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.
EvtBToDiBaryonlnupQCD.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/EvtId.hh"
24 #include "EvtGenBase/EvtIdSet.hh"
25 #include "EvtGenBase/EvtPDL.hh"
27 #include "EvtGenBase/EvtPatches.hh"
28 #include "EvtGenBase/EvtReport.hh"
32 
34 {
35  return "BToDiBaryonlnupQCD";
36 }
37 
39 {
40  return new EvtBToDiBaryonlnupQCD;
41 }
42 
44 {
45  p->initializePhaseSpace( getNDaug(), getDaugs(), true );
46 
47  calcAmp_->CalcAmp( p, _amp2 );
48 }
49 
51 {
52  if ( !( getNArg() == 6 || getNArg() == 7 ) ) {
53  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
54  << "EvtBToDiBaryonlnupQCD model expected "
55  << " 6 or 7 arguments but found:" << getNArg() << std::endl;
56  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
57  << "Will terminate execution!" << std::endl;
58  ::abort();
59  }
60 
61  if ( getNDaug() != 4 ) {
62  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
63  << "Wrong number of daughters in EvtBToDiBaryonlnupQCD model: "
64  << "4 daughters expected but found: " << getNDaug() << std::endl;
65  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
66  << "Will terminate execution!" << std::endl;
67  ::abort();
68  }
69 
70  // We expect B -> baryon baryon lepton neutrino
73  EvtSpinType::spintype neutrinoType = EvtPDL::getSpinType( getDaug( 3 ) );
74 
75  if ( parentType != EvtSpinType::SCALAR ) {
76  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
77  << "EvtBToDiBaryonlnupQCD model expected "
78  << " a SCALAR parent, found:" << EvtPDL::name( getParentId() )
79  << std::endl;
80  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
81  << "Will terminate execution!" << std::endl;
82  ::abort();
83  }
84 
85  if ( leptonType != EvtSpinType::DIRAC ) {
86  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
87  << "EvtBToDiBaryonlnupQCD model expected "
88  << " a DIRAC 3rd daughter, found:" << EvtPDL::name( getDaug( 2 ) )
89  << std::endl;
90  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
91  << "Will terminate execution!" << std::endl;
92  ::abort();
93  }
94 
95  if ( neutrinoType != EvtSpinType::NEUTRINO ) {
96  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
97  << "EvtBToDiBaryonlnupQCD model expected "
98  << " a NEUTRINO 4th daughter, found:" << EvtPDL::name( getDaug( 3 ) )
99  << std::endl;
100  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
101  << "Will terminate execution!" << std::endl;
102  ::abort();
103  }
104 
105  // Get the 6 form factor D parameters from model arguments in the decay file
106  std::vector<double> DPars( 6 );
107  for ( int i = 0; i < 6; i++ ) {
108  DPars[i] = getArg( i );
109  }
110 
111  // Form factor model
112  ffModel_ = std::make_unique<EvtBToDiBaryonlnupQCDFF>( DPars );
113 
114  // Set amplitude calculation pointer.
115  // Accomodate for spin 1/2 (DIRAC) or 3/2 (RARITASCHWINGER) baryons
116  EvtSpinType::spintype baryon1Type = EvtPDL::getSpinType( getDaug( 0 ) );
117  EvtSpinType::spintype baryon2Type = EvtPDL::getSpinType( getDaug( 1 ) );
118 
119  if ( ( baryon1Type == EvtSpinType::DIRAC &&
120  baryon2Type == EvtSpinType::RARITASCHWINGER ) ||
121  ( baryon1Type == EvtSpinType::RARITASCHWINGER &&
122  baryon2Type == EvtSpinType::DIRAC ) ||
123  ( baryon1Type == EvtSpinType::DIRAC &&
124  baryon2Type == EvtSpinType::DIRAC ) ) {
125  calcAmp_ = std::make_unique<EvtSLDiBaryonAmp>( *ffModel_ );
126 
127  } else {
128  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
129  << "Wrong baryon spin type in EvtBToDiBaryonlnupQCD model. "
130  << "Expected spin type " << EvtSpinType::DIRAC << " or "
131  << EvtSpinType::RARITASCHWINGER << ", found spin types "
132  << baryon1Type << " and " << baryon2Type << std::endl;
133  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
134  << "Will terminate execution!" << std::endl;
135  ::abort();
136  }
137 }
138 
140 {
141  // Set maximum prob using dec file parameter if present
142  if ( getNArg() == 7 ) {
143  setProbMax( getArg( 6 ) );
144 
145  } else {
146  // Default probability for the B -> p p l nu mode, where l = e, mu or tau
147  setProbMax( 3.0e6 );
148 
149  // Specific decay modes, where we have one proton plus a second
150  // baryon that can be any (excited) state. They all have lower
151  // maximum probabilities compared to the default pp mode in order
152  // to improve accept/reject generation efficiency
153  static EvtIdSet BMesons( "B-", "B+" );
154  static EvtIdSet Delta( "Delta+", "anti-Delta-" );
155  static EvtIdSet LambdaC( "Lambda_c+", "anti-Lambda_c-" );
156  static EvtIdSet LambdaC1( "Lambda_c(2593)+", "anti-Lambda_c(2593)-" );
157  static EvtIdSet LambdaC2( "Lambda_c(2625)+", "anti-Lambda_c(2625)-" );
158  static EvtIdSet N1440( "N(1440)+", "anti-N(1440)-" );
159  static EvtIdSet N1520( "N(1520)+", "anti-N(1520)-" );
160  static EvtIdSet N1535( "N(1535)+", "anti-N(1535)-" );
161  static EvtIdSet N1650( "N(1650)+", "anti-N(1650)-" );
162  static EvtIdSet N1700( "N(1700)+", "anti-N(1700)-" );
163  static EvtIdSet N1710( "N(1710)+", "anti-N(1710)-" );
164  static EvtIdSet N1720( "N(1720)+", "anti-N(1720)-" );
165 
166  EvtId parId = getParentId();
167  EvtId bar1Id = getDaug( 0 );
168  EvtId bar2Id = getDaug( 1 );
169 
170  // These probabilties are sensitive to the sub-decay modes of the excited baryon states,
171  // which limit the available phase space and allows for events to be generated within the
172  // 10,000 event trial limit. Otherwise the amplitude varies too much (by more than a factor
173  // of a million) and events fail to be generated correctly. In case of problems, specify
174  // the maximum probability by passing an extra 7th model parameter
175  if ( BMesons.contains( parId ) ) {
176  if ( Delta.contains( bar1Id ) || Delta.contains( bar2Id ) ) {
177  // Delta
178  setProbMax( 1e7 );
179 
180  } else if ( LambdaC.contains( bar1Id ) ||
181  LambdaC.contains( bar2Id ) ) {
182  // Lambda_c+
183  setProbMax( 1000.0 );
184 
185  } else if ( LambdaC1.contains( bar1Id ) ||
186  LambdaC1.contains( bar2Id ) ) {
187  // Lambda_c+(2593)
188  setProbMax( 200.0 );
189 
190  } else if ( LambdaC2.contains( bar1Id ) ||
191  LambdaC2.contains( bar2Id ) ) {
192  // Lambda_c+(2625)
193  setProbMax( 500.0 );
194 
195  } else if ( N1440.contains( bar1Id ) || N1440.contains( bar2Id ) ) {
196  // N(1440)
197  setProbMax( 8e5 );
198 
199  } else if ( N1520.contains( bar1Id ) || N1520.contains( bar2Id ) ) {
200  // N(1520)
201  setProbMax( 8e6 );
202 
203  } else if ( N1535.contains( bar1Id ) || N1535.contains( bar2Id ) ) {
204  // N(1535)
205  setProbMax( 8e5 );
206 
207  } else if ( N1650.contains( bar1Id ) || N1650.contains( bar2Id ) ) {
208  // N(1650)
209  setProbMax( 8e5 );
210 
211  } else if ( N1700.contains( bar1Id ) || N1700.contains( bar2Id ) ) {
212  // N(1700)
213  setProbMax( 4e6 );
214 
215  } else if ( N1710.contains( bar1Id ) || N1710.contains( bar2Id ) ) {
216  // N(1710)
217  setProbMax( 5e5 );
218 
219  } else if ( N1720.contains( bar1Id ) || N1720.contains( bar2Id ) ) {
220  // N(1720)
221  setProbMax( 4e6 );
222 
223  } // Baryon combinations
224 
225  } // B parent
226 
227  } // Specific modes
228 }
static std::string name(EvtId i)
Definition: EvtPDL.cpp:382
double getArg(unsigned int j)
static EvtSpinType::spintype getSpinType(EvtId i)
Definition: EvtPDL.cpp:377
EvtDecayBase * clone() override
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=0)
Definition: EvtReport.cpp:33
EvtId * getDaugs()
Definition: EvtDecayBase.hh:66
void setProbMax(double prbmx)
Definition: EvtId.hh:27
EvtId getParentId() const
Definition: EvtDecayBase.hh:61
double initializePhaseSpace(unsigned int numdaughter, EvtId *daughters, bool forceResetMasses=false, double poleSize=-1., int whichTwo1=0, int whichTwo2=1)
std::string getName() override
int getNDaug() const
Definition: EvtDecayBase.hh:65
EvtAmp _amp2
Definition: EvtDecayAmp.hh:73
void decay(EvtParticle *p) override
int contains(const EvtId id)
Definition: EvtIdSet.cpp:422
std::unique_ptr< EvtSLDiBaryonAmp > calcAmp_
int getNArg() const
Definition: EvtDecayBase.hh:68
std::unique_ptr< EvtBToDiBaryonlnupQCDFF > ffModel_
EvtId getDaug(int i) const
Definition: EvtDecayBase.hh:67