#include "PndSdsMCPoint.h" #include "PndSciTPoint.h" #include "PndSciTHit.h" #include "PndTrkComparisonMCtruth.h" // #include "PndTrkCTGeometryCalculations.h" #include "PndMCTrack.h" #include "PndTrkVectors.h" // Root includes #include "TROOT.h" #include "TClonesArray.h" #include #include using namespace std; //----------begin of function PndTrkComparisonMCtruth::AssociateFoundTrackstoMCquater // inizio cambio_in_perl ; void PndTrkComparisonMCtruth::AssociateFoundTrackstoMCquater( Double_t BFIELD, Double_t CVEL, Vec *daTrackFoundaTrackMC, TClonesArray *fMCTrackArray, Vec *FromPixeltoMCTrack, Vec *FromStriptoMCTrack, Vec *FromSciTiltoMCTrackList, Vec *keepit, Vec *info, Vec *ListSttParHitsinTrack, Vec *ListMvdPixelHitsinTrack, Vec *ListSciTilHitsinTrack, Vec *ListSttSkewHitsinTrack, Vec *ListMvdStripHitsinTrack, int MAXMVDPIXELHITSINTRACK, int MAXMVDSTRIPHITSINTRACK, int MAXSCITILHITSINTRACK, int MAXSTTHITSINTRACK, Vec *nFromSciTiltoMCTrack, Vec *nSttParHitsinTrack, int nMCTracks, Vec *nMvdPixelHitsinTrack, Short_t nSciTilHits, Vec *nSciTilHitsinTrack, Vec *nSttSkewHitsinTrack, Vec *nMvdStripHitsinTrack, Short_t nTracksFoundSoFar, Vec *Ox, Vec *Oy, Vec *R, Vec *X1, Vec *Y1, Vec *X2, Vec *Y2, Vec *X3, Vec *Y3 ) { // fine cambio_in_perl ; int tmp_dim = MAXSTTHITSINTRACK+MAXMVDPIXELHITSINTRACK+MAXMVDSTRIPHITSINTRACK; int tmp_dim2; // protection in case nTracksFoundSoFar = 0; the dimension of vector must be // >= 1; if(nTracksFoundSoFar>0) { tmp_dim2 = nTracksFoundSoFar;} else {tmp_dim2 = 1;} bool firstime, flaggo; // non cambiare senno' cambiaperl non funziona ! Short_t TMPinclusionMC[tmp_dim2*tmp_dim]; Vec inclusionMC(TMPinclusionMC,tmp_dim2*tmp_dim,"inclusionMC"); Short_t TMPinclusionExp[tmp_dim2]; Vec inclusionExp(TMPinclusionExp,tmp_dim2,"inclusionExp"); Short_t TMPntoMCtrack[tmp_dim2]; Vec ntoMCtrack(TMPntoMCtrack,tmp_dim2,"ntoMCtrack"); Short_t TMPtoMCtrackfrequency[tmp_dim2*MAXSTTHITSINTRACK]; Vec toMCtrackfrequency(TMPtoMCtrackfrequency,tmp_dim2*MAXSTTHITSINTRACK,"toMCtrackfrequency"); // fine non cambiare senno' cambiaperl non funziona ! Short_t i, j, jtemp,jexp , nmid; Short_t itemp, massimo; // non cambiare senno' cambiaperl non funziona ! Short_t TMPtoMCtracklist[tmp_dim2*MAXSTTHITSINTRACK]; Vec toMCtracklist(TMPtoMCtracklist,tmp_dim2*MAXSTTHITSINTRACK,"toMCtracklist"); // fine non cambiare senno' cambiaperl non funziona ! int nindex; Int_t enne; Double_t dx, Cx, Cy, Rr, alfa, beta, gamma, minimo; // non cambiare senno' cambiaperl non funziona ! Double_t TMPtanlow[tmp_dim2]; Vec tanlow(TMPtanlow,tmp_dim2,"tanlow"); Double_t TMPtanmid[tmp_dim2]; Vec tanmid(TMPtanmid,tmp_dim2,"tanmid"); Double_t TMPtanup[tmp_dim2]; Vec tanup(TMPtanup,tmp_dim2,"tanup"); Double_t TMPtoMCtrackdistance[tmp_dim2*MAXSTTHITSINTRACK]; Vec toMCtrackdistance(TMPtoMCtrackdistance,tmp_dim2*MAXSTTHITSINTRACK,"toMCtrackdistance"); // fine non cambiare senno' cambiaperl non funziona ! for(i=0; iat(i)=-1; if(!keepit->at(i)) continue; inclusionExp[i]=true; for(j=0; jat(i)+nSttSkewHitsinTrack->at(i)+nMvdPixelHitsinTrack->at(i) +nMvdStripHitsinTrack->at(i);j++){ inclusionMC[i*tmp_dim+j]=true; } //--- find the minimum, middle, end Tan(angle) of this track, for the comparison later tanlow[i]=0.; tanmid[i]=0.; tanup [i]=0.; int nn = nSttParHitsinTrack->at(i)+nMvdPixelHitsinTrack->at(i)+nMvdStripHitsinTrack->at(i); if( nn > 2 || nn == 1) { dx = X1->at(i) - Ox->at(i); if(fabs(dx)> 1.e-10){ tanlow[i] = (Y1->at(i) - Oy->at(i) )/dx; } else { tanlow[i] = 999999.; } dx = X2->at(i) - Ox->at(i); if(fabs(dx)> 1.e-10){ tanmid[i] = ( Y2->at(i) - Oy->at(i) )/dx; } else { tanmid[i] = 999999.; } dx = X3->at(i) - Ox->at(i); if(fabs(dx)> 1.e-10){ tanup[i] = (Y3->at(i) - Oy->at(i) )/dx; } else { tanup[i] = 999999.; } } else if (nn==2) { // continuation of if( nn > 2 || nn == 1) dx = X1->at(i) - Ox->at(i); if(fabs(dx)> 1.e-10){ tanlow[i] = (Y1->at(i) - Oy->at(i) )/dx; } else { tanlow[i] = 999999.; } dx = X2->at(i) - Ox->at(i); if(fabs(dx)> 1.e-10){ tanmid[i] = ( Y2->at(i) - Oy->at(i) )/dx; } else { tanmid[i] = 999999.; } tanup[i] = tanmid[i]; } //----------------------------- } // end of for(i=0; iat(jexp)) continue; firstime=true; ntoMCtrack[jexp]=0; // prima gli hits paralleli --------------------- for(i=0; iat(jexp); i++){ nindex = jexp*MAXSTTHITSINTRACK + i; // enne = MC track alla quale lo hit e' associato. enne = (Int_t)( info->at( ListSttParHitsinTrack->at(nindex)*7+ 6)+0.01 ); if(enne<0) continue; // hit not associated to any MC track; noise hit. if(firstime) { toMCtracklist[jexp*MAXSTTHITSINTRACK+0]= enne; toMCtrackfrequency[jexp*MAXSTTHITSINTRACK+0]=1; firstime = false; getMCInfo( BFIELD, CVEL, &Cx, &Cy,fMCTrackArray,enne, &Rr); if( Rr<0.) { toMCtrackdistance[jexp*MAXSTTHITSINTRACK+0]=-1.; } else { alfa = -2.*Cx; beta = -2.*Cy; gamma = Cx*Cx+Cy*Cy-Rr*Rr; toMCtrackdistance[jexp*MAXSTTHITSINTRACK+0]= FindDistance(Ox->at(jexp),Oy->at(jexp), R->at(jexp),tanlow[jexp],tanmid[jexp],tanup[jexp],alfa,beta,gamma); } ntoMCtrack[jexp]=1; } else { // continuation of if(firstime) flaggo=true; for(j=0; jat(jexp),Oy->at(jexp),R->at(jexp), tanlow[jexp],tanmid[jexp],tanup[jexp], alfa,beta,gamma); } ntoMCtrack[jexp]++; } // end of if(flaggo) } } // end of for(i=0; iat(jexp); i++) // poi i pixel ------------------------------------------- for(i=0; iat(jexp); i++){ nindex = jexp*MAXMVDPIXELHITSINTRACK + i; enne = FromPixeltoMCTrack->at( ListMvdPixelHitsinTrack->at(nindex) ) ; if(enne<0) continue; // hit not associated to any MC track; noise hit. if(firstime) { toMCtracklist[jexp*MAXSTTHITSINTRACK+0]= enne; toMCtrackfrequency[jexp*MAXSTTHITSINTRACK+0]=1; firstime = false; getMCInfo(BFIELD, CVEL, &Cx, &Cy,fMCTrackArray,enne, &Rr); if( Rr<0.) { toMCtrackdistance[jexp*MAXSTTHITSINTRACK+0]=-1.; } else { alfa = -2.*Cx; beta = -2.*Cy; gamma = Cx*Cx+Cy*Cy-Rr*Rr; toMCtrackdistance[jexp*MAXSTTHITSINTRACK+0]= FindDistance(Ox->at(jexp),Oy->at(jexp), R->at(jexp),tanlow[jexp],tanmid[jexp],tanup[jexp],alfa,beta,gamma); } ntoMCtrack[jexp]=1; } else { // continuation of if(firstime) flaggo=true; for(j=0; jat(jexp),Oy->at(jexp), R->at(jexp),tanlow[jexp],tanmid[jexp],tanup[jexp],alfa,beta,gamma); } ntoMCtrack[jexp]++; } // end of if(flaggo) } } // end of for(i=0; iat(jexp); i++) // le strip ------------------------------------------- for(i=0; iat(jexp); i++){ nindex = jexp*MAXMVDSTRIPHITSINTRACK + i; enne = FromStriptoMCTrack->at( ListMvdStripHitsinTrack->at(nindex) ) ; if(enne<0) continue; // hit not associated to any MC track; noise hit. if(firstime) { toMCtracklist[jexp*MAXSTTHITSINTRACK+0]= enne; toMCtrackfrequency[jexp*MAXSTTHITSINTRACK+0]=1; firstime = false; getMCInfo( BFIELD, CVEL, &Cx, &Cy,fMCTrackArray,enne, &Rr); if( Rr<0.) { toMCtrackdistance[jexp*MAXSTTHITSINTRACK+0]=-1.; } else { alfa = -2.*Cx; beta = -2.*Cy; gamma = Cx*Cx+Cy*Cy-Rr*Rr; toMCtrackdistance[jexp*MAXSTTHITSINTRACK+0]= FindDistance(Ox->at(jexp),Oy->at(jexp), R->at(jexp),tanlow[jexp],tanmid[jexp],tanup[jexp],alfa,beta,gamma); } ntoMCtrack[jexp]=1; } else { // continuation of if(firstime) flaggo=true; for(j=0; jat(jexp),Oy->at(jexp),R->at(jexp), tanlow[jexp],tanmid[jexp],tanup[jexp], alfa,beta,gamma); } ntoMCtrack[jexp]++; } // end of if(flaggo) } } // end of for(i=0; iat(jexp); i++) // the SciTil hits ------------------------------------------- for(i=0; iat(jexp); i++){ nindex = jexp*MAXSCITILHITSINTRACK+i; int SciTilTilenumber = ListSciTilHitsinTrack->at(nindex); // nFromSciTiltoMCTrack is zero in case this SciTil hit is not associated to any // MC truth track. In that case effectively the SciTil hit is ignored. for(int iMClinks=0; iMClinks< nFromSciTiltoMCTrack->at(SciTilTilenumber);iMClinks++){ enne = FromSciTiltoMCTrackList->at(SciTilTilenumber*nMCTracks+iMClinks); if(firstime) { toMCtracklist[jexp*MAXSTTHITSINTRACK+0]= enne; toMCtrackfrequency[jexp*MAXSTTHITSINTRACK+0]=1; firstime = false; getMCInfo( BFIELD, CVEL, &Cx, &Cy,fMCTrackArray,enne, &Rr); if( Rr<0.) { toMCtrackdistance[jexp*MAXSTTHITSINTRACK+0]=-1.; } else { alfa = -2.*Cx; beta = -2.*Cy; gamma = Cx*Cx+Cy*Cy-Rr*Rr; toMCtrackdistance[jexp*MAXSTTHITSINTRACK+0]= FindDistance(Ox->at(jexp),Oy->at(jexp), R->at(jexp),tanlow[jexp],tanmid[jexp],tanup[jexp],alfa,beta,gamma); } ntoMCtrack[jexp]=1; } else { // continuation of if(firstime) flaggo=true; for(j=0; jat(jexp),Oy->at(jexp),R->at(jexp), tanlow[jexp],tanmid[jexp],tanup[jexp], alfa,beta,gamma); } ntoMCtrack[jexp]++; } // end of if(flaggo) } } // end of for(int iMClinks=0; iMClinks< ... } // end of for(i=0; iat(jexp); i++) } // end of for(jexp=0; jexp< nTracksFoundSoFar ;jexp++) //-------------------------------------------------------------------- itemp=0; while ( itemp > -1){ itemp=-1; massimo = -1; minimo = 999999999999.; for(jexp=0; jexp< nTracksFoundSoFar ;jexp++){ if(!keepit->at(jexp)) continue; if( !inclusionExp[jexp]) continue; for(i=0; i< ntoMCtrack[jexp]; i++){ if( !inclusionMC[jexp*tmp_dim+i]) continue; if( toMCtrackdistance[jexp*MAXSTTHITSINTRACK+i]<-0.5) continue; if( toMCtrackfrequency[jexp*MAXSTTHITSINTRACK+i]>massimo){ massimo=toMCtrackfrequency[jexp*MAXSTTHITSINTRACK+i]; minimo=toMCtrackdistance[jexp*MAXSTTHITSINTRACK+i]; itemp = toMCtracklist[jexp*MAXSTTHITSINTRACK+i]; jtemp = jexp; } else if ( toMCtrackfrequency[jexp*MAXSTTHITSINTRACK+i]== massimo){ if( toMCtrackdistance[jexp*MAXSTTHITSINTRACK+i]-1 ){ daTrackFoundaTrackMC->at(jtemp)=itemp; inclusionExp[jtemp]=false; for(jexp=0; jexpat(jexp)) continue; for(int jk=0;jk -1) return; } //----------end of function PndTrkComparisonMCtruth::AssociateFoundTrackstoMCquater // marker1 per cambioperl; //----------begin of function PndTrkComparisonMCtruth::ComparisonwithMC int PndTrkComparisonMCtruth::ComparisonwithMC( PndTrkComparisonMCtruth_io_Data ioData ) { int i, j, dim1, dim2, dim3, nele, ncand, nMCTracks, nMvdMCPoint; Double_t dista; const double PI=3.141592654; Double_t BFIELD = ioData.Bfield; Vec Charge(ioData.Charge,ioData.MAXTRACKSPEREVENT,"Charge") ; Double_t CVEL = ioData.Cvel; Vec daTrackFoundaTrackMC(ioData.daTrackFoundaTrackMC,ioData.MAXTRACKSPEREVENT,"daTrackFoundaTrackMC") ; Double_t DIMENSIONSCITIL = ioData.DIMENSIONSciTil; Double_t ERRORSQPIXEL = ioData.Errorsqpixel; Double_t ERRORSQSTRIP = ioData.Errorsqstrip; Vec FI0(ioData.FI0,ioData.MAXTRACKSPEREVENT,"FI0") ; TClonesArray *fMCTrackArray = ioData.fMCTrackArray; TClonesArray *fMvdMCPointArray = ioData.fMvdMCPointArray; FILE * HANDLE = ioData.HANDLE; FILE * HANDLE2 = ioData.HANDLE2; Vec info (ioData.info,ioData.MAXSTTHITS*7,"info") ; int istampa = ioData.istampa; int IVOLTE = ioData.IVOLTE; Vec KAPPA(ioData.KAPPA,ioData.MAXTRACKSPEREVENT,"KAPPA") ; Vec keepit(ioData.keepit,ioData.MAXTRACKSPEREVENT,"keepit") ; Vec InclusionListStt(ioData.InclusionListStt,ioData.MAXSTTHITS,"InclusionListStt") ; Vec ListMvdPixelHitsinTrack(ioData.ListMvdPixelHitsinTrack, ioData.MAXTRACKSPEREVENT*ioData.MAXMVDPIXELHITSINTRACK,"ListMvdPixelHitsinTrack") ; Vec ListMvdStripHitsinTrack(ioData.ListMvdStripHitsinTrack, ioData.MAXTRACKSPEREVENT*ioData.MAXMVDSTRIPHITSINTRACK,"ListMvdStripHitsinTrack") ; Vec ListSciTilHitsinTrack(ioData.ListSciTilHitsinTrack, ioData.MAXTRACKSPEREVENT*ioData.MAXSCITILHITSINTRACK,"ListSciTilHitsinTrack") ; Vec ListSttParHitsinTrack(ioData.ListSttParHitsinTrack, ioData.MAXTRACKSPEREVENT*ioData.MAXSTTHITSINTRACK,"ListSttParHitsinTrack") ; Vec ListSttSkewHitsinTrack(ioData.ListSttSkewHitsinTrack, ioData.MAXTRACKSPEREVENT*ioData.MAXSTTHITSINTRACK,"ListSttSkewHitsinTrack") ; Vec ListTrackCandHit (ioData.ListTrackCandHit,ioData.MAXTRACKSPEREVENT*(ioData.MAXSTTHITSINTRACK+ ioData.MAXMVDPIXELHITSINTRACK+ ioData.MAXMVDSTRIPHITSINTRACK+ ioData.MAXSCITILHITSINTRACK),"ListTrackCandHit") ; Vec ListTrackCandHitType (ioData.ListTrackCandHitType, ioData.MAXTRACKSPEREVENT*(ioData.MAXSTTHITSINTRACK+ ioData.MAXMVDPIXELHITSINTRACK+ ioData.MAXMVDSTRIPHITSINTRACK+ ioData.MAXSCITILHITSINTRACK),"ListTrackCandHitType") ; int MAXMCTRACKS = ioData.MAXMCTRACKS; int MAXMVDPIXELHITSINTRACK = ioData.MAXMVDPIXELHITSINTRACK; int MAXMVDMCPOINTS = ioData.Maxmvdmcpoints; int MAXMVDSTRIPHITSINTRACK = ioData.MAXMVDSTRIPHITSINTRACK; int MAXSCITILHITSINTRACK = ioData.MAXSCITILHITSINTRACK; int MAXSTTHITS = ioData.MAXSTTHITS; int MAXSTTHITSINTRACK = ioData.MAXSTTHITSINTRACK; int MAXTRACKSPEREVENT = ioData.MAXTRACKSPEREVENT; // protection against dimension 0 cases; /* ioData.nTotalCandidates >0 ? dim1 = ioData.nTotalCandidates : dim1 = 1; ioData.nMvdPixelHit >0 ? dim2 = ioData.nMvdPixelHit : dim2 = 1; ioData.nMvdStripHit >0 ? dim3 = ioData.nMvdStripHit : dim3 = 1; ioData.nSttHit >0 ? dim4 = ioData.nSttHit : dim4 = 1; */ Vec MCMvdPixelAloneList(ioData.MCMvdPixelAloneList, ioData.nTotalCandidates*ioData.nMvdPixelHit,"MCMvdPixelAloneList") ; Vec MCMvdStripAloneList(ioData.MCMvdStripAloneList, ioData.nTotalCandidates*ioData.nMvdStripHit,"MCMvdStripAloneList") ; Vec MCParalAloneList(ioData.MCParalAloneList, ioData.MAXTRACKSPEREVENT*ioData.nSttHit,"MCParalAloneList") ; Vec MCSkewAloneList(ioData.MCSkewAloneList, ioData.MAXTRACKSPEREVENT*ioData.nSttHit,"MCSkewAloneList") ; Vec MCSkewAloneX(ioData.MCSkewAloneX,ioData.MAXSTTHITS,"MCSkewAloneX") ; Vec MCSkewAloneY(ioData.MCSkewAloneY,ioData.MAXSTTHITS,"MCSkewAloneY") ; Vec MvdPixelCommonList(ioData.MvdPixelCommonList, ioData.nTotalCandidates*ioData.MAXMVDPIXELHITSINTRACK,"MvdPixelCommonList") ; Vec MvdPixelSpuriList(ioData.MvdPixelSpuriList, ioData.nTotalCandidates*ioData.MAXMVDPIXELHITSINTRACK,"MvdPixelSpuriList") ; Vec MvdStripCommonList(ioData.MvdStripCommonList, ioData.nTotalCandidates*ioData.MAXMVDSTRIPHITSINTRACK,"MvdStripCommonList") ; Vec MvdStripSpuriList(ioData.MvdStripSpuriList, ioData.nTotalCandidates*ioData.MAXMVDSTRIPHITSINTRACK,"MvdStripSpuriList") ; Vec nHitsInMCTrack(ioData.nHitsInMCTrack,ioData.MAXTRACKSPEREVENT,"nHitsInMCTrack") ; Vec nMCMvdPixelAlone(ioData.nMCMvdPixelAlone,ioData.nTotalCandidates,"nMCMvdPixelAlone") ; Vec nMCMvdStripAlone(ioData.nMCMvdStripAlone,ioData.nTotalCandidates,"nMCMvdStripAlone") ; Vec nMCParalAlone(ioData.nMCParalAlone,ioData.MAXTRACKSPEREVENT,"nMCParalAlone") ; Vec nMCSkewAlone(ioData.nMCSkewAlone,ioData.MAXTRACKSPEREVENT,"nMCSkewAlone") ; Vec nMvdPixelCommon(ioData.nMvdPixelCommon,ioData.nTotalCandidates,"nMvdPixelCommon") ; Vec nMvdPixelHitsinTrack(ioData.nMvdPixelHitsinTrack,ioData.MAXTRACKSPEREVENT,"nMvdPixelHitsinTrack") ; Vec nMvdStripHitsinTrack(ioData.nMvdStripHitsinTrack,ioData.MAXTRACKSPEREVENT,"nMvdStripHitsinTrack") ; Short_t nMvdPixelHit = ioData.nMvdPixelHit; Vec nMvdPixelSpuriinTrack(ioData.nMvdPixelSpuriinTrack,ioData.nTotalCandidates,"nMvdPixelSpuriinTrack") ; Vec nMvdStripCommon(ioData.nMvdStripCommon,ioData.nTotalCandidates,"nMvdStripCommon") ; Short_t nMvdStripHit = ioData.nMvdStripHit; Vec nMvdStripSpuriinTrack(ioData.nMvdStripSpuriinTrack,ioData.nTotalCandidates,"nMvdStripSpuriinTrack") ; Vec nParalCommon(ioData.nParalCommon,ioData.MAXTRACKSPEREVENT,"nParalCommon") ; Short_t nSciTilHits = ioData.nSciTilHits; Vec nSciTilHitsinTrack(ioData.nSciTilHitsinTrack,ioData.MAXTRACKSPEREVENT,"nSciTilHitsinTrack") ; Vec nSkewCommon(ioData.nSkewCommon,ioData.MAXTRACKSPEREVENT,"nSkewCommon") ; Vec nSkewHitsInMCTrack(ioData.nSkewHitsInMCTrack,ioData.MAXTRACKSPEREVENT,"nSkewHitsInMCTrack") ; Vec nSpuriParinTrack(ioData.nSpuriParinTrack,ioData.MAXTRACKSPEREVENT,"nSpuriParinTrack") ; Vec nSpuriSkewinTrack(ioData.nSpuriSkewinTrack,ioData.MAXTRACKSPEREVENT,"nSpuriSkewinTrack") ; Int_t nSttHit = ioData.nSttHit; Vec nSttParHitsinTrack(ioData.nSttParHitsinTrack,ioData.MAXTRACKSPEREVENT,"nSttParHitsinTrack") ; Vec nSttSkewHitsinTrack(ioData.nSttSkewHitsinTrack,ioData.MAXTRACKSPEREVENT,"nSttSkewHitsinTrack") ; Short_t nTotalCandidates = ioData.nTotalCandidates; Vec Ox(ioData.Ox,ioData.MAXTRACKSPEREVENT,"Ox") ; Vec Oy(ioData.Oy,ioData.MAXTRACKSPEREVENT,"Oy") ; Vec ParalCommonList(ioData.ParalCommonList, ioData.MAXTRACKSPEREVENT*ioData.MAXSTTHITSINTRACK,"ParalCommonList") ; Vec ParSpuriList(ioData.ParSpuriList, ioData.MAXTRACKSPEREVENT*ioData.MAXSTTHITSINTRACK,"ParSpuriList") ; Vec R(ioData.R,ioData.MAXTRACKSPEREVENT,"R") ; Vec refindexMvdPixel(ioData.refindexMvdPixel,ioData.MAXMVDPIXELHITS,"refindexMvdPixel") ; Vec refindexMvdStrip(ioData.refindexMvdStrip,ioData.MAXMVDSTRIPHITS,"refindexMvdStrip") ; Vec resultFitSZagain(ioData.resultFitSZagain,ioData.MAXTRACKSPEREVENT,"resultFitSZagain") ; Vec SkewCommonList(ioData.SkewCommonList, ioData.MAXTRACKSPEREVENT*ioData.MAXSTTHITSINTRACK,"SkewCommonList") ; Vec SkewSpuriList(ioData.SkewSpuriList, ioData.MAXTRACKSPEREVENT*ioData.MAXSTTHITSINTRACK,"SkewSpuriList") ; Vec SttSZfit(ioData.SttSZfit,ioData.MAXTRACKSPEREVENT,"SttSZfit") ; Vec XMvdPixel(ioData.XMvdPixel,ioData.MAXMVDPIXELHITS,"XMvdPixel") ; Vec XMvdStrip(ioData.XMvdStrip,ioData.MAXMVDSTRIPHITS,"XMvdStrip") ; Vec XSciTilCenter(ioData.XSciTilCenter,ioData.MAXSCITILHITS,"XSciTilCenter") ; Vec YMvdPixel(ioData.YMvdPixel,ioData.MAXMVDPIXELHITS,"YMvdPixel") ; Vec YMvdStrip(ioData.YMvdStrip,ioData.MAXMVDSTRIPHITS,"YMvdStrip") ; Vec YSciTilCenter(ioData.YSciTilCenter,ioData.MAXSCITILHITS,"YSciTilCenter") ; Vec ZMvdPixel(ioData.ZMvdPixel,ioData.MAXMVDPIXELHITS,"ZMvdPixel") ; Vec ZMvdStrip(ioData.ZMvdStrip,ioData.MAXMVDSTRIPHITS,"ZMvdStrip") ; Vec ZSciTilCenter(ioData.ZSciTilCenter,ioData.MAXSCITILHITS,"ZSciTilCenter") ; nele = MAXSTTHITSINTRACK+MAXMVDPIXELHITSINTRACK+MAXMVDSTRIPHITSINTRACK+ MAXSCITILHITSINTRACK; // marker2 per cambioperl; //---------- fetching the MC truth tracks nMCTracks = fMCTrackArray->GetEntriesFast(); // num. tracce/evento if (istampa >= 2) { cout<<"from PndTrkComparisonMCTruth : event (starting from 0) N. "<< IVOLTE<< "\n N. di MC truth tracks : "< MAXMCTRACKS){ cout<<"from PndTrkComparisonMCTruth : N. MC truth tracks = "< MAXMCTRACKS = "<=2) stampaMCTracks( BFIELD, CVEL, fMCTrackArray, nMCTracks ); // fine cambio_in_perl // --------------------------------------------- get MC Points of MVD if( fMvdMCPointArray){ nMvdMCPoint = fMvdMCPointArray->GetEntriesFast(); } else { nMvdMCPoint = 0; } if(nMvdMCPoint>MAXMVDMCPOINTS) { cout<<"from PndTracking, nMvdMCPoint = "< the maximum number allowed ("<=2) cout<<"N. MC Points delle Mvd = "< FromPixeltoMCTrack(FromPixeltoMCTra,dimensioneP,"FromPixeltoMCTrack"); Vec FromStriptoMCTrack(FromStriptoMCTra,dimensioneS,"FromStriptoMCTrack"); // fine processamento; // inizio cambio_in_perl MvdMatchtoMC( ERRORSQPIXEL, ERRORSQSTRIP, fMvdMCPointArray, nMvdMCPoint, istampa, IVOLTE, nMvdPixelHit, nMvdStripHit, &refindexMvdPixel, &refindexMvdStrip, &XMvdPixel, &XMvdStrip, &YMvdPixel, &YMvdStrip, &ZMvdPixel, &ZMvdStrip, &FromPixeltoMCTrack, // output &FromStriptoMCTrack // output ); // fine cambio_in_perl if(istampa>=3){ cout<<"\n---------- da PndTrkComparisonMCTruth\n"; for(int h=0;h nFromSciTiltoMCTrack(nFromSciTiltoMCTra,nSciTilHits,"nFromSciTiltoMCTrack"); Vec FromSciTiltoMCTrackList(FromSciTiltoMCTrackL,nSciTilHits*nMCTracks,"FromSciTiltoMCTrackList"); // fine processamento; // inizio cambio_in_perl SciTilMatchtoMC( BFIELD, CVEL, DIMENSIONSCITIL, fMCTrackArray, &FromSciTiltoMCTrackList,// output ioData.fSciTHitArray, ioData.fSciTilMaxNumber, ioData.fSciTPointArray, &nFromSciTiltoMCTrack,// output ioData.nHitsInSciTile, nMCTracks, nSciTilHits, ioData.OriginalSciTilList, &XSciTilCenter, &YSciTilCenter, &ZSciTilCenter ); // fine cambio_in_perl // this section associates the found tracks to the // MC tracks, creating a bilinear correspondence between MC tracks and PR Found tracks if( nMCTracks >0 && nTotalCandidates > 0){ int nmid,nn; // non cambiare le seguenti righe // perche' vengono processate da modificaPndTrkComparisonMCtruth.pl Double_t xx1[MAXTRACKSPEREVENT], yy1[MAXTRACKSPEREVENT], xx2[MAXTRACKSPEREVENT], yy2[MAXTRACKSPEREVENT], xx3[MAXTRACKSPEREVENT], yy3[MAXTRACKSPEREVENT]; Vec X1(xx1,MAXTRACKSPEREVENT,"X1"); Vec Y1(yy1,MAXTRACKSPEREVENT,"Y1"); Vec X2(xx2,MAXTRACKSPEREVENT,"X2"); Vec Y2(yy2,MAXTRACKSPEREVENT,"Y2"); Vec X3(xx3,MAXTRACKSPEREVENT,"X3"); Vec Y3(yy3,MAXTRACKSPEREVENT,"Y3"); // fine processamento; for(i=0; i0 ){ // clockwise. if( FI0[i] < angle ) angle -= 2.*PI; if( FI0[i] < angle ) angle =0.; } else{ // counterclockwise. if( FI0[i] > angle ) angle += 2.*PI; if( FI0[i] > angle ) angle = FI0[i]; } middle = (FI0[i]+angle)/2.; X2[i] = Ox[i] + R[i]*cos( middle ); Y2[i] = Oy[i] + R[i]*sin( middle ); } // end of for(i=0; i0) AssociateFoundTrackstoMCquater( BFIELD, CVEL, &daTrackFoundaTrackMC, fMCTrackArray, &FromPixeltoMCTrack, &FromStriptoMCTrack, &FromSciTiltoMCTrackList, &keepit, &info, &ListSttParHitsinTrack, &ListMvdPixelHitsinTrack, &ListSciTilHitsinTrack, &ListSttSkewHitsinTrack, &ListMvdStripHitsinTrack, MAXMVDPIXELHITSINTRACK, MAXMVDSTRIPHITSINTRACK, MAXSCITILHITSINTRACK, MAXSTTHITSINTRACK, &nFromSciTiltoMCTrack, &nSttParHitsinTrack, nMCTracks, &nMvdPixelHitsinTrack, nSciTilHits, &nSciTilHitsinTrack, &nSttSkewHitsinTrack, &nMvdStripHitsinTrack, nTotalCandidates, &Ox, &Oy, &R, &X1, &Y1, &X2, &Y2, &X3, &Y3 ); // fine cambio_in_perl } // end if( nMCTracks >0 && nTotalCandidates > 0) //---------- stampe. if(istampa>=3){ for(i=0;iAt(MCSkewAloneList[ncand*nSttHit+j]); MCSkewAloneX [ MCSkewAloneList[ncand*nSttHit+j] ] = puntator->GetX(); MCSkewAloneY [ MCSkewAloneList[ncand*nSttHit+j] ] =puntator->GetY(); } // end of for( j=0;jAt(i); if ( ! pMCtr ) continue; Double_t aaa, carica, Rr, Dd, Fifi, Oxx, Oyy, Cx, Cy, Pxx, Pyy ; Int_t icode; icode = pMCtr->GetPdgCode() ; // PDG code of track Oxx = pMCtr->GetStartVertex().X(); // X of starting point track Oyy = pMCtr->GetStartVertex().Y(); // Y of starting point track Pxx = pMCtr->GetMomentum().X(); Pyy = pMCtr->GetMomentum().Y(); aaa = sqrt( Pxx*Pxx + Pyy*Pyy); Rr = aaa*1000./(BFIELD*CVEL); // R (cm) of Helix of track projected in XY plane; B = 2 Tesla if(istampa>2){ TDatabasePDG *fdbPDG= TDatabasePDG::Instance(); TParticlePDG *fParticle= fdbPDG->GetParticle(icode); if (icode>1000000000) carica = 1.; else carica = fParticle->Charge()/3. ; // charge of track if(fabs(carica)<1.e-5) continue; Cx = Oxx + Pyy*1000./(BFIELD*CVEL*carica); Cy = Oyy - Pxx*1000./(BFIELD*CVEL*carica); cout<<"from PndTrkComparisonMCTruth, event (starting from 0) n. "<0){ for(int ii=0; ii0) fprintf(HANDLE,"\tn. volte almeno 1 traccia MC accettabile e' ricostruita %d\n" ,ibene); bool flaggo; int ii, ibuone=-1; Double_t HoughFiii; for (ii=0; ii1) {cout<<"\tevt. n "<At(i); if ( ! pMCtr ){ fprintf(HANDLE, " MC track n. %d doesn't have pointer to MC Track TClones Array\n", i); continue; } // controllo che la traccia associata MC sia una delle tracce MC 'ragionevoli'. flaggo = true; for(int g=0; gGetPdgCode() ; // PDG code of track Oxx = pMCtr->GetStartVertex().X(); // X of starting point track Oyy = pMCtr->GetStartVertex().Y(); // Y of starting point track Pxx = pMCtr->GetMomentum().X(); Pyy = pMCtr->GetMomentum().Y(); aaa = sqrt( Pxx*Pxx + Pyy*Pyy); Rr = aaa*1000./(BFIELD*CVEL); // R (cm) of Helix of track projected in XY plane; B = 2 Tesla TDatabasePDG *fdbPDG= TDatabasePDG::Instance(); TParticlePDG *fParticle= fdbPDG->GetParticle(icode); if (icode>1000000000) carica = 1.; else carica = fParticle->Charge()/3. ; // charge of track if(fabs(carica)<1.e-5) fprintf(HANDLE," MC track n. %d e' neutra, assurdo!\n",i); Cx = Oxx + Pyy*1000./(BFIELD*CVEL*carica); Cy = Oyy - Pxx*1000./(BFIELD*CVEL*carica); Fifi = atan2(Cy, Cx); // MC truth Fifi angle of circle of Helix trajectory if(Fifi<0.) Fifi += 2.*PI; Double_t Kakka ; if( fabs( pMCtr->GetMomentum().Z() )< 1.e-20) Kakka = 99999999.; else Kakka = -carica*0.001*BFIELD*CVEL/pMCtr->GetMomentum().Z(); fprintf(HANDLE, " R_MC %g R %g Fi_MC %g Fi %g KAPPA_MC %g KAPPA %g FI0_MC %g FI0 %g\n", Rr, R[ ii ], Fifi, HoughFiii, Kakka, KAPPA[ ii ], fmod(Fifi+ PI, 2.*PI), // FI0 da MC truth FI0[ ii ] ); //------------------------ fprintf(HANDLE2,"Evento n. %d Found track %d messa in PndTrackCand",IVOLTE, ii); fprintf(HANDLE2, " R_MC %g R %g Fi_MC %g Fi %g KAPPA_MC %g KAPPA %g FI0_MC %g FI0 %g\n", Rr, R[ ii ], Fifi, HoughFiii, Kakka, KAPPA[ ii ], fmod(Fifi+ PI, 2.*PI), FI0[ ii ] ); //---------------------------------- } // end of for (ii=0; ii0){ for(icc=0; icc0) return nMCTracks; } // marker3 per cambioperl; //----------end of function PndTrkComparisonMCtruth::ComparisonwithMC //------------------------- begin of function PndTrkComparisonMCtruth::FindDistance // inizio cambio_in_perl. Double_t PndTrkComparisonMCtruth::FindDistance( Double_t Oxx, // center from wich distance is calculated Double_t Oyy, // center from wich distance is calculated Double_t Rr, Double_t tanlow, Double_t tanmid, Double_t tanup, Double_t alfa, // intersection circumference parameter Double_t beta, // intersection circumference parameter Double_t gamma // intersection circumference parameter ) { // fine cambio_in_perl. Short_t i, n; Double_t Delta, m[3], q, dist, dist1, dist2, distlow, distmid, distup, totaldist, x1, x2, y1, y2; int nevento=1; m[0] = tanlow; m[1] = tanmid; m[2] = tanup; n=0; totaldist=0.; for(i=0;i<3;i++){ if( tanlow<999998.) { q = Oyy-m[i]*Oxx; Delta = alfa*alfa + beta*beta*m[i]*m[i] - 4.*gamma*m[i]*m[i] - 4.*q*q + 4.*m[i]*q*alfa + + 2.*alfa*beta*m[i] - 4.*beta*q - 4.*gamma; if( Delta < 0.){ dist = -1.; } else if (Delta==0.){ x1 = 0.5*(-alfa - 2.*m[i]*q - beta*m[i] )/(1.+m[i]*m[i]); y1 = m[i]*x1+q; dist = fabs( sqrt( (Oxx-x1)*(Oxx-x1) + (Oyy-y1)*(Oyy-y1) ) - Rr); } else { Delta = sqrt(Delta); x1 = 0.5*(-alfa - 2.*m[i]*q - beta*m[i] - Delta)/(1.+m[i]*m[i]); x2 = 0.5*(-alfa - 2.*m[i]*q - beta*m[i] + Delta)/(1.+m[i]*m[i]); y1 = m[i]*x1+q; y2 = m[i]*x2+q; dist1 = fabs( sqrt( (Oxx-x1)*(Oxx-x1) + (Oyy-y1)*(Oyy-y1) ) - Rr); dist2 = fabs( sqrt( (Oxx-x2)*(Oxx-x2) + (Oyy-y2)*(Oyy-y2) ) - Rr); if(dist1-0.5) { totaldist+=dist; n++; } } // end of for(i=0;i<3;i++) if(n!=3) totaldist = -1.; else totaldist = totaldist / n; return totaldist; } //------------------------- end of function PndTrkComparisonMCtruth::FindDistance //------------------------- begin of function PndTrkComparisonMCtruth::getMCInfo // inizio cambio_in_perl. void PndTrkComparisonMCtruth::getMCInfo( Double_t BFIELD, Double_t CVEL, Double_t * Cx, Double_t * Cy, TClonesArray *fMCTrackArray, Int_t MCTrack, Double_t * Rr ) { // fine cambio_in_perl. Int_t icode; Double_t aaa, Dd, Fifi, Oxx, Oyy, Pxx, Pyy, carica ; PndMCTrack* pMC; if( MCTrack <0) { *Rr=-2.; return; } pMC = (PndMCTrack*) fMCTrackArray->At(MCTrack); if ( pMC ) { icode = pMC->GetPdgCode() ; // PDG code of track Oxx = pMC->GetStartVertex().X(); // X of starting point track Oyy = pMC->GetStartVertex().Y(); // Y of starting point track Pxx = pMC->GetMomentum().X(); Pyy = pMC->GetMomentum().Y(); aaa = sqrt( Pxx*Pxx + Pyy*Pyy); *Rr = aaa*1000./(BFIELD*CVEL); // R (cm) of Helix of track // projected in XY plane; B = 2 Tesla TDatabasePDG *fdbPDG= TDatabasePDG::Instance(); TParticlePDG *fParticle= fdbPDG->GetParticle(icode); if (icode>1000000000) carica = 1.; else carica = fParticle->Charge()/3. ; // charge of track if(fabs(carica)<1.e-5) { *Rr = -3.; return;} *Cx = Oxx + Pyy*1000./(BFIELD*CVEL*carica); *Cy = Oyy - Pxx*1000./(BFIELD*CVEL*carica); } else { *Rr = -1.; } return; } //------------------------- end of function PndTrkComparisonMCtruth::getMCInfo // inizio cambio_in_perl. //------------------ begin function PndTrkComparisonMCtruth::MvdMatchedSpurioustoTrackCand void PndTrkComparisonMCtruth::MvdMatchedSpurioustoTrackCand( Vec *daTrackFoundaTrackMC, Vec *FromPixeltoMCTrack, Vec *FromStriptoMCTrack, Vec *keepit, Vec *ListMvdPixelHitsinTrack, Vec *ListMvdStripHitsinTrack, int MAXMVDPIXELHITSINTRACK, int MAXMVDSTRIPHITSINTRACK, Short_t nMvdPixelHit, Short_t nMvdStripHit, Vec *nMvdPixelHitsinTrack, Vec *nMvdStripHitsinTrack, Short_t nSttTrackCand, // input Vec *nMvdPixelCommon, Vec *MvdPixelCommonList, Vec *nMvdPixelSpuriinTrack, Vec *MvdPixelSpuriList, Vec *nMCMvdPixelAlone, Vec *MCMvdPixelAloneList, Vec *nMvdStripCommon, Vec *MvdStripCommonList, Vec *nMvdStripSpuriinTrack, Vec *MvdStripSpuriList, Vec *nMCMvdStripAlone, Vec *MCMvdStripAloneList ) { // fine cambio_in_perl. int tmp_dim1, tmp_dim2, tmp_dim3; if(nSttTrackCand>0) {tmp_dim1=nSttTrackCand;} else {tmp_dim1=1;} if(nMvdPixelHit>0) {tmp_dim2=nMvdPixelHit;} else {tmp_dim2=1;} if(nMvdStripHit>0) {tmp_dim3=nMvdStripHit;} else {tmp_dim3=1;} // non modificare; modificaperl processa i seguenti statements; bool TMPincludePixel[tmp_dim1*tmp_dim2]; Vec includePixel(TMPincludePixel,tmp_dim1*tmp_dim2,"includePixel"); bool TMPincludeStrip[tmp_dim1*tmp_dim3]; Vec includeStrip(TMPincludeStrip,tmp_dim1*tmp_dim3,"includeStrip"); // fine di non modificare; modificaperl processa i seguenti statements; Short_t i,j; int index, index2; for(i=0; iat(i)) continue; nMvdPixelCommon->at(i)=0; nMvdPixelSpuriinTrack->at(i)=0; nMCMvdPixelAlone->at(i)=0; nMvdStripCommon->at(i)=0; nMvdStripSpuriinTrack->at(i)=0; nMCMvdStripAlone->at(i)=0; } for(i=0; iat(i)) continue; for(j=0;jat(i);j++){ index = i*MAXMVDPIXELHITSINTRACK+j; includePixel[i*tmp_dim2+ListMvdPixelHitsinTrack->at(index)]=false; if( daTrackFoundaTrackMC->at(i)>= 0 && daTrackFoundaTrackMC->at(i) == FromPixeltoMCTrack->at(ListMvdPixelHitsinTrack->at(index)) ){ index2 = i*MAXMVDPIXELHITSINTRACK+nMvdPixelCommon->at(i); MvdPixelCommonList->at(index2) = ListMvdPixelHitsinTrack->at(index); nMvdPixelCommon->at(i)++; } else { index2 = i*MAXMVDPIXELHITSINTRACK+nMvdPixelSpuriinTrack->at(i); MvdPixelSpuriList->at(index2) = ListMvdPixelHitsinTrack->at(index); nMvdPixelSpuriinTrack->at(i)++; } } for(j=0;jat(i);j++){ index = i*MAXMVDSTRIPHITSINTRACK+j; includeStrip[i *tmp_dim3+ ListMvdStripHitsinTrack->at(index)]=false; if(daTrackFoundaTrackMC->at(i)>= 0 && daTrackFoundaTrackMC->at(i) == FromStriptoMCTrack->at(ListMvdStripHitsinTrack->at(index)) ){ index2 = i*MAXMVDSTRIPHITSINTRACK+nMvdStripCommon->at(i); MvdStripCommonList->at(index2) = ListMvdStripHitsinTrack->at(index); nMvdStripCommon->at(i)++; } else { index2 = i*MAXMVDSTRIPHITSINTRACK+nMvdStripSpuriinTrack->at(i); MvdStripSpuriList->at(index2) = ListMvdStripHitsinTrack->at(index); nMvdStripSpuriinTrack->at(i)++; } } } // end of for(i=0; iat(j)) continue; if( daTrackFoundaTrackMC->at(j)> -1){ for(i=0;iat(j)==FromPixeltoMCTrack->at(i) ){ index = j*nMvdPixelHit+nMCMvdPixelAlone->at(j); MCMvdPixelAloneList->at(index)=i; nMCMvdPixelAlone->at(j)++; } } } } for(j=0; jat(j)) continue; if( daTrackFoundaTrackMC->at(j)> -1){ for(i=0;iat(j)==FromStriptoMCTrack->at(i) ){ index = j*nMvdStripHit+nMCMvdStripAlone->at(j); MCMvdStripAloneList->at(index)=i; nMCMvdStripAlone->at(j)++; } } } } return; } //------------------ end function PndTrkComparisonMCtruth::MvdMatchedSpurioustoTrackCand //----------begin of function PndTrkComparisonMCtruth::MvdMatchtoMC // inizio cambio_in_perl. void PndTrkComparisonMCtruth::MvdMatchtoMC( Double_t ERRORSQPIXEL, Double_t ERRORSQSTRIP, TClonesArray *fMvdMCPointArray, Short_t nMvdMCPoint, int istampa, int IVOLTE, Short_t nMvdPixelHit, Short_t nMvdStripHit, Vec *refindexMvdPixel, Vec *refindexMvdStrip, Vec *XMvdPixel, Vec *XMvdStrip, Vec *YMvdPixel, Vec *YMvdStrip, Vec *ZMvdPixel, Vec *ZMvdStrip, Vec *FromPixeltoMCTrack, Vec *FromStriptoMCTrack ) { // fine cambio_in_perl. int tmp_dim ; if(nMvdMCPoint>0) {tmp_dim = nMvdMCPoint;} else {tmp_dim = 1;} // non modificare la seguente linea; modificaperl la cambia. bool TMPinclusionMCPoint[tmp_dim]; Vec inclusionMCPoint(TMPinclusionMCPoint,tmp_dim,"inclusionMCPoint"); Short_t i, j, jmcpoint; Double_t dist, distance; Int_t MCPointtoMCTrackID; Double_t XMvdMCPoint, YMvdMCPoint, ZMvdMCPoint; PndSdsMCPoint * pMvdMCPoint; //---- initializations for(i=0; iat(i)=-1; } for(i=0; iat(i)=-1; } //---------- for(i=0; iat(i)<0.) continue; dist=ERRORSQPIXEL; for(j=0;jAt(j); TVector3 position; pMvdMCPoint->Position(position); XMvdMCPoint=position.X(); YMvdMCPoint=position.Y(); ZMvdMCPoint=position.Z(); MCPointtoMCTrackID= pMvdMCPoint->GetTrackID(); if( !inclusionMCPoint[j]) continue; distance = (XMvdMCPoint-XMvdPixel->at(i))*(XMvdMCPoint-XMvdPixel->at(i))+ (YMvdMCPoint-YMvdPixel->at(i))*(YMvdMCPoint-YMvdPixel->at(i))+ (ZMvdMCPoint-ZMvdPixel->at(i))*(ZMvdMCPoint-ZMvdPixel->at(i)); if( distanceat(i)=MCPointtoMCTrackID; jmcpoint=j; dist=distance; } } // end of for(j=0;jat(i)>= 0){ inclusionMCPoint[jmcpoint]=false; } } // end of for(i=0; iat(i)<0.) continue; dist=ERRORSQSTRIP; for(j=0;jAt(j); TVector3 position; pMvdMCPoint->Position(position); XMvdMCPoint=position.X(); YMvdMCPoint=position.Y(); ZMvdMCPoint=position.Z(); MCPointtoMCTrackID= pMvdMCPoint->GetTrackID(); if( !inclusionMCPoint[j]) continue; distance = (XMvdMCPoint-XMvdStrip->at(i))*(XMvdMCPoint-XMvdStrip->at(i))+ (YMvdMCPoint-YMvdStrip->at(i))*(YMvdMCPoint-YMvdStrip->at(i))+ (ZMvdMCPoint-ZMvdStrip->at(i))*(ZMvdMCPoint-ZMvdStrip->at(i)); if(istampa>3) cout<<"distanza**2 di Strip hit n. "<at(i)< *FromSciTiltoMCTrackList, TClonesArray *fSciTHitArray, Short_t fSciTilMaxNumber, TClonesArray *fSciTPointArray, Vec *nFromSciTiltoMCTrack, Short_t *nHitsInSciTile, int nMCTracks, Short_t nSciTilHits, Short_t *OriginalSciTilList, Vec *XSciTilCenter, Vec *YSciTilCenter, Vec *ZSciTilCenter ) { // fine cambio_in_perl. // initialization; for(int nsc=0; nscat(nsc)=0; // in a SciTil there may be more than 1 MC hit, here // it is the loop over those. // nHitsInSciTile[n] is the number of SciTil hits in the // tile indentified by the number n, which in actuality is // the number of the first hit [in the SciTil hit list] // belonging to that tile; // OriginalSciTilList[n][nnn] is their list; the dimension of // OriginalSciTilList is fSciTilMaxNumber*fSciTilMaxNumbe when nSciTilHits>0 // (otherwise it is 1*1 ). for(int h=0;hAt(m); PndSciTPoint *point=(PndSciTPoint*) fSciTPointArray->At(hit->GetRefIndex()); if( point->GetTrackID()>=0){ FromSciTiltoMCTrackList->at(nsc*nMCTracks+nFromSciTiltoMCTrack->at(nsc)) =point->GetTrackID(); nFromSciTiltoMCTrack->at(nsc)++; } } // end of for(int h=0;h *daTrackFoundaTrackMC, Vec *FromSciTiltoMCTrackList, // of dimension [nSciTilHits][nMCTracks] Vec *keepit, Vec *ListSciTilHitsinTrack, // [MAXTRACKSPEREVENT][MAXSCITILHITSINTRACK] int MAXSCITILHITSINTRACK, // input Short_t *MCSciTilAloneList, // output; equivalent to a matrix of dimension // [MAXTRACKSPEREVENT][nSciTilHits] Vec *nFromSciTiltoMCTrack, Short_t *nMCSciTilAlone, // output int nMCTracks, // input Short_t nSciTilHits, // input Vec *nSciTilHitsinTrack, Short_t *nSciTilCommon, // output Short_t *nSciTilSpuriinTrack, // output Short_t nSttTrackCand, // input Short_t *SciTilCommonList, // output; equivalent to a matrix of dimension // [MAXTRACKSPEREVENT][MAXSCITILHITSINTRACK] Short_t *SciTilSpuriList // output; equivalent to a matrix of dimension // [MAXTRACKSPEREVENT][MAXSCITILHITSINTRACK]. ) { // fine cambio_in_perl. // calculate the SciTil hits matched, spurious, alone to all tracks found // by Pattern Recognition. // The SciTil hit number is the 'purged' one already. int tmp_dim1, tmp_dim2 ; if(nSttTrackCand>0) {tmp_dim1 = nSttTrackCand;} else {tmp_dim1 = 1;} if(nSciTilHits>0) {tmp_dim2 = nSciTilHits;} else {tmp_dim2 = 1;} bool flag_Common; // non modificare la seguente linea (viene cambiata da modificaperl); bool TMPincludeSciTil[tmp_dim1*tmp_dim2]; Vec includeSciTil(TMPincludeSciTil,tmp_dim1*tmp_dim2,"includeSciTil"); int i, index2, j, SciTHn; for(i=0; iat(i)) continue; nSciTilSpuriinTrack[i]=0; nMCSciTilAlone[i]=0; } for(i=0; iat(i)) continue; nSciTilCommon[i]=0; for(j=0;jat(i);j++){ SciTHn = ListSciTilHitsinTrack->at(i*MAXSCITILHITSINTRACK+j); includeSciTil[i*tmp_dim2+SciTHn]=false; flag_Common = false; // loop over all MC tracks associated to SciTilHit n. SciTHn; for(int h=0;hat(SciTHn);h++){ if( daTrackFoundaTrackMC->at(i)>= 0 && daTrackFoundaTrackMC->at(i) == FromSciTiltoMCTrackList->at(SciTHn*nMCTracks+h) ) { flag_Common = true; index2 = i*MAXSCITILHITSINTRACK+nSciTilCommon[i]; SciTilCommonList[index2] = SciTHn; // increment the n. of common SciTils of Track i nSciTilCommon[i]++; } // end of if( daTrackFoundaTrackMC->at(i)>= 0 && ...... } // end of for(int h=0;hat(i);j++) } // end of for(i=0; iat(j)) continue; if(daTrackFoundaTrackMC->at(j)> -1){ for(i=0;iat(i);h++){ if(daTrackFoundaTrackMC->at(j)==FromSciTiltoMCTrackList->at(i*nMCTracks+h)){ index2 = j*nSciTilHits+nMCSciTilAlone[j]; MCSciTilAloneList[index2]=i; nMCSciTilAlone[j]++; } // end of if( daTrackFoundaTrackMC->at(j) ....) } // end of for(int h=0;hat(SciTHn);h++) } // end of for(i=0;iat(j)> -1) } // end of for(j=0; jAt(ic); if ( !( fabs(pMC->GetStartVertex().X())<0.5 && fabs(pMC->GetStartVertex().Y())<0.5 && fabs(pMC->GetStartVertex().Z())<0.5 )) continue; double carica; int icode = pMC->GetPdgCode() ; // PDG code of track double Pxx = pMC->GetMomentum().X(); double Pyy = pMC->GetMomentum().Y(); double aaa = sqrt( Pxx*Pxx + Pyy*Pyy); double Rr = aaa*1000./(BFIELD*CVEL);// R (cm) of Helix of track projected // in XY plane; B = 2 Tesla TDatabasePDG *fdbPDG= TDatabasePDG::Instance(); TParticlePDG *fParticle= fdbPDG->GetParticle(icode); if (icode>1000000000) carica = 1.; else carica = fParticle->Charge()/3. ; // charge of track cout<<"\tTraccia n. "<GetMomentum().X() <<", Py "<GetMomentum().Y() <<", Pz "<GetMomentum().Z() <<", carica = "<GetStartVertex().X() <<", Yvert "<GetStartVertex().Y() <<", Zvert "<GetStartVertex().Z()< *daTrackFoundaTrackMC, Vec *InclusionListStt, Vec *info, Vec *keepit, int MAXSTTHITS, int MAXSTTHITSINTRACK, int MAXTRACKSPEREVENT, Vec *ListSttParHitsinTrack, Vec *ListSttSkewHitsinTrack, Vec *MCParalAloneList, Vec *MCSkewAloneList, Vec *nHitsInMCTrack, Vec *nSttParHitsinTrack, Vec *nMCParalAlone, Vec *nMCSkewAlone, Vec *nParalCommon, Vec *nSkewCommon, Vec *nSkewHitsInMCTrack, Vec *nSttSkewHitsinTrack, Vec *nSpuriParinTrack, Vec *nSpuriSkewinTrack, Short_t nSttHit, Short_t nTracksFoundSoFar, // those found by PR Vec *ParalCommonList, Vec *ParSpuriList, Vec *SkewCommonList, Vec *SkewSpuriList ) { // fine cambio_in_perl. bool flaggo; Short_t i, jexp, exphit, iHit, enne; Short_t emme; int index1, index2; for(jexp=0; jexpat(jexp)) continue; nParalCommon->at(jexp)=0; nSkewCommon->at(jexp)=0; nMCParalAlone->at(jexp)=0; nMCSkewAlone->at(jexp)=0; nSpuriParinTrack->at(jexp)=0; nSpuriSkewinTrack->at(jexp)=0; // --- parallel hits for(exphit=0; exphitat(jexp); exphit++){ index1 = jexp*MAXSTTHITSINTRACK + exphit; iHit = ListSttParHitsinTrack->at(index1) ; enne = (Short_t) ( info->at(iHit*7 + 6) + 0.01); if( enne == daTrackFoundaTrackMC->at(jexp) ){ index2 = jexp*MAXSTTHITSINTRACK +nParalCommon->at(jexp); ParalCommonList->at(index2) = iHit; nParalCommon->at(jexp)++; } else { index2 = jexp*MAXSTTHITSINTRACK +nSpuriParinTrack->at(jexp); ParSpuriList->at(index2) = iHit; nSpuriParinTrack->at(jexp)++; } } //--- ricerca degli hits non mecciati, della traccia MC associata a questa traccia trovata. for(i=0; iat( i*7+6) + 0.01); // escludo gli hits non paralleli oppure che non appartengono alla giusta // traccia MC if( info->at(i*7+5) > 2. || (emme != daTrackFoundaTrackMC->at(jexp)) ) continue; if( !InclusionListStt->at(i)) continue; // escludo gli hits con multiple hits flaggo=true; for(exphit=0; exphitat(jexp); exphit++){ index1 = jexp*MAXSTTHITSINTRACK + exphit; if(ListSttParHitsinTrack->at(index1) == i){ flaggo=false; break; } } if(flaggo){ index2 = jexp*nSttHit+nMCParalAlone->at(jexp); MCParalAloneList->at(index2) = i; nMCParalAlone->at(jexp)++; } // end of if(flaggo) } // end of for(i=0; iat(jexp) = nMCParalAlone->at(jexp)+nParalCommon->at(jexp); // --- skew hits for(exphit=0; exphitat(jexp); exphit++){ index1 = jexp*MAXSTTHITSINTRACK + exphit; iHit = ListSttSkewHitsinTrack->at(index1); enne = (Short_t) ( info->at(iHit*7+6) + 0.01); if( enne == daTrackFoundaTrackMC->at(jexp) ){ index2 = jexp*MAXSTTHITSINTRACK+nSkewCommon->at(jexp); SkewCommonList->at(index2) = iHit; nSkewCommon->at(jexp)++; } else { index2 = jexp*MAXSTTHITSINTRACK+nSpuriSkewinTrack->at(jexp); SkewSpuriList->at(index2) = iHit; nSpuriSkewinTrack->at(jexp)++; } } //--- ricerca degli hits non mecciati, della traccia MC associata a questa traccia trovata. for(i=0; iat( i*7+6) + 0.01); // considero solo le skew ( info->at(i*7+5)=99.) ed escludo quelle che // non appartengono alla giusta traccia MC if( info->at(i*7+5) < 98. || (emme != daTrackFoundaTrackMC->at(jexp)) ) continue; if( !InclusionListStt->at(i)) continue; // escludo gli hits con multiple hits flaggo=true; for(exphit=0; exphitat(jexp); exphit++){ index1 = jexp*MAXSTTHITSINTRACK + exphit; if(i == ListSttSkewHitsinTrack->at(index1) ){ flaggo=false; break; } } if(flaggo){ index2 = jexp*nSttHit+nMCSkewAlone->at(jexp) ; MCSkewAloneList->at(index2) = i; nMCSkewAlone->at(jexp)++; } } nSkewHitsInMCTrack->at(jexp) = nMCSkewAlone->at(jexp)+nSkewCommon->at(jexp); } // end of for(jexp=0; jexp