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