laura is hosted by Hepforge, IPPP Durham
Laura++  v3r2
A maximum likelihood fitting package for performing Dalitz-plot analysis.
LauGounarisSakuraiRes.cc
Go to the documentation of this file.
1 
2 // Copyright University of Warwick 2006 - 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 "LauGounarisSakuraiRes.hh"
19 
21 
22 
23 LauGounarisSakuraiRes::LauGounarisSakuraiRes(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  h0_(0.0),
41  dhdm0_(0.0),
42  d_(0.0),
43  FR0_(1.0),
44  FP0_(1.0)
45 {
46 }
47 
49 {
50 }
51 
53 {
54  // Set-up various constants. This must be called again if the mass/width/spin
55  // of a resonance changes...
56 
57  resMass_ = this->getMass();
58  resWidth_ = this->getWidth();
59  resRadius_ = this->getResRadius();
60  parRadius_ = this->getParRadius();
61 
62  Double_t massDaug1 = this->getMassDaug1();
63  Double_t massDaug2 = this->getMassDaug2();
64  Double_t massBachelor = this->getMassBachelor();
65  Double_t massParent = this->getMassParent();
66 
67  // Check that the spin is 1
68  Int_t resSpin = this->getSpin();
69  if (resSpin != 1) {
70  std::cerr << "WARNING in LauGounarisSakuraiRes::initialise : Resonance spin is != 1. This lineshape is for the rho(770), setting the spin to 1." << std::endl;
71  this->changeResonance( -1.0, -1.0, 1 );
72  resSpin = this->getSpin();
73  }
74 
75  // Create the mass squares, sums, differences etc.
77  mDaugSum_ = massDaug1 + massDaug2;
79  mDaugDiff_ = massDaug1 - massDaug2;
81  mParentSq_ = massParent*massParent;
82  mBachSq_ = massBachelor*massBachelor;
83 
84  // Decay momentum of either daughter in the resonance rest frame
85  // when resonance mass = rest-mass value, m_0 (PDG value)
86  Double_t term1 = resMassSq_ - mDaugSumSq_;
87  Double_t term2 = resMassSq_ - mDaugDiffSq_;
88  Double_t term12 = term1*term2;
89  if (term12 > 0.0) {
90  q0_ = TMath::Sqrt(term12)/(2.0*resMass_);
91  } else {
92  q0_ = 0.0;
93  }
94 
95  // Momentum of the bachelor particle in the resonance rest frame
96  // when resonance mass = rest-mass value, m_0 (PDG value)
97  Double_t eBach = (mParentSq_ - resMassSq_ - mBachSq_)/(2.0*resMass_);
98  Double_t termBach = eBach*eBach - mBachSq_;
99  if ( eBach<0.0 || termBach<0.0 ) {
100  p0_ = 0.0;
101  } else {
102  p0_ = TMath::Sqrt( termBach );
103  }
104 
105  // Momentum of the bachelor particle in the parent rest frame
106  // when resonance mass = rest-mass value, m_0 (PDG value)
107  Double_t eStarBach = (mParentSq_ + mBachSq_ - resMassSq_)/(2.0*massParent);
108  Double_t termStarBach = eStarBach*eStarBach - mBachSq_;
109  if ( eStarBach<0.0 || termStarBach<0.0 ) {
110  pstar0_ = 0.0;
111  } else {
112  pstar0_ = TMath::Sqrt( termStarBach );
113  }
114 
115  // Covariant factor when resonance mass = rest-mass value, m_0 (PDF value)
116  erm0_ = (mParentSq_ + resMassSq_ - mBachSq_)/(2.0*massParent*resMass_);
117  this->calcCovFactor( erm0_ );
118 
119  // Calculate the Blatt-Weisskopf form factor for the case when m = m_0
120  FR0_ = 1.0;
121  FP0_ = 1.0;
122  if ( resSpin > 0 ) {
123  const LauBlattWeisskopfFactor* resBWFactor = this->getResBWFactor();
124  const LauBlattWeisskopfFactor* parBWFactor = this->getParBWFactor();
125  FR0_ = (resBWFactor!=0) ? resBWFactor->calcFormFactor(q0_) : 1.0;
126  switch ( parBWFactor->getRestFrame() ) {
128  FP0_ = (parBWFactor!=0) ? parBWFactor->calcFormFactor(p0_) : 1.0;
129  break;
131  FP0_ = (parBWFactor!=0) ? parBWFactor->calcFormFactor(pstar0_) : 1.0;
132  break;
134  {
135  Double_t covFactor = this->getCovFactor();
136  if ( resSpin > 2 ) {
137  covFactor = TMath::Power( covFactor, 1.0/resSpin );
138  } else if ( resSpin == 2 ) {
139  covFactor = TMath::Sqrt( covFactor );
140  }
141  FP0_ = (parBWFactor!=0) ? parBWFactor->calcFormFactor(pstar0_*covFactor) : 1.0;
142  break;
143  }
144  }
145  }
146 
147  // Calculate the extra things needed by the G-S shape
148  h0_ = 2.0*LauConstants::invPi * q0_/resMass_ * TMath::Log((resMass_ + 2.0*q0_)/(2.0*LauConstants::mPi));
149  dhdm0_ = h0_ * (1.0/(8.0*q0_*q0_) - 1.0/(2.0*resMassSq_)) + 1.0/(LauConstants::twoPi*resMassSq_);
151  * TMath::Log((resMass_ + 2.0*q0_)/(2.0*LauConstants::mPi))
152  + resMass_/(LauConstants::twoPi*q0_)
154 }
155 
156 LauComplex LauGounarisSakuraiRes::resAmp(Double_t mass, Double_t spinTerm)
157 {
158  // This function returns the complex dynamical amplitude for a Breit-Wigner resonance,
159  // given the invariant mass and cos(helicity) values.
160 
161  LauComplex resAmplitude(0.0, 0.0);
162 
163  if (mass < 1e-10) {
164  std::cerr << "WARNING in LauGounarisSakuraiRes::amplitude : mass < 1e-10." << std::endl;
165  return LauComplex(0.0, 0.0);
166  } else if (q0_ < 1e-30) {
167  return LauComplex(0.0, 0.0);
168  }
169 
170  // Calculate the width of the resonance (as a function of mass)
171  // First, calculate the various form factors.
172  // NB
173  // q is the momentum of either daughter in the resonance rest-frame,
174  // p is the momentum of the bachelor in the resonance rest-frame,
175  // pstar is the momentum of the bachelor in the parent rest-frame.
176  // These quantities have been calculate in LauAbsResonance::amplitude(...)
177 
178  const Double_t resMass = this->getMass();
179  const Double_t resWidth = this->getWidth();
180  const Double_t resRadius = this->getResRadius();
181  const Double_t parRadius = this->getParRadius();
182 
183  // If the mass is floating and its value has changed we need to
184  // recalculate everything that assumes that value
185  // Similarly for the BW radii
186  if ( ( (!this->fixMass()) && resMass != resMass_ ) ||
187  ( (!this->fixResRadius()) && resRadius != resRadius_ ) ||
188  ( (!this->fixParRadius()) && parRadius != parRadius_ ) ) {
189  this->initialise();
190  }
191 
192  const Int_t resSpin = this->getSpin();
193  const Double_t q = this->getQ();
194  const Double_t p = this->getP();
195  const Double_t pstar = this->getPstar();
196 
197  Double_t fFactorR(1.0);
198  Double_t fFactorB(1.0);
199  if ( resSpin > 0 ) {
200  const LauBlattWeisskopfFactor* resBWFactor = this->getResBWFactor();
201  const LauBlattWeisskopfFactor* parBWFactor = this->getParBWFactor();
202  fFactorR = (resBWFactor!=0) ? resBWFactor->calcFormFactor(q) : 1.0;
203  switch ( parBWFactor->getRestFrame() ) {
205  fFactorB = (parBWFactor!=0) ? parBWFactor->calcFormFactor(p) : 1.0;
206  break;
208  fFactorB = (parBWFactor!=0) ? parBWFactor->calcFormFactor(pstar) : 1.0;
209  break;
211  {
212  Double_t covFactor = this->getCovFactor();
213  if ( resSpin > 2 ) {
214  covFactor = TMath::Power( covFactor, 1.0/resSpin );
215  } else if ( resSpin == 2 ) {
216  covFactor = TMath::Sqrt( covFactor );
217  }
218  fFactorB = (parBWFactor!=0) ? parBWFactor->calcFormFactor(pstar*covFactor) : 1.0;
219  break;
220  }
221  }
222  }
223  const Double_t fFactorRRatio = fFactorR/FR0_;
224  const Double_t fFactorBRatio = fFactorB/FP0_;
225 
226  const Double_t qRatio = q/q0_;
227  const Double_t qTerm = qRatio*qRatio*qRatio;
228 
229  const Double_t totWidth = resWidth*qTerm*(resMass/mass)*fFactorRRatio*fFactorRRatio;
230 
231  const Double_t massSq = mass*mass;
232  const Double_t massSqTerm = resMassSq_ - massSq;
233 
234  const Double_t h = 2.0*LauConstants::invPi * q/mass * TMath::Log((mass + 2.0*q)/(2.0*LauConstants::mPi));
235  const Double_t f = resWidth * resMassSq_/(q0_*q0_*q0_) * (q*q * (h - h0_) + massSqTerm * q0_*q0_ * dhdm0_);
236 
237  // Compute the complex amplitude
238  resAmplitude = LauComplex(massSqTerm + f, resMass*totWidth);
239 
240  // Scale by the denominator factor, as well as the spin term and Blatt-Weisskopf factors
241  Double_t numerFactor = spinTerm*(1.0 + d_ * resWidth/resMass);
242  if (!this->ignoreBarrierScaling()) {
243  numerFactor *= fFactorRRatio*fFactorBRatio;
244  }
245  const Double_t denomFactor = (massSqTerm + f)*(massSqTerm + f) + resMassSq_*totWidth*totWidth;
246  resAmplitude.rescale(numerFactor/denomFactor);
247 
248  return resAmplitude;
249 }
250 
251 const std::vector<LauParameter*>& LauGounarisSakuraiRes::getFloatingParameters()
252 {
253  this->clearFloatingParameters();
254 
255  if ( ! this->fixMass() ) {
256  this->addFloatingParameter( this->getMassPar() );
257  }
258  if ( ! this->fixWidth() ) {
259  this->addFloatingParameter( this->getWidthPar() );
260  }
261  if ( ! this->fixResRadius() ) {
262  this->addFloatingParameter( this->getResBWFactor()->getRadiusParameter() );
263  }
264  if ( ! this->fixParRadius() ) {
265  this->addFloatingParameter( this->getParBWFactor()->getRadiusParameter() );
266  }
267 
268  return this->getParameters();
269 }
270 
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 q0_
Momentum of the daughters in the resonance rest frame (at pole mass)
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.
const Double_t twoPi
Two times Pi.
Definition: LauConstants.hh:93
Double_t mBachSq_
Square of the bachelor mass.
void changeResonance(const Double_t newMass, const Double_t newWidth, const Int_t newSpin)
Allow the mass, width and spin of the resonance to be changed.
ClassImp(LauAbsCoeffSet)
Double_t getMassParent() const
Get the parent particle 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 FP0_
Value of the form factor for parent decay (at pole mass)
Class for defininf the Gounaris-Sakurai resonance model.
Double_t resMass_
The resonance mass.
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.
Double_t h0_
Extra parameter required by GS shape.
Double_t getP() const
Get the current value of the bachelor momentum in the resonance rest frame.
File containing declaration of LauGounarisSakuraiRes class.
Double_t getMassDaug1() const
Get the mass of daughter 1.
RestFrame getRestFrame() const
Retrieve the rest frame information.
virtual ~LauGounarisSakuraiRes()
Destructor.
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.
virtual void initialise()
Initialise the model.
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 dhdm0_
Extra parameter required by GS shape.
Double_t mParentSq_
Square of the parent mass.
const Double_t mPi
Mass of pi+- (GeV/c^2)
Definition: LauConstants.hh:40
Double_t mDaugDiff_
Difference between the two daughter masses.
void addFloatingParameter(LauParameter *param)
Add parameter to the list of floating parameters.
LauBlattWeisskopfFactor * getParBWFactor()
Get the centrifugal barrier for the parent decay.
Double_t resRadius_
The resonance barrier radius.
const Double_t invPi
One over Pi.
std::vector< LauParameter * > & getParameters()
Access the list of floating parameters.
const Double_t pi
Pi.
Definition: LauConstants.hh:89
LauParameter * getWidthPar()
Get the width parameter of the resonance.
Double_t resWidth_
The resonance width.
Double_t mDaugDiffSq_
Square of the difference of the two daughter masses.
Double_t p0_
Momentum of the bachelor in the resonance rest frame (at pole mass)
Double_t FR0_
Value of the form factor for resonance decay (at pole mass)
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)
Double_t mDaugSum_
Sum of the two daughter masses.
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
Double_t parRadius_
The parent barrier radius.
Double_t erm0_
Covariant factor (at pole mass)
File containing LauConstants namespace.
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.
Double_t resMassSq_
Square of the resonance mass.
virtual LauComplex resAmp(Double_t mass, Double_t spinTerm)
Complex resonant amplitude.
Double_t mDaugSumSq_
Square of the sum of the two daughter masses.
Double_t pstar0_
Momentum of the bachelor in the parent rest frame (at pole mass)
Int_t getSpin() const
Get the spin of the resonance.
virtual const std::vector< LauParameter * > & getFloatingParameters()
Retrieve the resonance parameters, e.g. so that they can be loaded into a fit.
Double_t d_
Extra parameter required by GS shape.
Bool_t ignoreBarrierScaling() const
Get the ignore barrier factor scaling flag.
void clearFloatingParameters()
Clear list of floating parameters.