]>
Commit | Line | Data |
---|---|---|
da0e9ce3 | 1 | //-------------------------------------------------------------------------- |
2 | // | |
3 | // Environment: | |
4 | // This software is part of the EvtGen package developed jointly | |
5 | // for the BaBar and CLEO collaborations. If you use all or part | |
6 | // of it, please give an appropriate acknowledgement. | |
7 | // | |
8 | // Copyright Information: See EvtGen/COPYRIGHT | |
9 | // Copyright (C) 1998 Caltech, UCSB | |
10 | // | |
11 | // Module: EvtSingleParticle.cc | |
12 | // | |
13 | // Description: Special model to generate single particles. | |
14 | // | |
15 | // Modification history: | |
16 | // | |
17 | // RYD Febuary 17,1998 Module created | |
18 | // | |
19 | //------------------------------------------------------------------------ | |
20 | // | |
21 | #include "EvtGenBase/EvtPatches.hh" | |
22 | #include <stdlib.h> | |
23 | #include "EvtGenBase/EvtParticle.hh" | |
24 | #include "EvtGenBase/EvtRandom.hh" | |
25 | #include "EvtGenBase/EvtPDL.hh" | |
26 | #include "EvtGenModels/EvtSingleParticle.hh" | |
27 | #include "EvtGenBase/EvtReport.hh" | |
28 | #include <string> | |
29 | #include "EvtGenBase/EvtConst.hh" | |
30 | using std::endl; | |
31 | ||
32 | EvtSingleParticle::~EvtSingleParticle() {} | |
33 | ||
34 | std::string EvtSingleParticle::getName(){ | |
35 | ||
36 | return "SINGLE"; | |
37 | ||
38 | } | |
39 | ||
40 | EvtDecayBase* EvtSingleParticle::clone(){ | |
41 | ||
42 | return new EvtSingleParticle(); | |
43 | ||
44 | } | |
45 | ||
46 | void EvtSingleParticle::init(){ | |
47 | ||
48 | ||
49 | //turn off checks for charge conservation | |
50 | disableCheckQ(); | |
51 | ||
52 | if ((getNArg()==6)||(getNArg()==4)||(getNArg()==2)) { | |
53 | ||
54 | if (getNArg()==6){ | |
55 | //copy the arguments into eaiser to remember names! | |
56 | ||
57 | pmin=getArg(0); | |
58 | pmax=getArg(1); | |
59 | ||
60 | cthetamin=getArg(2); | |
61 | cthetamax=getArg(3); | |
62 | ||
63 | phimin=getArg(4); | |
64 | phimax=getArg(5); | |
65 | ||
66 | } | |
67 | ||
68 | if (getNArg()==4){ | |
69 | //copy the arguments into eaiser to remember names! | |
70 | ||
71 | pmin=getArg(0); | |
72 | pmax=getArg(1); | |
73 | ||
74 | cthetamin=getArg(2); | |
75 | cthetamax=getArg(3); | |
76 | ||
77 | phimin=0.0; | |
78 | phimax=EvtConst::twoPi; | |
79 | ||
80 | } | |
81 | ||
82 | if (getNArg()==2){ | |
83 | //copy the arguments into eaiser to remember names! | |
84 | ||
85 | pmin=getArg(0); | |
86 | pmax=getArg(1); | |
87 | ||
88 | cthetamin=-1.0; | |
89 | cthetamax=1.0; | |
90 | ||
91 | phimin=0.0; | |
92 | phimax=EvtConst::twoPi; | |
93 | ||
94 | } | |
95 | ||
96 | ||
97 | }else{ | |
98 | ||
99 | report(ERROR,"EvtGen") << "EvtSingleParticle generator expected " | |
100 | << " 6, 4, or 2 arguments but found:"<<getNArg()<<endl; | |
101 | report(ERROR,"EvtGen") << "Will terminate execution!"<<endl; | |
102 | ::abort(); | |
103 | ||
104 | } | |
105 | ||
106 | ||
107 | report(INFO,"EvtGen") << "The single particle generator has been configured:" | |
108 | <<endl; | |
109 | report(INFO,"EvtGen") << pmax << " > p > " << pmin <<endl; | |
110 | report(INFO,"EvtGen") << cthetamax << " > costheta > " << cthetamin <<endl; | |
111 | report(INFO,"EvtGen") << phimax << " > phi > " << phimin <<endl; | |
112 | ||
113 | } | |
114 | ||
115 | void EvtSingleParticle::decay( EvtParticle *p ){ | |
116 | ||
117 | EvtParticle *d; | |
118 | EvtVector4R p4; | |
119 | ||
120 | double mass=EvtPDL::getMass(getDaug(0)); | |
121 | ||
122 | p->makeDaughters(getNDaug(),getDaugs()); | |
123 | d=p->getDaug(0); | |
124 | ||
125 | //generate flat distribution in p | |
126 | //we are now in the parents restframe! This means the | |
127 | //restframe of the e+e- collison. | |
128 | double pcm=EvtRandom::Flat(pmin,pmax); | |
129 | //generate flat distribution in phi. | |
130 | double phi=EvtRandom::Flat(phimin,phimax); | |
131 | ||
132 | double cthetalab; | |
133 | ||
134 | do{ | |
135 | //generate flat distribution in costheta | |
136 | double ctheta=EvtRandom::Flat(cthetamin,cthetamax); | |
137 | double stheta=sqrt(1.0-ctheta*ctheta); | |
138 | p4.set(sqrt(mass*mass+pcm*pcm),pcm*cos(phi)*stheta, | |
139 | pcm*sin(phi)*stheta,pcm*ctheta); | |
140 | ||
141 | d->init( getDaug(0),p4); | |
142 | ||
143 | //get 4 vector in the lab frame! | |
144 | EvtVector4R p4lab=d->getP4Lab(); | |
145 | cthetalab=p4lab.get(3)/p4lab.d3mag(); | |
146 | }while (cthetalab>cthetamax||cthetalab<cthetamin); | |
147 | ||
148 | return ; | |
149 | } | |
150 | ||
151 | ||
152 |