FlyoDoc_2011 Pisa 2011 by GmP --- 011

flyopunta/src/src_ana/anak2pi.cpp

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