laura is hosted by Hepforge, IPPP Durham
Laura++  v3r2
A maximum likelihood fitting package for performing Dalitz-plot analysis.
LauRelBreitWignerRes.cc
Go to the documentation of this file.
1 
2 // Copyright University of Warwick 2004 - 2014.
3 // Distributed under the Boost Software License, Version 1.0.
4 // (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5 
6 // Authors:
7 // Thomas Latham
8 // John Back
9 // Paul Harrison
10 
15 #include <iostream>
16 
17 #include "LauConstants.hh"
18 #include "LauRelBreitWignerRes.hh"
19 
21 
22 
23 LauRelBreitWignerRes::LauRelBreitWignerRes(LauResonanceInfo* resInfo, const Int_t resPairAmpInt, const LauDaughters* daughters) :
24  LauAbsResonance(resInfo, resPairAmpInt, daughters),
25  q0_(0.0),
26  p0_(0.0),
27  pstar0_(0.0),
28  erm0_(0.0),
29  resMass_(0.0),
30  resMassSq_(0.0),
31  resWidth_(0.0),
32  resRadius_(0.0),
33  parRadius_(0.0),
34  mDaugSum_(0.0),
35  mDaugSumSq_(0.0),
36  mDaugDiff_(0.0),
37  mDaugDiffSq_(0.0),
38  mParentSq_(0.0),
39  mBachSq_(0.0),
40  FR0_(1.0),
41  FP0_(1.0)
42 {
43 }
44 
46 {
47 }
48 
50 {
51  // Set-up various constants. This must be called again if the mass/width/spin
52  // of a resonance changes...
53 
54  resMass_ = this->getMass();
55  resWidth_ = this->getWidth();
56  resRadius_ = this->getResRadius();
57  parRadius_ = this->getParRadius();
58 
59  Double_t massDaug1 = this->getMassDaug1();
60  Double_t massDaug2 = this->getMassDaug2();
61  Double_t massBachelor = this->getMassBachelor();
62  Double_t massParent = this->getMassParent();
63 
64  // Create the mass squares, sums, differences etc.
66  mDaugSum_ = massDaug1 + massDaug2;
68  mDaugDiff_ = massDaug1 - massDaug2;
70  mParentSq_ = massParent*massParent;
71  mBachSq_ = massBachelor*massBachelor;
72 
73  // Create an effective resonance pole mass to protect against resonances
74  // that are below threshold
75  Double_t effResMass = resMass_;
76  Double_t effResMassSq = resMassSq_;
77  if (resMassSq_ - mDaugSumSq_ < 0.0 || resMass_ > massParent - massBachelor){
78  Double_t minMass = mDaugSum_;
79  Double_t maxMass = massParent - massBachelor;
80  Double_t tanhTerm = std::tanh( (resMass_ - ((minMass + maxMass)/2))/(maxMass-minMass));
81  effResMass = minMass + (maxMass-minMass)*(1+tanhTerm)/2;
82  effResMassSq = effResMass*effResMass;
83  }
84 
85  // Decay momentum of either daughter in the resonance rest frame
86  // when resonance mass = rest-mass value, m_0 (PDG value)
87  Double_t term1 = effResMassSq - mDaugSumSq_;
88  Double_t term2 = effResMassSq - mDaugDiffSq_;
89  Double_t term12 = term1*term2;
90  if (term12 > 0.0) {
91  q0_ = TMath::Sqrt(term12)/(2.0*effResMass);
92  } else {
93  q0_ = 0.0;
94  }
95 
96  // Momentum of the bachelor particle in the resonance rest frame
97  // when resonance mass = rest-mass value, m_0 (PDG value)
98  Double_t eBach = (mParentSq_ - effResMassSq - mBachSq_)/(2.0*effResMass);
99  Double_t termBach = eBach*eBach - mBachSq_;
100  if ( eBach<0.0 || termBach<0.0 ) {
101  p0_ = 0.0;
102  } else {
103  p0_ = TMath::Sqrt( termBach );
104  }
105 
106  // Momentum of the bachelor particle in the parent rest frame
107  // when resonance mass = rest-mass value, m_0 (PDG value)
108  Double_t eStarBach = (mParentSq_ + mBachSq_ - effResMassSq)/(2.0*massParent);
109  Double_t termStarBach = eStarBach*eStarBach - mBachSq_;
110  if ( eStarBach<0.0 || termStarBach<0.0 ) {
111  pstar0_ = 0.0;
112  } else {
113  pstar0_ = TMath::Sqrt( termStarBach );
114  }
115 
116  // Covariant factor when resonance mass = rest-mass value, m_0 (PDF value)
117  erm0_ = (mParentSq_ + effResMassSq - mBachSq_)/(2.0*massParent*effResMass);
118  this->calcCovFactor( erm0_ );
119 
120  // Calculate the Blatt-Weisskopf form factor for the case when m = m_0
121  FR0_ = 1.0;
122  FP0_ = 1.0;
123  const Int_t resSpin = this->getSpin();
124  if ( resSpin > 0 ) {
125  const LauBlattWeisskopfFactor* resBWFactor = this->getResBWFactor();
126  const LauBlattWeisskopfFactor* parBWFactor = this->getParBWFactor();
127  FR0_ = (resBWFactor!=0) ? resBWFactor->calcFormFactor(q0_) : 1.0;
128  switch ( parBWFactor->getRestFrame() ) {
130  FP0_ = (parBWFactor!=0) ? parBWFactor->calcFormFactor(p0_) : 1.0;
131  break;
133  FP0_ = (parBWFactor!=0) ? parBWFactor->calcFormFactor(pstar0_) : 1.0;
134  break;
136  {
137  Double_t covFactor = this->getCovFactor();
138  if ( resSpin > 2 ) {
139  covFactor = TMath::Power( covFactor, 1.0/resSpin );
140  } else if ( resSpin == 2 ) {
141  covFactor = TMath::Sqrt( covFactor );
142  }
143  FP0_ = (parBWFactor!=0) ? parBWFactor->calcFormFactor(pstar0_*covFactor) : 1.0;
144  break;
145  }
146  }
147  }
148 }
149 
150 LauComplex LauRelBreitWignerRes::resAmp(Double_t mass, Double_t spinTerm)
151 {
152  // This function returns the complex dynamical amplitude for a Breit-Wigner resonance,
153  // given the invariant mass and cos(helicity) values.
154 
155  LauComplex resAmplitude(0.0, 0.0);
156 
157  if (mass < 1e-10) {
158  std::cerr << "WARNING in LauRelBreitWignerRes::amplitude : mass < 1e-10." << std::endl;
159  return LauComplex(0.0, 0.0);
160  } else if (q0_ < 1e-30) {
161  return LauComplex(0.0, 0.0);
162  }
163 
164  // Calculate the width of the resonance (as a function of mass)
165  // First, calculate the various form factors.
166  // NB
167  // q is the momentum of either daughter in the resonance rest-frame,
168  // p is the momentum of the bachelor in the resonance rest-frame,
169  // pstar is the momentum of the bachelor in the parent rest-frame.
170  // These quantities have been calculate in LauAbsResonance::amplitude(...)
171 
172  const Double_t resMass = this->getMass();
173  const Double_t resWidth = this->getWidth();
174  const Double_t resRadius = this->getResRadius();
175  const Double_t parRadius = this->getParRadius();
176 
177  // If the mass is floating and its value has changed we need to
178  // recalculate everything that assumes that value
179  // Similarly for the BW radii
180  if ( ( (!this->fixMass()) && resMass != resMass_ ) ||
181  ( (!this->fixResRadius()) && resRadius != resRadius_ ) ||
182  ( (!this->fixParRadius()) && parRadius != parRadius_ ) ) {
183 
184  this->initialise();
185  }
186 
187  const Int_t resSpin = this->getSpin();
188  const Double_t q = this->getQ();
189  const Double_t p = this->getP();
190  const Double_t pstar = this->getPstar();
191 
192  // Get barrier scaling factors
193  Double_t fFactorR(1.0);
194  Double_t fFactorB(1.0);
195  if ( resSpin > 0 ) {
196  const LauBlattWeisskopfFactor* resBWFactor = this->getResBWFactor();
197  const LauBlattWeisskopfFactor* parBWFactor = this->getParBWFactor();
198  fFactorR = (resBWFactor!=0) ? resBWFactor->calcFormFactor(q) : 1.0;
199  switch ( parBWFactor->getRestFrame() ) {
201  fFactorB = (parBWFactor!=0) ? parBWFactor->calcFormFactor(p) : 1.0;
202  break;
204  fFactorB = (parBWFactor!=0) ? parBWFactor->calcFormFactor(pstar) : 1.0;
205  break;
207  {
208  Double_t covFactor = this->getCovFactor();
209  if ( resSpin > 2 ) {
210  covFactor = TMath::Power( covFactor, 1.0/resSpin );
211  } else if ( resSpin == 2 ) {
212  covFactor = TMath::Sqrt( covFactor );
213  }
214  fFactorB = (parBWFactor!=0) ? parBWFactor->calcFormFactor(pstar*covFactor) : 1.0;
215  break;
216  }
217  }
218  }
219  const Double_t fFactorRRatio = fFactorR/FR0_;
220  const Double_t fFactorBRatio = fFactorB/FP0_;
221 
222  // If ignoreMomenta is set, set the total width simply as the pole width, and do
223  // not include any momentum-dependent barrier factors (set them to unity)
224  Double_t totWidth(resWidth);
225 
226  if (!this->ignoreMomenta()) {
227 
228  const Double_t qRatio = q/q0_;
229  Double_t qTerm(0.0);
230  if (resSpin == 0) {
231  qTerm = qRatio;
232  } else if (resSpin == 1) {
233  qTerm = qRatio*qRatio*qRatio;
234  } else if (resSpin == 2) {
235  qTerm = qRatio*qRatio*qRatio*qRatio*qRatio;
236  } else {
237  qTerm = TMath::Power(qRatio, 2.0*resSpin + 1.0);
238  }
239 
240  totWidth = resWidth*qTerm*(resMass/mass)*fFactorRRatio*fFactorRRatio;
241 
242  }
243 
244  const Double_t massSq = mass*mass;
245  const Double_t massSqTerm = resMassSq_ - massSq;
246 
247  // Compute the complex amplitude
248  resAmplitude = LauComplex(massSqTerm, resMass*totWidth);
249 
250  // Scale by the denominator factor, as well as the spin term
251  Double_t scale = spinTerm/(massSqTerm*massSqTerm + resMassSq_*totWidth*totWidth);
252 
253  // Include Blatt-Weisskopf barrier factors
254  if (!this->ignoreBarrierScaling()) {
255  scale *= fFactorRRatio*fFactorBRatio;
256  }
257 
258  resAmplitude.rescale(scale);
259 
260  return resAmplitude;
261 }
262 
263 const std::vector<LauParameter*>& LauRelBreitWignerRes::getFloatingParameters()
264 {
265  this->clearFloatingParameters();
266 
267  if ( ! this->fixMass() ) {
268  this->addFloatingParameter( this->getMassPar() );
269  }
270  if ( ! this->fixWidth() ) {
271  this->addFloatingParameter( this->getWidthPar() );
272  }
273  if ( ! this->fixResRadius() ) {
274  this->addFloatingParameter( this->getResBWFactor()->getRadiusParameter() );
275  }
276  if ( ! this->fixParRadius() ) {
277  this->addFloatingParameter( this->getParBWFactor()->getRadiusParameter() );
278  }
279 
280  return this->getParameters();
281 }
282 
Double_t getQ() const
Get the current value of the daughter momentum in the resonance rest frame.
LauParameter * getMassPar()
Get the mass parameter of the resonance.
Double_t getMassBachelor() const
Get the mass of the bachelor daughter.
Bool_t fixWidth() const
Get the status of resonance width (fixed or released)
Double_t getMass() const
Get the mass of the resonance.
void calcCovFactor(const Double_t erm)
Calculate the spin-dependent covariant factor.
ClassImp(LauAbsCoeffSet)
Double_t q0_
Momentum of the daughters in the resonance rest frame (at pole mass)
Double_t getMassParent() const
Get the parent particle mass.
Double_t resMassSq_
Square of the resonance mass.
Class for defining the properties of a resonant particle.
Class that defines the particular 3-body decay under study.
Definition: LauDaughters.hh:33
Double_t resRadius_
The resonance barrier radius.
Double_t calcFormFactor(const Double_t p) const
Calculate form factor value.
Double_t getPstar() const
Get the current value of the bachelor momentum in the parent rest frame.
virtual ~LauRelBreitWignerRes()
Destructor.
Double_t getP() const
Get the current value of the bachelor momentum in the resonance rest frame.
virtual LauComplex resAmp(Double_t mass, Double_t spinTerm)
Complex resonant amplitude.
Double_t parRadius_
The parent barrier radius.
Double_t mDaugSum_
Sum of the two daughter masses.
Double_t resMass_
The resonance mass.
Double_t getMassDaug1() const
Get the mass of daughter 1.
RestFrame getRestFrame() const
Retrieve the rest frame information.
Bool_t fixResRadius() const
Get the status of resonance barrier radius (fixed or released)
Double_t getParRadius() const
Get the radius of the parent barrier factor.
Double_t resWidth_
The resonance width.
File containing declaration of LauRelBreitWignerRes class.
Bool_t fixMass() const
Get the status of resonance mass (fixed or released)
Double_t getMassDaug2() const
Get the mass of daughter 2.
Double_t FR0_
Value of the form factor for resonance decay (at pole mass)
Double_t mParentSq_
Square of the parent mass.
Double_t mBachSq_
Square of the bachelor mass.
void addFloatingParameter(LauParameter *param)
Add parameter to the list of floating parameters.
LauBlattWeisskopfFactor * getParBWFactor()
Get the centrifugal barrier for the parent decay.
Double_t p0_
Momentum of the bachelor in the resonance rest frame (at pole mass)
Double_t pstar0_
Momentum of the bachelor in the parent rest frame (at pole mass)
std::vector< LauParameter * > & getParameters()
Access the list of floating parameters.
LauParameter * getWidthPar()
Get the width parameter of the resonance.
Double_t erm0_
Covariant factor (at pole mass)
Class for defining the relativistic Breit-Wigner resonance model.
Bool_t ignoreMomenta() const
Get the ignore momenta flag.
Double_t mDaugDiff_
Difference of the two daughter masses.
Double_t mDaugDiffSq_
Square of the difference of the two daughter masses.
Double_t getResRadius() const
Get the radius of the resonance barrier factor.
Double_t getWidth() const
Get the width of the resonance.
Bool_t fixParRadius() const
Get the status of parent barrier radius (fixed or released)
Abstract class for defining type for resonance amplitude models (Breit-Wigner, Flatte etc...
Double_t getCovFactor() const
Get the current value of the full spin-dependent covariant factor.
void rescale(Double_t scaleVal)
Scale this by a factor.
Definition: LauComplex.hh:285
File containing LauConstants namespace.
Double_t mDaugSumSq_
Square of the sum of the two daughter masses.
virtual void initialise()
Initialise the model.
LauBlattWeisskopfFactor * getResBWFactor()
Get the centrifugal barrier for the resonance decay.
Class for defining a complex number.
Definition: LauComplex.hh:47
Class that implements the Blatt-Weisskopf barrier factor.
virtual const std::vector< LauParameter * > & getFloatingParameters()
Retrieve the resonance parameters, e.g. so that they can be loaded into a fit.
Int_t getSpin() const
Get the spin of the resonance.
Bool_t ignoreBarrierScaling() const
Get the ignore barrier factor scaling flag.
void clearFloatingParameters()
Clear list of floating parameters.
Double_t FP0_
Value of the form factor for parent decay (at pole mass)