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