FlyoDoc_2011 Pisa 2011 by GmP --- 011
|
00001 /*************************************************************************** 00002 anak2pi.cpp - description 00003 ------------------- 00004 begin : Sat Jan 18 2003 00005 copyright : (C) 2003 by Giuseppe Pierazzini 00006 email : peppe@unipi.it 00007 *************************************************************************** 00008 * * 00009 * NA48 simulation program. * 00010 * * 00011 ***************************************************************************/ 00012 // #define MIN(x,y,z) ((x)<(y)?(x)<(z)?(x):(z):(y)<(z)?(y):(z)) 00013 00014 #include "flyoh.h" 00015 #include "anak2pi.h" 00016 using namespace std; 00017 00018 //------------------------------------------------------------- 00019 //------------------------------------------------------------- 00020 00021 AnaK2pi::AnaK2pi() 00022 {tipo=3;nfit=2;titol="K--> pi+ pi-";nome="K2pi"; 00023 nd=np=0; 00024 Gout<<"\n Attivato il fit di "<<titol; 00025 } 00026 00027 AnaK2pi::~AnaK2pi(){}; 00028 00029 //=============== C h a r g e 2 pions F i t ======== 00030 00031 int AnaK2pi::Fisica() 00032 { 00033 00034 // Device *dev; 00035 // gvet Xa,Va,Vb; 00036 qvet qp[3],qq,qtot; // crea e azzera 00037 np=nd=0; 00038 count_call++; 00039 // 00040 np=Le_Tracce->Tot_trk+1; 00041 if(np!=2) {np=0;return(-1);} 00042 // attenzione per piu' di tre tracce si dovrebbe iterare sulla meglio coppia 00043 // vedi anak3pi.cpp 00044 charge=Tracc[0]->charge+Tracc[1]->charge; 00045 pmis[0]=Tracc[0]->ptrk; 00046 pmis[1]=Tracc[1]->ptrk; 00047 qp[0]= Tracc[0]->Get_P(); 00048 qp[1]= Tracc[1]->Get_P(); 00049 qtot=qp[0]+qp[1]; 00050 qtot.Invar(); 00051 mkmis=qtot.m; 00052 pkmis=qtot.norma; 00053 00054 if(pkmis<50.||pkmis>190.){getta_en++;return -2;} 00055 if(pmis[0]<10.){getta_ch++; return -2;} 00056 if(pmis[1]<10.){getta_ch++; return -2;} 00057 00058 nd=2; 00059 qq=qp[0]+qp[1]; 00060 qq.Invar();qq.Norma(); 00061 mkmis=qq.m; 00062 pkmis=qq .norma; 00063 mcut=0.1608e-2+qq[3]*0.8505e-5; 00064 mcut=fabs(mkmis-0.49367)/mcut; 00065 00066 if(Vertice()!=1){getta_fit++;return -3;} 00067 double lvita=vz-607.5; // - Aks posizione... 00068 cvita= lvita/(2.676*pkmis/.49367); 00069 00070 double cogx= (pmis[0]*Cam4->M_Hits[0].Xdev.x+pmis[1]*Cam4->M_Hits[1].Xdev.x)/pkmis; 00071 double cogy= (pmis[0]*Cam4->M_Hits[0].Xdev.y+pmis[1]*Cam4->M_Hits[1].Xdev.y)/pkmis; 00072 00073 cog=sqrt(cogx*cogx+cogy*cogy); 00074 asp= fabs((pmis[1]-pmis[0])/pkmis); 00075 // calcolo del mon trsverso rispetto all'asse del fascio. 00076 gvet Bvers(0.,0.,1.); //asse KL 00077 if(SelRea->avo->Get_Idm()!=16) 00078 {Bvers.setvn(0.,-7.19,12171.4); // asse Ks 00079 Bvers=Bvers.Verso(); 00080 } 00081 gvet Pt=Bvers&qq; Pt.Norma(); 00082 cptq= Pt.normaq; 00083 count_wnt++; 00084 return 1; 00085 00086 } 00087 00088 //====================================================================================== 00089 int AnaK2pi::Vertice() 00090 { 00091 // calcola il vertice ed il chiq relativo per due tracce 00092 gvet P1,P2,V1,V2; 00093 gvet Noto,PV; 00094 00095 V1= Tracc[0]->Get_Pc2()-(P1=Tracc[0]->Get_Pc1()); V1.Norma();V1=V1.Verso(); 00096 V2= Tracc[1]->Get_Pc2()-(P2=Tracc[1]->Get_Pc1()); V2.Norma();V2=V2.Verso(); 00097 00098 Noto=P1+P2; 00099 Noto-=(V1*(V1%P1)+V2*(V2%P2)); 00100 // Noto.print("Noto"); 00101 00102 // matrice righe MV1,MV2,MV3 00103 gvet MV1(2.,0.,0.), MV2(0.,2.,0.),MV3(0.,0.,2.); 00104 MV1-=V1*V1[0] + V2*V2[0]; 00105 MV2-=V1*V1[1] + V2*V2[1]; 00106 MV3-=V1*V1[2] + V2*V2[2]; 00107 00108 gvet VM1,VM2,VM3; //righe della matrice inversa 00109 VM1= MV2&MV3; // nota: prodotto vettoriale 00110 double det = MV1%VM1; // determinante 00111 VM1= VM1/det; 00112 VM2= (MV3&MV1)/det; 00113 VM3= (MV1&MV2)/det; 00114 PV.setvn(VM1%Noto,VM2%Noto,VM3%Noto); // vertice 00115 //calcolo il chiq 00116 gvet DP1=PV-P1,DP2=PV-P2; 00117 double t1=V1%DP1, t2=V2%DP2; 00118 DP1-=V1*t1; DP2-=V2*t2; 00119 DP1.Norma(); DP2.Norma(); 00120 chisq= DP1.normaq + DP2.normaq; 00121 00122 if(Debugon>0) { 00123 PV.print("Vert"); 00124 Gout<<"\n Vertice chiq ="<<chisq<<std::endl; 00125 } 00126 /* PV.setv(cam2->mx[icp]-cam1->mx[icp], 00127 cam2->my[icp]-cam1->my[icp], 00128 cam2->mz[icp]-cam1->mz[icp]); 00129 */ 00130 00131 PV.putv(vx,vy,vz); 00132 // Gout<<"\n vertex %10.5lf %10.5lf %10.5lf", vx,vy,vz); 00133 if(chisq>200.)return -1; 00134 return 1; 00135 } 00136 00137 //---------------------------------------------------- 00138 void AnaK2pi::print_scale() 00139 { 00140 00141 Gout<<"\n -----> "<<titol<<" Analysis Summary. <-------\n"; 00142 Gout<<"\n Fit entries "<<count_call; 00143 Gout<<"\n Track energ to low "<<getta_ch; 00144 Gout<<"\n Killed by energy "<<getta_en; 00145 Gout<<"\n Tau cut "<<getta_tau; 00146 Gout<<"\n No good vertex "<<getta_fit; 00147 Gout<<"\n Good events "<<count_wnt; 00148 Gout<<"\n\n ======> d o n e <============ "; 00149 } 00150 //-------------------------------------------