FlyoDoc_2011 Pisa 2011 by GmP --- 011
|
00001 /*************************************************************************** 00002 anake2g.cpp - 00003 gmp/SGal 4 ottobre 2010 00004 ***************************************************************************/ 00005 //la successione degli include può essere causa di errore..... 00006 00007 #include "flyoh.h" 00008 #include "anake2g.h" 00009 00010 using namespace std; 00011 00012 gvet Vert_coor(gvet,gvet,gvet,gvet); 00013 00014 AnaKe2g::AnaKe2g() 00015 { 00016 tipo=24; 00017 nfit=1; 00018 titol="K->e v g" ; 00019 nome="Ke2g"; 00020 Gout<<"\n Ridefinito e creato il fit di "<<titol<<endl; 00021 00022 if(Le_Tracce==0) 00023 { 00024 Gout<<"\n Error.. "<<titol<<" analisys ... Tracks non defined!"<<endl; 00025 exit(0); 00026 } 00027 Part_db *pm; 00028 pm=Matter->Pntmatter("Kp"); 00029 mask= pm->Get_Massa(); 00030 pm=Matter->Pntmatter("mup"); 00031 masmu= pm->Get_Massa(); 00032 pm=Matter->Pntmatter("pip"); 00033 maspi= pm->Get_Massa(); 00034 pm=Matter->Pntmatter("elep"); 00035 mase= pm->Get_Massa(); 00036 00037 } 00038 AnaKe2g::~AnaKe2g() 00039 {} 00040 00041 00042 00043 00044 00045 //================================== 00046 00047 //utility vectors for Fisica 00048 qvet PK,Pelep,Pke,Pgam; 00049 gvet Vtxm, Vgam; 00050 00051 int AnaKe2g::Fisica() 00052 { 00053 count_call++; 00054 00055 kp=0.0; 00056 engm=enlk=miske=miskex=miskey=miskez=0.0; 00057 ptrske=emisq=0.0; 00058 vtx=vty=vtz=0.; 00059 00060 // nota Le_Tracce->First_trk corrispomde a Tracc[0] 00061 // atenzione forzata ad uno per vedere la statistica...... 00062 00063 nt=Le_Tracce->Tot_trk+1; 00064 if(nt<1) 00065 { 00066 getta_ch++; 00067 return(-1);// non c'e' la traccia carica 00068 } 00069 00070 // test on lkry hits 00071 if(lkry->mhit<2) 00072 { 00073 getta_en++; 00074 return -3;// calorimetro con pochi hits 00075 } 00076 00077 00078 00079 00080 // calcolo la distanza dell'elettrone estrapolato al calorimetro dagli hits visti per trovare 00081 // il gamma e il positrone 00082 00083 // test primo hits 00084 // controllare che Xdev sia quello giusto con errori! 00085 int pr_el=-1 , pr_gm=-1; 00086 00087 engm=enlk=Xtcal= Ytcal=0.0; 00088 if( ( discal=(Tracc[0]->Xlk-lkry->M_Hits[0].Xdev).XYNorma())<1.) 00089 { 00090 pr_el=0; 00091 pr_gm=1; // l'altro hit è del gamma 00092 } 00093 else if( (discal=(Tracc[0]->Xlk-lkry->M_Hits[1].Xdev).XYNorma())<1.) 00094 { 00095 pr_el=1; 00096 pr_gm=0; 00097 } 00098 else 00099 { 00100 getta_ch++; 00101 return(-1);// non c'e' matching 00102 } 00103 Xtcal=Tracc[0]->Xlk[0]; 00104 Ytcal=Tracc[0]->Xlk[1]; 00105 00106 00107 // qvet PK,Pelep,Pgam; 00108 // K incidente 00109 PK.setvn(0.,0.,75.,mask); // impulso fisso del K (px,py,pz,Massa) 00110 00111 // gamma 00112 if(( engm= lkry->M_Hits[pr_gm].e_rivela)<0.5) 00113 { 00114 getta_en++; 00115 return -3;// cut on energia misurata in lkry... 00116 } 00117 00118 00119 00120 00121 00122 00123 00124 // traccia elettrone con soglia 00125 if((enlk = lkry->M_Hits[pr_el].e_rivela)<0.1) 00126 { 00127 getta_en++; 00128 return -3;// cut on energia misurata in lkry... 00129 } 00130 gvet Mome=gvet(Tracc[0]->Get_P()); // impulso della traccia carica calcolato in DevTrk 00131 Pelep.setvn(Mome, mase); 00132 double puls=Tracc[0]->ptrk; 00133 if(puls>100.) puls=100.; 00134 pq=puls*Tracc[0]->charge; 00135 rapsel=-1.; 00136 if(abs(pq)>0.0) rapsel=enlk/abs(pq); 00137 00138 00139 // calcolo vertice in Vert_coor() 00140 gvet Xkb(0.,0.,8000.),Vkb(0.,0.,1.); 00141 gvet Xe=Tracc[0]->Get_Pc1(); 00142 gvet Ve= Tracc[0]->Get_Pc2()-Tracc[0]->Get_Pc1(); Ve.Norma();Ve=Ve.Verso(); 00143 00144 Vtxm = Vert_coor(Vkb,Xkb,Ve,Xe); 00145 Vtxm.putv(vtx,vty,vtz); 00146 00147 // calcolo della massa del neutrino in funzione dello zeta del vertice. 00148 Pke=PK-Pelep; 00149 Pke.Invar(); 00150 // Vgam.setvn(lkry->M_Hits[pr_gm].Xlab.x-vtx,lkry->M_Hits[pr_gm].Xlab.y-vty,lkry->M_Hits[pr_gm].Xlab.z-vtz); 00151 Vgam.setvn(lkry->M_Hits[pr_gm].Xlab.x,lkry->M_Hits[pr_gm].Xlab.y,lkry->M_Hits[pr_gm].Xlab.z-vtz); 00152 00153 Vgam=Vgam.Verso(); 00154 Pgam.setqn(Vgam*engm,engm); 00155 emisq= Pke.mq -2.*(Pke.e*Pgam.e -Pgam%Pke); 00156 00157 // define miske.... 00158 miske=Pke.mom; 00159 Pke.putv(miskex,miskey,miskez); 00160 ptrske=Pke.XYNorma(); 00161 00162 00163 00164 //************************************************************************* 00165 00166 count_wnt++; 00167 return 1 ; 00168 } 00169 00170 00171 // ========gvet Vert_coor def ================ 00172 00173 // utility matrix for Vert_coor with general scope 00174 gmatrix PJ1(3,3),PJ2(3,3),PJ(3,3),Noto(3,1),Xvt(3,1); 00175 gmatrix Ident(3,1.0); // oppure gmatrix Ident(3,3);Ident.Unit(); 00176 gvet Vtx; 00177 00178 gvet Vert_coor(gvet v1,gvet x1,gvet v2,gvet x2) 00179 { 00180 // calcolo del vertice a partire dalle de due rette. 00181 00182 gmatrix P1(x1),P2(x2); //passa da vettore gvet a matrice(3,1): 00183 00184 // Note 00185 /* 00186 attenzione "P.Proij( gvet &v)" definisce la matrice P come un proiettore 00187 sul vettore: "|v><v|" 00188 Il proiettore applicato ad un vettore, per esempio B, estrae la parte 00189 B' parallela a v come B'=P*B; 00190 [ricorda che anche B è una matrice (3X1) ad una colonna ottenuta per esempio 00191 generando la matrice a partire dal vettore tridimensionale gvet "b" con 00192 gmatrix B(b)] 00193 00194 Alternativamente in modo più compatto! 00195 L'operatore ">>" usato nella forma "b>>P" (dove b è un gvet e P una gmatrix 3X3 vuota) 00196 è equivalente alla Proij(). Attenzione a mettere le parentesi per definire la priorità nelle operazioni! 00197 */ 00198 00199 PJ1= Ident-(v1>>PJ1); PJ2= Ident-(v2>>PJ2); // attenzione alle parentesi 00200 00201 PJ1.Det(); PJ2.Det(); 00202 PJ = PJ1+PJ2; Noto= PJ1*P1+PJ2*P2; 00203 Xvt=!PJ*Noto; 00204 // passo da matrice a gvet. 00205 // Xvt.Get_Vcol(Vtx); //oppure 00206 Vtx=Xvt; // equivale a Vtx.x=Xvt(0,0); Vtx.y=Xvt(1,0); Vtx.z=Xvt(2,0); 00207 00208 return Vtx; 00209 00210 } 00211 00212 00213 00214 00215 00216 00217 00218 00219 00220