]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONRecoCheck.cxx
Added protection and 2 levels for problems
[u/mrichter/AliRoot.git] / MUON / AliMUONRecoCheck.cxx
index a68e5b65afb59dc08e97d8a102d5ea8ff60012fb..1aaa80214b544b75eb5795bbbfd893d8e97918d4 100644 (file)
@@ -16,7 +16,7 @@
 /* $Id$ */
 
 /// \class AliMUONRecoCheck
-/// \brief Utility class to check reconstruction
+/// Utility class to check reconstruction
 /// Reconstructed tracks are compared to reference tracks. 
 /// The reference tracks are built from AliTrackReference for the
 /// hit in chamber (0..9) and from kinematics for the vertex parameters.     
 #include "AliMUON.h"
 #include "AliMUONRecoCheck.h"
 #include "AliMUONTrack.h"
-#include "AliMUONData.h"
+#include "AliMUONRecData.h"
 #include "AliMUONConstants.h"
 
-#include "AliRun.h" // for gAlice
 #include "AliLoader.h" 
 #include "AliRunLoader.h" 
 #include "AliHeader.h"
 #include "AliLog.h" 
 
 #include <TParticle.h>
+#include <TParticlePDG.h>
 
 /// \cond CLASSIMP
 ClassImp(AliMUONRecoCheck)
 /// \endcond
 
 //_____________________________________________________________________________
-  AliMUONRecoCheck::AliMUONRecoCheck(Char_t *chLoader)
+  AliMUONRecoCheck::AliMUONRecoCheck(Char_t *chLoader, Char_t *chLoaderSim)
   : TObject(),
   fRunLoader(0x0),
   fMUONData(0x0),
+  fRunLoaderSim(0x0),
+  fMUONDataSim(0x0),
   fMuonTrackRef(0x0),
   fTrackReco(0x0),
   fReconstructibleTracks(0),
-  fRecoTracks(0)
+  fRecoTracks(0),
+  fIsLoadConstructor(kTRUE)
 {
-/// Constructor
+/// Constructor using "galice.root",
+/// takes care of loading/unloading Kinematics, TrackRefs and Tracks
 
   fMuonTrackRef = new TClonesArray("AliMUONTrack", 10);
 
-  // open the run loader
-  fRunLoader = AliRunLoader::Open(chLoader);
+  // run loader
+  fRunLoader = AliRunLoader::Open(chLoader,"MUONFolder","READ");
   if (!fRunLoader) {
-    AliError(Form("no run loader found in file %s","galice.root" ));
+    AliError(Form("no run loader found " ));
     return;
   }
-  // initialize loader's
+
+ // initialize loader   
   AliLoader *loader = fRunLoader->GetLoader("MUONLoader");
 
-  // initialize container
-  fMUONData  = new AliMUONData(loader,"MUON","MUON");
+  // container
+  fMUONData  = new AliMUONRecData(loader,"MUON","MUON");
+  if (!fMUONData) {
+    AliError(Form("no MUONData found " ));
+    return;
+  }
+
+  // run loader
+  fRunLoaderSim = AliRunLoader::Open(chLoaderSim,"MUONFolderSim","READ");
+  if (!fRunLoaderSim) {
+    AliError(Form("no run sim loader found " ));
+    return;
+  }
+
+ // initialize loader   
+  AliLoader *loaderSim = fRunLoaderSim->GetLoader("MUONLoader");
 
-   // Loading AliRun master
-  if (fRunLoader->GetAliRun() == 0x0) fRunLoader->LoadgAlice();
+  // container
+  fMUONDataSim  = new AliMUONSimData(loaderSim,"MUON","MUON");
+  if (!fMUONDataSim) {
+    AliError(Form("no MUONDataSim found " ));
+    return;
+  }
 
-  fRunLoader->LoadKinematics("READ");
-  fRunLoader->LoadTrackRefs("READ");
+  fRunLoaderSim->LoadKinematics("READ");        
+  fRunLoader->LoadTrackRefs("READ");    
   loader->LoadTracks("READ");
 
 }
 
+//_____________________________________________________________________________
+  AliMUONRecoCheck::AliMUONRecoCheck(AliRunLoader *runloader, AliMUONRecData *muondata,
+                                     AliRunLoader *runloaderSim, AliMUONSimData *muondataSim)
+  : TObject(),
+  fRunLoader(0x0),
+  fMUONData(0x0),
+  fRunLoaderSim(0x0),
+  fMUONDataSim(0x0),
+  fMuonTrackRef(0x0),
+  fTrackReco(0x0),
+  fReconstructibleTracks(0),
+  fRecoTracks(0),
+  fIsLoadConstructor(kFALSE)
+{
+/// Constructor from AliRunLoader and AliMUONData,
+/// does not load/unload Kinematics, TrackRefs and Tracks internally
+/// it should be done in the execution program (e.g. see MUONRecoCheck.C)
+
+  fMuonTrackRef = new TClonesArray("AliMUONTrack", 10);
+
+  // run loader
+  fRunLoader = runloader;
+  if (!fRunLoader) {
+    AliError(Form("no run loader found " ));
+    return;
+  }
+
+  // container
+  fMUONData  = muondata;
+  if (!fMUONData) {
+    AliError(Form("no MUONData found " ));
+    return;
+  }
+
+  // run loader
+  fRunLoaderSim = runloaderSim;
+  if (!fRunLoaderSim) {
+    AliError(Form("no run sim loader found " ));
+    return;
+  }
+
+  // container
+  fMUONDataSim  = muondataSim;
+  if (!fMUONDataSim) {
+    AliError(Form("no MUONDataSim found " ));
+    return;
+  }
+
+}
+
+
 //_____________________________________________________________________________
 AliMUONRecoCheck::~AliMUONRecoCheck()
 {
 /// Destructor
-
-  fRunLoader->UnloadKinematics();
-  fRunLoader->UnloadTrackRefs();
-  fRunLoader->UnloadTracks();
-  fMuonTrackRef->Delete();
   delete fMuonTrackRef;
-  delete fMUONData;
+  if(fIsLoadConstructor){
+    fRunLoaderSim->UnloadKinematics();
+    fRunLoader->UnloadTrackRefs();
+    fRunLoader->UnloadTracks();
+    delete fMUONData;
+    delete fRunLoader;
+    delete fMUONDataSim;
+    delete fRunLoaderSim;
+  }
 }
 
 //_____________________________________________________________________________
@@ -123,9 +200,11 @@ void AliMUONRecoCheck::MakeTrackRef()
 
   trackParam = new AliMUONTrackParam();
   hitForRec = new AliMUONHitForRec();
-  muonTrack = new AliMUONTrack();
 
-  Int_t max = fRunLoader->GetHeader()->Stack()->GetNtrack();
+  Int_t charge;
+  TParticlePDG *ppdg;
+
+  Int_t max = fRunLoaderSim->GetHeader()->Stack()->GetNtrack();
   for (Int_t iTrackRef  = 0; iTrackRef < nTrackRef; iTrackRef++) {
 
     branch->GetEntry(iTrackRef);
@@ -136,6 +215,9 @@ void AliMUONRecoCheck::MakeTrackRef()
     if (!trackRefs->GetEntries()) continue; 
 
     while (isNewTrack) {
+
+      muonTrack = new AliMUONTrack();
+      
       for (Int_t iHit = iHitMin; iHit < trackRefs->GetEntries(); iHit++) {
       
        trackReference = (AliTrackReference*)trackRefs->At(iHit);
@@ -187,7 +269,7 @@ void AliMUONRecoCheck::MakeTrackRef()
        else iChamber = AliMUONConstants::ChamberNumber(z);
        hitForRec->SetChamberNumber(iChamber);
 
-       muonTrack->AddTrackParamAtHit(trackParam);
+       muonTrack->AddTrackParamAtHit(trackParam,0);
        muonTrack->AddHitForRecAtHit(hitForRec);
        muonTrack->SetTrackID(track);
 
@@ -196,7 +278,7 @@ void AliMUONRecoCheck::MakeTrackRef()
       }
 
       // track parameters at vertex 
-      particle = fRunLoader->GetHeader()->Stack()->Particle(muonTrack->GetTrackID());
+      particle = fRunLoaderSim->GetHeader()->Stack()->Particle(muonTrack->GetTrackID());
 
       if (particle) {
 
@@ -214,8 +296,14 @@ void AliMUONRecoCheck::MakeTrackRef()
          bendingSlope = pY/pZ;
          nonBendingSlope = pX/pZ;
        }
+
        pYZ = TMath::Sqrt(pY*pY+pZ*pZ);
        if (pYZ >0) inverseBendingMomentum = 1/pYZ;       
+
+       ppdg = particle->GetPDG(1);
+       charge = (Int_t)(ppdg->Charge()/3.0);
+       inverseBendingMomentum *= charge;
+
        trackParam->SetBendingSlope(bendingSlope);
        trackParam->SetNonBendingSlope(nonBendingSlope);
        trackParam->SetInverseBendingMomentum(inverseBendingMomentum);
@@ -224,17 +312,16 @@ void AliMUONRecoCheck::MakeTrackRef()
       }
 
       AddMuonTrackReference(muonTrack);
-      muonTrack->ResetTrackParamAtHit();
-      muonTrack->ResetHitForRecAtHit();
+      delete muonTrack;
+      muonTrack = NULL;
       
     } // end while isNewTrack
   }
-  
+  delete trackRefs;
   CleanMuonTrackRef();
   
   ReconstructibleTracks();
 
-  delete muonTrack;
   delete trackParam;
   delete hitForRec;
 
@@ -245,10 +332,10 @@ TClonesArray* AliMUONRecoCheck::GetTrackReco()
 {
 /// Return TClonesArray of reconstructed tracks
 
-  GetMUONData()->ResetRecTracks();
-  GetMUONData()->SetTreeAddress("RT");
-  fTrackReco = GetMUONData()->RecTracks(); 
-  GetMUONData()->GetRecTracks();
+  fMUONData->ResetRecTracks();
+  fMUONData->SetTreeAddress("RT");
+  fTrackReco = fMUONData->RecTracks(); 
+  fMUONData->GetRecTracks();
   fRecoTracks = fTrackReco->GetEntriesFast();
   return fTrackReco;
 }
@@ -287,7 +374,7 @@ void AliMUONRecoCheck::ResetTracks() const
 {
 /// Reset tracks
 
-  if (fMuonTrackRef) fMuonTrackRef->Clear();
+  if (fMuonTrackRef) fMuonTrackRef->Delete();
 }
 //_____________________________________________________________________________
 void AliMUONRecoCheck::CleanMuonTrackRef()
@@ -316,7 +403,6 @@ void AliMUONRecoCheck::CleanMuonTrackRef()
 
   hitForRec = new AliMUONHitForRec();
   trackParam = new AliMUONTrackParam();
-  trackNew = new AliMUONTrack();
 
   Int_t nTrackRef = fMuonTrackRef->GetEntriesFast();
   for (Int_t index = 0; index < nTrackRef; index++) {
@@ -325,6 +411,7 @@ void AliMUONRecoCheck::CleanMuonTrackRef()
     trackParamAtHit = track->GetTrackParamAtHit();
     trackParamAtVertex = track->GetTrackParamAtVertex();
     nTrackHits = hitForRecAtHit->GetEntriesFast();
+    trackNew = new AliMUONTrack();
     iHit1 = 0;
     while (iHit1 < nTrackHits) {
       hitForRec1 = (AliMUONHitForRec*) hitForRecAtHit->At(iHit1); 
@@ -394,28 +481,26 @@ void AliMUONRecoCheck::CleanMuonTrackRef()
        trackParam->SetInverseBendingMomentum(1./bendingMomentum);
 
       trackNew->AddHitForRecAtHit(hitForRec);
-      trackNew->AddTrackParamAtHit(trackParam);
+      trackNew->AddTrackParamAtHit(trackParam,0);
       
       iHit1++;
     } // end iHit1
 
     trackNew->SetTrackID(track->GetTrackID());
     trackNew->SetTrackParamAtVertex(trackParamAtVertex);
-    {new ((*newMuonTrackRef)[newMuonTrackRef->GetEntriesFast()]) AliMUONTrack(*trackNew);}    
-    trackNew->ResetHitForRecAtHit();
-    trackNew->ResetTrackParamAtHit();
+    {new ((*newMuonTrackRef)[newMuonTrackRef->GetEntriesFast()]) AliMUONTrack(*trackNew);}   
+    delete trackNew;
+    trackNew = NULL;
     
   } // end trackRef
 
-  fMuonTrackRef->Clear();
+  fMuonTrackRef->Delete();
   nTrackRef = newMuonTrackRef->GetEntriesFast();
   for (Int_t index = 0; index < nTrackRef; index++) {
     track = (AliMUONTrack*)newMuonTrackRef->At(index);
     AddMuonTrackReference(track);
   }
   
-
-  delete trackNew;
   delete hitForRec;
   delete trackParam;
   newMuonTrackRef->Delete();