//
//  $Id: BrLocalTrackModule.cxx,v 1.4 1998/06/21 14:34:51 hagel Exp $
//
//  $Log: BrLocalTrackModule.cxx,v $
//  Revision 1.4  1998/06/21 14:34:51  hagel
//  Correct problem in BrDigitizeDC; clean up tests
//
//  Revision 1.3  1998/04/06 21:12:18  videbaek
//  Clean up and additions for Win95
//
//
#include "BrLocalTrackModule.h"
#include "iostream.h"
#include "BrDataTable.h"
#include "BrEventNode.h"
#include "TSonataMath.h"

ClassImp(BrLocalTrackModule)

//////////////////////////////////////////////////////////////////////////////
//																			//
// BrLocalTrackModule is a class for general tracking.  Both TPC and DC		  //
// tracking objects inherit from it and use its methods.					          //
//																			//
//////////////////////////////////////////////////////////////////////////////

  BrLocalTrackModule::BrLocalTrackModule()
 :BrModule()
{
// Constructor.
//
CreateClonesArrays(); 
}

  BrLocalTrackModule::BrLocalTrackModule(Text_t *Name,Char_t *Title)
 :BrModule(Name,Title)
{
// Default constructor for user.
// The name and title should be ste properly.
//
CreateClonesArrays();
}

 void BrLocalTrackModule::CreateClonesArrays()
{
CombinedHits  = new BrClonesArray("BrCombinedHit",1000);
LocalTracks   = new BrClonesArray("BrLocalTrack",1000);
TrackHits     = new BrClonesArray("BrTrackHit",1000);
VirtualTracks = new BrClonesArray("BrVirtualTrack",1000);
}

 BrLocalTrackModule::~BrLocalTrackModule(){
//
// Destructor
// detele the clones array always created in constructor
//
delete CombinedHits;
delete LocalTracks;
delete TrackHits;
delete VirtualTracks;
}

 void BrLocalTrackModule::GetHitCMBMod(Int_t imod,BrDataTable *HitCMBMod)
{
Int_t i;
Int_t NumHitCMB;
BrCombinedHit *hitcmb_p;
//#define SORT_HITCMB

NumHitCMB = CombinedHits->GetEntries();
for(i=0;i<NumHitCMB;i++) {
   hitcmb_p = (BrCombinedHit*)CombinedHits->At(i);
   if(( hitcmb_p->GetImod()  == imod  ) || ( imod  == IANY ) ) {
      HitCMBMod->Add(hitcmb_p);
	  }
   }

#ifdef SORT_HITCMB
HitCMBMod->Sort();
#endif
}

 void BrLocalTrackModule::InsertTrahit(BrCombinedHit *hitcmbb,BrLocalTrack* loctraa)
{
BrTrackHit* trahit_p;

//This should already be debugged

//trahit[NumTraHit] = new traHIT();
//trahit_p = trahit[NumTraHit];
//NumTraHit++;
//if(NumTraHit > maxtrahit) cout<<"NumTraHit too large"<<endl;
BrClonesArray &trahit = *TrackHits;
Int_t ntrahit = TrackHits->GetEntries();
trahit_p = new(trahit[ntrahit]) BrTrackHit();
//trahit[numtrahit]->gvolu = &gvolu;//need to get this back!!!!
trahit_p->SetImod(hitcmbb->GetImod());
trahit_p->SetTrID(loctraa);
//do we really need these two or does it just arrive because
//of differences from FORTRAN version?  Do it for the moment.
trahit_p->SetLoctra(loctraa);
trahit_p->SetHitcmb(hitcmbb);

//numtrahit = loctraa->numtrahit;
//if(numtrahit > maxloctrahit) printf("numtrahit in loctra too large");
//loctraa->trahit[numtrahit] = trahit_p;
//loctraa->numtrahit++;
loctraa->AddTrackHit(trahit_p);
}

 void BrLocalTrackModule::RemoveTrack(BrLocalTrack* loctraa)
{

//This routine should be more or less debugged although
//the results don't match exactly SONATA after the first time
//through.  I think for the moment that is because of the
//different way it is done here and in using ADAMO.  This should
//be monitored

//For future reference, this can be done in a much easier way
//using the numtrahit and trahit entries in loctra.  That gives
//us the information directly without having to do a search.
Int_t i,j;
//Int_t MOD(Int_t dividend,Int_t divisor);
Int_t NumTraHitLoctra = 0;
BrTrackHit *trahit_p;
BrCombinedHit *hitcmb_p;
Int_t NumTraHit;
Int_t NumHitCMB;
NumHitCMB = CombinedHits->GetEntries();
NumTraHit = TrackHits->GetEntries();
for( i=0;i<NumTraHit;i++) {
   trahit_p = (BrTrackHit*)TrackHits->At(i);
   if(trahit_p->GetTrID() == loctraa) {
      NumTraHitLoctra++;
//    First, find if any hitcmb corresponds to this and reset stat
      for(j=0;j<NumHitCMB;j++) {
	     hitcmb_p = (BrCombinedHit*)CombinedHits->At(j);
	     if( trahit_p->GetHitcmb() == hitcmb_p ) {
		    hitcmb_p->SetStat(TSonataMath::MOD(hitcmb_p->GetStat(),16) + (hitcmb_p->GetStat()/16-1)*16);
		    }
	     }
//    Now Delete this track.
//      delete trahit[i];
//    first we need to remove it from the local track
      loctraa->RemoveTrackHit(trahit_p);
      TrackHits->RemoveAt(i);
//	  delete trahit_p;
//	  i--;//?????
      }
   }
TrackHits->Compress();
loctraa->SetStat(999);
}

 void BrLocalTrackModule::DeleteBadTrack()
{
Int_t i;
Int_t NumLoctra;
BrLocalTrack *loctra_p;

NumLoctra = LocalTracks->GetEntries();
for(i=0;i<NumLoctra;i++) {
   loctra_p = (BrLocalTrack*)LocalTracks->At(i);
   if( loctra_p->GetStat() == 999 ) {
      LocalTracks->RemoveAt(i);
//	  delete loctra_p;
//	  i--;
      }
   }
LocalTracks->Compress();
}

 void BrLocalTrackModule::FillVTracks(Int_t ncutoff)
{
Int_t i,j,i1,i2;
Int_t nsame;

Int_t NumLoctra;
BrLocalTrack *loctra_p1;
BrLocalTrack *loctra_p2;
BrVirtualTrack *vtrack_p;

Int_t NumTrHits1Sel;
BrDataTable TrHits1Sel;
Int_t NumTrHits2Sel;
BrDataTable TrHits2Sel;

BrCombinedHit *hitcmb_p1;
BrCombinedHit *hitcmb_p2;

//printf("Entering FillVTracksn");
NumLoctra = LocalTracks->GetEntries();
for(i=0;i<NumLoctra;i++) {
   loctra_p1 = (BrLocalTrack*)LocalTracks->At(i);
   if( loctra_p1->GetVtrack() == INULL ) {
//    vtrack[NumVTrack] = new vTRACK();
//    numvtrack = NumVTrack;
//    NumVTrack++;
//    if(NumVTrack > maxvtrack) cout<<"NumVTrack too large"<<endl;
      BrClonesArray &vtracks = *VirtualTracks;
      Int_t nvtracks = VirtualTracks->GetEntries();
      vtrack_p = new(vtracks[nvtracks]) BrVirtualTrack();

//    vtrack[numvtrack]->gvolu = &gvolu;

      vtrack_p->AddLoctra(loctra_p1);
//    vtrack[numvtrack]->loctra[0] = loctra[i];
//    vtrack[numvtrack]->numloctra = 1;

//    loctra[i]->vtrack = vtrack[numvtrack];
      loctra_p1->SetVtrack(vtrack_p);

      TrHits1Sel.Clear();
      FillHitCMBSelector(loctra_p1,&TrHits1Sel);
      for(j=i+1;j<NumLoctra;j++) {
	 loctra_p2 = (BrLocalTrack*)LocalTracks->At(j);
         if( loctra_p2->GetVtrack() == INULL ) {
	    TrHits2Sel.Clear();
	    FillHitCMBSelector(loctra_p2,&TrHits2Sel);

//          Compare hits for ghost
	    nsame = 0;
	    NumTrHits1Sel = TrHits1Sel.GetEntries();
//	    NumTrHits1Sel = loctra_p1->GetTrackEntries();
            for(i1=0;i1<NumTrHits1Sel;i1++) {
	       hitcmb_p1 = (BrCombinedHit*)TrHits1Sel.At(i1);
//             hitcmb_p1 = loctra_p1->GetTrackHitAt(i1)->GetHitcmb();
	       NumTrHits2Sel = TrHits2Sel.GetEntries();
//		   NumTrHits2Sel = loctra_p2->GetTrackEntries();
	           for(i2=0;i2<NumTrHits2Sel;i2++) {
		      hitcmb_p2 = (BrCombinedHit*)TrHits2Sel.At(i2);
//                    hitcmb_p2 = loctra_p2->GetTrackHitAt(i2)->GetHitcmb();
	              if(hitcmb_p1 == hitcmb_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);
//	           int numvtrackloctra = vtrack[numvtrack]->numloctra;
//             if(numvtrackloctra>maxvtrackloctra) printf("numvtrackloctra too largen");
//	           vtrack[numvtrack]->loctra[numvtrackloctra] = loctra[j];
//	           vtrack[numvtrack]->numloctra++;
               vtrack_p->AddLoctra(loctra_p2);
	           }
	        if((nsame == NumTrHits1Sel) &&
	           (nsame == NumTrHits2Sel)) {
	           cout<<"Problem; two tracks are the same"<<endl;
	           }
	        }
         }
      }
   }
TrHits1Sel.Clear();
TrHits2Sel.Clear();
}

 void BrLocalTrackModule::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 Tracksx0",GetName());
BrDataTable *DetectorTracks = new BrDataTable(TableName);
OutputTable->AddObject(DetectorTracks);

NumVTrack = VirtualTracks->GetEntries();
for(ivt=0;ivt<NumVTrack;ivt++) {
   vtrack_p = (BrVirtualTrack*) VirtualTracks->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();
   DetectorTracks->Add(titr_p);

   loctra_p = vtrack_p->GetLoctraAt(PreferredTrack);
   titr_p->SetPos (loctra_p->GetPos());
   titr_p->SetAlph(loctra_p->GetVec());
   titr_p->SetLoctra(loctra_p);
   titr_p->SetVtrack(vtrack_p);

   }
Int_t numtracks = DetectorTracks->GetEntries();
if(numtracks > 0) {
   cout<<"Number of Tracks for "<<GetName()<<" is "<<numtracks<<endl;
   for(Int_t i=0;i<numtracks;i++) {
      titr_p = (BrDetectorTrack*)DetectorTracks->At(i);
      cout<<titr_p;
      }
    }
}

 void BrLocalTrackModule::FillHitCMBSelector( BrLocalTrack* loctra,BrDataTable *HitCMBSel)
{
int ic;
//Find the hitcmb which are related through the loctra part.
//i.e. the non-mainview planes.
Int_t NumTraHit;
BrTrackHit *trahit_p;

HitCMBSel->Clear();

NumTraHit = TrackHits->GetEntries();
for(ic=0;ic<NumTraHit;ic++) {
   trahit_p = (BrTrackHit*)TrackHits->At(ic);
   if(loctra == trahit_p->GetLoctra() ) {
      if( trahit_p->GetHitcmb() ) {
	     HitCMBSel->Add(trahit_p->GetHitcmb());
//	     HitCMBSel[numhitcmbsel] = trahit[ic]->hitcmb;
//		 numhitcmbsel++;
	     }
      }
   }

if(loctra->GetTr1() == 0) return;

for(ic=0;ic<NumTraHit;ic++) {
   trahit_p = (BrTrackHit*)TrackHits->At(ic);
   if(loctra->GetTr1() == trahit_p->GetTra2d() ) {
      if( trahit_p->GetHitcmb() ) {
	     HitCMBSel->Add(trahit_p->GetHitcmb());
	     }
      }
   }

for(ic=0;ic<NumTraHit;ic++) {
   trahit_p = (BrTrackHit*)TrackHits->At(ic);
   if(loctra->GetTr2() == trahit_p->GetTra2d() ) {
      if( trahit_p->GetHitcmb() ) {
	     HitCMBSel->Add(trahit_p->GetHitcmb());
	     }
      }
   }


}



ROOT page - Class index - Top of the page

This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.