BOSS 7.0.6
BESIII Offline Software System
Loading...
Searching...
No Matches
EvtPhokhara_4pi.cc
Go to the documentation of this file.
1//--------------------------------------------------------------------------
2//
3// Environment:
4// This software is part of models developed at BES collaboration
5// based on the EvtGen framework. If you use all or part
6// of it, please give an appropriate acknowledgement.
7//
8// Copyright Information: See EvtGen/BesCopyright
9// Copyright (A) 2006 Ping Rong-Gang @IHEP
10//
11// Module: EvtPhokhara.cc
12// the necessary file: phokharar.F
13// fist.inc,gen.inc mix.inc stdhep.inc
14// Description: Modified Lund model at tau-charm energy level, see
15// PHYSICAL REVIEW D, VOLUME 62, 034003
16// Modification history:
17//
18// Ping R.-G. Jan.25, 2010 Module created
19// The random engine RLU0 is unified with RLU for BesEvtGen
20//------------------------------------------------------------------------
21//
27#include "EvtGenBase/EvtPDL.hh"
31#include <string>
32#include "EvtGenBase/EvtId.hh"
33#include <iostream>
34#include <iomanip>
35#include <fstream>
36#include <string.h>
37#include <stdlib.h>
38#include <unistd.h>
39#include <stdio.h>
40
43#include "CLHEP/Random/RandomEngine.h"
44#include "cfortran/cfortran.h"
45
46using namespace std;
47using namespace CLHEP;
48
49using std::endl;
50using std::fstream;
51using std::ios;
52using std::ofstream;
53using std::resetiosflags;
54using std::setiosflags;
55using std::setw;
56
57int EvtPhokhara_4pi::nevtgen=0;
58int EvtPhokhara_4pi::nphokharadecays=0;
59EvtDecayBasePtr* EvtPhokhara_4pi::phokharadecays=0;
60int EvtPhokhara_4pi::ntable=0;
61
62int EvtPhokhara_4pi::ncommand=0;
63int EvtPhokhara_4pi::lcommand=0;
64std::string* EvtPhokhara_4pi::commands=0;
65int EvtPhokhara_4pi::nevt=0;
66
69 int i;
70 //the deletion of commands is really uggly!
71
72 if (nphokharadecays==0) {
73 delete [] commands;
74 commands=0;
75 return;
76 }
77
78 for(i=0;i<nphokharadecays;i++){
79 if (phokharadecays[i]==this){
80 phokharadecays[i]=phokharadecays[nphokharadecays-1];
81 nphokharadecays--;
82 if (nphokharadecays==0) {
83 delete [] commands;
84 commands=0;
85 }
86 return;
87 }
88 }
89
90 report(ERROR,"EvtGen") << "Error in destroying Phokhara model!"<<endl;
91
92}
93
94
95void EvtPhokhara_4pi::getName(std::string& model_name){
96
97 model_name="PHOKHARA_4pi";
98
99}
100
102
103 return new EvtPhokhara_4pi;
104
105}
106
107
109
110 noProbMax();
111
112}
113
114
116 m_pion=3;
117 // mu+mu-(0),pi+pi-(1),2pi0pi+pi-(2),
118 // 2pi+2pi-(3),ppbar(4),nnbar(5),
119 // K+K-(6),K0K0bar(7),pi+pi-pi0(8),
120 // Lamb Lambbar->pi-pi+ppbar(9)
121#include "Phokhara_init_mode.txt"
122}
123
124
125
127 checkNArg(0);
128
129 std::string locvp=getenv("BESEVTGENROOT");
130 system("cat $BESEVTGENROOT/share/phokhara_9.1.param>phokhara_9.1.param");
131 system("cat $BESEVTGENROOT/share/phokhara_9.1.fferr>phokhara_9.1.fferr");
132 system("cat $BESEVTGENROOT/share/phokhara_9.1.ffwarn>phokhara_9.1.ffwarn");
133
134
135 if (getParentId().isAlias()){
136
137 report(ERROR,"EvtGen") << "EvtPhokhara finds that you are decaying the"<<endl
138 << " aliased particle "
139 << EvtPDL::name(getParentId()).c_str()
140 << " with the Phokhara model"<<endl
141 << " this does not work, please modify decay table."
142 << endl;
143 report(ERROR,"EvtGen") << "Will terminate execution!"<<endl;
144 ::abort();
145
146 }
147
148 store(this);
149
150}
151
152
154
155 return std::string("PhokharaPar");
156
157}
158
159void EvtPhokhara_4pi::command(std::string cmd){
160
161 if (ncommand==lcommand){
162
163 lcommand=10+2*lcommand;
164
165 std::string* newcommands=new std::string[lcommand];
166
167 int i;
168
169 for(i=0;i<ncommand;i++){
170 newcommands[i]=commands[i];
171 }
172
173 delete [] commands;
174
175 commands=newcommands;
176
177 }
178
179 commands[ncommand]=cmd;
180
181 ncommand++;
182
183}
184
185
186
188 EvtId myvpho=EvtPDL::getId("vpho");
189 if(p->getId()!=myvpho) {std::cout<<"Parent particle is required to be vpho for Phokhara model"<<std::endl;abort();}
190 if(nevtgen==0) {init_mode(p);}
191 else{init_evt(p);}
192 std::cout<<"PHOKHARA : 2(pi+pi-) mode "<<std::endl;
193
194
195 int istdheppar=EvtPDL::getStdHep(p->getId());
196 int ntrials = 0;
197 int tr_old[3];
198 tr_old[0] = (int)maxima_.tr[0];
199 tr_old[1] = (int)maxima_.tr[1];
200 tr_old[2] = (int)maxima_.tr[2];
201
202 while( ntrials < 1000000)
203 {
204 ievent++;
205 RANLXDF(Ar_r,1);
206 Ar[1] = Ar_r[0];
207
208 if (Ar[1] <= (maxima_.Mmax[0]/(maxima_.Mmax[0]+maxima_.Mmax[1]+maxima_.Mmax[2]))) {
209 maxima_.count[0] = maxima_.count[0]+1.0;
210 GEN_0PH(2,qqmin,ctes_.Sp,cos3min,cos3max);
211 }else
212 if (Ar[1] <= ( (maxima_.Mmax[0]+maxima_.Mmax[1])/(maxima_.Mmax[0]+maxima_.Mmax[1]+maxima_.Mmax[2]))) {
213 maxima_.count[1] = maxima_.count[1]+1.0;
214 GEN_1PH(2,qqmin,qqmax,cos1min,cos1max,cos3min,cos3max);
215 }
216 else {
217 maxima_.count[2] = maxima_.count[2]+1.0;
218 GEN_2PH(2,qqmin,cos1min,cos1max,cos2min,cos2max,cos3min,cos3max);
219 }
220
221 if( ((int)maxima_.tr[0]+(int)maxima_.tr[1]+(int)maxima_.tr[2]) > (tr_old[0]+tr_old[1]+tr_old[2]) ) // event accepted after cuts
222 {
223 goto storedEvents;
224 }
225 ntrials ++;
226 }
227 std::cout <<"FATAL: Could not satisfy cuts after " << ntrials << "trials. Terminate." <<std::endl;
228 //----
229 storedEvents:
230 int more=0;
231 int numstable=0;
232 int numparton=0;
233 EvtId evtnumstable[100];//
234 EvtVector4R p4[20];
235
236 // except ISR photos, products depending on channel
237 if (flags_.pion == 0) { // mu+ mu-
238 // mu+
239 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(-13);
240 p4[numstable].set(ctes_.momenta[0][5],ctes_.momenta[1][5], ctes_.momenta[2][5], ctes_.momenta[3][5]);
241 numstable++;
242 // mu -
243 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(13);
244 p4[numstable].set(ctes_.momenta[0][6],ctes_.momenta[1][6], ctes_.momenta[2][6], ctes_.momenta[3][6]);
245 numstable++;
246 }
247 if (flags_.pion == 1) { // pi+ pi-
248 // pi+
249 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(211);
250 p4[numstable].set(ctes_.momenta[0][5],ctes_.momenta[1][5], ctes_.momenta[2][5], ctes_.momenta[3][5]);
251 numstable++;
252 // pi -
253 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(-211);
254 p4[numstable].set(ctes_.momenta[0][6],ctes_.momenta[1][6], ctes_.momenta[2][6], ctes_.momenta[3][6]);
255 numstable++;
256 }
257 if (flags_.pion == 2) { // pi+ pi-2pi0
258 // pi0
259 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(111);
260 p4[numstable].set(ctes_.momenta[0][5],ctes_.momenta[1][5], ctes_.momenta[2][5], ctes_.momenta[3][5]);
261 numstable++;
262 // pi0
263 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(111);
264 p4[numstable].set(ctes_.momenta[0][6],ctes_.momenta[1][6], ctes_.momenta[2][6], ctes_.momenta[3][6]);
265 numstable++;
266 // pi-
267 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(-211);
268 p4[numstable].set(ctes_.momenta[0][7],ctes_.momenta[1][7], ctes_.momenta[2][7], ctes_.momenta[3][7]);
269 numstable++;
270 // pi +
271 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(211);
272 p4[numstable].set(ctes_.momenta[0][8],ctes_.momenta[1][8], ctes_.momenta[2][8], ctes_.momenta[3][8]);
273 numstable++;
274 }
275 if (flags_.pion == 3) { // 2(pi+ pi-)
276 // pi+
277 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(211);
278 p4[numstable].set(ctes_.momenta[0][5],ctes_.momenta[1][5], ctes_.momenta[2][5], ctes_.momenta[3][5]);
279 numstable++;
280 // pi-
281 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(-211);
282 p4[numstable].set(ctes_.momenta[0][6],ctes_.momenta[1][6], ctes_.momenta[2][6], ctes_.momenta[3][6]);
283 numstable++;
284 // pi+
285 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(-211);
286 p4[numstable].set(ctes_.momenta[0][7],ctes_.momenta[1][7], ctes_.momenta[2][7], ctes_.momenta[3][7]);
287 numstable++;
288 // pi -
289 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(211);
290 p4[numstable].set(ctes_.momenta[0][8],ctes_.momenta[1][8], ctes_.momenta[2][8], ctes_.momenta[3][8]);
291 numstable++;
292 }
293 if (flags_.pion == 4) { // ppbar
294 // pbar
295 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(-2212);
296 p4[numstable].set(ctes_.momenta[0][5],ctes_.momenta[1][5], ctes_.momenta[2][5], ctes_.momenta[3][5]);
297 numstable++;
298 // p
299 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(2212);
300 p4[numstable].set(ctes_.momenta[0][6],ctes_.momenta[1][6], ctes_.momenta[2][6], ctes_.momenta[3][6]);
301 numstable++;
302 }
303 if (flags_.pion == 5) { // nnbar
304 // pbar
305 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(-2112);
306 p4[numstable].set(ctes_.momenta[0][5],ctes_.momenta[1][5], ctes_.momenta[2][5], ctes_.momenta[3][5]);
307 numstable++;
308 // p
309 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(2112);
310 p4[numstable].set(ctes_.momenta[0][6],ctes_.momenta[1][6], ctes_.momenta[2][6], ctes_.momenta[3][6]);
311 numstable++;
312 }
313 if (flags_.pion == 6) { // K+ K-
314 // K+
315 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(321);
316 p4[numstable].set(ctes_.momenta[0][5],ctes_.momenta[1][5], ctes_.momenta[2][5], ctes_.momenta[3][5]);
317 numstable++;
318 // K -
319 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(-321);
320 p4[numstable].set(ctes_.momenta[0][6],ctes_.momenta[1][6], ctes_.momenta[2][6], ctes_.momenta[3][6]);
321 numstable++;
322 }
323 if (flags_.pion == 7) { // K0K0bar
324 // Kbar
325 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(311);
326 p4[numstable].set(ctes_.momenta[0][5],ctes_.momenta[1][5], ctes_.momenta[2][5], ctes_.momenta[3][5]);
327 numstable++;
328 // K0
329 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(-311);
330 p4[numstable].set(ctes_.momenta[0][6],ctes_.momenta[1][6], ctes_.momenta[2][6], ctes_.momenta[3][6]);
331 numstable++;
332 }
333 if (flags_.pion == 8) { // pi+ pi-pi0
334 // pi+
335 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(211);
336 p4[numstable].set(ctes_.momenta[0][5],ctes_.momenta[1][5], ctes_.momenta[2][5], ctes_.momenta[3][5]);
337 numstable++;
338 // pi-
339 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(-211);
340 p4[numstable].set(ctes_.momenta[0][6],ctes_.momenta[1][6], ctes_.momenta[2][6], ctes_.momenta[3][6]);
341 numstable++;
342 // pi0
343 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(111);
344 p4[numstable].set(ctes_.momenta[0][7],ctes_.momenta[1][7], ctes_.momenta[2][7], ctes_.momenta[3][7]);
345 numstable++;
346 }
347 if (flags_.pion == 9) { //Lambda Lambdabar-> pi+ pi- ppbar
348 // pi+
349 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(211);
350 p4[numstable].set(ctes_.momenta[0][7],ctes_.momenta[1][7], ctes_.momenta[2][7], ctes_.momenta[3][7]);
351 numstable++;
352 // pbar
353 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(-2212);
354 p4[numstable].set(ctes_.momenta[0][8],ctes_.momenta[1][8], ctes_.momenta[2][8], ctes_.momenta[3][8]);
355 numstable++;
356 // pi-
357 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(-211);
358 p4[numstable].set(ctes_.momenta[0][9],ctes_.momenta[1][9], ctes_.momenta[2][9], ctes_.momenta[3][9]);
359 numstable++;
360 // p
361 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(2212);
362 p4[numstable].set(ctes_.momenta[0][10],ctes_.momenta[1][10], ctes_.momenta[2][10], ctes_.momenta[3][10]);
363 numstable++;
364 }
365
366 // ISR gamma
367 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(22);
368 p4[numstable].set(ctes_.momenta[0][2],ctes_.momenta[1][2], ctes_.momenta[2][2], ctes_.momenta[3][2]);
369 numstable++;
370 if( ctes_.momenta[0][3] != 0 ) // second photon exists
371 {
372 evtnumstable[numstable]=EvtPDL::evtIdFromStdHep(22);
373 p4[numstable].set(ctes_.momenta[0][3],ctes_.momenta[1][3], ctes_.momenta[2][3], ctes_.momenta[3][3]);
374 numstable++;
375 }
376
377 int channel=EvtDecayTable::inChannelList(p->getId(),numstable,evtnumstable);
378 more=(channel!=-1);
379 if(more) {std::cout<<"Existence of mode "<<channel<<" in exclusive decay list has the same final state as this one"<<std::endl;abort(); }
380
381 p->makeDaughters(numstable,evtnumstable);
382 //double weight = p->initializePhaseSpace(getNDaug(),getDaugs());
383
384 int ndaugFound=0;
385 EvtVector4R SUMP4(0,0,0,0);
386 for(int i=0;i<numstable;i++){
387 p->getDaug(i)->init(evtnumstable[i],p4[i]);
388 ndaugFound++;
389 }
390 if ( ndaugFound == 0 ) {
391 report(ERROR,"EvtGen") << "Phokhara has failed to do a decay ";
392 report(ERROR,"EvtGen") << EvtPDL::name(p->getId()).c_str() << " " << p->mass()<<endl;
393 assert(0);
394 }
395
396 nevtgen++;
397 return ;
398
399}
400
401
402
403void EvtPhokhara_4pi::store(EvtDecayBase* jsdecay){
404
405 if (nphokharadecays==ntable){
406
407 EvtDecayBasePtr* newphokharadecays=new EvtDecayBasePtr[2*ntable+10];
408 int i;
409 for(i=0;i<ntable;i++){
410 newphokharadecays[i]=phokharadecays[i];
411 }
412 ntable=2*ntable+10;
413 delete [] phokharadecays;
414 phokharadecays=newphokharadecays;
415 }
416
417 phokharadecays[nphokharadecays++]=jsdecay;
418
419
420
421}
422
423
425 static int first=1;
426 if (first){
427
428 first=0;
429 //for(int i=0;i<ncommand;i++)
430 // lugive0_(commands[i].c_str(),strlen(commands[i].c_str()));
431 }
432
433}
434
435
436
438 m_pion=3;
439 // mu+mu-(0),pi+pi-(1),2pi0pi+pi-(2),
440 // 2pi+2pi-(3),ppbar(4),nnbar(5),
441 // K+K-(6),K0K0bar(7),pi+pi-pi0(8),
442 // Lamb Lambbar->pi-pi+ppbar(9)
443#include "Phokhara_init_evt.txt"
444}
445
446
448 m_tagged = 0;
449 m_nm = 50000 ; // # of events to determine the maximum
450 m_nlo = 1; // Born(0), NLO(1)
451 m_w = 0.00001; // soft photon cutoff
452 m_fsr = 0; // ISR only(0), ISR+FSR(1), ISR+INT+FSR(2)
453 m_fsrnlo = 0 ; // yes(1), no(0)
454 m_NarrowRes = 0 ;// none(0) jpsi(1) psip(2)
455 m_FF_Kaon = 1 ; // constrained (0), unconstrained (1), Kuhn-Khodjamirian-Bruch (2)
456 m_ivac = 0; // yes(1), no(0)
457 m_FF_Pion = 0 ; // KS Pionformfactor(0), GS Pionformfactor old(1) and new(2)
458 m_f0_model = 0 ; // f0+f0(600): KK model(0), no structure(1), no f0+f0(600)(2), f0 KLOE(3)
459 m_q2min = (4*0.135)*(4*0.135); // minimal hadrons(muons)-gamma-inv mass squared (GeV^2)
460 m_q2_min_c = m_q2min ; // minimal inv. mass squared of the hadrons(muons)(GeV^2)
461 m_q2_max_c = m_E*m_E; // maximal inv. mass squared of the hadrons(muons)(GeV^2)
462 m_gmin = 0.001; // minimal photon energy/missing energy (GeV) //total Ecm will reduce m_gmin
463 m_phot1cut = 0.0; // maximal photon angle/missing momentum angle (grad)
464 m_phot2cut = 180.0; // maximal photon angle/missing momentum angle (grad)
465 m_pi1cut = 0.0 ; // minimal hadrons(muons) angle (grad)
466 m_pi2cut = 180.0; // maximal hadrons(muons) angle (grad)
467 if(!(m_pion==0 || m_pion==1 || m_pion==6)){m_fsr = 0; m_fsrnlo = 0 ;}
468 if( m_pion==9 ){m_nlo = 0 ;}
469}
struct @17 flags_
#define GEN_1PH(I, QQMIN, QQMAX, COS1MIN, COS1MAX, COS3MIN, COS3MAX)
#define RANLXDF(AR, VAL)
#define GEN_0PH(I, QQMIN, SP, COS3MIN, COS3MAX)
struct @16 maxima_
struct @10 ctes_
#define GEN_2PH(I, QQMIN, COS1MIN, COS1MAX, COS2MIN, COS2MAX, COS3MIN, COS3MAX)
ostream & report(Severity severity, const char *facility)
Definition: EvtReport.cc:36
@ ERROR
Definition: EvtReport.hh:49
void noProbMax()
EvtId getParentId()
Definition: EvtDecayBase.hh:60
void checkNArg(int a1, int a2=-1, int a3=-1, int a4=-1)
static int inChannelList(EvtId parent, int ndaug, EvtId *daugs)
Definition: EvtId.hh:27
static int getStdHep(EvtId id)
Definition: EvtPDL.hh:56
static EvtId evtIdFromStdHep(int stdhep)
Definition: EvtPDL.cc:244
static std::string name(EvtId i)
Definition: EvtPDL.hh:64
static EvtId getId(const std::string &name)
Definition: EvtPDL.cc:287
void makeDaughters(int ndaug, EvtId *id)
virtual void init(EvtId part_n, const EvtVector4R &p4)=0
EvtId getId() const
Definition: EvtParticle.cc:113
EvtParticle * getDaug(int i)
Definition: EvtParticle.cc:85
double mass() const
Definition: EvtParticle.cc:127
virtual ~EvtPhokhara_4pi()
void PhokharaInit(int dummy)
EvtDecayBase * clone()
void getName(std::string &name)
std::string commandName()
void init_evt(EvtParticle *p)
void command(std::string cmd)
void init_mode(EvtParticle *p)
void decay(EvtParticle *p)
void set(int i, double d)
Definition: EvtVector4R.hh:183