evtgen is hosted by Hepforge, IPPP Durham
EvtGen  2.0.0
Monte Carlo generator of particle decays, in particular the weak decays of heavy flavour particles such as B mesons.
EvtLambdacPHH.cpp
Go to the documentation of this file.
1 
2 /***********************************************************************
3 * Copyright 1998-2020 CERN for the benefit of the EvtGen authors *
4 * *
5 * This file is part of EvtGen. *
6 * *
7 * EvtGen is free software: you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation, either version 3 of the License, or *
10 * (at your option) any later version. *
11 * *
12 * EvtGen is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
16 * *
17 * You should have received a copy of the GNU General Public License *
18 * along with EvtGen. If not, see <https://www.gnu.org/licenses/>. *
19 ***********************************************************************/
20 
22 
23 #include "EvtGenBase/EvtConst.hh"
24 #include "EvtGenBase/EvtGenKine.hh"
25 #include "EvtGenBase/EvtPDL.hh"
27 #include "EvtGenBase/EvtPatches.hh"
28 #include "EvtGenBase/EvtRandom.hh"
29 #include "EvtGenBase/EvtReport.hh"
32 
33 #include <algorithm>
34 #include <cmath>
35 #include <utility>
36 
38  _d1( 0 ),
39  _d2( 1 ),
40  _d3( 3 ),
41  _Nplusplus( 0.46 ),
42  _Nplusminus( 1.0 ),
43  _Nminusplus( 0.18 ),
44  _Nminusminus( 0.94 ),
45  _phiNplusplus( 3.48 ),
46  _phiNplusminus( 0.00 ),
47  _phiNminusplus( 0.75 ),
48  _phiNminusminus( 1.13 ),
49  _E1( 0.52 ),
50  _phiE1( -1.01 ),
51  _E2( 0.20 ),
52  _phiE2( 2.35 ),
53  _E3( 0.21 ),
54  _phiE3( 3.46 ),
55  _E4( 0.16 ),
56  _phiE4( 5.29 ),
57  _F1( 0.17 ),
58  _phiF1( 4.98 ),
59  _F2( 0.38 ),
60  _phiF2( 4.88 ),
61  _H1( 0.18 ),
62  _phiH1( 5.93 ),
63  _H2( 0.20 ),
64  _phiH2( -0.06 ),
65  _NRNorm( 1.0 ),
66  _KstarNorm( 1.0 ),
67  _DeltaNorm( 1.0 ),
68  _LambdaNorm( 1.0 ),
69  _KstarM( 0.890 ),
70  _KstarW( 0.0498 ),
71  _KstarR( 3.40 ),
72  _DeltaM( 1.232 ),
73  _DeltaW( 0.1120 ),
74  _DeltaR( 5.22 ),
75  _LambdaM( 1.520 ),
76  _LambdaW( 0.0156 ),
77  _LambdaR( 6.29 ),
78  _Lambda_cR( 5.07 ),
79  _zprime(),
80  _p4_Lambda_c(),
81  _zpMag( 0.0 ),
82  _p4_Lambdac_Mag( 0.0 )
83 {
84  // Fermilab E791 values from MINUIT fit arXiv:hep-ex/9912003v1
85 }
86 
88 {
89  return "LAMBDAC_PHH";
90 }
91 
93 {
94  return new EvtLambdacPHH;
95 }
96 
97 bool compareId( const std::pair<EvtId, int>& left,
98  const std::pair<EvtId, int>& right )
99 {
100  // Compare id numbers to achieve the ordering K-, pi+ and p
101  bool result( false );
102 
103  int leftPDGid = EvtPDL::getStdHep( left.first );
104  int rightPDGid = EvtPDL::getStdHep( right.first );
105 
106  if ( leftPDGid < rightPDGid ) {
107  result = true;
108  }
109 
110  return result;
111 }
112 
114 {
115  static EvtId KM = EvtPDL::getId( "K-" );
116  static EvtId PIP = EvtPDL::getId( "pi+" );
117  static EvtId LAMBDAC = EvtPDL::getId( "Lambda_c+" );
118  static EvtId LAMBDACB = EvtPDL::getId( "anti-Lambda_c-" );
119  static EvtId PROTON = EvtPDL::getId( "p+" );
120 
121  // check that there are 0 or 1 arguments and 3 daughters
122  checkNArg( 0, 1 );
123  checkNDaug( 3 );
124 
125  EvtId parnum = getParentId();
130 
131  std::vector<std::pair<EvtId, int>> daughters;
132  if ( parnum == LAMBDAC ) {
133  for ( int i = 0; i < 3; ++i ) {
134  daughters.push_back( std::make_pair( getDaug( i ), i ) );
135  }
136  } else {
137  for ( int i = 0; i < 3; ++i ) {
138  daughters.push_back(
139  std::make_pair( EvtPDL::chargeConj( getDaug( i ) ), i ) );
140  }
141  }
142 
143  // Sort daughters, they will end up in the order KM, PIP and PROTON
144  std::sort( daughters.begin(), daughters.end(), compareId );
145 
146  if ( parnum == LAMBDAC || parnum == LAMBDACB ) {
147  if ( daughters[0].first == KM && daughters[1].first == PIP &&
148  daughters[2].first == PROTON ) {
149  _d1 = daughters[0].second;
150  _d2 = daughters[1].second;
151  _d3 = daughters[2].second;
152  }
153  }
154 
155  // Find resonance dynamics normalisations
157 
158  // Print out expected fit fractions
159  getFitFractions();
160 }
161 
163 {
164  // Generate events uniform in the Lambda_c Dalitz plot and find the
165  // normalisation integrals of the Breit-Wigner lineshapes
166 
167  // Lambda_c -> K- pi+ p
168  int nDaug( 3 );
169  EvtVector4R p4Daug[3];
170 
171  double mDaug[3] = {EvtPDL::getMeanMass( EvtPDL::getId( "K-" ) ),
174 
175  double norm[3] = {0.0, 0.0, 0.0};
176 
177  // sample size
178  int N( 100000 );
179  for ( int i = 0; i < N; i++ ) {
180  double mParent = EvtPDL::getMass( EvtPDL::getId( "Lambda_c+" ) );
181  EvtVector4R p0( mParent, 0.0, 0.0, 0.0 );
182 
183  // Generate uniform 4 momenta
184  EvtGenKine::PhaseSpace( nDaug, mDaug, p4Daug, mParent );
185 
186  EvtResonance2 LambdacpKpi1( p0, p4Daug[0], p4Daug[1], 1.0, 0.0, _KstarW,
187  _KstarM, 1, true, _KstarR,
188  _Lambda_cR ); // K*0 -> K- and pi+; L = 1
189  EvtResonance2 LambdacpKpi2( p0, p4Daug[2], p4Daug[1], 1.0, 0.0, _DeltaW,
190  _DeltaM, 1, true, _DeltaR,
191  _Lambda_cR ); // Delta++ -> p and pi+; L = 1
192  EvtResonance2 LambdacpKpi3(
193  p0, p4Daug[2], p4Daug[0], 1.0, 0.0, _LambdaW, _LambdaM, 2, true,
194  _LambdaR, _Lambda_cR ); // Lambda(1520) -> K- and p; L = 2
195 
196  // Sum amplitude magnitude squared
197  norm[0] += abs2( LambdacpKpi1.resAmpl() );
198  norm[1] += abs2( LambdacpKpi2.resAmpl() );
199  norm[2] += abs2( LambdacpKpi3.resAmpl() );
200  }
201 
202  // Set normalisation lineshape multiplication factors
203  double N0( N * 1.0 );
204 
205  // Scale NR to get sensible relative fit fractions
206  _NRNorm = 1.0 / 3.0;
207  // Set this using a decay file parameter if required
208  if ( getNArg() > 1 ) {
209  _NRNorm = getArg( 1 );
210  }
211 
212  if ( norm[0] > 0.0 ) {
213  _KstarNorm = sqrt( N0 / norm[0] );
214  }
215  if ( norm[1] > 0.0 ) {
216  _DeltaNorm = sqrt( N0 / norm[1] );
217  }
218  if ( norm[2] > 0.0 ) {
219  _LambdaNorm = sqrt( N0 / norm[2] );
220  }
221 }
222 
224 {
225  // Generate events uniform in the Lambda_c Dalitz plot and find the
226  // fit fractions for each resonance
227 
228  // Lambda_c -> K- pi+ p
229  int nDaug( 3 );
230  EvtVector4R p4Daug[3];
231 
232  double mDaug[3] = {EvtPDL::getMeanMass( EvtPDL::getId( "K-" ) ),
235 
236  double FitFracTop[4] = {0.0, 0.0, 0.0, 0.0};
237  double FitFracDenom = 0.0;
238 
239  // sample size
240  int N( 100000 );
241  for ( int i = 0; i < N; i++ ) {
242  double mParent = EvtPDL::getMass( EvtPDL::getId( "Lambda_c+" ) );
243  EvtVector4R p0( mParent, 0.0, 0.0, 0.0 );
244 
245  // Generate uniform 4 momenta
246  EvtGenKine::PhaseSpace( nDaug, mDaug, p4Daug, mParent );
247 
248  EvtResonance2 LambdacpKpi0( p0, p4Daug[0], p4Daug[1], 1.0, 0.0, 0.0, 0.0,
249  0, true, 0.0, 0.0 ); // Non resonant (NR)
250  EvtResonance2 LambdacpKpi1( p0, p4Daug[0], p4Daug[1], 1.0, 0.0, _KstarW,
251  _KstarM, 1, true, _KstarR,
252  _Lambda_cR ); // K*0 -> K- and pi+; L = 1
253  EvtResonance2 LambdacpKpi2( p0, p4Daug[2], p4Daug[1], 1.0, 0.0, _DeltaW,
254  _DeltaM, 1, true, _DeltaR,
255  _Lambda_cR ); // Delta++ -> p and pi+; L = 1
256  EvtResonance2 LambdacpKpi3(
257  p0, p4Daug[2], p4Daug[0], 1.0, 0.0, _LambdaW, _LambdaM, 2, true,
258  _LambdaR, _Lambda_cR ); // Lambda(1520) -> K- and p; L = 2
259 
260  std::vector<EvtComplex> ampNonRes =
262  std::vector<EvtComplex> ampKstar =
264  std::vector<EvtComplex> ampDelta =
266  std::vector<EvtComplex> ampLambda =
268 
269  // Combine resonance amplitudes for a given spin configuration
270  EvtComplex amp00 = ampNonRes[0] + ampKstar[0] + ampDelta[0] +
271  ampLambda[0];
272  EvtComplex amp01 = ampNonRes[1] + ampKstar[1] + ampDelta[1] +
273  ampLambda[1];
274  EvtComplex amp10 = ampNonRes[2] + ampKstar[2] + ampDelta[2] +
275  ampLambda[2];
276  EvtComplex amp11 = ampNonRes[3] + ampKstar[3] + ampDelta[3] +
277  ampLambda[3];
278 
279  // Fit fraction numerator terms
280  FitFracTop[0] += abs2( ampNonRes[0] ) + abs2( ampNonRes[1] ) +
281  abs2( ampNonRes[2] ) + abs2( ampNonRes[3] );
282  FitFracTop[1] += abs2( ampKstar[0] ) + abs2( ampKstar[1] ) +
283  abs2( ampKstar[2] ) + abs2( ampKstar[3] );
284  FitFracTop[2] += abs2( ampDelta[0] ) + abs2( ampDelta[1] ) +
285  abs2( ampDelta[2] ) + abs2( ampDelta[3] );
286  FitFracTop[3] += abs2( ampLambda[0] ) + abs2( ampLambda[1] ) +
287  abs2( ampLambda[2] ) + abs2( ampLambda[3] );
288 
289  // Fit fraction common denominator
290  FitFracDenom += abs2( amp00 ) + abs2( amp01 ) + abs2( amp10 ) +
291  abs2( amp11 );
292  }
293 
294  EvtGenReport( EVTGEN_INFO, "EvtLambdacPHH" )
295  << "FitFracs: NR = " << FitFracTop[0] / FitFracDenom
296  << ", K* = " << FitFracTop[1] / FitFracDenom
297  << ", Del = " << FitFracTop[2] / FitFracDenom
298  << ", Lam = " << FitFracTop[3] / FitFracDenom << std::endl;
299 }
300 
302 {
303  // Default value
304  setProbMax( 10.0 );
305 
306  // Set probability using decay file parameter
307  if ( getNArg() > 0 ) {
308  setProbMax( getArg( 0 ) );
309  }
310 }
311 
313 {
314  // Daughter order: 1 = K-, 2 = pi+, 3 = p
316 
317  // 4-momenta in the rest frame of the Lambda_c
318  EvtVector4R p4_p( p->mass(), 0.0, 0.0, 0.0 );
319  EvtVector4R moms1 = p->getDaug( _d1 )->getP4();
320  EvtVector4R moms2 = p->getDaug( _d2 )->getP4();
321  EvtVector4R moms3 = p->getDaug( _d3 )->getP4();
322 
323  // Lambda_c decay mode resonances. Spin L values from strong decay parity conservation:
324  // parity(resonance) = parity(daug1)*parity(daug2)*(-1)^L
325  EvtResonance2 LambdacpKpi0( p4_p, moms1, moms2, 1.0, 0.0, 0.0, 0.0, 0, true,
326  0.0, 0.0 ); // Non-resonant L = 0
327  EvtResonance2 LambdacpKpi1( p4_p, moms1, moms2, 1.0, 0.0, _KstarW, _KstarM,
328  1, true, _KstarR,
329  _Lambda_cR ); // K*0 -> K- and pi+; L = 1
330  EvtResonance2 LambdacpKpi2( p4_p, moms3, moms2, 1.0, 0.0, _DeltaW, _DeltaM,
331  1, true, _DeltaR,
332  _Lambda_cR ); // Delta++ -> p and pi+; L = 1
333  EvtResonance2 LambdacpKpi3( p4_p, moms3, moms1, 1.0, 0.0, _LambdaW,
334  _LambdaM, 2, true, _LambdaR,
335  _Lambda_cR ); // Lambda(1520) -> K- and p; L = 2
336 
337  // Define the "beam" direction, used in Fig 1 of hep-ex/9912003v1
338  EvtVector4R beam( 0.0, 0.0, 0.0, 1.0 );
339  EvtParticle* parent = p->getParent();
340  if ( parent ) {
341  // If non prompt, the beam is along the direction of the mother
342  EvtVector4R p4_Lambda_c_mother = parent->getP4Lab();
343  p4_Lambda_c_mother.applyBoostTo( p->getP4Lab() );
344  beam = p4_Lambda_c_mother;
345  }
346 
347  _p4_Lambda_c = p->getP4Lab();
349 
350  // Define the unit vector denoting the "z" axis in Fig 1
351  _zprime = -1.0 * _p4_Lambda_c.cross( beam );
352  _zprime.applyBoostTo( _p4_Lambda_c, true ); // From lab frame to Lambda_c
353 
354  _zpMag = _zprime.d3mag();
355  // Check if zprime magnitude is non-zero
356  if ( _zpMag > 0.0 ) {
357  // Normalise
358  _zprime /= _zpMag;
359  } else {
360  // Set as the z direction
361  _zprime.set( 0.0, 0.0, 0.0, 1.0 );
362  }
363  // Update normalised |z'|
364  _zpMag = 1.0;
365 
366  // Get the amplitudes: non-resonant, K*, Delta and Lambda
367  std::vector<EvtComplex> ampNonRes = calcResAmpTerms( EvtLambdacPHH::NonReson,
368  LambdacpKpi0, _NRNorm );
369  std::vector<EvtComplex> ampKstar =
371  std::vector<EvtComplex> ampDelta =
373  std::vector<EvtComplex> ampLambda =
375 
376  // Combine resonance amplitudes for a given spin configuration
377  EvtComplex amp00 = ampNonRes[0] + ampKstar[0] + ampDelta[0] + ampLambda[0];
378  EvtComplex amp01 = ampNonRes[1] + ampKstar[1] + ampDelta[1] + ampLambda[1];
379  EvtComplex amp10 = ampNonRes[2] + ampKstar[2] + ampDelta[2] + ampLambda[2];
380  EvtComplex amp11 = ampNonRes[3] + ampKstar[3] + ampDelta[3] + ampLambda[3];
381 
382  // Set the amplitude components
383  vertex( 0, 0, amp00 );
384  vertex( 0, 1, amp01 );
385  vertex( 1, 0, amp10 );
386  vertex( 1, 1, amp11 );
387 }
388 
389 std::vector<EvtComplex> EvtLambdacPHH::calcResAmpTerms(
390  EvtLambdacPHH::LcResLabel resIndex, const EvtResonance2& res, double norm ) const
391 {
392  // Initialise the resonance and daughter theta and phi angles
393  double thetaRes( 0.0 ), phiRes( 0.0 ), phiPrimeDaug( 0.0 ),
394  thetaPrimeDaug( 0.0 );
395  // Initialise beta rotation angle
396  double beta_res( 0.0 );
397 
398  EvtVector4R res_atproton( 0.0, 0.0, 0.0, 0.0 ),
399  Lc_atproton( 0.0, 0.0, 0.0, 0.0 );
400 
401  // Initialise Amplitude terms
402  EvtComplex term1( 0.0 ), term2( 0.0 ), term3( 0.0 ), term4( 0.0 );
403  // Normalised dynamical amplitude
404  EvtComplex resAmp( norm, 0.0 );
405 
406  // Angles are not needed for the non-resonant amplitude
407  if ( resIndex != EvtLambdacPHH::NonReson ) {
408  resAmp = res.resAmpl() * norm;
409  // Resonance and daughter 4 momenta
410  EvtVector4R p4d1 = res.p4_d1();
411  EvtVector4R p4d2 = res.p4_d2();
412  EvtVector4R p4Res = p4d1 + p4d2;
413  EvtVector4R p4_d3 = res.p4_p() - p4Res;
414 
415  double p4ResMag = p4Res.d3mag();
416 
417  // 4-momenta for theta' and phi' angles
418  EvtVector4R yRes = -1.0 * p4_d3.cross( _zprime );
419 
420  EvtVector4R res_d1 = p4d1;
421  res_d1.applyBoostTo( p4Res, true );
422  double res_d1_Mag = res_d1.d3mag();
423 
424  EvtVector4R res_d3 = -1.0 * p4_d3;
425  double res_d3_Mag = res_d3.d3mag();
426 
427  thetaPrimeDaug = getACos( res_d1.dot( res_d3 ), res_d1_Mag * res_d3_Mag );
428 
429  res_atproton = p4Res;
430  res_atproton.applyBoostTo( p4d1, true );
431  double res_atproton_mag = res_atproton.d3mag();
432 
433  Lc_atproton = res.p4_p();
434  Lc_atproton.applyBoostTo( p4d1, true );
435  double Lc_atproton_mag = Lc_atproton.d3mag();
436 
437  // Check that the momentum of the Lambda_c is not zero, as well as a valid zprime vector
438  if ( _p4_Lambdac_Mag > 0.0 && _zpMag > 0.0 ) {
439  thetaRes = getACos( -1.0 * p4Res.dot( _zprime ), p4ResMag );
440  phiRes = getASin( -1.0 * p4Res.dot( _p4_Lambda_c ),
441  sin( thetaRes ) * _p4_Lambdac_Mag * p4ResMag );
442  phiPrimeDaug = getASin( res_d1.dot( yRes ), sin( thetaPrimeDaug ) *
443  res_d1_Mag *
444  yRes.d3mag() );
445 
446  } else {
447  // Use randomised angles with flat probability distributions
448  thetaRes = EvtRandom::Flat( 0.0, EvtConst::pi );
449  phiRes = EvtRandom::Flat( 0.0, EvtConst::twoPi );
450  phiPrimeDaug = EvtRandom::Flat( 0.0, EvtConst::twoPi );
451  }
452 
453  if ( res_atproton_mag > 0.0 && Lc_atproton_mag > 0.0 ) {
454  // Extra rotation to go to the proton helicity frame for the two resonances Delta++ and Lambda.
455  // No rotation is needed for K*. Use the momenta boosted to the proton restframe
456 
457  beta_res = getACos( res_atproton.dot( Lc_atproton ),
458  res_atproton_mag * Lc_atproton_mag );
459 
460  } else {
461  beta_res = EvtRandom::Flat( 0.0, EvtConst::pi );
462  }
463  }
464 
465  // Find the spin-dependent amplitudes
466  if ( resIndex == EvtLambdacPHH::NonReson ||
467  resIndex == EvtLambdacPHH::Kstar ) {
468  term1 = resAmp * DecayAmp3( resIndex, 1, 1, thetaRes, phiRes,
469  thetaPrimeDaug, phiPrimeDaug );
470  term2 = resAmp * DecayAmp3( resIndex, 1, -1, thetaRes, phiRes,
471  thetaPrimeDaug, phiPrimeDaug );
472  term3 = resAmp * DecayAmp3( resIndex, -1, 1, thetaRes, phiRes,
473  thetaPrimeDaug, phiPrimeDaug );
474  term4 = resAmp * DecayAmp3( resIndex, -1, -1, thetaRes, phiRes,
475  thetaPrimeDaug, phiPrimeDaug );
476 
477  } else {
478  double rotate_00 = EvtdFunction::d( 1, 1, 1, beta_res );
479  double rotate_10 = EvtdFunction::d( 1, -1, 1, beta_res );
480  double rotate_11 = EvtdFunction::d( 1, -1, -1, beta_res );
481  double rotate_01 = EvtdFunction::d( 1, 1, -1, beta_res );
482 
483  // Delta and Lambda need to be rotated before summing over the proton helicity axis
484  EvtComplex termA = resAmp * DecayAmp3( resIndex, 1, 1, thetaRes, phiRes,
485  thetaPrimeDaug, phiPrimeDaug );
486  EvtComplex termB = resAmp * DecayAmp3( resIndex, 1, -1, thetaRes, phiRes,
487  thetaPrimeDaug, phiPrimeDaug );
488  EvtComplex termC = resAmp * DecayAmp3( resIndex, -1, 1, thetaRes, phiRes,
489  thetaPrimeDaug, phiPrimeDaug );
490  EvtComplex termD = resAmp * DecayAmp3( resIndex, -1, -1, thetaRes, phiRes,
491  thetaPrimeDaug, phiPrimeDaug );
492 
493  term1 = rotate_00 * termA + rotate_10 * termB;
494  term2 = rotate_01 * termA + rotate_11 * termB;
495  term3 = rotate_00 * termC + rotate_10 * termD;
496  term4 = rotate_01 * termC + rotate_11 * termD;
497  }
498 
499  // Return the spin amplitudes as a vector
500  std::vector<EvtComplex> ampVect;
501  ampVect.push_back( term1 );
502  ampVect.push_back( term2 );
503  ampVect.push_back( term3 );
504  ampVect.push_back( term4 );
505 
506  return ampVect;
507 }
508 
510  int mprime, double theta_res, double phi_res,
511  double theta_prime_daughter_res,
512  double phi_prime_daughter_res ) const
513 {
514  // Find the amplitudes given in Tables 3 to 6 in the paper.
515  // Wigner d-functions use 2*spin, e.g. d(1/2, 1/2, 1/2) -> d(1, 1, 1)
516  EvtComplex term1( 0.0, 0.0 ), term2( 0.0, 0.0 );
517 
518  if ( resonance == EvtLambdacPHH::NonReson ) {
519  // Non-resonant: table 6
520  if ( m == 1 && mprime == 1 ) {
521  term1 = _Nplusplus *
522  EvtComplex( cos( _phiNplusplus ), sin( _phiNplusplus ) );
523 
524  } else if ( m == 1 && mprime == -1 ) {
525  term1 = _Nplusminus *
526  EvtComplex( cos( _phiNplusminus ), sin( _phiNplusminus ) );
527 
528  } else if ( m == -1 && mprime == 1 ) {
529  term1 = _Nminusplus *
530  EvtComplex( cos( _phiNminusplus ), sin( _phiNminusplus ) );
531 
532  } else if ( m == -1 && mprime == -1 ) {
533  term1 = _Nminusminus * EvtComplex( cos( _phiNminusminus ),
534  sin( _phiNminusminus ) );
535  }
536 
537  } else if ( resonance == EvtLambdacPHH::Kstar ) {
538  // K*0(1-) resonance: table 3
539  if ( m == 1 && mprime == 1 ) {
540  term1 = fampl3( _E1, _phiE1, 1, 1, 1, theta_res, 2, 2, 0,
541  theta_prime_daughter_res, phi_prime_daughter_res );
542  term2 = fampl3( _E2, _phiE2, 1, 1, -1, theta_res, 2, 0, 0,
543  theta_prime_daughter_res, phi_res );
544 
545  } else if ( m == 1 && mprime == -1 ) {
546  term1 = fampl3( _E3, _phiE3, 1, 1, 1, theta_res, 2, 0, 0,
547  theta_prime_daughter_res, 0.0 );
548  term2 = fampl3( _E4, _phiE4, 1, 1, -1, theta_res, 2, -2, 0,
549  theta_prime_daughter_res,
550  phi_res - phi_prime_daughter_res );
551 
552  } else if ( m == -1 && mprime == 1 ) {
553  term1 = fampl3( _E1, _phiE1, 1, -1, 1, theta_res, 2, 2, 0,
554  theta_prime_daughter_res,
555  -( phi_res - phi_prime_daughter_res ) );
556  term2 = fampl3( _E2, _phiE2, 1, -1, -1, theta_res, 2, 0, 0,
557  theta_prime_daughter_res, 0.0 );
558 
559  } else if ( m == -1 && mprime == -1 ) {
560  term1 = fampl3( _E3, _phiE3, 1, -1, 1, theta_res, 2, 0, 0,
561  theta_prime_daughter_res, -phi_res );
562  term2 = fampl3( _E4, _phiE4, 1, -1, -1, theta_res, 2, -2, 0,
563  theta_prime_daughter_res, -phi_prime_daughter_res );
564  }
565 
566  } else if ( resonance == EvtLambdacPHH::Delta ) {
567  // Delta++(3/2+) resonance: table 4
568  if ( m == 1 && mprime == 1 ) {
569  term1 = fampl3( _F1, _phiF1, 1, 1, 1, theta_res, 3, 1, 1,
570  theta_prime_daughter_res, 0.0 );
571  term2 = fampl3( _F2, _phiF2, 1, 1, -1, theta_res, 3, -1, 1,
572  theta_prime_daughter_res,
573  phi_res - phi_prime_daughter_res );
574 
575  } else if ( m == 1 && mprime == -1 ) {
576  term1 = fampl3( _F1, _phiF1, 1, 1, 1, theta_res, 3, 1, -1,
577  theta_prime_daughter_res, phi_prime_daughter_res );
578  term2 = fampl3( _F2, _phiF2, 1, 1, -1, theta_res, 3, -1, -1,
579  theta_prime_daughter_res, phi_res );
580 
581  } else if ( m == -1 && mprime == 1 ) {
582  term1 = fampl3( _F1, _phiF1, 1, -1, 1, theta_res, 3, 1, 1,
583  theta_prime_daughter_res, -phi_res );
584  term2 = fampl3( _F2, _phiF2, 1, -1, -1, theta_res, 3, -1, 1,
585  theta_prime_daughter_res, -phi_prime_daughter_res );
586 
587  } else if ( m == -1 && mprime == -1 ) {
588  term1 = fampl3( _F1, _phiF1, 1, -1, 1, theta_res, 3, 1, -1,
589  theta_prime_daughter_res,
590  -( phi_res - phi_prime_daughter_res ) );
591  term2 = fampl3( _F2, _phiF2, 1, -1, -1, theta_res, 3, -1, -1,
592  theta_prime_daughter_res, 0.0 );
593  }
594 
595  } else if ( resonance == EvtLambdacPHH::Lambda ) {
596  // Lambda(1520)(3/2-) resonance: table 5
597  if ( m == 1 && mprime == 1 ) {
598  term1 = fampl3( _H1, _phiH1, 1, 1, 1, theta_res, 3, 1, 1,
599  theta_prime_daughter_res, 0.0 );
600  term2 = fampl3( _H2, _phiH2, 1, 1, -1, theta_res, 3, -1, 1,
601  theta_prime_daughter_res,
602  phi_res - phi_prime_daughter_res );
603 
604  } else if ( m == 1 && mprime == -1 ) {
605  term1 = -1.0 * fampl3( _H1, _phiH1, 1, 1, 1, theta_res, 3, 1, -1,
606  theta_prime_daughter_res,
607  phi_prime_daughter_res );
608  term2 = -1.0 * fampl3( _H2, _phiH2, 1, 1, -1, theta_res, 3, -1, -1,
609  theta_prime_daughter_res, phi_res );
610 
611  } else if ( m == -1 && mprime == 1 ) {
612  term1 = fampl3( _H1, _phiH1, 1, -1, 1, theta_res, 3, 1, 1,
613  theta_prime_daughter_res, -phi_res );
614  term2 = fampl3( _H2, _phiH2, 1, -1, -1, theta_res, 3, -1, 1,
615  theta_prime_daughter_res, -phi_prime_daughter_res );
616 
617  } else if ( m == -1 && mprime == -1 ) {
618  term1 = -1.0 * fampl3( _H1, _phiH1, 1, -1, 1, theta_res, 3, 1, -1,
619  theta_prime_daughter_res,
620  -( phi_res - phi_prime_daughter_res ) );
621  term2 = -1.0 * fampl3( _H2, _phiH2, 1, -1, -1, theta_res, 3, -1, -1,
622  theta_prime_daughter_res, 0.0 );
623  }
624  }
625 
626  EvtComplex Amplitude = term1 + term2;
627  return Amplitude;
628 }
629 
630 EvtComplex EvtLambdacPHH::fampl3( double amplitude_res, double phi_res,
631  int spinMother, int m_spinMother,
632  int m_prime_spinMother, double theta_res,
633  float spin_res, float m_spin_res,
634  float m_prime_spin_res,
635  double theta_daughter_res,
636  double phi_prime_daughter_res ) const
637 {
638  double dTerm1 = EvtdFunction::d( spinMother, m_spinMother,
639  m_prime_spinMother, theta_res );
640  double dTerm2 = EvtdFunction::d( spin_res, m_spin_res, m_prime_spin_res,
641  theta_daughter_res );
642 
643  EvtComplex amp_phase1 = EvtComplex( cos( phi_res ), sin( phi_res ) );
644  EvtComplex amp_phase2 = EvtComplex( cos( phi_prime_daughter_res ),
645  sin( phi_prime_daughter_res ) );
646 
647  EvtComplex partial_amp = amplitude_res * amp_phase1 * dTerm1 * amp_phase2 *
648  dTerm2;
649 
650  return partial_amp;
651 }
652 
653 double EvtLambdacPHH::getACos( double num, double denom ) const
654 {
655  // Find inverse cosine, checking ratio is within +- 1
656  double angle( 0.0 ), ratio( 0.0 );
657  if ( fabs( denom ) > 0.0 ) {
658  ratio = num / denom;
659  }
660 
661  if ( fabs( ratio ) <= 1.0 ) {
662  angle = acos( ratio );
663  }
664 
665  return angle;
666 }
667 
668 double EvtLambdacPHH::getASin( double num, double denom ) const
669 {
670  // Find inverse sine, checking ratio is within +- 1
671  double angle( 0.0 ), ratio( 0.0 );
672  if ( fabs( denom ) > 0.0 ) {
673  ratio = num / denom;
674  }
675 
676  if ( fabs( ratio ) <= 1.0 ) {
677  angle = asin( ratio );
678  }
679 
680  return angle;
681 }
std::string getName() override
EvtComplex resAmpl() const
double _phiNplusminus
void initProbMax() override
EvtParticle * getParent() const
Definition: EvtParticle.cpp:96
double getArg(unsigned int j)
EvtVector4R getP4Lab() const
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=0)
Definition: EvtReport.cpp:33
EvtVector4R cross(const EvtVector4R &v2)
double getACos(double num, double denom) const
EvtVector4R _zprime
static const double twoPi
Definition: EvtConst.hh:27
static double getMeanMass(EvtId i)
Definition: EvtPDL.cpp:314
double abs2(const EvtComplex &c)
Definition: EvtComplex.hh:209
void set(int i, double d)
Definition: EvtVector4R.hh:167
double _phiNminusminus
const EvtVector4R & p4_d1() const
EvtId * getDaugs()
Definition: EvtDecayBase.hh:66
void setProbMax(double prbmx)
double _phiNplusplus
Definition: EvtId.hh:27
static const double pi
Definition: EvtConst.hh:26
EvtId getParentId() const
Definition: EvtDecayBase.hh:61
void vertex(const EvtComplex &amp)
Definition: EvtDecayAmp.hh:37
std::vector< EvtComplex > calcResAmpTerms(EvtLambdacPHH::LcResLabel resIndex, const EvtResonance2 &res, double norm) const
double initializePhaseSpace(unsigned int numdaughter, EvtId *daughters, bool forceResetMasses=false, double poleSize=-1., int whichTwo1=0, int whichTwo2=1)
void decay(EvtParticle *p) override
EvtComplex fampl3(double amplitude_res, double phi_res, int spinMother, int m_spinMother, int m_prime_spinMother, double theta_res, float spin_res, float m_spin_res, float m_prime_spin_res, double theta_daughter_res, double phi_prime_daughter_res) const
double _Nminusplus
void checkNDaug(int d1, int d2=-1)
void checkSpinParent(EvtSpinType::spintype sp)
static double Flat()
Definition: EvtRandom.cpp:72
void checkNArg(int a1, int a2=-1, int a3=-1, int a4=-1)
double _p4_Lambdac_Mag
static EvtId getId(const std::string &name)
Definition: EvtPDL.cpp:287
const EvtVector4R & getP4() const
void applyBoostTo(const EvtVector4R &p4, bool inverse=false)
void checkSpinDaughter(int d1, EvtSpinType::spintype sp)
static double PhaseSpace(int ndaug, double mass[30], EvtVector4R p4[30], double mp)
Definition: EvtGenKine.cpp:46
double mass() const
void calcNormalisations()
double d3mag() const
int getNDaug() const
Definition: EvtDecayBase.hh:65
double _phiNminusplus
double _Nminusminus
void getFitFractions()
EvtDecayBase * clone() override
EvtParticle * getDaug(int i)
Definition: EvtParticle.cpp:91
EvtComplex DecayAmp3(EvtLambdacPHH::LcResLabel resonance, int m, int mprime, double theta_res, double phi_res, double theta_prime_daughter_res, double phi_prime_daughter_res) const
bool compareId(const std::pair< EvtId, int > &left, const std::pair< EvtId, int > &right)
double _LambdaNorm
double getASin(double num, double denom) const
static int first
Definition: EvtPDL.cpp:38
static double getMass(EvtId i)
Definition: EvtPDL.cpp:319
const EvtVector4R & p4_d2() const
void init() override
static double d(int j, int m1, int m2, double theta)
const EvtVector4R & p4_p() const
int getNArg() const
Definition: EvtDecayBase.hh:68
EvtVector4R _p4_Lambda_c
static EvtId chargeConj(EvtId id)
Definition: EvtPDL.cpp:207
static int getStdHep(EvtId id)
Definition: EvtPDL.cpp:362
double dot(const EvtVector4R &v2) const
double _Nplusminus
EvtId getDaug(int i) const
Definition: EvtDecayBase.hh:67