BRAT 2.4.5
Class index
Full class index
brahmlib
BRAHMS
ROOT page
//-*- mode: c++ -*-

#include "BrGeantToMRSTracks.h"
#include "BrSpectrometerTracks.h"
#include "TClonesArray.h"

ClassImp(BrGeantToMRSTracks)

//_______________________________________________________________
   BrGeantToMRSTracks::BrGeantToMRSTracks() : BrModule()
// default constructor
{
  fCombineModule = 0;
  fMrsTracks = 0;
}

//_______________________________________________________________
 BrGeantToMRSTracks::BrGeantToMRSTracks(Char_t* Name,Char_t* Title) 
  : BrModule(Name,Title)
// normal constructor
{
  fCombineModule = new BrModuleMatchTrack("MRS","MRS matching",
                                          "TPM1","TPM2","D5");
  fMrsTracks = new TObjArray;
}

//_______________________________________________________________
 BrGeantToMRSTracks::~BrGeantToMRSTracks() 
  // default destructor
{
  if (fCombineModule) delete fCombineModule;
  if (fMrsTracks){
    fMrsTracks->Clear();
    delete fMrsTracks;
  }
}

//_______________________________________________________________
 void BrGeantToMRSTracks::Clear()
{
  fMrsTracks->Clear();
  fCombineModule->Clear();
}

//_______________________________________________________________
 void BrGeantToMRSTracks::Init()  
{
  fCombineModule->Init();
}


//_______________________________________________________________
 void BrGeantToMRSTracks::Event(BrEventNode* InputNode, BrEventNode* OutputNode)
{
  Clear();

  if (DebugLevel() > 0)
    fCombineModule->SetDebugLevel(DebugLevel());

  // Use BrMatchedTrack to combine tracks, to use fiducial cuts
  fCombineModule->CombineFrontBack(OutputNode);

  TClonesArray* MatchedTracks = fCombineModule->GetMatchedTracks();
  if (!MatchedTracks){
    cout << " In BrGeantToMRSTracks: No MatchedTracks list! " << endl;
  }

  Char_t Name[32];
  sprintf(Name,"GeantTracks");
  BrDataTable *GeantTracks = InputNode->GetDataTable(Name);
  if (!GeantTracks){
    cout << " In BrGeantToMRSTracks: No GeantTracks table! " << endl;
    return;
  }

  
  sprintf(Name,"DetectorTrack TPM1");   
  BrDataTable *FrontDetectorTracks = OutputNode->GetDataTable(Name);
  if (!FrontDetectorTracks){
    cout << " In BrGeantToMRSTracks: No DetectorTrack TPM1 table! " << endl;
    return;
  }

  sprintf(Name,"DetectorTrack TPM2");   
  BrDataTable *BackDetectorTracks = OutputNode->GetDataTable(Name);
  if (!BackDetectorTracks){
    cout << " In BrGeantToMRSTracks: No DetectorTrack TPM2 table! " << endl;
    return;
  }
  
  BrPlane3D BeamPlane(0,0,0,0,0,1,0,1,0);
 
  BrDataTable* mrstable = new BrDataTable("MrsTracks");
  OutputNode->AddObject(mrstable);

  BrDetectorTrack* backtrack = 0;
  BrDetectorTrack* fronttrack = 0;
  BrGeantTrack* geanttrack = 0;
  BrMrsTrack* mrstrack = 0;
  BrMatchedTrack* matchedtrack = 0;

  if (DebugLevel()) 
    cout << " BrGeantToMRSTracks: Number of matched tracks is: " 
	 << MatchedTracks->GetEntries() << endl;
  for (Int_t i_m=0; i_m<MatchedTracks->GetEntries(); i_m++){
    matchedtrack = (BrMatchedTrack*)MatchedTracks->At(i_m);
    fronttrack = matchedtrack->GetFrontTrack();
    backtrack = matchedtrack->GetBackTrack();
    if ((backtrack->GetID()==fronttrack->GetID()) && 
	(matchedtrack->GetStatus()==BrMatchedTrack::kOk)){
      matchedtrack->SetID(backtrack->GetID());
      // correctly matched track, now create new MRS track
      mrstrack = new BrMrsTrack();
      mrstrack->SetTrackId(matchedtrack->GetID());
      mrstrack->SetMatchedTrack(matchedtrack);
      mrstable->Add(mrstrack);  
      if (DebugLevel()) cout << " Created GEANT MRS track nr: " 
			     << mrstable->GetEntries()-1 
			     <<" ID: " << mrstrack->GetTrackId() << endl;
	
      for (Int_t i_g=0; i_g<GeantTracks->GetEntries(); i_g++){
	geanttrack = (BrGeantTrack*)GeantTracks->At(i_g);
	if (geanttrack->TrackNo() == mrstrack->GetTrackId()){
	  mrstrack->SetMomentum(geanttrack->P()*geanttrack->Charge());
	  if (DebugLevel()) 
	    cout << " Momentum: " 
		 << mrstrack->GetMomentum() 
		 << " Momentum from Match: " 
		 << matchedtrack->GetMomentum() << endl;
	}
      } // loop over Geanttracks
     
      // find intersection with beam plane
      BrDetectorVolume* frontvolume = fCombineModule->GetFrontVolume();
      BrLine3D local_frontline = fronttrack->GetTrackLine();
      BrLine3D global_frontline = frontvolume->LocalToGlobal(local_frontline);
      BrVector3D intersection = 
	BeamPlane.GetIntersectionWithLine(global_frontline);
      mrstrack->SetTx(intersection.X());
      mrstrack->SetTy(intersection.Y());
      mrstrack->SetTz(intersection.Z());

      if(DebugLevel()>=1){
	cout << "Track # " << mrstrack->GetTrackId() << endl;
	cout << " P      " << mrstrack->GetMomentum() << endl;
	cout << " Tx     " << mrstrack->GetTx() << endl;
	cout << " Ty     " << mrstrack->GetTy() << endl;
	cout << " Tz     " << mrstrack->GetTz() << endl;
      }

    } // if matching front-back tracks found
      

  } // loop over matched tracks

  /*
  for (Int_t i_b=0; i_b<BackDetectorTracks->GetEntries(); i_b++){
    backtrack = (BrDetectorTrack*)BackDetectorTracks->At(i_b);
    for (Int_t i_f=0; i_f<FrontDetectorTracks->GetEntries(); i_f++){
      fronttrack = (BrDetectorTrack*)FrontDetectorTracks->At(i_f);
      if (backtrack->GetID()==fronttrack->GetID()){
	matchedtrack = new BrMatchedTrack();
        matchedtrack->SetFrontTrack(fronttrack);
        matchedtrack->SetBackTrack(backtrack);
        matchedtrack->SetID(backtrack->GetID());
	mrstrack = new BrMrsTrack();
	mrstrack->SetId(matchedtrack->GetID());
	mrstrack->FillFrontTrack(fronttrack);
	mrstrack->FillBackTrack(backtrack);
	mrstrack->SetMatchedTrack(matchedtrack);
	mrstable->Add(mrstrack);  
	if (DebugLevel()) cout << " Created GEANT MRS track nr: " << mrstable->GetEntries()-1 <<" ID: " << mrstrack->GetId() << endl;
	
	for (Int_t i_g=0; i_g<GeantTracks->GetEntries(); i_g++){
	  geanttrack = (BrGeantTrack*)GeantTracks->At(i_g);
	  if (geanttrack->TrackNo() == mrstrack->GetId()){
	    mrstrack->SetMomentum(geanttrack->P()*geanttrack->Charge());
	    if (DebugLevel()) cout << " Momentum: " << mrstrack->GetMomentum() << endl;
	  }
	} // loop over Geanttracks
	
      } // matching front and back found
      
    } // loop over fronttracks
  } // loop over backtracks

  */
  if (DebugLevel()) cout << " Number of GEANT MRS tracks created: " << mrstable->GetEntries() << endl;

}

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