laura is hosted by Hepforge, IPPP Durham
Laura++  v2r2p1
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 - 2013.
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(TString resName, Double_t resMass, Double_t resWidth, Int_t resSpin,
24  Int_t resCharge, Int_t resPairAmpInt, const LauDaughters* daughters) :
25  LauAbsResonance(resName, resMass, resWidth, resSpin, resCharge, resPairAmpInt, daughters),
26  q0_(0.0),
27  p0_(0.0),
28  pstar0_(0.0),
29  resMassSq_(0.0),
30  mDaugSum_(0.0),
31  mDaugSumSq_(0.0),
32  mDaugDiff_(0.0),
33  mDaugDiffSq_(0.0),
34  mParentSq_(0.0),
35  mBachSq_(0.0),
36  h0_(0.0),
37  dhdm0_(0.0),
38  d_(0.0),
39  FR0_(1.0),
40  FB0_(1.0)
41 {
42 }
43 
45 {
46 }
47 
49 {
50  // Set-up various constants. This must be called again if the mass/width/spin
51  // of a resonance changes...
52 
53  Int_t resSpin = this->getSpin();
54  Double_t resMass = this->getMass();
55  Double_t massDaug1 = this->getMassDaug1();
56  Double_t massDaug2 = this->getMassDaug2();
57  Double_t massBachelor = this->getMassBachelor();
58  Double_t massParent = this->getMassParent();
59 
60  // Check that the spin is 1
61  if (resSpin != 1) {
62  std::cerr << "WARNING in LauGounarisSakuraiRes::initialise : Resonance spin is != 1. This lineshape is for the rho(770), setting the spin to 1." << std::endl;
63  this->changeResonance( -1.0, -1.0, 1 );
64  resSpin = this->getSpin();
65  }
66 
67  // Create the mass squares, sums, differences etc.
68  resMassSq_ = resMass*resMass;
69  mDaugSum_ = massDaug1 + massDaug2;
71  mDaugDiff_ = massDaug1 - massDaug2;
73  mParentSq_ = massParent*massParent;
74  mBachSq_ = massBachelor*massBachelor;
75 
76  // Decay momentum of either daughter in the resonance rest frame
77  // when resonance mass = rest-mass value, m_0 (PDG value)
78  Double_t term1 = resMassSq_ - mDaugSumSq_;
79  Double_t term2 = resMassSq_ - mDaugDiffSq_;
80  Double_t term12 = term1*term2;
81  if (term12 > 0.0) {
82  q0_ = TMath::Sqrt(term12)/(2.0*resMass);
83  } else {
84  q0_ = 0.0;
85  }
86 
87  // Momentum of the bachelor particle in the resonance rest frame
88  // when resonance mass = rest-mass value, m_0 (PDG value)
89  Double_t eBach = (mParentSq_ - resMassSq_ - mBachSq_)/(2.0*resMass);
90  Double_t termBach = eBach*eBach - mBachSq_;
91  if ( eBach<0.0 || termBach<0.0 ) {
92  p0_ = 0.0;
93  } else {
94  p0_ = TMath::Sqrt( termBach );
95  }
96 
97  // Momentum of the bachelor particle in the parent rest frame
98  // when resonance mass = rest-mass value, m_0 (PDG value)
99  Double_t eStarBach = (mParentSq_ + mBachSq_ - resMassSq_)/(2.0*massParent);
100  Double_t termStarBach = eStarBach*eStarBach - mBachSq_;
101  if ( eStarBach<0.0 || termStarBach<0.0 ) {
102  pstar0_ = 0.0;
103  } else {
104  pstar0_ = TMath::Sqrt( termStarBach );
105  }
106 
107  // Blatt-Weisskopf barrier factor constant: z = q^2*radius^2
108  // Calculate the Blatt-Weisskopf form factor for the case when m = m_0
109  const Double_t resR = this->getResBWRadius();
110  const Double_t parR = this->getParBWRadius();
111  const BarrierType barrierType = this->getBarrierType();
112  this->setBarrierRadii(resR, parR, barrierType);
113 
114  // Calculate the extra things needed by the G-S shape
115  h0_ = 2.0*LauConstants::invPi * q0_/resMass * TMath::Log((resMass + 2.0*q0_)/(2.0*LauConstants::mPi));
116  dhdm0_ = h0_ * (1.0/(8.0*q0_*q0_) - 1.0/(2.0*resMassSq_)) + 1.0/(LauConstants::twoPi*resMassSq_);
118  * TMath::Log((resMass + 2.0*q0_)/(2.0*LauConstants::mPi))
119  + resMass/(LauConstants::twoPi*q0_)
121 }
122 
123 void LauGounarisSakuraiRes::setBarrierRadii(Double_t resRadius, Double_t parRadius, LauAbsResonance::BarrierType type)
124 {
125  // Reset the Blatt-Weisskopf barrier radius for the resonance and its parent
126  this->LauAbsResonance::setBarrierRadii( resRadius, parRadius, type );
127 
128  // Recalculate the Blatt-Weisskopf form factor for the case when m = m_0
129  const Double_t resR = this->getResBWRadius();
130  const Double_t parR = this->getParBWRadius();
131 
132  std::cout << "INFO in LauGounarisSakuraiRes::setBarrierRadii : Recalculating barrier factor normalisations for new radii: resonance = " << resR << ", parent = " << parR << std::endl;
133 
134  Double_t zR0 = q0_*q0_*resR*resR;
135  Double_t zB0 = p0_*p0_*parR*parR;
136  if ( ( type == LauAbsResonance::BWPrimeBarrier ) || ( type == LauAbsResonance::ExpBarrier ) ) {
137  FR0_ = (resR==0.0) ? 1.0 : this->calcFFactor(zR0);
138  FB0_ = (parR==0.0) ? 1.0 : this->calcFFactor(zB0);
139  }
140 }
141 
143 {
144  // Calculate the requested form factor for the resonance, given the z value
145  Double_t fFactor(1.0);
146  const BarrierType barrierType = this->getBarrierType();
147  if ( barrierType == LauAbsResonance::BWBarrier ) {
148  fFactor = TMath::Sqrt(2.0*z/(z + 1.0));
149  } else if ( barrierType == LauAbsResonance::BWPrimeBarrier ) {
150  fFactor = TMath::Sqrt(1.0/(z + 1.0));
151  } else if ( barrierType == LauAbsResonance::ExpBarrier ) {
152  fFactor = TMath::Exp( -TMath::Sqrt(z) );
153  }
154  return fFactor;
155 }
156 
157 LauComplex LauGounarisSakuraiRes::resAmp(Double_t mass, Double_t spinTerm)
158 {
159  // This function returns the complex dynamical amplitude for a Breit-Wigner resonance,
160  // given the invariant mass and cos(helicity) values.
161 
162  LauComplex resAmplitude(0.0, 0.0);
163 
164  if (mass < 1e-10) {
165  std::cerr << "WARNING in LauGounarisSakuraiRes::amplitude : mass < 1e-10." << std::endl;
166  return LauComplex(0.0, 0.0);
167  } else if (q0_ < 1e-30) {
168  return LauComplex(0.0, 0.0);
169  }
170 
171  // Calculate the width of the resonance (as a function of mass)
172  // First, calculate the various form factors.
173  // NB
174  // q is the momentum of either daughter in the resonance rest-frame,
175  // p is the momentum of the bachelor in the resonance rest-frame,
176  // pstar is the momentum of the bachelor in the parent rest-frame.
177  // These quantities have been calculate in LauAbsResonance::amplitude(...)
178 
179  Double_t resMass = this->getMass();
180  Double_t resWidth = this->getWidth();
181  Double_t q = this->getQ();
182  Double_t p = this->getP();
183  //Double_t pstar = this->getPstar();
184 
185  const Double_t resR = this->getResBWRadius();
186  const Double_t parR = this->getParBWRadius();
187  Double_t zR = q*q*resR*resR;
188  Double_t zB = p*p*parR*parR;
189  Double_t fFactorR = (resR==0.0) ? 1.0 : this->calcFFactor(zR);
190  Double_t fFactorB = (parR==0.0) ? 1.0 : this->calcFFactor(zB);
191  Double_t fFactorRRatio = fFactorR/FR0_;
192  Double_t fFactorBRatio = fFactorB/FB0_;
193 
194  Double_t qRatio = q/q0_;
195  Double_t qTerm = qRatio*qRatio*qRatio;
196 
197  Double_t totWidth = resWidth*qTerm*(resMass/mass)*fFactorRRatio*fFactorRRatio;
198 
199  Double_t massSq = mass*mass;
200  Double_t massSqTerm = resMassSq_ - massSq;
201 
202  Double_t h = 2.0*LauConstants::invPi * q/mass * TMath::Log((mass + 2.0*q)/(2.0*LauConstants::mPi));
203  Double_t f = totWidth * resMassSq_/(q0_*q0_*q0_) * (q*q * (h - h0_) + massSqTerm * q0_*q0_ * dhdm0_);
204 
205  // Compute the complex amplitude
206  resAmplitude = LauComplex(massSqTerm + f, resMass*totWidth);
207 
208  // Scale by the denominator factor, as well as the spin term and Blatt-Weisskopf factors
209  Double_t numerFactor = fFactorRRatio*fFactorBRatio*spinTerm*(1 + d_ * resWidth/resMass);
210  Double_t denomFactor = (massSqTerm + f)*(massSqTerm + f) + resMassSq_*totWidth*totWidth;
211  resAmplitude.rescale(numerFactor/denomFactor);
212 
213  return resAmplitude;
214 }
215 
Double_t getQ() const
Get the current value of the daughter momentum in the resonance rest frame.
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.
Double_t getParBWRadius() const
Get the radius of the centrifugal barrier for the parent decay.
BarrierType getBarrierType() const
Get the form factor model.
Double_t getMass() const
Get the mass of the resonance.
Double_t getResBWRadius() const
Get the radius of the centrifugal barrier for the resonance decay.
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 that defines the particular 3-body decay under study.
Definition: LauDaughters.hh:33
Class for defininf the Gounaris-Sakurai resonance model.
Double_t calcFFactor(Double_t z)
Calculate the form factor for the resonance.
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.
virtual void setBarrierRadii(const Double_t resRadius, const Double_t parRadius, const LauAbsResonance::BarrierType type)
Set the form factor model and parameters.
Double_t getMassDaug1() const
Get the mass of daughter 1.
virtual ~LauGounarisSakuraiRes()
Destructor.
virtual void initialise()
Initialise the model.
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.
const Double_t invPi
One over Pi.
Double_t FB0_
Value of the form factor for parent decay (at pole mass)
const Double_t pi
Pi.
Definition: LauConstants.hh:89
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 getWidth() const
Get the width of the resonance.
Double_t mDaugSum_
Sum of the two daughter masses.
Abstract class for defining type for resonance amplitude models (Breit-Wigner, Flatte etc...
void rescale(Double_t scaleVal)
Scale this by a factor.
Definition: LauComplex.hh:282
File containing LauConstants namespace.
Class for defining a complex number.
Definition: LauComplex.hh:47
Double_t resMassSq_
Square of the resonance mass.
virtual LauComplex resAmp(Double_t mass, Double_t spinTerm)
Complex resonant amplitude.
BarrierType
Define the allowed types of barrier factors.
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.
Double_t d_
Extra parameter required by GS shape.
virtual void setBarrierRadii(const Double_t resRadius, const Double_t parRadius, const BarrierType type)
Set the form factor model and parameters.