laura is hosted by Hepforge, IPPP Durham
Laura++  3.6.0
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 "LauGounarisSakuraiRes.hh"
30 
31 #include "LauConstants.hh"
32 
33 #include <iostream>
34 
36  const Int_t resPairAmpInt,
37  const LauDaughters* daughters ) :
38  LauAbsResonance( resInfo, resPairAmpInt, daughters ),
39  q0_( 0.0 ),
40  resMass_( 0.0 ),
41  resMassSq_( 0.0 ),
42  resWidth_( 0.0 ),
43  resRadius_( 0.0 ),
44  parRadius_( 0.0 ),
45  mDaugSum_( 0.0 ),
46  mDaugSumSq_( 0.0 ),
47  mDaugDiff_( 0.0 ),
48  mDaugDiffSq_( 0.0 ),
49  mParentSq_( 0.0 ),
50  mBachSq_( 0.0 ),
51  h0_( 0.0 ),
52  dhdm0_( 0.0 ),
53  d_( 0.0 ),
54  FR0_( 1.0 )
55 {
56 }
57 
59 {
60 }
61 
63 {
64  // Set-up various constants. This must be called again if the mass/width/spin
65  // of a resonance changes...
66 
67  resMass_ = this->getMass();
68  resWidth_ = this->getWidth();
69  resRadius_ = this->getResRadius();
70  parRadius_ = this->getParRadius();
71 
72  Double_t massDaug1 = this->getMassDaug1();
73  Double_t massDaug2 = this->getMassDaug2();
74  Double_t massBachelor = this->getMassBachelor();
75  Double_t massParent = this->getMassParent();
76 
77  // Check that the spin is 1
78  Int_t resSpin = this->getSpin();
79  if ( resSpin != 1 ) {
80  std::cerr << "WARNING in LauGounarisSakuraiRes::initialise : Resonance spin is != 1. This lineshape is for the rho(770), setting the spin to 1."
81  << std::endl;
82  this->changeResonance( -1.0, -1.0, 1 );
83  resSpin = this->getSpin();
84  }
85 
86  // Create the mass squares, sums, differences etc.
88  mDaugSum_ = massDaug1 + massDaug2;
90  mDaugDiff_ = massDaug1 - massDaug2;
92  mParentSq_ = massParent * massParent;
93  mBachSq_ = massBachelor * massBachelor;
94 
95  // Create an effective resonance pole mass to protect against resonances
96  // that are below threshold
97  Double_t effResMass = resMass_;
98  Double_t effResMassSq = resMassSq_;
99  if ( resMassSq_ - mDaugSumSq_ < 0.0 ) {
100  Double_t minMass = mDaugSum_;
101  Double_t maxMass = massParent - massBachelor;
102  Double_t tanhTerm = std::tanh( ( resMass_ - ( ( minMass + maxMass ) / 2 ) ) /
103  ( maxMass - minMass ) );
104  effResMass = minMass + ( maxMass - minMass ) * ( 1 + tanhTerm ) / 2;
105  effResMassSq = effResMass * effResMass;
106  }
107 
108  // Decay momentum of either daughter in the resonance rest frame
109  // when resonance mass = rest-mass value, m_0 (PDG value)
110  Double_t term1 = effResMassSq - mDaugSumSq_;
111  Double_t term2 = effResMassSq - mDaugDiffSq_;
112  Double_t term12 = term1 * term2;
113  if ( term12 > 0.0 ) {
114  q0_ = TMath::Sqrt( term12 ) / ( 2.0 * effResMass );
115  } else {
116  q0_ = 0.0;
117  }
118 
119  // Calculate the Blatt-Weisskopf form factor for the case when m = m_0
120  FR0_ = 1.0;
121  if ( this->getSpin() > 0 ) {
122  const LauBlattWeisskopfFactor* resBWFactor = this->getResBWFactor();
123  if ( resBWFactor != nullptr ) {
124  FR0_ = resBWFactor->calcFormFactor( q0_ );
125  }
126  }
127 
128  // Calculate the extra things needed by the G-S shape
129  h0_ = 2.0 * LauConstants::invPi * q0_ / effResMass *
130  TMath::Log( ( effResMass + 2.0 * q0_ ) / ( 2.0 * LauConstants::mPi ) );
131  dhdm0_ = h0_ * ( 1.0 / ( 8.0 * q0_ * q0_ ) - 1.0 / ( 2.0 * effResMassSq ) ) +
132  1.0 / ( LauConstants::twoPi * effResMassSq );
134  TMath::Log( ( effResMass + 2.0 * q0_ ) / ( 2.0 * LauConstants::mPi ) ) +
135  effResMass / ( LauConstants::twoPi * q0_ ) -
136  LauConstants::mPi * LauConstants::mPi * effResMass / ( LauConstants::pi * q0_ * q0_ * q0_ );
137 }
138 
139 LauComplex LauGounarisSakuraiRes::resAmp( Double_t mass, Double_t spinTerm )
140 {
141  // This function returns the complex dynamical amplitude for a Breit-Wigner resonance,
142  // given the invariant mass and cos(helicity) values.
143 
144  LauComplex resAmplitude( 0.0, 0.0 );
145 
146  if ( mass < 1e-10 ) {
147  std::cerr << "WARNING in LauGounarisSakuraiRes::amplitude : mass < 1e-10." << std::endl;
148  return LauComplex( 0.0, 0.0 );
149  } else if ( q0_ < 1e-30 ) {
150  return LauComplex( 0.0, 0.0 );
151  }
152 
153  // Calculate the width of the resonance (as a function of mass)
154  // First, calculate the various form factors.
155  // NB
156  // q is the momentum of either daughter in the resonance rest-frame,
157  // p is the momentum of the bachelor in the resonance rest-frame,
158  // pstar is the momentum of the bachelor in the parent rest-frame.
159  // These quantities have been calculate in LauAbsResonance::amplitude(...)
160 
161  const Double_t resMass = this->getMass();
162  const Double_t resWidth = this->getWidth();
163  const Double_t resRadius = this->getResRadius();
164  const Double_t parRadius = this->getParRadius();
165 
166  // If the mass is floating and its value has changed we need to
167  // recalculate everything that assumes that value
168  // Similarly for the BW radii
169  if ( ( ( ! this->fixMass() ) && resMass != resMass_ ) ||
170  ( ( ! this->fixResRadius() ) && resRadius != resRadius_ ) ||
171  ( ( ! this->fixParRadius() ) && parRadius != parRadius_ ) ) {
172  this->initialise();
173  }
174 
175  const Int_t resSpin = this->getSpin();
176  const Double_t q = this->getQ();
177  const Double_t p = this->getP();
178  const Double_t pstar = this->getPstar();
179 
180  Double_t fFactorR( 1.0 );
181  Double_t fFactorB( 1.0 );
182  if ( resSpin > 0 ) {
183  const LauBlattWeisskopfFactor* resBWFactor = this->getResBWFactor();
184  if ( resBWFactor != nullptr ) {
185  fFactorR = resBWFactor->calcFormFactor( q );
186  }
187 
188  const LauBlattWeisskopfFactor* parBWFactor = this->getParBWFactor();
189  if ( parBWFactor != nullptr ) {
190  switch ( parBWFactor->getRestFrame() ) {
192  fFactorB = parBWFactor->calcFormFactor( p );
193  break;
195  fFactorB = parBWFactor->calcFormFactor( pstar );
196  break;
198  Double_t covFactor = this->getCovFactor();
199  if ( resSpin > 2 ) {
200  covFactor = TMath::Power( covFactor, 1.0 / resSpin );
201  } else if ( resSpin == 2 ) {
202  covFactor = TMath::Sqrt( covFactor );
203  }
204  fFactorB = parBWFactor->calcFormFactor( pstar * covFactor );
205  break;
206  }
207  }
208  }
209  }
210  const Double_t fFactorRRatio = fFactorR / FR0_;
211 
212  const Double_t qRatio = q / q0_;
213  const Double_t qTerm = qRatio * qRatio * qRatio;
214 
215  const Double_t totWidth = resWidth * qTerm * ( resMass / mass ) * fFactorRRatio * fFactorRRatio;
216 
217  const Double_t massSq = mass * mass;
218  const Double_t massSqTerm = resMassSq_ - massSq;
219 
220  const Double_t h = 2.0 * LauConstants::invPi * q / mass *
221  TMath::Log( ( mass + 2.0 * q ) / ( 2.0 * LauConstants::mPi ) );
222  const Double_t f = resWidth * resMassSq_ / ( q0_ * q0_ * q0_ ) *
223  ( q * q * ( h - h0_ ) + massSqTerm * q0_ * q0_ * dhdm0_ );
224 
225  // Compute the complex amplitude
226  resAmplitude = LauComplex( massSqTerm + f, resMass * totWidth );
227 
228  // Scale by the denominator factor, as well as the spin term and Blatt-Weisskopf factors
229  Double_t numerFactor = spinTerm * ( 1.0 + d_ * resWidth / resMass );
230  if ( ! this->ignoreBarrierScaling() ) {
231  numerFactor *= fFactorR * fFactorB;
232  }
233  const Double_t denomFactor = ( massSqTerm + f ) * ( massSqTerm + f ) +
234  resMassSq_ * totWidth * totWidth;
235  resAmplitude.rescale( numerFactor / denomFactor );
236 
237  return resAmplitude;
238 }
239 
240 const std::vector<LauParameter*>& LauGounarisSakuraiRes::getFloatingParameters()
241 {
242  this->clearFloatingParameters();
243 
244  if ( ! this->fixMass() ) {
245  this->addFloatingParameter( this->getMassPar() );
246  }
247  if ( ! this->fixWidth() ) {
248  this->addFloatingParameter( this->getWidthPar() );
249  }
250  if ( ! this->fixResRadius() ) {
251  this->addFloatingParameter( this->getResBWFactor()->getRadiusParameter() );
252  }
253  if ( ! this->fixParRadius() ) {
254  this->addFloatingParameter( this->getParBWFactor()->getRadiusParameter() );
255  }
256 
257  return this->getParameters();
258 }
Double_t getWidth() const
Get the width of the resonance.
RestFrame getRestFrame() const
Retrieve the rest frame information.
Double_t q0_
Momentum of the daughters in the resonance rest frame (at pole mass)
Double_t d_
Extra parameter required by GS shape.
Double_t calcFormFactor(const Double_t p) const
Calculate form factor value.
LauParameter * getMassPar()
Get the mass parameter of the resonance.
LauBlattWeisskopfFactor * getParBWFactor()
Get the centrifugal barrier for the parent decay.
virtual ~LauGounarisSakuraiRes()
Destructor.
virtual void initialise()
Initialise the model.
std::vector< LauParameter * > & getParameters()
Access the list of floating parameters.
Double_t getPstar() const
Get the current value of the bachelor momentum in the parent rest frame.
const Double_t pi
Pi.
Double_t mDaugDiff_
Difference between the two daughter masses.
virtual LauComplex resAmp(Double_t mass, Double_t spinTerm)
Complex resonant amplitude.
Double_t mBachSq_
Square of the bachelor mass.
Double_t h0_
Extra parameter required by GS shape.
Double_t resMass_
The resonance mass.
Double_t parRadius_
The parent barrier radius.
Bool_t fixResRadius() const
Get the status of resonance barrier radius (fixed or released)
Int_t getSpin() const
Get the spin of the resonance.
Class for defining a complex number.
Definition: LauComplex.hh:61
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.
void addFloatingParameter(LauParameter *param)
Add parameter to the list of floating parameters.
const Double_t invPi
One over Pi.
LauGounarisSakuraiRes(LauResonanceInfo *resInfo, const Int_t resPairAmpInt, const LauDaughters *daughters)
Constructor.
Double_t getCovFactor() const
Get the current value of the full spin-dependent covariant factor.
Double_t mDaugDiffSq_
Square of the difference of the two daughter masses.
void rescale(Double_t scaleVal)
Scale this by a factor.
Definition: LauComplex.hh:301
virtual const std::vector< LauParameter * > & getFloatingParameters()
Retrieve the resonance parameters, e.g. so that they can be loaded into a fit.
Double_t getMassParent() const
Get the parent particle mass.
Double_t FR0_
Value of the form factor for resonance decay (at pole mass)
Bool_t fixWidth() const
Get the status of resonance width (fixed or released)
Double_t getMass() const
Get the mass of the resonance.
Class for defining the properties of a resonant particle.
File containing LauConstants namespace.
Bool_t ignoreBarrierScaling() const
Get the ignore barrier factor scaling flag.
Double_t getMassDaug1() const
Get the mass of daughter 1.
Double_t getQ() const
Get the current value of the daughter momentum in the resonance rest frame.
Bool_t fixMass() const
Get the status of resonance mass (fixed or released)
Double_t getParRadius() const
Get the radius of the parent barrier factor.
Double_t getResRadius() const
Get the radius of the resonance barrier factor.
Double_t resRadius_
The resonance barrier radius.
Double_t getMassDaug2() const
Get the mass of daughter 2.
Double_t resWidth_
The resonance width.
Bool_t fixParRadius() const
Get the status of parent barrier radius (fixed or released)
Double_t dhdm0_
Extra parameter required by GS shape.
Double_t mParentSq_
Square of the parent mass.
void clearFloatingParameters()
Clear list of floating parameters.
Abstract class for defining type for resonance amplitude models (Breit-Wigner, Flatte etc....
File containing declaration of LauGounarisSakuraiRes class.
Double_t mDaugSumSq_
Square of the sum of the two daughter masses.
const Double_t mPi
Mass of pi+- (GeV/c^2)
Definition: LauConstants.hh:55
Double_t mDaugSum_
Sum of the two daughter masses.
Class that defines the particular 3-body decay under study.
Definition: LauDaughters.hh:47
LauBlattWeisskopfFactor * getResBWFactor()
Get the centrifugal barrier for the resonance decay.
Double_t getP() const
Get the current value of the bachelor momentum in the resonance rest frame.
LauParameter * getWidthPar()
Get the width parameter of the resonance.
Double_t getMassBachelor() const
Get the mass of the bachelor daughter.
const Double_t twoPi
Two times Pi.
Class that implements the Blatt-Weisskopf barrier factor.
Double_t resMassSq_
Square of the resonance mass.