BRAT 2.4.5
Class index
Full class index
brahmlib
BRAHMS
ROOT page
//
//  $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>
Last Update on by

Validate HTML
Validate CSS