--- DarthVader/TrackerLevel2/src/TrkLevel2.cpp 2006/06/30 09:48:15 1.5 +++ DarthVader/TrackerLevel2/src/TrkLevel2.cpp 2006/10/27 16:59:20 1.14 @@ -4,6 +4,7 @@ */ #include #include +#include using namespace std; //...................................... // F77 routines @@ -11,7 +12,8 @@ extern "C" { void dotrack_(int*, double*, double*, double*, double*, int*); void dotrack2_(int*, double*, double*, double*, double*,double*, double*, double*,int*); - int readb_(const char*); + int readb_(const char*); + void mini2_(int*,int*,int*); } //-------------------------------------- // @@ -21,27 +23,31 @@ seqno = -1; image = -1; chi2 = 0; + nstep = 0; for(int it1=0;it1<5;it1++){ al[it1] = 0; - for(int it2=0;it2<5;it2++) - coval[it1][it2] = 0; + for(int it2=0;it2<5;it2++)coval[it1][it2] = 0; }; for(int ip=0;ip<6;ip++){ - xgood[ip] = 0; - ygood[ip] = 0; - xm[ip] = 0; - ym[ip] = 0; - zm[ip] = 0; - resx[ip] = 0; - resy[ip] = 0; - xv[ip] = 0; - yv[ip] = 0; - zv[ip] = 0; - axv[ip] = 0; - ayv[ip] = 0; - dedx_x[ip] = 0; - dedx_y[ip] = 0; - }; + xgood[ip] = 0; + ygood[ip] = 0; + xm[ip] = 0; + ym[ip] = 0; + zm[ip] = 0; + resx[ip] = 0; + resy[ip] = 0; + xv[ip] = 0; + yv[ip] = 0; + zv[ip] = 0; + axv[ip] = 0; + ayv[ip] = 0; + dedx_x[ip] = 0; + dedx_y[ip] = 0; +// clx[ip] = 0; +// cly[ip] = 0; + }; + clx = new TRefArray(6,0); + cly = new TRefArray(6,0); }; //-------------------------------------- // @@ -51,27 +57,32 @@ seqno = t.seqno; image = t.image; chi2 = t.chi2; + nstep = t.nstep; for(int it1=0;it1<5;it1++){ al[it1] = t.al[it1]; - for(int it2=0;it2<5;it2++) - coval[it1][it2] = t.coval[it1][it2]; + for(int it2=0;it2<5;it2++)coval[it1][it2] = t.coval[it1][it2]; }; for(int ip=0;ip<6;ip++){ - xgood[ip] = t.xgood[ip]; - ygood[ip] = t.ygood[ip]; - xm[ip] = t.xm[ip]; - ym[ip] = t.ym[ip]; - zm[ip] = t.zm[ip]; - resx[ip] = t.resx[ip]; - resy[ip] = t.resy[ip]; - xv[ip] = t.xv[ip]; - yv[ip] = t.yv[ip]; - zv[ip] = t.zv[ip]; - axv[ip] = t.axv[ip]; - ayv[ip] = t.ayv[ip]; - dedx_x[ip] = t.dedx_x[ip]; - dedx_y[ip] = t.dedx_y[ip]; - }; + xgood[ip] = t.xgood[ip]; + ygood[ip] = t.ygood[ip]; + xm[ip] = t.xm[ip]; + ym[ip] = t.ym[ip]; + zm[ip] = t.zm[ip]; + resx[ip] = t.resx[ip]; + resy[ip] = t.resy[ip]; + xv[ip] = t.xv[ip]; + yv[ip] = t.yv[ip]; + zv[ip] = t.zv[ip]; + axv[ip] = t.axv[ip]; + ayv[ip] = t.ayv[ip]; + dedx_x[ip] = t.dedx_x[ip]; + dedx_y[ip] = t.dedx_y[ip]; + // clx[ip] = 0;//<<< " << track_.al[4] << endl; + + for(int i=0; i<5; i++) al[i]=track_.al[i]; + chi2=track_.chi2; + nstep=track_.nstep; + for(int i=0; i<6; i++) xv[i]=track_.xv[i]; + for(int i=0; i<6; i++) yv[i]=track_.yv[i]; + for(int i=0; i<6; i++) zv[i]=track_.zv[i]; + for(int i=0; i<6; i++) axv[i]=track_.axv[i]; + for(int i=0; i<6; i++) ayv[i]=track_.ayv[i]; + for(int i=0; i<5; i++) { + for(int j=0; j<5; j++) coval[i][j]=track_.cov[i][j]; + } +}; +/* + * Reset the parameters fit + */ +void TrkTrack::FitReset(){ + for(int i=0; i<5; i++) al[i]=-9999.; + chi2=0.; + nstep=0; + for(int i=0; i<6; i++) xv[i]=0.; + for(int i=0; i<6; i++) yv[i]=0.; + for(int i=0; i<6; i++) zv[i]=0.; + for(int i=0; i<6; i++) axv[i]=0.; + for(int i=0; i<6; i++) ayv[i]=0.; + for(int i=0; i<5; i++) { + for(int j=0; j<5; j++) coval[i][j]=0.; + } +} + +//-------------------------------------- +// +// +//-------------------------------------- +void TrkTrack::Clear(){ + seqno = -1; + image = -1; + chi2 = 0; + nstep = 0; + for(int it1=0;it1<5;it1++){ + al[it1] = 0; + for(int it2=0;it2<5;it2++)coval[it1][it2] = 0; + }; + for(int ip=0;ip<6;ip++){ + xgood[ip] = 0; + ygood[ip] = 0; + xm[ip] = 0; + ym[ip] = 0; + zm[ip] = 0; + resx[ip] = 0; + resy[ip] = 0; + xv[ip] = 0; + yv[ip] = 0; + zv[ip] = 0; + axv[ip] = 0; + ayv[ip] = 0; + dedx_x[ip] = 0; + dedx_y[ip] = 0; +// clx[ip] = 0; +// cly[ip] = 0; + }; + clx->Clear(); + cly->Clear(); +}; +//-------------------------------------- +// +// +//-------------------------------------- +void TrkTrack::Delete(){ + Clear(); + clx->Delete(); + cly->Delete(); +}; + //-------------------------------------- +// +// +//-------------------------------------- + //-------------------------------------- // // @@ -206,6 +403,7 @@ coord[0] = 0; coord[1] = 0; sgnl = 0; + cls = 0; }; //-------------------------------------- // @@ -216,6 +414,8 @@ coord[0] = s.coord[0]; coord[1] = s.coord[1]; sgnl = s.sgnl; +// cls = 0;//<<<ntrk() ; cout << endl << "nclsx() : " << this->nclsx(); cout << endl << "nclsy() : " << this->nclsy(); @@ -270,68 +471,72 @@ /** * Fills a TrkLevel2 object with values from a struct cTrkLevel2 (to get data from F77 common). */ -void TrkLevel2::FillCommonVar(cTrkLevel2 *l2){ - // -// Track = new TClonesArray("TrkTrack"); -// SingletX = new TClonesArray("TrkSinglet"); -// SingletY = new TClonesArray("TrkSinglet"); -// temporary objects: +void TrkLevel2::SetFromLevel2Struct(cTrkLevel2 *l2){ + + // temporary objects: TrkSinglet* t_singlet = new TrkSinglet(); TrkTrack* t_track = new TrkTrack(); -// general variables - good2 = l2->good2; + + // **** general variables **** +// good2 = l2->good2; for(Int_t i=0; i<12 ; i++){ - crc[i] = l2->crc[i]; - }; -// *** TRACKS *** +// crc[i] = l2->crc[i]; + good[i] = l2->good[i]; + }; + // *** TRACKS *** TClonesArray &t = *Track; for(int i=0; intrk; i++){ - t_track->seqno = i; - t_track->image = l2->image[i]-1; -// cout << "track "<seqno << t_track->image<chi2 = l2->chi2_nt[i]; - for(int it1=0;it1<5;it1++){ - t_track->al[it1] = l2->al_nt[i][it1]; - for(int it2=0;it2<5;it2++) - t_track->coval[it1][it2] = l2->coval[i][it2][it1]; - }; - for(int ip=0;ip<6;ip++){ - t_track->xgood[ip] = l2->xgood_nt[i][ip]; - t_track->ygood[ip] = l2->ygood_nt[i][ip]; - t_track->xm[ip] = l2->xm_nt[i][ip]; - t_track->ym[ip] = l2->ym_nt[i][ip]; - t_track->zm[ip] = l2->zm_nt[i][ip]; - t_track->resx[ip] = l2->resx_nt[i][ip]; - t_track->resy[ip] = l2->resy_nt[i][ip]; - t_track->xv[ip] = l2->xv_nt[i][ip]; - t_track->yv[ip] = l2->yv_nt[i][ip]; - t_track->zv[ip] = l2->zv_nt[i][ip]; - t_track->axv[ip] = l2->axv_nt[i][ip]; - t_track->ayv[ip] = l2->ayv_nt[i][ip]; - t_track->dedx_x[ip] = l2->dedx_x[i][ip]; - t_track->dedx_y[ip] = l2->dedx_y[i][ip]; - }; - new(t[i]) TrkTrack(*t_track); - t_track->Clear(); + t_track->seqno = i;// NBNBNBNB deve sempre essere = i + t_track->image = l2->image[i]-1; + // cout << "track "<seqno << t_track->image<chi2 = l2->chi2_nt[i]; + t_track->nstep = l2->nstep_nt[i]; + for(int it1=0;it1<5;it1++){ + t_track->al[it1] = l2->al_nt[i][it1]; + for(int it2=0;it2<5;it2++) + t_track->coval[it1][it2] = l2->coval[i][it2][it1]; + }; + for(int ip=0;ip<6;ip++){ + t_track->xgood[ip] = l2->xgood_nt[i][ip]; + t_track->ygood[ip] = l2->ygood_nt[i][ip]; + t_track->xm[ip] = l2->xm_nt[i][ip]; + t_track->ym[ip] = l2->ym_nt[i][ip]; + t_track->zm[ip] = l2->zm_nt[i][ip]; + t_track->resx[ip] = l2->resx_nt[i][ip]; + t_track->resy[ip] = l2->resy_nt[i][ip]; + t_track->xv[ip] = l2->xv_nt[i][ip]; + t_track->yv[ip] = l2->yv_nt[i][ip]; + t_track->zv[ip] = l2->zv_nt[i][ip]; + t_track->axv[ip] = l2->axv_nt[i][ip]; + t_track->ayv[ip] = l2->ayv_nt[i][ip]; + t_track->dedx_x[ip] = l2->dedx_x[i][ip]; + t_track->dedx_y[ip] = l2->dedx_y[i][ip]; +// t_track->clx[ip] = 0; +// t_track->cly[ip] = 0; + }; + new(t[i]) TrkTrack(*t_track); + t_track->Clear(); }; // *** SINGLETS *** TClonesArray &sx = *SingletX; for(int i=0; inclsx; i++){ - t_singlet->plane = l2->planex[i]; - t_singlet->coord[0] = l2->xs[i][0]; - t_singlet->coord[1] = l2->xs[i][1]; - t_singlet->sgnl = l2->signlxs[i]; - new(sx[i]) TrkSinglet(*t_singlet); - t_singlet->Clear(); + t_singlet->plane = l2->planex[i]; + t_singlet->coord[0] = l2->xs[i][0]; + t_singlet->coord[1] = l2->xs[i][1]; + t_singlet->sgnl = l2->signlxs[i]; +// t_singlet->cls = 0; + new(sx[i]) TrkSinglet(*t_singlet); + t_singlet->Clear(); } TClonesArray &sy = *SingletY; for(int i=0; inclsy; i++){ - t_singlet->plane = l2->planey[i]; - t_singlet->coord[0] = l2->ys[i][0]; - t_singlet->coord[1] = l2->ys[i][1]; - t_singlet->sgnl = l2->signlys[i]; - new(sy[i]) TrkSinglet(*t_singlet); - t_singlet->Clear(); + t_singlet->plane = l2->planey[i]; + t_singlet->coord[0] = l2->ys[i][0]; + t_singlet->coord[1] = l2->ys[i][1]; + t_singlet->sgnl = l2->signlys[i]; +// t_singlet->cls = 0; + new(sy[i]) TrkSinglet(*t_singlet); + t_singlet->Clear(); }; delete t_track; @@ -341,11 +546,163 @@ // // //-------------------------------------- -void TrkLevel2::Clear(){ - good2 = -1; +/** + * Fills a TrkLevel2 object with values from a struct cTrkLevel2 (to get data from F77 common). + * Ref to Level1 data (clusters) is also set. + */ +void TrkLevel2::SetFromLevel2Struct(cTrkLevel2 *l2, TrkLevel1 *l1){ + +// temporary objects: + TrkSinglet* t_singlet = new TrkSinglet(); + TrkTrack* t_track = new TrkTrack(); +// general variables +// good2 = l2->good2; + for(Int_t i=0; i<12 ; i++){ +// crc[i] = l2->crc[i]; + good[i] = l2->good[i]; + }; +// *** TRACKS *** + TClonesArray &t = *Track; + for(int i=0; intrk; i++){ + t_track->seqno = i;// NBNBNBNB deve sempre essere = i + t_track->image = l2->image[i]-1; +// cout << "track "<seqno << t_track->image<chi2 = l2->chi2_nt[i]; + t_track->nstep = l2->nstep_nt[i]; + for(int it1=0;it1<5;it1++){ + t_track->al[it1] = l2->al_nt[i][it1]; + for(int it2=0;it2<5;it2++) + t_track->coval[it1][it2] = l2->coval[i][it2][it1]; + }; + for(int ip=0;ip<6;ip++){ + t_track->xgood[ip] = l2->xgood_nt[i][ip]; + t_track->ygood[ip] = l2->ygood_nt[i][ip]; + t_track->xm[ip] = l2->xm_nt[i][ip]; + t_track->ym[ip] = l2->ym_nt[i][ip]; + t_track->zm[ip] = l2->zm_nt[i][ip]; + t_track->resx[ip] = l2->resx_nt[i][ip]; + t_track->resy[ip] = l2->resy_nt[i][ip]; + t_track->xv[ip] = l2->xv_nt[i][ip]; + t_track->yv[ip] = l2->yv_nt[i][ip]; + t_track->zv[ip] = l2->zv_nt[i][ip]; + t_track->axv[ip] = l2->axv_nt[i][ip]; + t_track->ayv[ip] = l2->ayv_nt[i][ip]; + t_track->dedx_x[ip] = l2->dedx_x[i][ip]; + t_track->dedx_y[ip] = l2->dedx_y[i][ip]; +// cout << "traccia "<cltrx[i][ip] <<" "<< l2->cltry[i][ip] <<" "<< t_track->xgood[ip] << t_track->ygood[ip]<clx[ip] = l1->GetCluster(l2->cltrx[i][ip]-1); +// t_track->cly[ip] = l1->GetCluster(l2->cltry[i][ip]-1); + if(t_track->xgood[ip])t_track->clx->AddAt(l1->GetCluster(l2->cltrx[i][ip]-1),ip); + if(t_track->ygood[ip])t_track->cly->AddAt(l1->GetCluster(l2->cltry[i][ip]-1),ip); +// if(t_track->ygood[ip])cout<<" i "<cltry[i][ip] "<cltry[i][ip]<< " l1->GetCluster(l2->cltry[i][ip]-1) "<GetCluster(l2->cltry[i][ip]-1)<xgood[ip])cout<<" i "<cltrx[i][ip] "<cltrx[i][ip]<< " l1->GetCluster(l2->cltrx[i][ip]-1) "<GetCluster(l2->cltrx[i][ip]-1)<Clear(); + }; +// *** SINGLETS *** + TClonesArray &sx = *SingletX; + for(int i=0; inclsx; i++){ + t_singlet->plane = l2->planex[i]; + t_singlet->coord[0] = l2->xs[i][0]; + t_singlet->coord[1] = l2->xs[i][1]; + t_singlet->sgnl = l2->signlxs[i]; + //----------------------------------------------------- +// cout << "singolo x "<clsx[i] <cls = l1->GetCluster(l2->clsx[i]-1); +// cout<<" i "<clsx[i] "<clsx[i]<< " l1->GetCluster(l2->clsx[i]-1) "<GetCluster(l2->clsx[i]-1)<Clear(); + } + TClonesArray &sy = *SingletY; + for(int i=0; inclsy; i++){ + t_singlet->plane = l2->planey[i]; + t_singlet->coord[0] = l2->ys[i][0]; + t_singlet->coord[1] = l2->ys[i][1]; + t_singlet->sgnl = l2->signlys[i]; + //----------------------------------------------------- +// cout << "singolo y "<clsy[i] <cls = l1->GetCluster(l2->clsy[i]-1); +// cout<<" i "<clsy[i] "<clsy[i]<< " l1->GetCluster(l2->clsy[i]-1) "<GetCluster(l2->clsy[i]-1)<Clear(); + }; + + delete t_track; + delete t_singlet; +} +/** + * Fills a struct cTrkLevel2 with values from a TrkLevel2 object (to put data into a F77 common). + */ + +void TrkLevel2::GetLevel2Struct(cTrkLevel2 *l2) const { + +// general variables +// l2->good2 = good2 ; for(Int_t i=0; i<12 ; i++){ - crc[i] = -1; +// l2->crc[i] = crc[i]; + l2->good[i] = good[i]; }; +// *** TRACKS *** + + l2->ntrk = Track->GetEntries(); + for(Int_t i=0;intrk;i++){ + l2->image[i] = 1 + ((TrkTrack *)Track->At(i))->image; + l2->chi2_nt[i] = ((TrkTrack *)Track->At(i))->chi2; + l2->nstep_nt[i] = ((TrkTrack *)Track->At(i))->nstep; + for(int it1=0;it1<5;it1++){ + l2->al_nt[i][it1] = ((TrkTrack *)Track->At(i))->al[it1]; + for(int it2=0;it2<5;it2++) + l2->coval[i][it2][it1] = ((TrkTrack *)Track->At(i))->coval[it1][it2]; + }; + for(int ip=0;ip<6;ip++){ + l2->xgood_nt[i][ip] = ((TrkTrack *)Track->At(i))->xgood[ip]; + l2->ygood_nt[i][ip] = ((TrkTrack *)Track->At(i))->ygood[ip]; + l2->xm_nt[i][ip] = ((TrkTrack *)Track->At(i))->xm[ip]; + l2->ym_nt[i][ip] = ((TrkTrack *)Track->At(i))->ym[ip]; + l2->zm_nt[i][ip] = ((TrkTrack *)Track->At(i))->zm[ip]; + l2->resx_nt[i][ip] = ((TrkTrack *)Track->At(i))->resx[ip]; + l2->resy_nt[i][ip] = ((TrkTrack *)Track->At(i))->resy[ip]; + l2->xv_nt[i][ip] = ((TrkTrack *)Track->At(i))->xv[ip]; + l2->yv_nt[i][ip] = ((TrkTrack *)Track->At(i))->yv[ip]; + l2->zv_nt[i][ip] = ((TrkTrack *)Track->At(i))->zv[ip]; + l2->axv_nt[i][ip] = ((TrkTrack *)Track->At(i))->axv[ip]; + l2->ayv_nt[i][ip] = ((TrkTrack *)Track->At(i))->ayv[ip]; + l2->dedx_x[i][ip] = ((TrkTrack *)Track->At(i))->dedx_x[ip]; + l2->dedx_y[i][ip] = ((TrkTrack *)Track->At(i))->dedx_y[ip]; + }; + } + +// *** SINGLETS *** + l2->nclsx = SingletX->GetEntries(); + for(Int_t i=0;inclsx;i++){ + l2->planex[i] = ((TrkSinglet *)SingletX->At(i))->plane; + l2->xs[i][0] = ((TrkSinglet *)SingletX->At(i))->coord[0]; + l2->xs[i][1] = ((TrkSinglet *)SingletX->At(i))->coord[1]; + l2->signlxs[i] = ((TrkSinglet *)SingletX->At(i))->sgnl; + } + l2->nclsy = SingletY->GetEntries(); + for(Int_t i=0;inclsy;i++){ + l2->planey[i] = ((TrkSinglet *)SingletY->At(i))->plane; + l2->ys[i][0] = ((TrkSinglet *)SingletY->At(i))->coord[0]; + l2->ys[i][1] = ((TrkSinglet *)SingletY->At(i))->coord[1]; + l2->signlys[i] = ((TrkSinglet *)SingletY->At(i))->sgnl; + } +} +//-------------------------------------- +// +// +//-------------------------------------- +void TrkLevel2::Clear(){ +// good2 = -1; + for(Int_t i=0; i<12 ; i++){ +// crc[i] = -1; + good[i] = -1; + }; /* Track->RemoveAll(); SingletX->RemoveAll(); SingletY->RemoveAll();*/ @@ -358,89 +715,72 @@ // // //-------------------------------------- +void TrkLevel2::Delete(){ + + Clear(); + Track->Delete(); + SingletX->Delete(); + SingletY->Delete(); +} +//-------------------------------------- +// +// +//-------------------------------------- /** * Sort physical tracks and stores them in a TObjectArray, ordering by increasing chi**2 value (in case of track image, it selects the one with lower chi**2). The total number of physical tracks is given by GetNTracks() and the it-th physical track can be retrieved by means of the method GetTrack(int it). * This method is overridden by PamLevel2::GetTracks(), where calorimeter and TOF information is used. */ -TClonesArray *TrkLevel2::GetTracks(){ - TClonesArray *sorted = GetTracks_NFitSorted(); - return sorted; -}; +TRefArray *TrkLevel2::GetTracks_NFitSorted(){ -TClonesArray *TrkLevel2::GetTracks_Chi2Sorted(){ - - TClonesArray *sorted = new TClonesArray("TrkTrack"); - TClonesArray &t = *Track; - TClonesArray &ts = *sorted; - int N=this->ntrk(); - vector m(N); for(int i=0; intrk(); i++){ - if(((TrkTrack *)t[i])->chi2 < chi2ref && m[i]==1){ - chi2ref = ((TrkTrack *)t[i])->chi2; - indi = i; - } - } - if( ((TrkTrack *)t[indi])->image != -1 ){ - m[((TrkTrack *)t[indi])->image] = 0; - N--; - } - new(ts[indo]) TrkTrack(*(TrkTrack*)t[indi]); - m[indi] = 0; - N--; - indo++; - } - return sorted; -} -TClonesArray *TrkLevel2::GetTracks_NFitSorted(){ - - TClonesArray *sorted = new TClonesArray("TrkTrack"); - TClonesArray &t = *Track; - TClonesArray &ts = *sorted; - int N=this->ntrk(); - vector m(N); for(int i=0; intrk(); i++){ - if( ((TrkTrack *)t[i])->GetNtot() >= nfit && m[i]==1){ - nfit = ((TrkTrack *)t[i])->GetNtot(); -// cout << "1** "<ntrk(); i++){ - if( ((TrkTrack *)t[i])->chi2 < chi2ref - && ((TrkTrack *)t[i])->GetNtot()== nfit - && m[i]==1){ - chi2ref = ((TrkTrack *)t[i])->chi2; - indi = i; -// cout << "2** "<HasImage() ){ - m[((TrkTrack *)t[indi])->image] = 0; - N--; - -// Int_t nfiti=((TrkTrack *)t[((TrkTrack *)t[indi])->image ])->GetNtot(); -// Float_t chi2i=((TrkTrack *)t[((TrkTrack *)t[indi])->image ])->chi2; + TRefArray *sorted = new TRefArray(); + + TClonesArray &t = *Track; +// TClonesArray &ts = *PhysicalTrack; + int N = ntrk(); + vector m(N); for(int i=0; i::max(); -// cout << "i** "<< ((TrkTrack *)t[indi])->image << " " << nfiti <<" "<GetNtot() >= nfit && m[i]==1){ + nfit = ((TrkTrack *)t[i])->GetNtot(); + } + } + //second loop to search minimum chi2 among selected + for(int i=0; intrk(); i++){ + Float_t chi2 = ((TrkTrack *)t[i])->chi2; + if(chi2 < 0) chi2 = chi2*1000; + if( chi2 < chi2ref + && ((TrkTrack *)t[i])->GetNtot() == nfit + && m[i]==1){ + chi2ref = ((TrkTrack *)t[i])->chi2; + indi = i; + }; + }; + if( ((TrkTrack *)t[indi])->HasImage() ){ + m[((TrkTrack *)t[indi])->image] = 0; + N--; + + // cout << "i** "<< ((TrkTrack *)t[indi])->image << " " << nfiti <<" "<Add( (TrkTrack*)t[indi] ); + + m[indi] = 0; +// cout << "SORTED "<< indo << " "<< indi << " "<< N << endl; + N--; + indo++; } - new(ts[indo]) TrkTrack(*(TrkTrack*)t[indi]); - m[indi] = 0; - N--; - indo++; - } - return sorted; + m.clear(); +// cout << "GetTracks_NFitSorted(it): Done"<< endl; + + return sorted; +// return PhysicalTrack; } //-------------------------------------- // @@ -467,25 +807,74 @@ // //-------------------------------------- /** + * Retrieves the is-th stored X singlet. + * @param it Singlet number, ranging from 0 to nclsx(). + */ +TrkSinglet *TrkLevel2::GetSingletX(int is){ + + if(is >= this->nclsx()){ + cout << "** TrkLevel2 ** Singlet "<< is << "doen not exits! " << endl; + cout << " Stored x-singlets nclsx() = "<< this->nclsx() << endl; + return 0; + } + TClonesArray &t = *(SingletX); + TrkSinglet *singlet = (TrkSinglet*)t[is]; + return singlet; +} +//-------------------------------------- +// +// +//-------------------------------------- +/** + * Retrieves the is-th stored Y singlet. + * @param it Singlet number, ranging from 0 to nclsx(). + */ +TrkSinglet *TrkLevel2::GetSingletY(int is){ + + if(is >= this->nclsy()){ + cout << "** TrkLevel2 ** Singlet "<< is << "doen not exits! " << endl; + cout << " Stored y-singlets nclsy() = "<< this->nclsx() << endl; + return 0; + } + TClonesArray &t = *(SingletY); + TrkSinglet *singlet = (TrkSinglet*)t[is]; + return singlet; +} +//-------------------------------------- +// +// +//-------------------------------------- +/** * Retrieves the it-th "physical" track, sorted by the method GetNTracks(). * @param it Track number, ranging from 0 to GetNTracks(). */ + TrkTrack *TrkLevel2::GetTrack(int it){ - if(it >= this->GetNTracks()){ - cout << "** TrkLevel2 ** Track "<< it << "does not exits! " << endl; - cout << " Physical tracks GetNTracks() = "<< this->ntrk() << endl; - return 0; - } - TrkTrack *track = (TrkTrack*)(*(this->GetTracks()))[it]; - GetTracks()->Delete();////TEMPORANEO - return track; + if(it >= this->GetNTracks()){ + cout << "** TrkLevel2 ** Track "<< it << "does not exits! " << endl; + cout << " Physical tracks GetNTracks() = "<< this->ntrk() << endl; + return 0; + } + + TRefArray *sorted = GetTracks(); //TEMPORANEO + TrkTrack *track = (TrkTrack*)sorted->At(it); + sorted->Delete(); + return track; } +/** + * Give the number of "physical" tracks, sorted by the method GetTracks(). + */ Int_t TrkLevel2::GetNTracks(){ - Int_t ntot=0; - ntot = GetTracks()->GetEntries(); - GetTracks()->Delete();////TEMPORANEO - return ntot; + + Float_t ntot=0; + TClonesArray &t = *Track; + for(int i=0; iGetImageSeqNo() == -1 ) ntot+=1.; + else ntot+=0.5; + } + return (Int_t)ntot; + }; //-------------------------------------- // @@ -497,18 +886,24 @@ */ TrkTrack *TrkLevel2::GetTrackImage(int it){ - if(it >= this->GetNTracks()){ - cout << "** TrkLevel2 ** Track "<< it << "does not exits! " << endl; - cout << " Physical tracks GetNTracks() = "<< this->ntrk() << endl; - return 0; - } - TrkTrack *track = (TrkTrack*)(*(this->GetTracks()))[it]; - if(!track->HasImage()){ - cout << "** TrkLevel2 ** Track "<< it << "does not have image! " << endl; - return 0; - } - TrkTrack *image = (TrkTrack*)(*Track)[track->image]; - return image; + if(it >= this->GetNTracks()){ + cout << "** TrkLevel2 ** Track "<< it << "does not exits! " << endl; + cout << " Physical tracks GetNTracks() = "<< this->ntrk() << endl; + return 0; + } + + TRefArray* sorted = GetTracks(); //TEMPORANEO + TrkTrack *track = (TrkTrack*)sorted->At(it); + + if(!track->HasImage()){ + cout << "** TrkLevel2 ** Track "<< it << "does not have image! " << endl; + return 0; + } + TrkTrack *image = (TrkTrack*)(*Track)[track->image]; + + sorted->Delete(); + + return image; } //-------------------------------------- @@ -527,6 +922,25 @@ // //-------------------------------------- /** + * Get tracker-plane (mechanical) z-coordinate + * @param plane_id plane index (1=TOP,2,3,4,5,6=BOTTOM) + */ +Float_t TrkLevel2::GetZTrk(Int_t plane_id){ + switch(plane_id){ + case 1: return ZTRK1; + case 2: return ZTRK2; + case 3: return ZTRK3; + case 4: return ZTRK4; + case 5: return ZTRK5; + case 6: return ZTRK6; + default: return 0.; + }; +}; +//-------------------------------------- +// +// +//-------------------------------------- +/** * Trajectory default constructor. * (By default is created with z-coordinates inside the tracking volume) */ @@ -538,11 +952,11 @@ thx = new float[npoint]; thy = new float[npoint]; tl = new float[npoint]; - float dz = ((ZTRKUP)-(ZTRKDW))/(npoint-1); + float dz = ((ZTRK1)-(ZTRK6))/(npoint-1); for(int i=0; i zin[i] && i < npoint); npoint=i; if(npoint != n)cout << "NB! Trajectory created with "<