FlyoDoc_2011 Pisa 2011 by GmP --- 011

flyopunta/src/src_ana/anakmunu.cpp

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