--- DarthVader/TrackerLevel2/src/TrkLevel2.cpp 2006/06/14 10:01:44 1.3 +++ DarthVader/TrackerLevel2/src/TrkLevel2.cpp 2006/08/04 08:18:06 1.8 @@ -240,9 +240,9 @@ Track = new TClonesArray("TrkTrack"); SingletX = new TClonesArray("TrkSinglet"); SingletY = new TClonesArray("TrkSinglet"); -// Track = 0; -// Singlet = 0; -// SingletY = 0; + +// PhysicalTrack = new TClonesArray("TrkTrack"); + //sostituire con TRefArray... appena ho capito come si usa } //-------------------------------------- // @@ -270,7 +270,7 @@ /** * Fills a TrkLevel2 object with values from a struct cTrkLevel2 (to get data from F77 common). */ -void TrkLevel2::FillCommonVar(cTrkLevel2 *l2){ +void TrkLevel2::SetFromLevel2Struct(cTrkLevel2 *l2){ // // Track = new TClonesArray("TrkTrack"); // SingletX = new TClonesArray("TrkSinglet"); @@ -333,6 +333,65 @@ new(sy[i]) TrkSinglet(*t_singlet); t_singlet->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++){ + l2->crc[i] = crc[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; + 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; + } } //-------------------------------------- // @@ -343,9 +402,13 @@ for(Int_t i=0; i<12 ; i++){ crc[i] = -1; }; - Track->RemoveAll(); +/* Track->RemoveAll(); SingletX->RemoveAll(); - SingletY->RemoveAll(); + SingletY->RemoveAll();*/ + // modify to avoid memory leakage + Track->Clear(); + SingletX->Clear(); + SingletY->Clear(); } //-------------------------------------- // @@ -355,11 +418,12 @@ * 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; -}; -TClonesArray *TrkLevel2::GetTracks_Chi2Sorted(){ +// TClonesArray *TrkLevel2::GetTracks(){ +// TClonesArray *sorted = GetTracks_NFitSorted(); +// return sorted; +// }; + +/*TClonesArray *TrkLevel2::GetTracks_Chi2Sorted(){ TClonesArray *sorted = new TClonesArray("TrkTrack"); TClonesArray &t = *Track; @@ -387,52 +451,117 @@ indo++; } return sorted; -} -TClonesArray *TrkLevel2::GetTracks_NFitSorted(){ +}*/ +/*TClonesArray *TrkLevel2::GetTracks_NFitSorted(){ - TClonesArray *sorted = new TClonesArray("TrkTrack"); - TClonesArray &t = *Track; - TClonesArray &ts = *sorted; - int N=this->ntrk(); + TClonesArray *sorted = new TClonesArray("TrkTrack"); + TClonesArray &t = *Track; + TClonesArray &ts = *sorted; +// TClonesArray &ts = *PhysicalTrack; + int N = 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 nfit =0; + float chi2ref = numeric_limits::max(); + // first loop to search maximum num. of fit points + for(int i=0; i < ntrk(); i++){ +// if(N==ntrk())cout << "** "<GetImageSeqNo()<< " " <<((TrkTrack *)t[i])->GetNtot() << " " <<((TrkTrack *)t[i])->chi2 << endl; + if( ((TrkTrack *)t[i])->GetNtot() >= nfit && m[i]==1){ + nfit = ((TrkTrack *)t[i])->GetNtot(); + } + } + //second loop to search minimum chi2 among selected + for(int i=0; intrk(); 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; + + // cout << "i** "<< ((TrkTrack *)t[indi])->image << " " << nfiti <<" "<image ])->GetNtot(); -// Float_t chi2i=((TrkTrack *)t[((TrkTrack *)t[indi])->image ])->chi2; +// cout << "GetTracks_NFitSorted(it): new TRefArray()"<< endl; +// TClonesArray *sorted = new TClonesArray("TrkTrack"); +// TClonesArray &ts = *sorted; + TRefArray *sorted = new TRefArray(); + + TClonesArray &t = *Track; +// TClonesArray &ts = *PhysicalTrack; + int N = ntrk(); + vector m(N); for(int i=0; i::max(); + // first loop to search maximum num. of fit points + for(int i=0; i < ntrk(); i++){ +// if(N==ntrk())cout << "** "<GetImageSeqNo()<< " " <<((TrkTrack *)t[i])->GetNtot() << " " <<((TrkTrack *)t[i])->chi2 << endl; + if( ((TrkTrack *)t[i])->GetNtot() >= nfit && m[i]==1){ + nfit = ((TrkTrack *)t[i])->GetNtot(); + } + } + //second loop to search minimum chi2 among selected + for(int i=0; intrk(); 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; + + // cout << "i** "<< ((TrkTrack *)t[indi])->image << " " << nfiti <<" "<Add( (TrkTrack*)t[indi] ); -// cout << "i** "<< ((TrkTrack *)t[indi])->image << " " << nfiti <<" "<= 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){ +/*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]; - return track; + TClonesArray* sorted = GetTracks(); + TClonesArray &ts = *sorted; + +// TrkTrack *track = (TrkTrack*)ts[it]; + TrkTrack *track = new TrkTrack( *(TrkTrack*)ts[it] ); //copia + sorted->Delete("all");////TEMPORANEO + return track; +}*/ +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; + } + + 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(){ + + Float_t ntot=0; + TClonesArray &t = *Track; + for(int i=0; iGetImageSeqNo() == -1 ) ntot+=1.; + else ntot+=0.5; + } + return (Int_t)ntot; + +}; //-------------------------------------- // // @@ -480,21 +679,52 @@ * Retrieves (if present) the image of the it-th "physical" track, sorted by the method GetNTracks(). * @param it Track number, ranging from 0 to GetNTracks(). */ -TrkTrack *TrkLevel2::GetTrackImage(int it){ +/*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()){ + + TClonesArray* sorted = GetTracks(); + TClonesArray &ts = *sorted; + TrkTrack *track = (TrkTrack*)ts[it]; +// 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]; + +// GetTracks()->Delete(); ////TEMPORANEO + sorted->Delete(); ////TEMPORANEO + return image; +}*/ +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; + } + + 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; + } //-------------------------------------- // @@ -512,6 +742,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) */ @@ -523,11 +772,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