FlyoDoc_2011 Pisa 2011 by GmP --- 011

flyopunta/src/src_ana/anakpivv.cpp

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 }
 All Classes Namespaces Files Functions Variables