]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONRecoCheck.cxx
RAW QA only for calibration events
[u/mrichter/AliRoot.git] / MUON / AliMUONRecoCheck.cxx
index 144d0769280a9f795fa56cbca853bdc216bc0ac6..5a83d2e54e687711da3c90390206a1f5a89eba7b 100644 (file)
 // ESD data. This is necessary since the track objects that are actually created
 // during offline reconstruction are no longer stored to disk.
 //  - Artur Szostak <artursz@iafrica.com>
+// 25 Jan 2008:
+// Use the new ESDInterface to create MUON objects from ESD data
+// - Philippe Pillot
+// 
 
 #include "AliMUONRecoCheck.h"
-#include "AliMUONRawClusterV2.h"
 #include "AliMUONTrack.h"
+#include "AliMUONVTrackStore.h"
+#include "AliMUONVCluster.h"
+#include "AliMUONVClusterStore.h"
 #include "AliMUONConstants.h"
-#include "AliMUONTrackStoreV1.h"
-
+#include "AliMUONESDInterface.h"
+#include "AliMUONTrackParam.h"
 #include "AliMCEventHandler.h"
 #include "AliMCEvent.h"
 #include "AliStack.h"
@@ -54,7 +60,7 @@ ClassImp(AliMUONRecoCheck)
 /// \endcond
 
 //_____________________________________________________________________________
-AliMUONRecoCheck::AliMUONRecoCheck(Char_t *esdFileName, Char_t *pathSim)
+AliMUONRecoCheck::AliMUONRecoCheck(const Char_t *esdFileName, const Char_t *pathSim)
 : TObject(),
 fMCEventHandler(new AliMCEventHandler()),
 fESDEvent(new AliESDEvent()),
@@ -63,7 +69,8 @@ fESDFile (0x0),
 fCurrentEvent(0),
 fTrackRefStore(0x0),
 fRecoTrackRefStore(0x0),
-fRecoTrackStore(0x0)
+fRecoTrackStore(0x0),
+fESDEventOwner(kTRUE)
 {
   /// Normal ctor
   
@@ -88,13 +95,38 @@ fRecoTrackStore(0x0)
   fESDEvent->ReadFromTree(fESDTree); // link fESDEvent to the tree
 }
 
+//_____________________________________________________________________________
+AliMUONRecoCheck::AliMUONRecoCheck(AliESDEvent *esdEvent, AliMCEventHandler *mcEventHandler)
+: TObject(),
+fMCEventHandler(0),
+fESDEvent(0),
+fESDTree (0x0),
+fESDFile (0x0),
+fCurrentEvent(0),
+fTrackRefStore(0x0),
+fRecoTrackRefStore(0x0),
+fRecoTrackStore(0x0),
+fESDEventOwner(kFALSE)
+{
+  /// Normal ctor
+  
+  // TrackRefs and Particules
+  fMCEventHandler = mcEventHandler;
+  
+  // ESD MUON Tracks
+  fESDEvent = esdEvent;
+  
+}
+
 //_____________________________________________________________________________
 AliMUONRecoCheck::~AliMUONRecoCheck()
 {
   /// Destructor
-  delete fMCEventHandler;
-  delete fESDEvent;
-  if (fESDFile) fESDFile->Close();
+  if (fESDEventOwner) {
+    delete fMCEventHandler;
+    delete fESDEvent;
+    if (fESDFile) fESDFile->Close();
+  }
   ResetStores();
 }
 
@@ -111,7 +143,7 @@ void AliMUONRecoCheck::ResetStores()
 Int_t AliMUONRecoCheck::NumberOfEvents() const
 {
   /// Return the number of events
-  if (fESDTree) return fESDTree->GetEntries();
+  if (fESDEventOwner && fESDTree) return fESDTree->GetEntries();
   return 0;
 }
 
@@ -120,6 +152,12 @@ AliMUONVTrackStore* AliMUONRecoCheck::ReconstructedTracks(Int_t event)
 {
   /// Return a track store containing the reconstructed tracks (converted into 
   /// MUONTrack objects) for a given event
+  
+  if (!fESDEventOwner) {
+    MakeReconstructedTracks();
+    return fRecoTrackStore;
+  }
+
   if (event != fCurrentEvent) {
     ResetStores();
     fCurrentEvent = event;
@@ -142,6 +180,12 @@ AliMUONVTrackStore* AliMUONRecoCheck::TrackRefs(Int_t event)
 {
   /// Return a track store containing the track references (converted into 
   /// MUONTrack objects) for a given event
+  
+  if (!fESDEventOwner) {
+    MakeTrackRefs();
+    return fTrackRefStore;
+  }
+
   if (event != fCurrentEvent) {
     ResetStores();
     fCurrentEvent = event;
@@ -162,6 +206,13 @@ AliMUONVTrackStore* AliMUONRecoCheck::TrackRefs(Int_t event)
 AliMUONVTrackStore* AliMUONRecoCheck::ReconstructibleTracks(Int_t event)
 {
   /// Return a track store containing the reconstructible tracks for a given event
+
+  if (!fESDEventOwner) {
+    if (TrackRefs(event) == 0x0) return 0x0;
+    MakeReconstructibleTracks();
+    return fRecoTrackRefStore;
+  }
+
   if (event != fCurrentEvent) {
     ResetStores();
     fCurrentEvent = event;
@@ -179,19 +230,13 @@ AliMUONVTrackStore* AliMUONRecoCheck::ReconstructibleTracks(Int_t event)
 void AliMUONRecoCheck::MakeReconstructedTracks()
 {
   /// Make reconstructed tracks
-  fRecoTrackStore = new AliMUONTrackStoreV1();
-  
-  Int_t nTracks = Int_t(fESDEvent->GetNumberOfMuonTracks());
+  if (!(fRecoTrackStore = AliMUONESDInterface::NewTrackStore())) return;
   
-  // loop over all reconstructed tracks
+  // loop over all reconstructed tracks and add them to the store (skip ghosts)
+  Int_t nTracks = (Int_t) fESDEvent->GetNumberOfMuonTracks();
   for (Int_t iTrack = 0; iTrack < nTracks; iTrack++) {
     AliESDMuonTrack* esdTrack = fESDEvent->GetMuonTrack(iTrack);
-    
-    // copy ESD MUON track into standard MUON track
-    AliMUONTrack track(*esdTrack);
-    
-    // add track to the store
-    fRecoTrackStore->Add(track);
+    if (esdTrack->ContainTrackerData()) AliMUONESDInterface::Add(*esdTrack, *fRecoTrackStore);
   }
   
 }
@@ -200,12 +245,16 @@ void AliMUONRecoCheck::MakeReconstructedTracks()
 void AliMUONRecoCheck::MakeTrackRefs()
 {
   /// Make reconstructible tracks
-  AliMUONVTrackStore *tmpTrackRefStore = new AliMUONTrackStoreV1();
+  AliMUONVTrackStore *tmpTrackRefStore = AliMUONESDInterface::NewTrackStore();
+  if (!tmpTrackRefStore) return;
   
   Double_t x, y, z, pX, pY, pZ, bendingSlope, nonBendingSlope, inverseBendingMomentum;
   TParticle* particle;
   TClonesArray* trackRefs;
   Int_t nTrackRef = fMCEventHandler->MCEvent()->GetNumberOfTracks();
+  AliMUONVClusterStore* cStore = AliMUONESDInterface::NewClusterStore();
+  if (!cStore) return;
+  AliMUONVCluster* hit = cStore->CreateCluster(0,0,0);
   
   // loop over simulated tracks
   for (Int_t iTrackRef  = 0; iTrackRef < nTrackRef; ++iTrackRef) {
@@ -216,7 +265,7 @@ void AliMUONRecoCheck::MakeTrackRefs()
     
     // get the particle charge for further calculation
     TParticlePDG* ppdg = particle->GetPDG();
-    Int_t charge = (Int_t)(ppdg->Charge()/3.0);
+    Int_t charge = ppdg != NULL ? (Int_t)(ppdg->Charge()/3.0) : 0;
     
     AliMUONTrack track;
     
@@ -236,18 +285,19 @@ void AliMUONRecoCheck::MakeTrackRefs()
       pZ = trackReference->Pz();
       
       // check chamberId of current trackReference
-      Int_t chamberId = AliMUONConstants::ChamberNumber(z);
+      Int_t detElemId = trackReference->UserId();
+      Int_t chamberId = detElemId / 100 - 1;
       if (chamberId < 0 || chamberId >= AliMUONConstants::NTrackingCh()) continue;
       
       // set hit parameters
-      AliMUONRawClusterV2 hit(chamberId, 0, 0);
-      hit.SetXYZ(x,y,z);
-      hit.SetErrXY(0.,0.);
+      hit->SetUniqueID(AliMUONVCluster::BuildUniqueID(chamberId, detElemId, iHit));
+      hit->SetXYZ(x,y,z);
+      hit->SetErrXY(0.,0.);
       
       // compute track parameters at hit
-      Double_t bendingSlope = 0;
-      Double_t nonBendingSlope = 0;
-      Double_t inverseBendingMomentum = 0;
+      bendingSlope = 0;
+      nonBendingSlope = 0;
+      inverseBendingMomentum = 0;
       if (TMath::Abs(pZ) > 0) {
        bendingSlope = pY/pZ;
        nonBendingSlope = pX/pZ;
@@ -266,7 +316,7 @@ void AliMUONRecoCheck::MakeTrackRefs()
       trackParam.SetInverseBendingMomentum(inverseBendingMomentum);
       
       // add track parameters at current hit to the track
-      track.AddTrackParamAtCluster(trackParam,hit,kTRUE);
+      track.AddTrackParamAtCluster(trackParam, *hit, kTRUE);
     }
     
     // if none of the track hits was in MUON, goto the next track
@@ -304,14 +354,15 @@ void AliMUONRecoCheck::MakeTrackRefs()
     // add track parameters at vertex
     track.SetTrackParamAtVertex(&trackParamAtVertex);
     
-    // sort trackParamAtCluster and store the track
-    track.GetTrackParamAtCluster()->Sort();
-    track.SetTrackID(iTrackRef);
+    // store the track
+    track.SetUniqueID(iTrackRef);
     tmpTrackRefStore->Add(track);
   }
   
   CleanMuonTrackRef(tmpTrackRefStore);
   
+  delete hit;
+  delete cStore;
   delete tmpTrackRefStore;
 }
 
@@ -321,11 +372,14 @@ void AliMUONRecoCheck::CleanMuonTrackRef(const AliMUONVTrackStore *tmpTrackRefSt
   /// Re-calculate hits parameters because two AliTrackReferences are recorded for
   /// each chamber (one when particle is entering + one when particle is leaving 
   /// the sensitive volume) 
-  fTrackRefStore = new AliMUONTrackStoreV1();
+  if (!(fTrackRefStore = AliMUONESDInterface::NewTrackStore())) return;
   
   Double_t maxGasGap = 1.; // cm 
   Double_t x, y, z, pX, pY, pZ, x1, y1, z1, pX1, pY1, pZ1, z2;
   Double_t bendingSlope,nonBendingSlope,inverseBendingMomentum;
+  AliMUONVClusterStore* cStore = AliMUONESDInterface::NewClusterStore();
+  if (!cStore) return;
+  AliMUONVCluster* hit = cStore->CreateCluster(0,0,0);
   
   // create iterator
   TIter next(tmpTrackRefStore->CreateIterator());
@@ -399,9 +453,9 @@ void AliMUONRecoCheck::CleanMuonTrackRef(const AliMUONVTrackStore *tmpTrackRefSt
       inverseBendingMomentum *= trackParam1->GetCharge();
       
       // set hit parameters
-      AliMUONRawClusterV2 hit(trackParam1->GetClusterPtr()->GetChamberId(), 0, 0);
-      hit.SetXYZ(x,y,z);
-      hit.SetErrXY(0.,0.);
+      hit->SetUniqueID(trackParam1->GetClusterPtr()->GetUniqueID());
+      hit->SetXYZ(x,y,z);
+      hit->SetErrXY(0.,0.);
       
       // set new track parameters at new hit
       AliMUONTrackParam trackParam;
@@ -413,25 +467,26 @@ void AliMUONRecoCheck::CleanMuonTrackRef(const AliMUONVTrackStore *tmpTrackRefSt
       trackParam.SetInverseBendingMomentum(inverseBendingMomentum);
       
       // add track parameters at current hit to the track
-      newTrack.AddTrackParamAtCluster(trackParam,hit,kTRUE);
+      newTrack.AddTrackParamAtCluster(trackParam, *hit, kTRUE);
       
       iHit1++;
     }
     
-    newTrack.GetTrackParamAtCluster()->Sort();
-    newTrack.SetTrackID(track->GetTrackID());
+    newTrack.SetUniqueID(track->GetUniqueID());
     newTrack.SetTrackParamAtVertex(track->GetTrackParamAtVertex());
     fTrackRefStore->Add(newTrack);
     
   }
   
+  delete hit;
+  delete cStore;
 }
 
 //_____________________________________________________________________________
 void AliMUONRecoCheck::MakeReconstructibleTracks()
 {
   /// Isolate the reconstructible tracks
-  fRecoTrackRefStore = new AliMUONTrackStoreV1();
+  if (!(fRecoTrackRefStore = AliMUONESDInterface::NewTrackStore())) return;
   
   // create iterator on trackRef
   TIter next(fTrackRefStore->CreateIterator());