Add track matching between trigger and tracker informations (CF+JPC)
authorcussonno <cussonno@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 4 Mar 2004 12:01:48 +0000 (12:01 +0000)
committercussonno <cussonno@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 4 Mar 2004 12:01:48 +0000 (12:01 +0000)
MUON/AliMUON.cxx
MUON/AliMUONEventReconstructor.cxx
MUON/AliMUONEventReconstructor.h
MUON/AliMUONTrack.cxx
MUON/AliMUONTrack.h
MUON/AliMUONTrackParam.h

index 6b345c6..0ee4b5c 100644 (file)
@@ -820,11 +820,6 @@ void AliMUON::Reconstruct() const
 
     //---------------------------- Track & TriggerTrack ---------------------
     if (!fLoader->TreeT()) fLoader->MakeTracksContainer();
-    // tracking branch
-    dataEvent->MakeBranch("RT"); //track
-    dataEvent->SetTreeAddress("RT");
-    recoEvent->EventReconstruct();
-    dataEvent->Fill("RT");
 
     // trigger branch
     dataEvent->MakeBranch("RL"); //trigger track
@@ -832,6 +827,12 @@ void AliMUON::Reconstruct() const
     recoEvent->EventReconstructTrigger();
     dataEvent->Fill("RL");
 
+    // tracking branch
+    dataEvent->MakeBranch("RT"); //track
+    dataEvent->SetTreeAddress("RT");
+    recoEvent->EventReconstruct();
+    dataEvent->Fill("RT");
+
     fLoader->WriteTracks("OVERWRITE");  
   
     //--------------------------- Resetting branches -----------------------
index e123948..b24f4de 100644 (file)
@@ -371,6 +371,15 @@ void AliMUONEventReconstructor::EventReconstruct(void)
   MakeEventToBeReconstructed();
   MakeSegments();
   MakeTracks();
+  if (fMUONData->IsTriggerTrackBranchesInTree()) 
+    ValidateTracksWithTrigger(); 
+
+  // Add tracks to MUON data container 
+  for(Int_t i=0; i<GetNRecTracks(); i++) {
+    AliMUONTrack * track = (AliMUONTrack*) GetRecTracksPtr()->At(i);
+    fMUONData->AddRecTrack(*track);
+  }
+
   return;
 }
 
@@ -966,24 +975,33 @@ void AliMUONEventReconstructor::MakeTracks(void)
     RemoveDoubleTracksK();
     // Propagate tracks to the vertex thru absorber
     GoToVertex();
-  } else { //AZ
+  } else { 
     // Look for candidates from at least 3 aligned points in stations(1..) 4 and 5
     MakeTrackCandidates();
     // Follow tracks in stations(1..) 3, 2 and 1
     FollowTracks();
     // Remove double tracks
     RemoveDoubleTracks();
-  }
-  //  AliMUON * pMUON = (AliMUON *) gAlice->GetDetector("MUON");
-  for(Int_t i=0; i<GetNRecTracks(); i++) {
-    AliMUONTrack * track = (AliMUONTrack*) GetRecTracksPtr()->At(i);
-     fMUONData->AddRecTrack(*track);
+    UpdateTrackParamAtHit();
   }
   return;
 }
 
   //__________________________________________________________________________
-void AliMUONEventReconstructor::MakeTriggerTracks(void)
+void AliMUONEventReconstructor::ValidateTracksWithTrigger(void)
+{
+  AliMUONTrack *track;
+  TClonesArray *recTriggerTracks = fMUONData->RecTriggerTracks();
+  
+  track = (AliMUONTrack*) fRecTracksPtr->First();
+  while (track) {
+    track->MatchTriggerTrack(recTriggerTracks);
+    track = (AliMUONTrack*) fRecTracksPtr->After(track);
+  } 
+}
+
+  //__________________________________________________________________________
+Bool_t AliMUONEventReconstructor::MakeTriggerTracks(void)
 {
     // To make the trigger tracks from Local Trigger
     if (fPrintLevel >= 1) cout << "enter MakeTriggerTracks" << endl;
@@ -997,38 +1015,22 @@ void AliMUONEventReconstructor::MakeTriggerTracks(void)
     AliMUONGlobalTrigger *gloTrg;
     AliMUONTriggerCircuit *circuit;
     AliMUONTriggerTrack *recTriggerTrack = 0;
-//     TString evfoldname = AliConfig::fgkDefaultEventFolderName;//to be interfaced properly
-//     AliRunLoader* rl = AliRunLoader::GetRunLoader(evfoldname);
-//     if (rl == 0x0)
-//     {
-//     Error("MakeTriggerTracks",
-//           "Can not find Run Loader in Event Folder named %s.",
-//           evfoldname.Data());
-//     return;
-//     }
-//     AliLoader* gime = rl->GetLoader("MUONLoader");
-//     if (gime == 0x0)
-//     {
-//     Error("MakeTriggerTracks","Can not get MUON Loader from Run Loader.");
-//     return;
-//     }
+
     TTree* TR = fLoader->TreeR();
     
-    // Loading AliRun master
-//     rl->LoadgAlice();
-//     gAlice = rl->GetAliRun();
-    
     // Loading MUON subsystem
     AliMUON * pMUON = (AliMUON *) gAlice->GetDetector("MUON");
     
     nTRentries = Int_t(TR->GetEntries());
-    if (nTRentries != 1) {
-      cout << "Error in AliMUONEventReconstructor::MakeTriggerTracks"
+     
+    TR->GetEvent(0); // only one entry  
+
+    if (!(fMUONData->IsTriggerBranchesInTree())) {
+      cout << "Warning in AliMUONEventReconstructor::MakeTriggerTracks"
           << endl;
-      cout << "nTRentries = " << nTRentries << " not equal to 1" << endl;
-      exit(0);
+      cout << "Trigger information is not avalaible, nTRentries = " << nTRentries << " not equal to 1" << endl;
+      return kFALSE;
     }
-    fLoader->TreeR()->GetEvent(0); // only one entry  
 
     fMUONData->SetTreeAddress("GLT");
     fMUONData->GetTrigger();
@@ -1081,7 +1083,7 @@ void AliMUONEventReconstructor::MakeTriggerTracks(void)
       //       fNRecTriggerTracks++;
       fMUONData->AddRecTriggerTrack(*recTriggerTrack);
     } // end of loop on Local Trigger
-    return;    
+    return kTRUE;    
 }
 
   //__________________________________________________________________________
@@ -1547,6 +1549,26 @@ void AliMUONEventReconstructor::RemoveDoubleTracks(void)
 }
 
   //__________________________________________________________________________
+void AliMUONEventReconstructor::UpdateTrackParamAtHit()
+{
+  // Set track parameters after track fitting. Fill fTrackParamAtHit of AliMUONTrack's
+  AliMUONTrack *track;
+  AliMUONTrackHit *trackHit;
+  AliMUONTrackParam *trackParam;
+  track = (AliMUONTrack*) fRecTracksPtr->First();
+  while (track) {
+    trackHit = (AliMUONTrackHit*) (track->GetTrackHitsPtr())->First();
+    while (trackHit) {
+      trackParam = trackHit->GetTrackParam();
+      track->AddTrackParamAtHit(trackParam);
+      trackHit = (AliMUONTrackHit*) (track->GetTrackHitsPtr())->After(trackHit); 
+    } // trackHit    
+    track = (AliMUONTrack*) fRecTracksPtr->After(track);
+  } // track
+  return;
+}
+
+  //__________________________________________________________________________
 void AliMUONEventReconstructor::EventDump(void)
 {
   // Dump reconstructed event (track parameters at vertex and at first hit),
index 5c5c89e..5afde84 100644 (file)
@@ -184,7 +184,7 @@ class AliMUONEventReconstructor : public TObject {
   void ResetSegments(void);
   void MakeSegmentsPerStation(Int_t Station);
   void MakeTracks(void);
-  void MakeTriggerTracks(void);
+  Bool_t MakeTriggerTracks(void);
   void ResetTrackHits(void);
   void ResetTracks(void);
   void ResetTriggerTracks(void);
@@ -193,7 +193,8 @@ class AliMUONEventReconstructor : public TObject {
   void MakeTrackCandidates(void);
   void FollowTracks(void);
   void RemoveDoubleTracks(void);
-
+  void UpdateTrackParamAtHit(void);
+  void ValidateTracksWithTrigger(void);
 
 
   //AZ - for Kalman Filter
index 88a659f..69a2e9f 100644 (file)
@@ -39,6 +39,8 @@
 #include "AliMUONSegment.h" 
 #include "AliMUONTrack.h"
 #include "AliMUONTrackHit.h"
+#include "AliMUONTriggerTrack.h"
+#include "AliMUONConstants.h"
 
 // Functions to be minimized with Minuit
 void TrackChi2(Int_t &NParam, Double_t *Gradient, Double_t &Chi2, Double_t *Param, Int_t Flag);
@@ -53,6 +55,16 @@ ClassImp(AliMUONTrack) // Class implementation in ROOT context
 TVirtualFitter* AliMUONTrack::fgFitter = NULL; 
 
   //__________________________________________________________________________
+AliMUONTrack::AliMUONTrack() 
+{
+  // Default constructor
+  fgFitter = 0;
+  fEventReconstructor = 0;
+  fTrackHitsPtr = 0;
+  fTrackParamAtHit = new TClonesArray("AliMUONTrackParam",10);  
+}
+
+  //__________________________________________________________________________
 AliMUONTrack::AliMUONTrack(AliMUONSegment* BegSegment, AliMUONSegment* EndSegment, AliMUONEventReconstructor* EventReconstructor)
 {
   // Constructor from two Segment's
@@ -64,11 +76,14 @@ AliMUONTrack::AliMUONTrack(AliMUONSegment* BegSegment, AliMUONSegment* EndSegmen
   AddSegment(EndSegment); // add hits from EndSegment
   fTrackHitsPtr->Sort(); // sort TrackHits according to increasing Z
   SetTrackParamAtVertex(); // set track parameters at vertex
+  fTrackParamAtHit = new TClonesArray("AliMUONTrackParam",10);
   // set fit conditions...
   fFitMCS = 0;
   fFitNParam = 3;
   fFitStart = 1;
   fFitFMin = -1.0;
+  fMatchTrigger = kFALSE;
+  fChi2MatchTrigger = 0;
   return;
 }
 
@@ -84,11 +99,14 @@ AliMUONTrack::AliMUONTrack(AliMUONSegment* Segment, AliMUONHitForRec* HitForRec,
   AddHitForRec(HitForRec); // add HitForRec
   fTrackHitsPtr->Sort(); // sort TrackHits according to increasing Z
   SetTrackParamAtVertex(); // set track parameters at vertex
+  fTrackParamAtHit = new TClonesArray("AliMUONTrackParam",10);
   // set fit conditions...
   fFitMCS = 0;
   fFitNParam = 3;
   fFitStart = 1;
   fFitFMin = -1.0;
+  fMatchTrigger = kFALSE;
+  fChi2MatchTrigger = 0;
   return;
 }
 
@@ -100,19 +118,28 @@ AliMUONTrack::~AliMUONTrack()
     delete fTrackHitsPtr; // delete the TObjArray of pointers to TrackHit's
     fTrackHitsPtr = NULL;
   }
+  
+  if (fTrackParamAtHit) {
+    // delete the TClonesArray of pointers to TrackParam
+    delete fTrackParamAtHit;
+    fTrackParamAtHit = NULL;
+  }
 }
 
   //__________________________________________________________________________
 AliMUONTrack::AliMUONTrack (const AliMUONTrack& MUONTrack):TObject(MUONTrack)
 {
-  fEventReconstructor = new AliMUONEventReconstructor(*MUONTrack.fEventReconstructor);
+  fEventReconstructor = new AliMUONEventReconstructor(*MUONTrack.fEventReconstructor); // is it right ?
   fTrackParamAtVertex = MUONTrack.fTrackParamAtVertex;
-  fTrackHitsPtr =  new TObjArray(*MUONTrack.fTrackHitsPtr);
-  fNTrackHits =  MUONTrack.fNTrackHits;
-  fFitMCS     =  MUONTrack.fFitMCS;
-  fFitNParam  =  MUONTrack.fFitNParam;
-  fFitFMin    =  MUONTrack.fFitFMin;
-  fFitStart   =  MUONTrack.fFitStart;
+  fTrackHitsPtr     =  new TObjArray(*MUONTrack.fTrackHitsPtr);  // is it right ?
+  fTrackParamAtHit  =  new TClonesArray(*MUONTrack.fTrackParamAtHit);
+  fNTrackHits       =  MUONTrack.fNTrackHits;
+  fFitMCS           =  MUONTrack.fFitMCS;
+  fFitNParam        =  MUONTrack.fFitNParam;
+  fFitFMin          =  MUONTrack.fFitFMin;
+  fFitStart         =  MUONTrack.fFitStart;
+  fMatchTrigger     =  MUONTrack.fMatchTrigger;
+  fChi2MatchTrigger =  MUONTrack.fChi2MatchTrigger;
 }
 
   //__________________________________________________________________________
@@ -121,14 +148,17 @@ AliMUONTrack & AliMUONTrack::operator=(const AliMUONTrack& MUONTrack)
   if (this == &MUONTrack)
     return *this;
 
-  fEventReconstructor = new AliMUONEventReconstructor(*MUONTrack.fEventReconstructor);
-  fTrackParamAtVertex = MUONTrack.fTrackParamAtVertex;
-  fTrackHitsPtr =  new TObjArray(*MUONTrack.fTrackHitsPtr);
-  fNTrackHits =  MUONTrack.fNTrackHits;
-  fFitMCS     =  MUONTrack.fFitMCS;
-  fFitNParam  =  MUONTrack.fFitNParam;
-  fFitFMin    =  MUONTrack.fFitFMin;
-  fFitStart   =  MUONTrack.fFitStart;
+  fEventReconstructor =  new AliMUONEventReconstructor(*MUONTrack.fEventReconstructor); // is it right ?
+  fTrackParamAtVertex =  MUONTrack.fTrackParamAtVertex;
+  fTrackHitsPtr       =  new TObjArray(*MUONTrack.fTrackHitsPtr); // is it right ?
+  fTrackParamAtHit    =  new TClonesArray(*MUONTrack.fTrackParamAtHit);
+  fNTrackHits         =  MUONTrack.fNTrackHits;
+  fFitMCS             =  MUONTrack.fFitMCS;
+  fFitNParam          =  MUONTrack.fFitNParam;
+  fFitFMin            =  MUONTrack.fFitFMin;
+  fFitStart           =  MUONTrack.fFitStart;
+  fMatchTrigger       =  MUONTrack.fMatchTrigger;
+  fChi2MatchTrigger   =  MUONTrack.fChi2MatchTrigger;
   return *this;
 }
 
@@ -261,6 +291,47 @@ Int_t AliMUONTrack::HitsInCommon(AliMUONTrack* Track)
 }
 
   //__________________________________________________________________________
+void AliMUONTrack::MatchTriggerTrack(TClonesArray *triggerTrackArray)
+{
+  // Match this track with one trigger track if possible
+  AliMUONTrackParam *trackParam; 
+  AliMUONTriggerTrack *triggerTrack;
+  Double_t xTrack, yTrack, ySlopeTrack, dTrigTrackMin2, dTrigTrack2;
+  Double_t nSigmaCut2;
+
+  Double_t distSigma[3]={1,1,0.02}; // sigma of distributions (trigger-track) X,Y,slopeY
+  Double_t distTriggerTrack[3] = {0,0,0};
+
+  fMatchTrigger = kFALSE;
+  fChi2MatchTrigger = 0;
+
+  trackParam = (AliMUONTrackParam*) fTrackParamAtHit->Last(); 
+  trackParam->ExtrapToZ(AliMUONConstants::DefaultChamberZ(10)); // extrap to 1st trigger chamber
+
+  nSigmaCut2 =  fEventReconstructor->GetMaxSigma2Distance(); // nb of sigma**2 for cut
+  xTrack = trackParam->GetNonBendingCoor();
+  yTrack = trackParam->GetBendingCoor();
+  ySlopeTrack = trackParam->GetBendingSlope();
+  dTrigTrackMin2 = 999;
+  
+  triggerTrack = (AliMUONTriggerTrack*) triggerTrackArray->First();
+  while(triggerTrack){
+    distTriggerTrack[0] = (triggerTrack->GetX11()-xTrack)/distSigma[0];
+    distTriggerTrack[1] = (triggerTrack->GetY11()-yTrack)/distSigma[1];
+    distTriggerTrack[2] = (TMath::Tan(triggerTrack->GetThetay())-ySlopeTrack)/distSigma[2];
+    dTrigTrack2 = 0;
+    for (Int_t iVar = 0; iVar < 3; iVar++)
+      dTrigTrack2 += distTriggerTrack[iVar]*distTriggerTrack[iVar];
+    if (dTrigTrack2 < dTrigTrackMin2 && dTrigTrack2 < nSigmaCut2) {
+      dTrigTrackMin2 = dTrigTrack2;
+      fMatchTrigger = kTRUE;
+      fChi2MatchTrigger =  dTrigTrack2/3.; // Normalized Chi2, 3 variables (X,Y,slopeY)
+    }
+    triggerTrack = (AliMUONTriggerTrack*) triggerTrackArray->After(triggerTrack);
+  }
+
+}
+  //__________________________________________________________________________
 void AliMUONTrack::Fit()
 {
   // Fit the current track ("this"),
index 01eb117..bf552d5 100644 (file)
 
 #include "AliMUONTrackParam.h" // object belongs to the class
 
+const Int_t kMaxTrackingChamber=10;
+
 class TObjArray;
+class TClonesArray;
 class TVirtualFitter;
 class AliMUONEventReconstructor;
 class AliMUONHitForRec;
@@ -19,12 +22,7 @@ class AliMUONSegment;
 
 class AliMUONTrack : public TObject {
  public:
-  AliMUONTrack(){
-    // Constructor
-    fgFitter = 0;
-    fEventReconstructor = 0;
-    fTrackHitsPtr = 0;
-  } // Constructor
+  AliMUONTrack(); // Default constructor
   virtual ~AliMUONTrack(); // Destructor
   AliMUONTrack (const AliMUONTrack& AliMUONTrack); // copy constructor
   AliMUONTrack& operator=(const AliMUONTrack& AliMUONTrack); // assignment operator
@@ -37,6 +35,9 @@ class AliMUONTrack : public TObject {
   AliMUONTrackParam* GetTrackParamAtVertex(void) {return &fTrackParamAtVertex;}
   void SetTrackParamAtVertex(void); // Set track parameters at vertex from last stations 4 & 5
   void SetTrackParamAtVertex(AliMUONTrackParam* TrackParam) {fTrackParamAtVertex = *TrackParam;}
+  TClonesArray *GetTrackParamAtHit(void) const {return fTrackParamAtHit;}
+  void AddTrackParamAtHit(const AliMUONTrackParam *trackParam) 
+    {new ((*fTrackParamAtHit)[fTrackParamAtHit->GetEntriesFast()]) AliMUONTrackParam(*trackParam);}
 
   TObjArray* GetTrackHitsPtr(void) const {return fTrackHitsPtr;}
   Int_t GetNTrackHits(void) const {return fNTrackHits;}
@@ -44,6 +45,8 @@ class AliMUONTrack : public TObject {
   Int_t GetFitNParam(void) const {return fFitNParam;}
   Int_t GetFitStart(void) const {return fFitStart;}
   Double_t GetFitFMin(void) const {return fFitFMin;}
+  Bool_t GetMatchTrigger(void) const {return fMatchTrigger;}
+  Double_t GetChi2MatchTrigger(void) const {return fChi2MatchTrigger;}
   void SetFitMCS(Int_t FitMCS);
   void SetFitNParam(Int_t FitNParam);
   void SetFitStart(Int_t FitStart);
@@ -56,6 +59,7 @@ class AliMUONTrack : public TObject {
   void AddHitForRec(AliMUONHitForRec* HitForRec); // Add HitForRec
   void SetTrackParamAtHit(Int_t indexHit, AliMUONTrackParam *TrackParam) const;
   Int_t HitsInCommon(AliMUONTrack* Track);
+  void MatchTriggerTrack(TClonesArray* TriggerTrackArray);
 
   static TVirtualFitter* Fitter(void) {return fgFitter;}
 
@@ -64,13 +68,16 @@ class AliMUONTrack : public TObject {
   static TVirtualFitter* fgFitter; //!                  Pointer to track fitter
   AliMUONEventReconstructor* fEventReconstructor; //!   Pointer to EventReconstructor
   AliMUONTrackParam fTrackParamAtVertex; // Track parameters at vertex
+  TClonesArray *fTrackParamAtHit; // Track parameters at hit
   TObjArray *fTrackHitsPtr; //!  Pointer to array of pointers to TrackHit's
   Int_t fNTrackHits; // Number of TrackHit's
   Int_t fFitMCS; // 0(1) for fit without(with) multiple Coulomb scattering
   Int_t fFitNParam; // 3(5) for fit with 3(5) parameters
   Int_t fFitStart; // 0 or 1 for fit starting from parameters at vertex (0) or at first TrackHit(1)
   Double_t fFitFMin; // minimum value of the function minimized by the fit
-  
+  Bool_t fMatchTrigger; // 1 if track matches with trigger track, 0 if not
+  Double_t fChi2MatchTrigger; // chi2 of trigger/track matching 
   ClassDef(AliMUONTrack, 2) // Reconstructed track in ALICE dimuon spectrometer
     };
        
index 1e027ce..ba61923 100644 (file)
 class AliMUONTrackParam : public TObject {
  public:
   AliMUONTrackParam(){
+    fInverseBendingMomentum = 0;
+    fBendingSlope = 0;
+    fNonBendingSlope = 0;
+    fZ = 0;
+    fBendingCoor = 0;
+    fNonBendingCoor = 0;
     // Constructor
-    ;} // Constructor
-  virtual ~AliMUONTrackParam(){
-    // Destructor
-    ;} // Destructor
+  } // Constructor
+  virtual ~AliMUONTrackParam(){} // Destructor
   
   AliMUONTrackParam(const AliMUONTrackParam& );// copy constructor (should be added per default !)
   AliMUONTrackParam& operator=(const  AliMUONTrackParam& );// (should be added per default !)