|
// // $Id: BrLocalTrackingModule.cxx,v 1.1.1.1 2001/06/21 14:55:11 hagel Exp $ // // $Log: BrLocalTrackingModule.cxx,v $ // Revision 1.1.1.1 2001/06/21 14:55:11 hagel // Initial revision of brat2 // // Revision 1.6 2000/04/28 21:18:59 videbaek // Updates to BrLocalTrack. Added fit method; Status is changed. Uses // MarkAsBad, IsBad instead of fixed 999. // Cleanup of BrModuleMatchtrack. Added histohgrams. // Changed LocalTrack and LocalTracking to use IsBad etc. // // Revision 1.5 2000/03/24 14:19:15 pchristi // Added Quality to BrDetectorTrack // // Revision 1.4 2000/01/18 18:41:19 videbaek // ved covariance to output. // // Revision 1.3 1999/12/30 20:16:39 videbaek // Added fMaxPixelCutoff for cluster selection. Chnegd default nsame for tpc tracking // Use fNTrackgroups in villVtracks.. // // Revision 1.2 1999/12/23 15:59:02 videbaek // Enhanched use of ClonesArrays for temporary data. i.e. tracks hits // so they become accessible to the outside. // // Revision 1.1 1999/03/07 22:38:04 videbaek // Added DetectorHit and BrLocalTrackingModule as a more general way to // deal with local tracks and hits. Initial insertion. Not fully debugged. // Cosmetic changes to other modules. // #include <iostream.h> #include <iomanip.h> #include <assert.h> #include "BrLocalTrackingModule.h" #if !defined BRAT_BrDetectorTrack # include "BrDetectorTrack.h" #endif #if !defined BRAT_BrDetectorHit # include "BrDetectorHit.h" #endif #if !defined BRAT_BrVirtualTrack #include "BrVirtualTrack.h" #endif #if !defined BRAT_BrDataTable # include "BrDataTable.h" #endif #if !defined BRAT_BrEventNode # include "BrEventNode.h" #endif #if !defined BRAT_BrMath # include "BrMath.h" #endif ClassImp(BrLocalTrackingModule) ////////////////////////////////////////////////////////////////////////////// // // // BrLocalTrackingModule is a class for general tracking. Both TPC // // tracking objects inherit from it and use its methods. // // April 28, 2000 // New classes are being written to deal with TPC tracking taht do not // inherit form this class but rather BrTrackFinderBase and // BrClusterFinderBase. // // ////////////////////////////////////////////////////////////////////////////// //_____________________________________________________________________________ BrLocalTrackingModule::BrLocalTrackingModule() :BrModule() { // Constructor. // CreateClonesArrays(); fDetectorTracks = 0; } //_____________________________________________________________________________ BrLocalTrackingModule::BrLocalTrackingModule(Text_t *Name,Char_t *Title) :BrModule(Name,Title) { // Default constructor for user. // The name and title should be set properly. // CreateClonesArrays(); fDetectorTracks = 0; } //_____________________________________________________________________________ BrLocalTrackingModule::~BrLocalTrackingModule(){ // // Destructor // delete the clones array always created in constructor // delete fTrackGroups; delete fLocalTracks; delete fDetectorHits; if(fDetectorTracks) delete fDetectorTracks; } //_____________________________________________________________________________ void BrLocalTrackingModule::Clear() { // Clear the temporary ClonesArray for intermediate data // structures. // fDetectorHits->Clear(); fNDetectorHits=0; fTrackGroups->Delete(); fNTrackGroups=0; fLocalTracks->Delete(); fNLocalTracks=0; } //_____________________________________________________________________________ void BrLocalTrackingModule::CreateClonesArrays() { // Create the temporary ClonesArray for intermediate data // structures. // fDetectorHits = new BrClonesArray("BrDetectorHit",2000); fNDetectorHits = 0; fLocalTracks = new BrClonesArray("BrLocalTrack",500); fNLocalTracks = 0; fTrackHitAsco = new BrClonesArray("BrTrackHit",1000); fTrackGroups = new BrClonesArray("BrVirtualTrack",500); fNTrackGroups = 0; } //_____________________________________________________________________________ void BrLocalTrackingModule::DeleteBadTrack() { // // Find tracks marked in track candidate list as bad // and compress the LocalTrack container // BrLocalTrack *loctra_p; Int_t NumLocalTracks = fLocalTracks->GetEntries(); for(int i=0;i<NumLocalTracks;i++) { loctra_p = (BrLocalTrack*)fLocalTracks->At(i); if( loctra_p->IsBad()) { fLocalTracks->RemoveAt(i); fNLocalTracks--; } } fLocalTracks->Compress(); assert(fLocalTracks->GetEntries() == fNLocalTracks); } //_____________________________________________________________________________ void BrLocalTrackingModule::FillHitContainer(Int_t imod, TObjArray *SelectedHitContainer) { // Fill selector i.e. TObjArray with the hits that // Int_t i; Int_t NumHits; BrDetectorHit *hit_p; // // Could probably use GetLast()+1 instead NumHits = fDetectorHits->GetEntries(); for(i=0; i<NumHits; i++) { hit_p = (BrDetectorHit*)fDetectorHits->At(i); if(( hit_p->GetImod() == imod ) || ( imod == IANY ) ) { SelectedHitContainer->Add(hit_p); } } } /* //_____________________________________________________________________________ void BrLocalTrackingModule::InsertTrahit(BrCombinedHit *hit, BrLocalTrack* localtrack) { // Fill a new entry in the mapping 'table' TrackHits with the // pointers to a detector hit (hit) and to a localtrack. // BrTrackHit* trahit_p; //This should already be debugged BrClonesArray &trahit = *TrackHits; Int_t ntrahit = TrackHits->GetEntries(); trahit_p = new(trahit[ntrahit]) BrTrackHit(); trahit_p->SetImod(hit->GetImod()); trahit_p->SetTrackID(localtrack->GetID()); trahit_p->SetHitID(hit->GetID()); trahit_p->SetLoctra(localtrack); trahit_p->SetHitcmb(hit); localtrack->AddTrackHit(trahit_p); } */ //_____________________________________________________________________________ void BrLocalTrackingModule::FillTrackGroups(Int_t ncutoff) { // Create the different groups of tracks group. i.e. those localtracks // that has overlapping hits. Tracks in a track group are deemed ghosttracks // the ghost busting is done at a later stage when the DetectorTracks // are filled. // Int_t i,j,i1,i2; Int_t nsame; BrLocalTrack *loctra_p1; BrLocalTrack *loctra_p2; BrVirtualTrack *vtrack_p; Int_t NumTrHits1Sel; TObjArray* TrHits1Sel; Int_t NumTrHits2Sel; TObjArray* TrHits2Sel; BrDetectorHit *hit_p1; BrDetectorHit *hit_p2; assert(fNLocalTracks== fLocalTracks->GetEntries()); for(i=0;i<fNLocalTracks;i++) { loctra_p1 = (BrLocalTrack*)fLocalTracks->At(i); if( loctra_p1->GetVtrack() == INULL ) { BrClonesArray &vtracks = *fTrackGroups; assert(fNTrackGroups == fTrackGroups->GetEntries()); vtrack_p = new(vtracks[fNTrackGroups++]) BrVirtualTrack(); vtrack_p->AddLoctra(loctra_p1); vtrack_p->SetID((Int_t)vtrack_p); loctra_p1->SetVtrack(vtrack_p); TrHits1Sel = loctra_p1->GetHitList(); for(j=i+1; j<fNLocalTracks; j++) { loctra_p2 = (BrLocalTrack*)fLocalTracks->At(j); if( loctra_p2->GetVtrack() == INULL ) { TrHits2Sel = loctra_p2->GetHitList(); // // Compare hits for ghost nsame = 0; NumTrHits1Sel = TrHits1Sel->GetEntries(); for(i1=0;i1<NumTrHits1Sel;i1++) { hit_p1 = (BrDetectorHit*) TrHits1Sel->At(i1); NumTrHits2Sel = TrHits2Sel->GetEntries(); for(i2=0;i2<NumTrHits2Sel;i2++) { hit_p2 = (BrDetectorHit*) TrHits2Sel->At(i2); if(hit_p1 == hit_p2) { nsame++; } } } // decide on sameness of ghost tracks // Beware that this loop works. Ncutoff should be related // to the number of planes etc. if(nsame>=ncutoff) { loctra_p2->SetVtrack(vtrack_p); vtrack_p->AddLoctra(loctra_p2); } if((nsame == NumTrHits1Sel) && (nsame == NumTrHits2Sel)) { Error("FillTrackGroupscout","Problem; two tracks are the same"); } } } } } } //_____________________________________________________________________________ void BrLocalTrackingModule::FillLocalTracks(BrEventNode* OutputTable) { Int_t ivt,ic,numvtrackloctra; Float_t chimin; Int_t PreferredTrack; Int_t NumVTrack; BrLocalTrack* loctra_p; BrVirtualTrack* vtrack_p; BrDetectorTrack* titr_p; // //Prepare the output table // Char_t TableName[32]; sprintf(TableName,"%s Detector Tracks",GetName()); fDetectorTracks = new BrDataTable(TableName); OutputTable->AddObject(fDetectorTracks); NumVTrack = fTrackGroups->GetEntries(); // if(DebugLevel()) { cout << "FillLocalTracksn"<< " no virtual tracks = " << NumVTrack << endl; } for(ivt=0;ivt<NumVTrack;ivt++) { vtrack_p = (BrVirtualTrack*) fTrackGroups->At(ivt); // Look in the list of loctra connected to the vtrack and pick // the "best"?? PreferredTrack = 0; chimin = (float)1000000.; numvtrackloctra = vtrack_p->GetLoctraEntries(); for(ic=0;ic<numvtrackloctra;ic++) { loctra_p = vtrack_p->GetLoctraAt(ic); if( loctra_p->GetChisq() < chimin ) { PreferredTrack = ic; chimin = loctra_p->GetChisq(); } } titr_p = new BrDetectorTrack(); fDetectorTracks->Add(titr_p); loctra_p = vtrack_p->GetLoctraAt(PreferredTrack); titr_p->SetPos (loctra_p->GetPos()); titr_p->SetAlpha(loctra_p->GetVec()); titr_p->SetID(loctra_p->GetID()); titr_p->SetGroupID(vtrack_p->GetID()); } if(DebugLevel() > 0) { Int_t numtracks = fDetectorTracks->GetEntries(); if(numtracks > 0) { cout<<"Number of Tracks for "<<GetName()<<" is "<<numtracks<<" fDetectorTracks = "<<(Int_t)fDetectorTracks<<endl; for(Int_t i=0;i<numtracks;i++) { titr_p = (BrDetectorTrack*)fDetectorTracks->At(i); cout<< titr_p; } } } } //_____________________________________________________________________________ void BrLocalTrackingModule::FillDetectorTracks(BrEventNode* OutputNode) { // // Method to add to the output node a table consiting of the prefered // best local tracks. The objects in this table are BrDetectorTracks // These objects are used in all higher level tracking code that combines // and matches tracks between detectors. Int_t ivt,ic,numvtrackloctra; Float_t chimin; Int_t PreferredTrack; Int_t NumVTrack; BrLocalTrack* loctra_p; BrVirtualTrack* vtrack_p; BrDetectorTrack* titr_p; // //Prepare the output table // Char_t TableName[32]; sprintf(TableName,"DetectorTrack %s",GetName()); fDetectorTracks = new BrDataTable(TableName); OutputNode->AddObject(fDetectorTracks); NumVTrack = fTrackGroups->GetEntries(); // if(DebugLevel()) { cout << "FillLocalTracksn"<< " no virtual tracks = " << NumVTrack << endl; } for(ivt=0;ivt<NumVTrack;ivt++) { vtrack_p = (BrVirtualTrack*) fTrackGroups->At(ivt); // Look in the list of loctra connected to the vtrack and pick // the "best"?? PreferredTrack = 0; chimin = (float)1000000.; numvtrackloctra = vtrack_p->GetLoctraEntries(); for(ic=0;ic<numvtrackloctra;ic++) { loctra_p = vtrack_p->GetLoctraAt(ic); if( loctra_p->GetChisq() < chimin ) { PreferredTrack = ic; chimin = loctra_p->GetChisq(); } } titr_p = new BrDetectorTrack(); fDetectorTracks->Add(titr_p); loctra_p = vtrack_p->GetLoctraAt(PreferredTrack); titr_p->SetPos (loctra_p->GetPos()); titr_p->SetAlpha(loctra_p->GetVec()); titr_p->SetID(loctra_p->GetID()); titr_p->SetGroupID(vtrack_p->GetID()); // Peter Update titr_p->SetQuality( loctra_p->GetChisq() ); } if(DebugLevel() > 0) { Int_t numtracks = fDetectorTracks->GetEntries(); if(numtracks > 0) { cout<<"Number of Tracks for "<<GetName() <<" is "<<numtracks<< endl; if(DebugLevel()>2) cout << " fDetectorTracks = "<<(Int_t)fDetectorTracks<<endl; for(Int_t i=0;i<numtracks;i++) { titr_p = (BrDetectorTrack*)fDetectorTracks->At(i); cout<< titr_p; } } } } //_________________________________________________________________________ void BrLocalTrackingModule::FitLocalTrack(BrLocalTrack* localtrack, Float_t *sol,Float_t *covar, Float_t &chisq, Int_t &ifail) { //FitLocalTPCTrack takes the input Local Track, extracts the combined hits that //make up this track and does a fit to get a chisqr //Input arguments: //BrLocalTrack *localtrack : the local track to be fit //Output arguments: //Float_t *sol : output parameters from the fit //Float_t *covar : covar //Input tables: // None //Output tables: // None Int_t i,j,ic; Double_t a[4]; Double_t beta[4][1]; Double_t alpha[4][4]; Double_t *alphaa[4],*betaa[4]; Float_t work[4]; Float_t du,dchi,dchi1,dchi2; Int_t NumHits; BrDetectorHit *hit_p; NumHits = localtrack->GetNhit(); for(i=0;i<4;i++) { beta[i][0] = (Double_t)0.0; for(j=0;j<4;j++) { alpha[i][j] = (Double_t)0.0; } } //Is there a more elegant way to do this? for(i=0;i<4;i++) { alphaa[i] = &alpha[i][0]; betaa [i] = &beta[i][0]; } //Setup matrix equation if(NumHits<=2) { cout<<"Too few points for fitting; this ought not to happen"<<endl; return; } if(DebugLevel()>2){ cout << "Fitting track " << "with" << NumHits << "points" << endl; for(int k=0; k<NumHits;k++){ hit_p = localtrack->GetDetectorHitAt(k); cout << setprecision(5)<<setw(8)<<hit_p->GetPos()[0]<<setw(8)<<hit_p->GetPos()[1]<<endl; } } for(ic=0;ic<NumHits;ic++) { hit_p = localtrack->GetDetectorHitAt(ic); a[0] = hit_p->GetPos()[2]; a[1] = 1; a[2] = hit_p->GetPos()[2]; a[3] = 1; du = (Float_t)0.02; for(i=0;i<2;i++) { for(j=0;j<2;j++) alpha[i][j] += a[i]*a[j]/du/du; beta[i][0] += a[i] * hit_p->GetPos()[0]/du/du; } for(i=2;i<4;i++) { for(j=2;j<4;j++) alpha[i][j] += a[i]*a[j]/du/du; beta[i][0] += a[i] * hit_p->GetPos()[1]/du/du; } } //Solve 4x4 matrix for xc,yc and ex,ey vector BrMath::DEQINV(4,alphaa,4,work,ifail,1,betaa); //Calculate chisqr chisq = (Float_t)0.0; for(ic=0;ic<NumHits;ic++) { hit_p = localtrack->GetDetectorHitAt(ic); a[0] = hit_p->GetPos()[2]; a[1] = 1; a[2] = hit_p->GetPos()[2]; a[3] = 1; du = (Float_t)0.02; dchi1 = (Float_t)(beta[1][0] + beta[0][0]*a[0] - hit_p->GetPos()[0]); dchi2 = (Float_t)(beta[3][0] + beta[2][0]*a[2] - hit_p->GetPos()[1]); dchi = (dchi1*dchi1 + dchi2*dchi2)/du/du; chisq += dchi; } chisq = chisq/(NumHits-2); for(i=0;i<4;i++) sol[i] = (Float_t)beta[i][0]; if(DebugLevel()>2){ for(i=0;i<4;i++){ for(j=0;j<4;j++) cout << setw(8)<< alpha[i][j]; cout << endl; } } for(i=0;i<4;i++) for(j=0;j<4;j++) covar[i*4+j] = alpha[i][j]; } //_____________________________________________________________________________ void BrLocalTrackingModule::RemoveTrack(BrLocalTrack* localtrack) { // Mark a track (during construction of all tracks for deletion in the // by setting its status value. // Why is this a routine in the local tracking, and not a property of // localtrack right away (12/19/99-fv)? localtrack->MarkAsBad(); } |
||||||
This page automatically generated by script docBrat by Christian Holm |
Copyright ; 2002 BRAHMS Collaboration
<brahmlib@rcf.rhic.bnl.gov>
|