FlyoDoc_2011 Pisa 2011 by GmP --- 011

flyopunta/src/src_ana/anake2g.cpp

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