00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <stdlib.h>
00022 #include "EvtGenBase/EvtParticle.hh"
00023 #include "EvtGenBase/EvtGenKine.hh"
00024 #include "EvtGenBase/EvtPDL.hh"
00025 #include "EvtGenBase/EvtVector4C.hh"
00026 #include "EvtGenBase/EvtVector4R.hh"
00027 #include "EvtGenBase/EvtReport.hh"
00028 #include "EvtGenBase/EvtRandom.hh"
00029 #include "EvtGenModels/EvtVPHOtoVISRHi.hh"
00030 #include <string>
00031
00032 using std::endl;
00033
00034 EvtVPHOtoVISRHi::~EvtVPHOtoVISRHi() {}
00035
00036 void EvtVPHOtoVISRHi::getName(std::string& model_name){
00037
00038 model_name="VPHOTOVISRHI";
00039
00040 }
00041
00042
00043 EvtDecayBase* EvtVPHOtoVISRHi::clone(){
00044
00045 return new EvtVPHOtoVISRHi;
00046
00047 }
00048
00049 void EvtVPHOtoVISRHi::init(){
00050
00051
00052 checkNArg(0,1);
00053
00054
00055 checkNDaug(2);
00056
00057
00058 checkSpinParent(EvtSpinType::VECTOR);
00059 checkSpinDaughter(0,EvtSpinType::VECTOR);
00060 checkSpinDaughter(1,EvtSpinType::PHOTON);
00061 }
00062
00063 void EvtVPHOtoVISRHi::initProbMax() {
00064
00065 setProbMax(20.0);
00066
00067 }
00068
00069 void EvtVPHOtoVISRHi::decay( EvtParticle *p){
00070
00071
00072
00073 double power=1;
00074 if (getNArg()==1) power=getArg(0);
00075
00076 static EvtId D0=EvtPDL::getId("D0");
00077 static EvtId D0B=EvtPDL::getId("anti-D0");
00078 static EvtId DP=EvtPDL::getId("D+");
00079 static EvtId DM=EvtPDL::getId("D-");
00080 static EvtId DSM=EvtPDL::getId("D_s-");
00081 static EvtId DSP=EvtPDL::getId("D_s+");
00082 static EvtId DSMS=EvtPDL::getId("D_s*-");
00083 static EvtId DSPS=EvtPDL::getId("D_s*+");
00084 static EvtId D0S=EvtPDL::getId("D*0");
00085 static EvtId D0BS=EvtPDL::getId("anti-D*0");
00086 static EvtId DPS=EvtPDL::getId("D*+");
00087 static EvtId DMS=EvtPDL::getId("D*-");
00088
00089 double w=p->mass();
00090 double s=w*w;
00091 double L=2.0*log(w/0.000511);
00092 double alpha=1/137.0;
00093 double beta=(L-1)*2.0*alpha/EvtConst::pi;
00094
00095 assert (p->getDaug(0)->getNDaug() == 2 || p->getDaug(0)->getNDaug() == 3);
00096
00097
00098 double md1 = EvtPDL::getMeanMass(p->getDaug(0)->getDaug(0)->getId());
00099 double md2 = EvtPDL::getMeanMass(p->getDaug(0)->getDaug(1)->getId());
00100 double minResMass = md1+md2;
00101 if (p->getDaug(0)->getNDaug() == 3) {
00102 double md3 = EvtPDL::getMeanMass(p->getDaug(0)->getDaug(2)->getId());
00103 minResMass = minResMass + md3;
00104 }
00105
00106
00107 double pgmax=(s-minResMass*minResMass)/(2.0*w);
00108 double pgz=0.99*pgmax*exp(log(EvtRandom::Flat(1.0))/(beta*power));
00109 if (EvtRandom::Flat(1.0)<0.5) pgz=-pgz;
00110
00111 double k=fabs(pgz);
00112
00113
00114 EvtVector4R p4g(k,0.0,0.0,pgz);
00115
00116 EvtVector4R p4res=p->getP4Restframe()-p4g;
00117
00118 double mres=p4res.mass();
00119
00120
00121 p->getDaug(0)->init(getDaug(0),p4res);
00122 p->getDaug(1)->init(getDaug(1),p4g);
00123
00124
00125
00126
00127
00128
00129 double sigma=9.0;
00130 if (mres<=3.9) sigma = 0.00001;
00131
00132 bool sigmacomputed(false);
00133
00134
00135 if (p->getDaug(0)->getNDaug() == 2
00136 &&((p->getDaug(0)->getDaug(0)->getId()==D0S
00137 && p->getDaug(0)->getDaug(1)->getId()==D0BS)
00138 ||(p->getDaug(0)->getDaug(0)->getId()==DPS
00139 && p->getDaug(0)->getDaug(1)->getId()==DMS))){
00140 if(mres>4.18) {
00141 sigma*=5./9.*(1.-1.*sqrt((4.18-mres)*(4.18-mres))/(4.3-4.18));
00142 }
00143 else if(mres>4.07 && mres<=4.18) {
00144 sigma*=5./9.;
00145 }
00146 else if (mres<=4.07&&mres>4.03)
00147 {
00148 sigma*=(5./9. - 1.5/9.*sqrt((4.07-mres)*(4.07-mres))/(4.07-4.03));
00149 }
00150 else if (mres<=4.03&& mres>=4.013)
00151 {
00152 sigma*=(3.5/9. - 3.5/9.*sqrt((4.03-mres)*(4.03-mres))/(4.03-4.013));
00153 }
00154 else{
00155 sigma=0.00001;
00156 }
00157 sigmacomputed = true;
00158
00159 }
00160
00161
00162 if(p->getDaug(0)->getNDaug() == 2 && ((p->getDaug(0)->getDaug(0)->getId()==D0S
00163 && p->getDaug(0)->getDaug(1)->getId()==D0B)
00164 ||(p->getDaug(0)->getDaug(0)->getId()==DPS
00165 && p->getDaug(0)->getDaug(1)->getId()==DM)
00166 ||(p->getDaug(0)->getDaug(0)->getId()==D0BS
00167 && p->getDaug(0)->getDaug(1)->getId()==D0)
00168 ||(p->getDaug(0)->getDaug(0)->getId()==DMS
00169 && p->getDaug(0)->getDaug(1)->getId()==DP)) )
00170 {
00171 if(mres>=4.2){
00172 sigma*=1.5/9.;
00173 }
00174 else if( mres>4.06 && mres<4.2){
00175 sigma*=((1.5/9.+2.5/9.*sqrt((4.2-mres)*(4.2-mres))/(4.2-4.06)));
00176 }
00177 else if(mres>=4.015 && mres<4.06){
00178 sigma*=((4./9.+3./9.*sqrt((4.06-mres)*(4.06-mres))/(4.06-4.015)));
00179 }
00180 else if (mres<4.015 && mres>=3.9){
00181 sigma*=((7./9.-7/9.*sqrt((4.015-mres)*(4.015-mres))/(4.015-3.9)));
00182 }
00183 else {
00184 sigma = 0.00001;
00185 }
00186 sigmacomputed = true;
00187
00188 }
00189
00190
00191 if (((p->getDaug(0)->getDaug(0)->getId()==DSPS && p->getDaug(0)->getDaug(1)->getId()==DSMS)))
00192 {
00193 if(mres>(2.112+2.112)){
00194 sigma=0.4;
00195 }
00196 else {
00197
00198
00199 sigma=0.00001;
00200 }
00201 sigmacomputed = true;
00202
00203 }
00204
00205
00206 if (p->getDaug(0)->getNDaug() == 2 && ((p->getDaug(0)->getDaug(0)->getId()==DSPS
00207 && p->getDaug(0)->getDaug(1)->getId()==DSM)
00208 || (p->getDaug(0)->getDaug(0)->getId()==DSMS
00209 && p->getDaug(0)->getDaug(1)->getId()==DSP)))
00210 {
00211 if(mres>4.26){
00212 sigma=0.05;
00213 }
00214 else if (mres>4.18 && mres<=4.26){
00215 sigma*=1./9.*(0.05+0.95*sqrt((4.26-mres)*(4.26-mres))/(4.26-4.18));
00216 }
00217 else if (mres>4.16 && mres<=4.18){
00218 sigma*=1/9.;
00219 }
00220 else if (mres<=4.16 && mres>4.08){
00221 sigma*=1/9.*(1-sqrt((4.16-mres)*(4.16-mres))/(4.16-4.08));
00222 }
00223 else if (mres<=(4.08)){
00224 sigma=0.00001;
00225 }
00226 sigmacomputed = true;
00227
00228 }
00229
00230
00231 if (p->getDaug(0)->getNDaug() == 2 && ((p->getDaug(0)->getDaug(0)->getId()==D0
00232 && p->getDaug(0)->getDaug(1)->getId()==D0B)
00233 ||(p->getDaug(0)->getDaug(0)->getId()==DP
00234 && p->getDaug(0)->getDaug(1)->getId()==DM))){
00235 sigma*=0.4/9.;
00236 sigmacomputed = true;
00237
00238 }
00239
00240
00241 if (p->getDaug(0)->getNDaug() == 2 && ((p->getDaug(0)->getDaug(0)->getId()==DSP && p->getDaug(0)->getDaug(1)->getId()==DSM))){
00242 sigma*=0.2/9.;
00243 sigmacomputed = true;
00244
00245 }
00246
00247
00248 if (p->getDaug(0)->getNDaug() == 3){
00249 if(mres>4.03){
00250 sigma*=0.5/9.;
00251 }
00252 else {
00253 sigma=0.00001;
00254 }
00255 sigmacomputed = true;
00256
00257 }
00258
00259 if (! sigmacomputed) {
00260 report(ERROR,"EvtGen") << "VPHOTOVISRHI: This model requires daughters to be listed in a particular order." << endl
00261 << "The following are acceptable:" << endl
00262 << "D0 anti-D0" << endl
00263 << "D+ D-" << endl
00264 << "D*0 anti-D0" << endl
00265 << "anti-D*0 D0" << endl
00266 << "D*+ D-" << endl
00267 << "D*- D+" << endl
00268 << "D*0 anti-D*0" << endl
00269 << "D*+ D*-" << endl
00270 << "D_s+ D_s-" << endl
00271 << "D_s*+ D_s-" << endl
00272 << "D_s*- D_s+" << endl
00273 << "D_s*+ D_s*-" << endl
00274 << "(D* D pi can be in any order)" << endl
00275 << "Aborting..." << endl;
00276 assert(0);
00277 }
00278
00279 if(sigma<0) sigma = 0.0;
00280
00281
00282
00283
00284
00285
00286 static int count=0;
00287
00288 count++;
00289
00290
00291
00292
00293
00294
00295 double norm=sqrt(sigma);
00296
00297
00298
00299
00300 vertex(0,0,0,norm*p->eps(0)*p->epsParent(0).conj());
00301 vertex(1,0,0,norm*p->eps(1)*p->epsParent(0).conj());
00302 vertex(2,0,0,norm*p->eps(2)*p->epsParent(0).conj());
00303
00304 vertex(0,1,0,norm*p->eps(0)*p->epsParent(1).conj());
00305 vertex(1,1,0,norm*p->eps(1)*p->epsParent(1).conj());
00306 vertex(2,1,0,norm*p->eps(2)*p->epsParent(1).conj());
00307
00308 vertex(0,2,0,norm*p->eps(0)*p->epsParent(2).conj());
00309 vertex(1,2,0,norm*p->eps(1)*p->epsParent(2).conj());
00310 vertex(2,2,0,norm*p->eps(2)*p->epsParent(2).conj());
00311
00312 vertex(0,0,1,norm*p->eps(0)*p->epsParent(0).conj());
00313 vertex(1,0,1,norm*p->eps(1)*p->epsParent(0).conj());
00314 vertex(2,0,1,norm*p->eps(2)*p->epsParent(0).conj());
00315
00316 vertex(0,1,1,norm*p->eps(0)*p->epsParent(1).conj());
00317 vertex(1,1,1,norm*p->eps(1)*p->epsParent(1).conj());
00318 vertex(2,1,1,norm*p->eps(2)*p->epsParent(1).conj());
00319
00320 vertex(0,2,1,norm*p->eps(0)*p->epsParent(2).conj());
00321 vertex(1,2,1,norm*p->eps(1)*p->epsParent(2).conj());
00322 vertex(2,2,1,norm*p->eps(2)*p->epsParent(2).conj());
00323
00324 return;
00325 }