laura is hosted by Hepforge, IPPP Durham
Laura++  v3r5
A maximum likelihood fitting package for performing Dalitz-plot analysis.
LauGounarisSakuraiRes.cc
Go to the documentation of this file.
1 
2 /*
3 Copyright 2006 University of Warwick
4 
5 Licensed under the Apache License, Version 2.0 (the "License");
6 you may not use this file except in compliance with the License.
7 You may obtain a copy of the License at
8 
9  http://www.apache.org/licenses/LICENSE-2.0
10 
11 Unless required by applicable law or agreed to in writing, software
12 distributed under the License is distributed on an "AS IS" BASIS,
13 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 See the License for the specific language governing permissions and
15 limitations under the License.
16 */
17 
18 /*
19 Laura++ package authors:
20 John Back
21 Paul Harrison
22 Thomas Latham
23 */
24 
29 #include <iostream>
30 
31 #include "LauConstants.hh"
32 #include "LauGounarisSakuraiRes.hh"
33 
35 
36 
37 LauGounarisSakuraiRes::LauGounarisSakuraiRes(LauResonanceInfo* resInfo, const Int_t resPairAmpInt, const LauDaughters* daughters) :
38  LauAbsResonance(resInfo, resPairAmpInt, daughters),
39  q0_(0.0),
40  p0_(0.0),
41  pstar0_(0.0),
42  erm0_(0.0),
43  resMass_(0.0),
44  resMassSq_(0.0),
45  resWidth_(0.0),
46  resRadius_(0.0),
47  parRadius_(0.0),
48  mDaugSum_(0.0),
49  mDaugSumSq_(0.0),
50  mDaugDiff_(0.0),
51  mDaugDiffSq_(0.0),
52  mParentSq_(0.0),
53  mBachSq_(0.0),
54  h0_(0.0),
55  dhdm0_(0.0),
56  d_(0.0),
57  FR0_(1.0),
58  FP0_(1.0)
59 {
60 }
61 
63 {
64 }
65 
67 {
68  // Set-up various constants. This must be called again if the mass/width/spin
69  // of a resonance changes...
70 
71  resMass_ = this->getMass();
72  resWidth_ = this->getWidth();
73  resRadius_ = this->getResRadius();
74  parRadius_ = this->getParRadius();
75 
76  Double_t massDaug1 = this->getMassDaug1();
77  Double_t massDaug2 = this->getMassDaug2();
78  Double_t massBachelor = this->getMassBachelor();
79  Double_t massParent = this->getMassParent();
80 
81  // Check that the spin is 1
82  Int_t resSpin = this->getSpin();
83  if (resSpin != 1) {
84  std::cerr << "WARNING in LauGounarisSakuraiRes::initialise : Resonance spin is != 1. This lineshape is for the rho(770), setting the spin to 1." << std::endl;
85  this->changeResonance( -1.0, -1.0, 1 );
86  resSpin = this->getSpin();
87  }
88 
89  // Create the mass squares, sums, differences etc.
91  mDaugSum_ = massDaug1 + massDaug2;
93  mDaugDiff_ = massDaug1 - massDaug2;
95  mParentSq_ = massParent*massParent;
96  mBachSq_ = massBachelor*massBachelor;
97 
98  // Decay momentum of either daughter in the resonance rest frame
99  // when resonance mass = rest-mass value, m_0 (PDG value)
100  Double_t term1 = resMassSq_ - mDaugSumSq_;
101  Double_t term2 = resMassSq_ - mDaugDiffSq_;
102  Double_t term12 = term1*term2;
103  if (term12 > 0.0) {
104  q0_ = TMath::Sqrt(term12)/(2.0*resMass_);
105  } else {
106  q0_ = 0.0;
107  }
108 
109  // Momentum of the bachelor particle in the resonance rest frame
110  // when resonance mass = rest-mass value, m_0 (PDG value)
111  Double_t eBach = (mParentSq_ - resMassSq_ - mBachSq_)/(2.0*resMass_);
112  Double_t termBach = eBach*eBach - mBachSq_;
113  if ( eBach<0.0 || termBach<0.0 ) {
114  p0_ = 0.0;
115  } else {
116  p0_ = TMath::Sqrt( termBach );
117  }
118 
119  // Momentum of the bachelor particle in the parent rest frame
120  // when resonance mass = rest-mass value, m_0 (PDG value)
121  Double_t eStarBach = (mParentSq_ + mBachSq_ - resMassSq_)/(2.0*massParent);
122  Double_t termStarBach = eStarBach*eStarBach - mBachSq_;
123  if ( eStarBach<0.0 || termStarBach<0.0 ) {
124  pstar0_ = 0.0;
125  } else {
126  pstar0_ = TMath::Sqrt( termStarBach );
127  }
128 
129  // Covariant factor when resonance mass = rest-mass value, m_0 (PDF value)
130  erm0_ = (mParentSq_ + resMassSq_ - mBachSq_)/(2.0*massParent*resMass_);
131  this->calcCovFactor( erm0_ );
132 
133  // Calculate the Blatt-Weisskopf form factor for the case when m = m_0
134  FR0_ = 1.0;
135  FP0_ = 1.0;
136  if ( resSpin > 0 ) {
137  const LauBlattWeisskopfFactor* resBWFactor = this->getResBWFactor();
138  const LauBlattWeisskopfFactor* parBWFactor = this->getParBWFactor();
139  FR0_ = (resBWFactor!=0) ? resBWFactor->calcFormFactor(q0_) : 1.0;
140  switch ( parBWFactor->getRestFrame() ) {
142  FP0_ = (parBWFactor!=0) ? parBWFactor->calcFormFactor(p0_) : 1.0;
143  break;
145  FP0_ = (parBWFactor!=0) ? parBWFactor->calcFormFactor(pstar0_) : 1.0;
146  break;
148  {
149  Double_t covFactor = this->getCovFactor();
150  if ( resSpin > 2 ) {
151  covFactor = TMath::Power( covFactor, 1.0/resSpin );
152  } else if ( resSpin == 2 ) {
153  covFactor = TMath::Sqrt( covFactor );
154  }
155  FP0_ = (parBWFactor!=0) ? parBWFactor->calcFormFactor(pstar0_*covFactor) : 1.0;
156  break;
157  }
158  }
159  }
160 
161  // Calculate the extra things needed by the G-S shape
162  h0_ = 2.0*LauConstants::invPi * q0_/resMass_ * TMath::Log((resMass_ + 2.0*q0_)/(2.0*LauConstants::mPi));
163  dhdm0_ = h0_ * (1.0/(8.0*q0_*q0_) - 1.0/(2.0*resMassSq_)) + 1.0/(LauConstants::twoPi*resMassSq_);
165  * TMath::Log((resMass_ + 2.0*q0_)/(2.0*LauConstants::mPi))
166  + resMass_/(LauConstants::twoPi*q0_)
168 }
169 
170 LauComplex LauGounarisSakuraiRes::resAmp(Double_t mass, Double_t spinTerm)
171 {
172  // This function returns the complex dynamical amplitude for a Breit-Wigner resonance,
173  // given the invariant mass and cos(helicity) values.
174 
175  LauComplex resAmplitude(0.0, 0.0);
176 
177  if (mass < 1e-10) {
178  std::cerr << "WARNING in LauGounarisSakuraiRes::amplitude : mass < 1e-10." << std::endl;
179  return LauComplex(0.0, 0.0);
180  } else if (q0_ < 1e-30) {
181  return LauComplex(0.0, 0.0);
182  }
183 
184  // Calculate the width of the resonance (as a function of mass)
185  // First, calculate the various form factors.
186  // NB
187  // q is the momentum of either daughter in the resonance rest-frame,
188  // p is the momentum of the bachelor in the resonance rest-frame,
189  // pstar is the momentum of the bachelor in the parent rest-frame.
190  // These quantities have been calculate in LauAbsResonance::amplitude(...)
191 
192  const Double_t resMass = this->getMass();
193  const Double_t resWidth = this->getWidth();
194  const Double_t resRadius = this->getResRadius();
195  const Double_t parRadius = this->getParRadius();
196 
197  // If the mass is floating and its value has changed we need to
198  // recalculate everything that assumes that value
199  // Similarly for the BW radii
200  if ( ( (!this->fixMass()) && resMass != resMass_ ) ||
201  ( (!this->fixResRadius()) && resRadius != resRadius_ ) ||
202  ( (!this->fixParRadius()) && parRadius != parRadius_ ) ) {
203  this->initialise();
204  }
205 
206  const Int_t resSpin = this->getSpin();
207  const Double_t q = this->getQ();
208  const Double_t p = this->getP();
209  const Double_t pstar = this->getPstar();
210 
211  Double_t fFactorR(1.0);
212  Double_t fFactorB(1.0);
213  if ( resSpin > 0 ) {
214  const LauBlattWeisskopfFactor* resBWFactor = this->getResBWFactor();
215  const LauBlattWeisskopfFactor* parBWFactor = this->getParBWFactor();
216  fFactorR = (resBWFactor!=0) ? resBWFactor->calcFormFactor(q) : 1.0;
217  switch ( parBWFactor->getRestFrame() ) {
219  fFactorB = (parBWFactor!=0) ? parBWFactor->calcFormFactor(p) : 1.0;
220  break;
222  fFactorB = (parBWFactor!=0) ? parBWFactor->calcFormFactor(pstar) : 1.0;
223  break;
225  {
226  Double_t covFactor = this->getCovFactor();
227  if ( resSpin > 2 ) {
228  covFactor = TMath::Power( covFactor, 1.0/resSpin );
229  } else if ( resSpin == 2 ) {
230  covFactor = TMath::Sqrt( covFactor );
231  }
232  fFactorB = (parBWFactor!=0) ? parBWFactor->calcFormFactor(pstar*covFactor) : 1.0;
233  break;
234  }
235  }
236  }
237  const Double_t fFactorRRatio = fFactorR/FR0_;
238  const Double_t fFactorBRatio = fFactorB/FP0_;
239 
240  const Double_t qRatio = q/q0_;
241  const Double_t qTerm = qRatio*qRatio*qRatio;
242 
243  const Double_t totWidth = resWidth*qTerm*(resMass/mass)*fFactorRRatio*fFactorRRatio;
244 
245  const Double_t massSq = mass*mass;
246  const Double_t massSqTerm = resMassSq_ - massSq;
247 
248  const Double_t h = 2.0*LauConstants::invPi * q/mass * TMath::Log((mass + 2.0*q)/(2.0*LauConstants::mPi));
249  const Double_t f = resWidth * resMassSq_/(q0_*q0_*q0_) * (q*q * (h - h0_) + massSqTerm * q0_*q0_ * dhdm0_);
250 
251  // Compute the complex amplitude
252  resAmplitude = LauComplex(massSqTerm + f, resMass*totWidth);
253 
254  // Scale by the denominator factor, as well as the spin term and Blatt-Weisskopf factors
255  Double_t numerFactor = spinTerm*(1.0 + d_ * resWidth/resMass);
256  if (!this->ignoreBarrierScaling()) {
257  numerFactor *= fFactorRRatio*fFactorBRatio;
258  }
259  const Double_t denomFactor = (massSqTerm + f)*(massSqTerm + f) + resMassSq_*totWidth*totWidth;
260  resAmplitude.rescale(numerFactor/denomFactor);
261 
262  return resAmplitude;
263 }
264 
265 const std::vector<LauParameter*>& LauGounarisSakuraiRes::getFloatingParameters()
266 {
267  this->clearFloatingParameters();
268 
269  if ( ! this->fixMass() ) {
270  this->addFloatingParameter( this->getMassPar() );
271  }
272  if ( ! this->fixWidth() ) {
273  this->addFloatingParameter( this->getWidthPar() );
274  }
275  if ( ! this->fixResRadius() ) {
276  this->addFloatingParameter( this->getResBWFactor()->getRadiusParameter() );
277  }
278  if ( ! this->fixParRadius() ) {
279  this->addFloatingParameter( this->getParBWFactor()->getRadiusParameter() );
280  }
281 
282  return this->getParameters();
283 }
284 
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.
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:47
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:54
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.
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:299
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:61
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.