#include <EvtPsi3Sdecay.hh>
Public Member Functions | |
bool | choseDecay () |
EvtPsi3Sdecay (double ecms, EvtParticle *parent) | |
int | findMode () |
int | findPoints () |
double | polint (std::vector< double > points) |
double | theProb (std::vector< double > myxs, int ich) |
virtual | ~EvtPsi3Sdecay () |
Private Attributes | |
std::vector< double > | d0bardst0 |
std::vector< double > | d0d0bar |
std::vector< double > | d0dst0bar |
EvtId * | Daughters |
std::vector< double > | dpdm |
std::vector< double > | dspdsm |
std::vector< double > | dst0dst0bar |
std::vector< double > | dstmdp |
std::vector< double > | dstpdm |
std::vector< double > | dstpdstm |
double | Ecms |
int | Ndaugs |
int | nsize |
int | theLocation |
EvtParticle * | theParent |
double | theXsection [50] |
std::vector< double > | x |
|
00035 { 00036 //initializer 00037 Ecms = ecms; 00038 theParent = parent; 00039 Ndaugs=parent->getNDaug(); 00040 nsize = 14; 00041 00042 x.clear(); 00043 // open charm cross section, see PRD 80, 072001 00044 double xx[14]={3.72968, 3.97, 3.99, 4.01, 4.015, 4.03, 4.06, 4.12, 4.14, 4.16, 4.17, 4.18, 4.2, 4.26}; // 14 energy points 00045 double y0[14]={0., 86, 133, 76, 10, 334, 410, 303, 177, 167, 177, 179, 180, 86}; // 0) D0D0bar cross section 00046 double y1[14]={0., 137, 90, 135, 38, 196, 480, 310, 200, 200, 182, 197, 181, 94}; // 1) D+D- 00047 double y2[14]={0., 1140, 1370, 1660, 1920, 1600, 1115, 700, 675, 626, 636, 605, 515, 540}; // 2)D0D*0bar 00048 double y3[14]={0., 1140, 1370, 1660, 1920, 1600, 1115, 700, 675, 626, 636, 605, 515, 540}; // 3)D0bar D*0 00049 double y4[14]={0., 0, 0, 0, 213, 2000, 2290, 2550, 2443, 2566, 2363, 2173, 1830, 269}; // 4)D*0 D*0bar 00050 double y5[14]={0., 1115, 1375, 1650, 1851, 1650, 1085, 780, 688, 688, 642, 648, 535, 511}; // 5)D*+D- 00051 double y6[14]={0., 1115, 1375, 1650, 1851, 1650, 1085, 780, 688, 688, 642, 648, 535, 511}; // 6)D*-D+ 00052 double y7[14]={0., 0, 0, 0, 0, 1400, 2390, 2280, 2556, 2479, 2357, 2145, 1564, 237}; // 7)D*+D*- 00053 double y8[14]={0., 102, 133, 269, 250, 174, 51, 26, 25, 15, 34, 7, 15, 47}; // 8)Ds+ Ds- 00054 00055 d0d0bar.clear(); 00056 dpdm.clear(); 00057 d0dst0bar.clear(); 00058 dst0dst0bar.clear(); 00059 d0bardst0.clear(); 00060 dstpdm.clear(); 00061 dstmdp.clear(); 00062 dstpdstm.clear(); 00063 dspdsm.clear(); 00064 00065 for(int i=0;i<14;i++){ 00066 x.push_back(xx[i]); 00067 d0d0bar.push_back(y0[i]); 00068 dpdm.push_back(y1[i]); 00069 d0dst0bar.push_back(y2[i]); 00070 d0bardst0.push_back(y3[i]); 00071 dst0dst0bar.push_back(y4[i]); 00072 dstpdm.push_back( y5[i]); 00073 dstmdp.push_back( y6[i]); 00074 dstpdstm.push_back(y7[i]); 00075 dspdsm.push_back( y8[i]); 00076 } 00077 }
|
|
00079 {}
|
|
00085 { //determing accept or reject a generated decay 00086 00087 // findPoints(); 00088 double d0d0bar_xs=polint(d0d0bar); 00089 double dpdm_xs = polint(dpdm); 00090 double d0dst0bar_xs = polint(d0dst0bar); 00091 double d0bardst0_xs = polint(d0bardst0); 00092 00093 double dst0dst0bar_xs = polint(dst0dst0bar); 00094 double dstpdm_xs = polint(dstpdm); 00095 00096 double dstmdp_xs = polint(dstmdp); 00097 double dstpdstm_xs = polint(dstpdstm); 00098 00099 double dspdsm_xs = polint(dspdsm); 00100 00101 int ich = findMode(); 00102 // std::cout<<"calculated XS "<< d0d0bar_xs<<" "<<dpdm_xs<<" "<<d0dst0bar_xs<<" "<<d0bardst0_xs<< " "<<dst0dst0bar_xs<<" "<<dstpdm_xs<< " "<<dstmdp_xs<<" "<<dstpdstm_xs<<" "<<dspdsm_xs<<std::endl; 00103 00104 std::vector<double> myxs; myxs.clear(); 00105 myxs.push_back(d0d0bar_xs); 00106 myxs.push_back(dpdm_xs); 00107 myxs.push_back(d0dst0bar_xs); 00108 myxs.push_back(d0bardst0_xs); 00109 myxs.push_back(dst0dst0bar_xs); 00110 myxs.push_back(dstpdm_xs); 00111 myxs.push_back(dstmdp_xs); 00112 myxs.push_back(dstpdstm_xs); 00113 myxs.push_back(dspdsm_xs); 00114 00115 00116 double Prop0 = theProb(myxs,ich-1); 00117 double Prop1 = theProb(myxs,ich); 00118 00119 double pm= EvtRandom::Flat(0.,1); 00120 bool flag = false; 00121 if( Prop0 < pm && pm<= Prop1 ) flag = true; 00122 00123 //--- debuging 00124 00125 if(flag) { 00126 // std::cout<<"findMode= "<<ich<<std::endl; 00127 // for(int i=0;i<myxs.size();i++){ std::cout<<"channel "<<i<<" myxs: "<<myxs[i]<<std::endl;} 00128 //std::cout<<"prop0,prop1= "<<Prop0<<" "<<Prop1<<std::endl; 00129 } 00130 00131 //------------- 00132 00133 return flag; 00134 }
|
|
00062 { 00063 // mode index: 0) D0D0bar, 1)D+D-; 2)D0D*0bar , 3)D0bar D*0, 4)D*0 D*0 bar, 5)D*+D- 6)D*-D+ 7)D*+ D*- 8) Ds+ Ds- 00064 std::string son0=EvtPDL::name(theParent->getDaug(0)->getId()); 00065 std::string son1=EvtPDL::name(theParent->getDaug(1)->getId()); 00066 std::string son2; 00067 if(Ndaugs == 3){son2=EvtPDL::name(theParent->getDaug(2)->getId());} 00068 if(Ndaugs == 2 || Ndaugs ==3 && son2=="gammaFSR"){ 00069 if(son0 == "D0" && son1 == "anti-D0" || son1 == "D0" && son0 == "anti-D0") {return 0;} else 00070 if(son0 == "D+" && son1 == "D-" || son1 == "D+" && son0 == "D-" ) {return 1;} else 00071 if(son0 == "D0" && son1 == "anti-D*0" || son1 == "D0" && son0 == "anti-D*0") {return 2;} else 00072 if(son0 == "anti-D0" && son1 == "D*0" || son1 == "anti-D0" && son0 == "D*0") {return 3;} else 00073 if(son0 == "D*0" && son1 == "anti-D*0" || son1 == "D*0" && son0 == "anti-D*0") {return 4;} else 00074 if(son0 == "D*+" && son1 == "D-" || son1 == "D*+" && son0 == "D-") {return 5;} else 00075 if(son0 == "D*-" && son1 == "D+" || son1 == "D*-" && son0 == "D+") {return 6;} else 00076 if(son0 == "D*+" && son1 == "D*-" || son1 == "D*+" && son0 == "D*-") {return 7;} else 00077 if(son0 == "D_s+" && son1 == "D_s-" || son1 == "D_s+" && son0 == "D_s-") {return 8;} 00078 } else{ 00079 std::cout<<"Not open charm decay"<<std::endl; 00080 ::abort(); 00081 } 00082 00083 }
|
|
00030 { 00031 if(Ecms < x[0] ){theLocation =0;} else 00032 if(Ecms >=x[nsize]) {theLocation = nsize;} 00033 for (int i=0;i<nsize-1;i++){ 00034 if( x[i] <= Ecms && x[i+1] > Ecms) {theLocation=i;} 00035 } 00036 return theLocation; 00037 }
|
|
00039 { 00040 // EvtPolInt thePolInt(x,vy,Ecms); 00041 // double xs = thePolInt.getvalue(); 00042 theLocation = findPoints(); 00043 double xs = (vy[theLocation +1 ]- vy[theLocation]) / (x[theLocation+1]-x[theLocation])*(Ecms - x[theLocation])+vy[theLocation]; 00044 if(xs <0 ) xs = 0; 00045 // for(int i=0;i<vy.size();i++){ std::cout<<"channel "<<i<<" xsection: "<<vy[i]<<std::endl;} 00046 // std::cout<<"Ecms, theLocation= "<<Ecms<<" "<<theLocation<<std::endl; 00047 return xs; 00048 }
|
|
00050 { 00051 int Nchannels=myxs.size(); 00052 std::vector <double> thexs; 00053 thexs.clear(); 00054 double sumxs=0; 00055 for(int j=0;j<Nchannels;j++){ 00056 sumxs += myxs[j]; 00057 thexs.push_back(sumxs); 00058 } 00059 return thexs[ich] / sumxs ; 00060 }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|