Fixes for #86279 Improper usage of TClonesArrays in MUON
authorhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 11 Oct 2011 07:41:51 +0000 (07:41 +0000)
committerhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 11 Oct 2011 07:41:51 +0000 (07:41 +0000)
MUON/AliMUONReconstructor.cxx
MUON/AliMUONReconstructor.h
MUON/AliMUONTracker.cxx
MUON/AliMUONTracker.h
STEER/STEER/AliReconstruction.cxx

index 7bdd6c1..09a1233 100644 (file)
@@ -134,12 +134,13 @@ fDigitStore(0x0),
 fTriggerCircuit(0x0),
 fCalibrationData(0x0),
 fDigitCalibrator(0x0),
-fClusterServer(0x0),
 fTriggerStore(0x0),
 fTrackStore(0x0),
 fClusterStore(0x0),
 fTriggerProcessor(0x0),
-fTriggerUtilities(0x0)
+fTriggerUtilities(0x0),
+fClusterServers(),
+fTrackers()
 {
   /// normal ctor
 
@@ -165,7 +166,9 @@ fTriggerUtilities(0x0)
   
   // Load geometry data
   fTransformer->LoadGeometryData();
-  
+  fClusterServers.SetOwner(kTRUE);
+  fTrackers.SetOwner(kTRUE);
 }
 
 //_____________________________________________________________________________
@@ -190,7 +193,7 @@ AliMUONReconstructor::~AliMUONReconstructor()
   delete AliMpSegmentation::Instance(false);
   delete AliMpDDLStore::Instance(false);  
 
-  delete fCalibrationData;
+  delete fCalibrationData;  
 }
 
 //_____________________________________________________________________________
@@ -330,27 +333,44 @@ AliMUONReconstructor::CreateTracker() const
   
   CreateTriggerCircuit();
   CreateTriggerUtilities();
-  CreateClusterServer();
-
-  AliMUONTracker* tracker(0x0);
   
-  if ( ! GetRecoParam()->CombineClusterTrackReco() )
-  {
-    tracker = new AliMUONTracker(GetRecoParam(),
-                                0x0,
-                                 *DigitStore(),
-                                 fTransformer,
-                                 fTriggerCircuit,
-                                 fTriggerUtilities);
-  }
-  else
+  const AliMUONRecoParam* rp = GetRecoParam();
+  
+  Int_t es = rp->GetEventSpecie();
+  
+  AliTracker* tracker = static_cast<AliTracker*>(fTrackers.At(es));
+  
+  if (!tracker ) 
   {
-    tracker = new AliMUONTracker(GetRecoParam(),
-                                fClusterServer,
-                                 *DigitStore(),
-                                 fTransformer,
-                                 fTriggerCircuit,
-                                 fTriggerUtilities);
+    if ( ! rp->CombineClusterTrackReco() )
+    {
+      tracker = new AliMUONTracker(rp,
+                                   0x0,
+                                   *DigitStore(),
+                                   fTransformer,
+                                   fTriggerCircuit,
+                                   fTriggerUtilities);
+
+      AliInfo(Form("Created tracker %p for recoparam of type %s es=%d",
+                   tracker,
+                   AliRecoParam::GetEventSpecieName(AliRecoParam::Convert(rp->GetEventSpecie())),es));
+    }
+    else
+    {
+      
+      tracker = new AliMUONTracker(rp,
+                                   CreateClusterServer(*rp),
+                                   *DigitStore(),
+                                   fTransformer,
+                                   fTriggerCircuit,
+                                   fTriggerUtilities);
+
+      AliInfo(Form("Created (combined) tracker %p for recoparam of type %s es=%d",
+                   tracker,
+                   AliRecoParam::GetEventSpecieName(AliRecoParam::Convert(rp->GetEventSpecie())),es));      
+    }
+    
+    fTrackers.AddAtAndExpand(tracker,es);
   }
   
   
@@ -428,22 +448,30 @@ AliMUONReconstructor::CreateClusterFinder(const char* clusterFinderType)
 }
 
 //_____________________________________________________________________________
-void
-AliMUONReconstructor::CreateClusterServer() const
+AliMUONVClusterServer*
+AliMUONReconstructor::CreateClusterServer(const AliMUONRecoParam& rp) const
 {
   /// Create cluster server
   
-  if ( fClusterServer ) return;
-  
   AliCodeTimerAuto("",0);
-    
-  AliMUONVClusterFinder* clusterFinder = CreateClusterFinder(GetRecoParam()->GetClusteringMode());
   
-  if ( !clusterFinder ) return;
+  AliMUONVClusterServer* clusterServer = static_cast<AliMUONVClusterServer*>(fClusterServers.At(rp.GetEventSpecie()));
   
-  AliInfo(Form("Will use %s for clusterizing",clusterFinder->ClassName()));
+  if (!clusterServer )
+  {
+    AliMUONVClusterFinder* clusterFinder = CreateClusterFinder(rp.GetClusteringMode());
+    
+    if ( !clusterFinder ) return 0x0;
+    
+    clusterServer = new AliMUONSimpleClusterServer(clusterFinder,*fTransformer);
+
+    AliInfo(Form("Created AliMUONSimpleClusterServer (%p) for specie %d with clustering = %s",
+                 clusterServer,rp.GetEventSpecie(),clusterFinder->ClassName()));
+    
+    fClusterServers.AddAtAndExpand(clusterServer,rp.GetEventSpecie());
+  }
   
-  fClusterServer = new AliMUONSimpleClusterServer(clusterFinder,*fTransformer);
+  return clusterServer;
 }
 
 //_____________________________________________________________________________
@@ -598,7 +626,9 @@ AliMUONReconstructor::FillTreeR(AliMUONVTriggerStore* triggerStore,
   Bool_t ok(kFALSE);
   Bool_t alone(kTRUE); // is trigger the only info in TreeR ?
   
-  if ( ! GetRecoParam()->CombineClusterTrackReco() )
+   const AliMUONRecoParam* rp = GetRecoParam();
+  
+  if ( ! rp->CombineClusterTrackReco() )
   {
     alone = kFALSE; // we'll get both tracker and trigger information in TreeR
   }
@@ -620,23 +650,23 @@ AliMUONReconstructor::FillTreeR(AliMUONVTriggerStore* triggerStore,
       fClusterStore = new AliMUONClusterStoreV2;
     }
     
-    CreateClusterServer();
+    AliMUONVClusterServer* clusterServer = CreateClusterServer(*rp);
     
     TIter next(DigitStore()->CreateIterator());
-    fClusterServer->UseDigits(next,DigitStore());
+    clusterServer->UseDigits(next,DigitStore());
 
     AliMpArea area;
     
-    AliDebug(1,Form("Doing full clusterization in local reconstruction using %s ",fClusterServer->ClassName()));
+    AliDebug(1,Form("Doing full clusterization in local reconstruction using %s ",clusterServer->ClassName()));
     
     for ( Int_t i = 0; i < AliMpConstants::NofTrackingChambers(); ++i ) 
     {
-      if (GetRecoParam()->UseChamber(i))
+      if (rp->UseChamber(i))
       {
-        if ( ( i == 6 || i == 7 )  && GetRecoParam()->BypassSt4() ) continue;
-        if ( ( i == 8 || i == 9 )  && GetRecoParam()->BypassSt5() ) continue;
+        if ( ( i == 6 || i == 7 )  && rp->BypassSt4() ) continue;
+        if ( ( i == 8 || i == 9 )  && rp->BypassSt5() ) continue;
         
-        fClusterServer->Clusterize(i,*fClusterStore,area,GetRecoParam());
+        clusterServer->Clusterize(i,*fClusterStore,area,rp);
       }
     }
     
@@ -658,6 +688,14 @@ AliMUONReconstructor::FillTreeR(AliMUONVTriggerStore* triggerStore,
 }
 
 //_____________________________________________________________________________
+const AliMUONRecoParam* AliMUONReconstructor::GetRecoParam()
+{ 
+  /// Get the recoparam from reconstruction
+  return dynamic_cast<const AliMUONRecoParam*>(AliReconstructor::GetRecoParam(AliReconstruction::GetDetIndex("MUON"))); 
+}
+
+
+//_____________________________________________________________________________
 Bool_t 
 AliMUONReconstructor::HasDigitConversion() const
 {
index dca7b4f..22d953d 100644 (file)
@@ -15,6 +15,9 @@
 #ifndef ALIRECONSTRUCTOR_H
 #  include "AliReconstructor.h"
 #endif
+#ifndef ROOT_TObjArray
+#define "TObjArray.h"
+#endif
 
 class AliMUONCalibrationData;
 class AliMUONDigitCalibrator;
@@ -51,7 +54,7 @@ public:
   virtual AliTracker* CreateTracker() const;
   
   /// Get param object
-  static const AliMUONRecoParam* GetRecoParam() { return dynamic_cast<const AliMUONRecoParam*>(AliReconstructor::GetRecoParam(7)); }
+  static const AliMUONRecoParam* GetRecoParam();
   
   static AliMUONVClusterFinder* CreateClusterFinder(const char* clusterFinderType);
 
@@ -70,7 +73,7 @@ private:
   void CreateDigitMaker() const;
   void CreateTriggerCircuit() const;
   void CreateTriggerUtilities() const;
-  void CreateClusterServer() const;
+  AliMUONVClusterServer* CreateClusterServer(const AliMUONRecoParam& rp) const;
   void FillTreeR(AliMUONVTriggerStore* triggerStore,
                  TTree& clustersTree) const;
   
@@ -86,14 +89,15 @@ private:
   mutable AliMUONTriggerCircuit* fTriggerCircuit; //!< Trigger Circuit
   mutable AliMUONCalibrationData* fCalibrationData; //!< Calibration data
   mutable AliMUONDigitCalibrator* fDigitCalibrator; //!<  Digit to calibrate digit converter
-  mutable AliMUONVClusterServer* fClusterServer; //!<  Clusterizer
   mutable AliMUONVTriggerStore* fTriggerStore; //!< Trigger container
   mutable AliMUONVTrackStore* fTrackStore; //!< Track container
   mutable AliMUONVClusterStore* fClusterStore; //!< cluster store (when not in combined tracking mode)
   mutable AliMUONTriggerElectronics* fTriggerProcessor; //!< Processor to recalculate trigger response
   mutable AliMUONTriggerUtilities* fTriggerUtilities; //!< Trigger utilities for masks
-  
-  ClassDef(AliMUONReconstructor,10) // Implementation of AliReconstructor
+  mutable TObjArray fClusterServers; //!<  Clusterizers (one per event specie)
+  mutable TObjArray fTrackers; //!< trackers (one per event specie)
+    
+  ClassDef(AliMUONReconstructor,11) // Implementation of AliReconstructor
 };
 
 #endif
index 5223dbc..462d4e3 100644 (file)
@@ -58,6 +58,7 @@
 #include <Riostream.h>
 #include <TRandom.h>
 #include <TTree.h>
+#include "AliLog.h"
 
 /// \cond CLASSIMP
 ClassImp(AliMUONTracker)
@@ -83,9 +84,11 @@ fIsOwnerOfClusterServer(kFALSE),
 fkDigitStore(digitStore), // not owner
 fInputClusterStore(0x0),
 fTriggerTrackStore(0x0),
-fkRecoParam(recoParam)
+fkRecoParam(recoParam),
+fInternalTrackStore(0x0)
 {
   /// constructor
+  
   if (fkTransformer)
     fTrackHitPatternMaker = new AliMUONTrackHitPattern(recoParam,*fkTransformer,fkDigitStore,triggerUtilities);
   
@@ -107,6 +110,7 @@ fkRecoParam(recoParam)
 AliMUONTracker::~AliMUONTracker()
 {
   /// dtor
+  
   delete fTrackReco;
   delete fTrackHitPatternMaker;
   delete fClusterStore;
@@ -114,6 +118,7 @@ AliMUONTracker::~AliMUONTracker()
   if ( fIsOwnerOfClusterServer ) delete fClusterServer;
   delete fInputClusterStore;
   delete fTriggerTrackStore;
+  delete fInternalTrackStore;
 }
 
 //_____________________________________________________________________________
@@ -145,16 +150,15 @@ Int_t AliMUONTracker::LoadClusters(TTree* clustersTree)
 {
   /// Load triggerStore from clustersTree
 
-  delete fTriggerStore;
-  delete fInputClusterStore;
-  fInputClusterStore=0x0;
-
   if ( ! clustersTree ) {
     AliFatal("No clustersTree");
     return 1;
   }
 
-  fTriggerStore = AliMUONVTriggerStore::Create(*clustersTree);
+  if ( !fTriggerStore ) 
+  {
+    fTriggerStore = AliMUONVTriggerStore::Create(*clustersTree);    
+  }
   
   if (!fTriggerStore)
   {
@@ -162,22 +166,32 @@ Int_t AliMUONTracker::LoadClusters(TTree* clustersTree)
     return 2;
   }
   
-  if ( fIsOwnerOfClusterServer )
+  if (!fInputClusterStore) 
   {
     fInputClusterStore = AliMUONVClusterStore::Create(*clustersTree);
-    if ( fInputClusterStore ) 
+    if (!fInputClusterStore)
     {
-      AliDebug(1,Form("Created %s from cluster tree",fInputClusterStore->ClassName()));
-      fInputClusterStore->Clear();
-      fInputClusterStore->Connect(*clustersTree,kFALSE);
+      AliError("Could not get clusterStore");
+      return 3;
     }
-    delete fClusterServer;
-    fClusterServer = new AliMUONLegacyClusterServer(*fkTransformer,fInputClusterStore,
-                                                                                                                                                                                                               GetRecoParam()->BypassSt4(),
-                                                                                                                                                                                                               GetRecoParam()->BypassSt5());
-    SetupClusterServer(*fClusterServer);
+    AliDebug(1,Form("Created %s from cluster tree",fInputClusterStore->ClassName()));
+  }
+    
+  if ( !fClusterServer && fIsOwnerOfClusterServer )
+  {
+    if ( !fClusterServer ) 
+    {
+      fClusterServer = new AliMUONLegacyClusterServer(*fkTransformer,fInputClusterStore,
+                                                      GetRecoParam()->BypassSt4(),
+                                                      GetRecoParam()->BypassSt5());
+      SetupClusterServer(*fClusterServer);
+    }
+
   }
   
+  fInputClusterStore->Clear();
+  fInputClusterStore->Connect(*clustersTree,kFALSE);
+  fTriggerStore->Clear();
   fTriggerStore->Connect(*clustersTree,kFALSE);
   
   clustersTree->GetEvent(0);
@@ -189,12 +203,21 @@ Int_t AliMUONTracker::LoadClusters(TTree* clustersTree)
 Int_t AliMUONTracker::Clusters2Tracks(AliESDEvent* esd)
 {
   /// Performs the tracking and store the resulting tracks in the ESD
-  AliDebug(1,"");
+  ///
+  /// note that we're dealing with two cluster stores here : fInputClusterStore
+  /// and ClusterStore().
+  /// The first one is read from the TreeR and may be used by the cluster server 
+  /// (that's the case for the legacy cluster server) to fill the other one.
+  /// The second one is more dynamic and might be created on the fly by the cluster
+  /// server (used by the combined tracking, in which case the first one is not used
+  /// at all).
+  
   AliCodeTimerAuto("",0)
   
   if (!fTrackReco) 
   {
     fTrackReco = CreateTrackReconstructor(GetRecoParam(),fClusterServer);
+    fInternalTrackStore = new AliMUONTrackStoreV1;
   }
   
   // if the required tracking mode does not exist
@@ -230,21 +253,19 @@ Int_t AliMUONTracker::Clusters2Tracks(AliESDEvent* esd)
     return 0;
   }
        
-  // Make tracker tracks
-  AliMUONVTrackStore* trackStore = new AliMUONTrackStoreV1;
-  fTrackReco->EventReconstruct(*(ClusterStore()),*trackStore);
+  fTrackReco->EventReconstruct(*(ClusterStore()),*fInternalTrackStore);
   
   // Match tracker/trigger tracks
   if ( fTrackHitPatternMaker ) 
   {
-    fTrackReco->ValidateTracksWithTrigger(*trackStore,*(TriggerTrackStore()),*fTriggerStore,*fTrackHitPatternMaker);
+    fTrackReco->ValidateTracksWithTrigger(*fInternalTrackStore,*(TriggerTrackStore()),*fTriggerStore,*fTrackHitPatternMaker);
   }
   
   // Fill ESD
-  FillESD(*trackStore,esd);
+  FillESD(*fInternalTrackStore,esd);
   
-  // cleanup
-  delete trackStore;
+  fInternalTrackStore->Clear();
+  ClusterStore()->Clear();
   
   return 0;
 }
@@ -355,8 +376,7 @@ void AliMUONTracker::UnloadClusters()
 {
   /// Clear internal clusterStore
   
-  delete fInputClusterStore;
-  fInputClusterStore = 0x0;
+  fInputClusterStore->Clear();
 }
 
 
index fddaaf6..bbb356c 100644 (file)
@@ -85,6 +85,7 @@ private:
   mutable AliMUONVClusterStore* fInputClusterStore; //!< cluster container
   mutable AliMUONVTriggerTrackStore* fTriggerTrackStore; //!< trigger track store
   const AliMUONRecoParam* fkRecoParam; //!< pointer to reco param
+  AliMUONVTrackStore* fInternalTrackStore; //!< internal track store
   
   ClassDef(AliMUONTracker,0)  //tracker base class for MUON
 };
index 27db254..047d75c 100644 (file)
@@ -2760,9 +2760,7 @@ Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
     AliError("Missing runLoader!");
     return kFALSE;
   }
-  Int_t iDet = 7; // for MUON
-
-  AliInfo("is running...");
+  Int_t iDet =  GetDetIndex("MUON"); // for MUON
 
   // Get a pointer to the MUON reconstructor
   AliReconstructor *reconstructor = GetReconstructor(iDet);
@@ -2788,8 +2786,6 @@ Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
 
   tracker->UnloadClusters();
   
-  delete tracker;
-  
   if ( rv )
   {
     AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));