FlyoDoc_2011 Pisa 2011 by GmP --- 011
|
00001 /*************************************************************************** 00002 anakmunu.cpp - description 00003 ------------------- 00004 begin : Sun Jan 18 2004 00005 copyright : (C) 2004 by gmp 00006 email : peppe@newpeppe 00007 *************************************************************************** 00008 * * 00009 * NA48 simulation program. * 00010 * * 00011 ***************************************************************************/ 00012 00013 #include <flyoh.h> 00014 #include <anakmunu.h> 00015 00016 using namespace std; 00021 00022 00023 AnaKmunu::AnaKmunu() 00024 { 00025 tipo=29; 00026 nfit=1; 00027 titol="K--> mu nu " ; 00028 nome="Kmunu"; 00029 mas_Kp= ptr_Kapp->Get_Massa(); 00030 mas_mu=ptr_Mup->Get_Massa(); 00031 00032 Pk_ric =new GigaBeam(); 00033 00034 00035 Gout<<"\n Attivato il fit di "<<titol; 00036 00037 } 00038 AnaKmunu::~AnaKmunu() 00039 { 00040 } 00041 //GigaBeam *Pk_ric=0; 00042 00046 int AnaKmunu::Fisica() 00047 { 00048 00049 00050 count_call++; 00051 00052 np=0; 00053 pxkp=pykp=pzkp=momk=0.; 00054 pxmu=pymu=pzmu=mommu=0.; 00055 emu =masnu= mqnu=0.; 00056 pxnu=pynu=pznu=momnu=0.; 00057 xnu=ynu=znu =0.; 00058 00059 //taglio sul vertice generato (taglia solo gli eventi che finiscono sul collimatore)da togliere!!! 00060 if (evento_.Gen.zv < 10000.) { 00061 counter[0]++; 00062 return -1; 00063 } 00064 00065 count_decay++; 00066 np=0; 00067 int npt = 0 ; 00068 if (Trkstraw!=0) npt = Trkstraw->ntrk_done; 00069 if (npt<1) { 00070 counter[1]++; 00071 return -1; 00072 } 00073 00074 // ricavo l'impulso del K dal gigatrak 00075 Pk_mom=Pk_ric->Beam_Rec(); // impulso del beam dal gigatrack 00076 Pkp.setvn ( Pk_mom,mas_Kp ); // definizione del quadrimomento 00077 Pkp.putvn( pxkp,pykp,pzkp,momk ); // salvo per root 00078 00079 00080 // Dato che si selezionano eventi con solo una traccia, uso l'indirizzo della traccia [0] 00081 00082 Track Trk=Trkstraw->Traccia[0]; 00083 charge=Trk.charge; 00084 chiq_trk=Trk.chiq_fit; 00085 00086 if (Trk.chiq_fit>2.) { 00087 counter[6]++; 00088 return -1; 00089 } 00090 00091 00092 if ( charge !=1. ) { //even for wrong sign study, positive cut later! 00093 counter[2]++; 00094 return -1; 00095 } 00096 00097 // impulso del mu+ dallo spettromentro 00098 Pmu.setvn(Trk.P_in,mas_mu); 00099 Pmu.putvn( pxmu,pymu,pzmu,mommu ); 00100 // taglio sull'impulso del mup 00101 if (mommu<15. || mommu>75.) { 00102 counter[3]++; 00103 return -1; 00104 } 00105 00106 // 4 camere coinvolte 00107 if (Trk.camere!=4) { 00108 counter[4]++; 00109 return -1; 00110 } 00111 // taglio radiale sulle strawchambers; d < 7.5 || d > 110 00112 gvet XCamera,XCamera1; 00113 double dq=0.; 00114 XCamera= Trk.Xmg + Trk.P_in*((St1x->Get_Cface().z-Trk.Xmg.z)/Trk.P_in.z); 00115 XCamera1=XCamera; 00116 XCamera=St1x->Lab2cDev(XCamera) ; 00117 dq=XCamera.XYNorma(); 00118 if (dq<7.5||dq>110.) { 00119 counter[5]++; 00120 return -1; 00121 } 00122 XCamera= Trk.Xmg + Trk.P_in*((St2x->Get_Cface().z-Trk.Xmg.z)/Trk.P_in.z); 00123 XCamera=St2x->Lab2cDev(XCamera) ; 00124 dq=XCamera.XYNorma(); 00125 if (dq<7.5||dq>110.) { 00126 counter[5]++; 00127 return -1; 00128 } 00129 XCamera= Trk.Xmg + Trk.P_out*((St3x->Get_Cface().z-Trk.Xmg.z)/Trk.P_out.z); 00130 XCamera=St3x->Lab2cDev(XCamera) ; 00131 dq=XCamera.XYNorma(); 00132 if (dq<7.5||dq>110.) { 00133 counter[5]++; 00134 return -1; 00135 } 00136 XCamera= Trk.Xmg + Trk.P_out*((St4x->Get_Cface().z-Trk.Xmg.z)/Trk.P_out.z); 00137 XCamera=St4x->Lab2cDev(XCamera) ; 00138 dq=XCamera.XYNorma(); 00139 if (dq<7.5||dq>110.) { 00140 counter[5]++; 00141 return -1; 00142 } 00143 00144 00145 00146 emu=Pmu*Pkp/mas_Kp; // energia del pi nel sistema Kappa 00147 Pnu=Pkp-Pmu; 00148 mqnu=Pnu.Invarq(); 00149 masnu=Pnu.m; 00150 00151 Pnu.putvn( pxnu,pynu,pznu,momnu ); 00152 enu=Pnu*Pkp/mas_Kp; 00153 00154 // calcolo dell'impulso trasverso del mu 00155 gvet ptrasv; 00156 ptrasv= Pmu&Pkp; 00157 ptrasv.Norma(); 00158 tmom=ptrasv.mom/Pkp.mom; 00159 00160 00161 00162 00164 00165 Vtxstruct Xdecay(2); 00166 Xdecay.P[0].setvn(0.,0.,10240.); // beam at G3 (0.,0.,10240.); Fare meglio 00167 Xdecay.V[0]=Pkp.NVerso(); // versore del beam... 00168 Xdecay.P[1]=Trkstraw->Traccia[0].Xmg; // coordinate della traccia 1 al centro del magnete (definizione) 00169 Xdecay.V[1]=Trkstraw->Traccia[0].P_in.NVerso(); // versore della traccia 1 00170 Xdecay.Vertice(); 00171 chiq_vert=Xdecay.chiq; 00172 Xdecay.Vtx.putv( xnu,ynu,znu ); 00173 00174 00175 00176 // //taglio sul vertice ricostruito (livello 0) 00177 if (znu<10250.||znu>17000.) { 00178 counter[7]++; 00179 return -1; 00180 } 00181 00182 //taglio su xnu e ynu 00185 //per il segnale taglia circa 2 eventi su 10^4 che hanno passato la selezione, per il gas il 10%! 00186 //collimatore a 10000 con raggio 3.5 (fascio generato in 0) 00187 //=> r_min = 3.5, z_min = 10000 => r_max = 5.95 se z_max = 17000 00188 00189 gvet beam0 (0.,0.,10240.) ; // beam point at gigatrack 3 00190 gvet beamc (-10.7,0.,18366.) ;// beam point at st1x chamber 00191 gvet bvers; 00192 bvers = beamc-beam0 ; 00193 bvers = bvers.NVerso() ; 00194 double dbeam = (Xdecay.Vtx - beam0)%bvers; 00195 gvet tbeam; 00196 tbeam =(Xdecay.Vtx - beam0)-bvers*dbeam; 00197 double dtrv = tbeam.Norma(); 00198 if (dtrv > dbeam*0.00035) { 00199 counter[8]++; 00200 return -1; 00201 } 00202 00203 // taglio sui cluster del calorimetro 00204 if ( lkry->hit_recorded>1) { 00205 counter[9]++; 00206 return -1; 00207 } 00208 00209 // calcolo le coordinate estrapolate della traccia al piano del calorimeter 00210 00211 gvet X_at_lkr; 00212 X_at_lkr= Trk.Xmg + Trk.P_out*((lkry->Get_Cface().z-Trk.Xmg.z)/Trk.P_out.z); 00213 X_at_lkr.putv(xlac,ylac,zlac); 00214 00215 double rqcl= X_at_lkr.XYNorma(); 00216 rqcl = rqcl*rqcl; 00217 // accettanza ottagonale 00218 if (sqrt(rqcl)<=15. || fabs( X_at_lkr.x) >= 113. ||fabs( X_at_lkr.y) >= 113. || 00219 (fabs(X_at_lkr.x)+fabs(X_at_lkr.y)) >= 113.*sqrt(2.)) { 00220 counter[10]++; 00221 return -1; 00222 } 00223 00224 //distanza traccia cluster < 10 cm 00225 if (lkry->hit_recorded>0) { 00226 double dx = lkry->mxl[0] - X_at_lkr.x; 00227 double dy = lkry->myl[0] - X_at_lkr.y; 00228 if (dx*dx + dy*dy > 100) { 00229 counter[11]++; 00230 return -1; 00231 } 00232 } 00233 00234 // accettanza dei muv1,2,3 00235 00236 gvet X_at_muv; 00237 X_at_muv= Trk.Xmg + Trk.P_out*((muvet1->Get_Cface().z-Trk.Xmg.z)/Trk.P_out.z); 00238 if (fabs(X_at_muv.x)<10.&&fabs(X_at_muv.y)<10.) { //taglio interno 00239 counter[12]++; 00240 return -1; 00241 } 00242 if (fabs(X_at_muv.x)>120.||fabs(X_at_muv.y)>120) { //taglio esterno 00243 counter[13]++; 00244 return -1; 00245 } 00246 00247 // muvet2 00248 X_at_muv= Trk.Xmg + Trk.P_out*((muvet2->Get_Cface().z-Trk.Xmg.z)/Trk.P_out.z); 00249 if (fabs(X_at_muv.x)<10.&&fabs(X_at_muv.y)<10.) { //taglio interno 00250 counter[14]++; 00251 return -1; 00252 } 00253 if (fabs(X_at_muv.x)>120.||fabs(X_at_muv.y)>120) { //taglio esterno 00254 counter[15]++; 00255 return -1; 00256 } 00257 00258 // muvet3 00259 X_at_muv= Trk.Xmg + Trk.P_out*((muvet3->Get_Cface().z-Trk.Xmg.z)/Trk.P_out.z); 00260 if (fabs(X_at_muv.x)<10.&&fabs(X_at_muv.y)<10.) { //taglio interno 00261 counter[16]++; 00262 return -1; 00263 } 00264 if (fabs(X_at_muv.x)>120.||fabs(X_at_muv.y)>120) { //taglio esterno 00265 counter[17]++; 00266 return -1; 00267 } 00268 00269 00270 //************************************************* 00271 count_wnt++; 00272 np=1; 00273 00274 Set_tempo_parms(); 00275 timedif=ana_dtim; 00276 return 1; 00277 00278 } 00279 //---------------------------------------------------- 00280 00281 00282 //---------------------------------------------------- 00283 void AnaKmunu::print_scale() 00284 { 00289 Gout<<"\n -----> "<<titol<<" Analysis Summary <-------\n"; 00290 Gout<<"\n Fit entries "<<count_call; 00291 Gout<<"\n Good decays "<<count_decay << " (after zv cut)"; 00292 00293 for (int i=0;i<30;i++) 00294 { 00295 if (counter[i]>0) Gout<<"\n Rejection "<<setw(3)<<i<<" "<<counter[i]; 00296 00297 } 00298 00299 Gout<<"\n Good events "<<count_wnt; 00300 00301 00302 Gout<<"\n\n ======> d o n e <============ "<<std::endl; 00303 }