]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/mapping/AliMpSegmentation.cxx
Small changes to allow proper unloading of all mapping from memory
[u/mrichter/AliRoot.git] / MUON / mapping / AliMpSegmentation.cxx
index 3c36e27b0c9edc792478cff9f528b9ff8e403ec9..d767773166a66dfd9a1b899a8ed15d2bd665915b 100644 (file)
@@ -27,6 +27,7 @@
 
 #include "AliMpSegmentation.h"
 
+#include "AliMpDataStreams.h"
 #include "AliMpDetElement.h"
 #include "AliMpDEStore.h"
 #include "AliMpDEManager.h"
 #include "AliMpTriggerReader.h"
 #include "AliMpTriggerSegmentation.h"
 #include "AliMpCathodType.h"
+#include "AliMpSlatMotifMap.h"
+
 
 #include "AliLog.h"
-#include "AliCDBManager.h"
-#include "AliCDBEntry.h"
 
 #include <Riostream.h>
 #include <TMap.h>
@@ -53,6 +54,8 @@
 #include <TSystem.h>
 #include <TClass.h>
 
+#include <cassert>
+
 /// \cond CLASSIMP
 ClassImp(AliMpSegmentation)
 /// \endcond
@@ -76,7 +79,8 @@ AliMpSegmentation* AliMpSegmentation::Instance(Bool_t warn)
 }    
 
 //______________________________________________________________________________
-AliMpSegmentation* AliMpSegmentation::ReadData(Bool_t warn)
+AliMpSegmentation* AliMpSegmentation::ReadData(const AliMpDataStreams& dataStreams,
+                                               Bool_t warn)
 {
 /// Load the sementation from ASCII data files
 /// and return its instance
@@ -87,9 +91,10 @@ AliMpSegmentation* AliMpSegmentation::ReadData(Bool_t warn)
     return fgInstance;
   }  
   
-  AliInfoClass("Reading segmentation from ASCII files.");
+  if ( dataStreams.GetReadFromFiles() )
+    AliInfoClass("Reading segmentation from ASCII files.");
 
-  fgInstance = new AliMpSegmentation();
+  fgInstance = new AliMpSegmentation(dataStreams);
   return fgInstance;
 }    
 
@@ -98,48 +103,54 @@ AliMpSegmentation* AliMpSegmentation::ReadData(Bool_t warn)
 //
 
 //______________________________________________________________________________
-AliMpSegmentation::AliMpSegmentation()
+AliMpSegmentation::AliMpSegmentation(const AliMpDataStreams& dataStreams)
 : TObject(),
+  fDataStreams(dataStreams),
   fDetElements(0),
   fMpSegmentations(true),
-  fElCardsMap(true),
-  fSlatMotifMap()
+  fElCardsMap(),
+  fSlatMotifMap(new AliMpSlatMotifMap)
 {  
 /// Standard constructor - segmentation is loaded from ASCII data files
 
   AliDebug(1,"");
-  fElCardsMap.SetOwner(true);
+  
+  fElCardsMap.SetOwner(kTRUE);
   
   // Load DE data
   if ( ! AliMpDEStore::Instance(false) )  
-    AliMpDEStore::ReadData();
+    AliMpDEStore::ReadData(dataStreams);
   fDetElements = AliMpDEStore::Instance();  
 
   // Create mapping segmentations for all detection elements
-  for ( Int_t cath = AliMp::kCath0; cath <= AliMp::kCath1; cath ++ ) { 
-    AliMpDEIterator it;
-    for ( it.First(); ! it.IsDone(); it.Next() ) {
-      CreateMpSegmentation(it.CurrentDEId(), AliMp::GetCathodType(cath));
-    } 
-  }  
-
-  // Fill el cards map for all detection elements
-  // of tracking chambers
   AliMpDEIterator it;
-  for ( it.First(); ! it.IsDone(); it.Next() ) { 
-    if ( AliMpDEManager::GetStationType(it.CurrentDEId()) != AliMp::kStationTrigger ) {
-      FillElCardsMap(it.CurrentDEId());
+  for ( it.First(); ! it.IsDone(); it.Next() ) 
+  {
+    Int_t n(0);
+    
+    for ( Int_t cath = AliMp::kCath0; cath <= AliMp::kCath1; ++cath ) 
+    { 
+      if ( CreateMpSegmentation(it.CurrentDEId(), AliMp::GetCathodType(cath)) ) ++n;
     }
-  }  
+     
+    if ( n == 2 &&  // should always be the case except when we play with the CreateMpSegmentation method...
+        AliMpDEManager::GetStationType(it.CurrentDEId()) != AliMp::kStationTrigger ) // only for tracker
+    {
+        // Fill el cards map for all detection elements
+        // of tracking chambers
+        FillElCardsMap(it.CurrentDEId());
+    }      
+  } 
 }
 
 //______________________________________________________________________________
-AliMpSegmentation::AliMpSegmentation(TRootIOCtor* /*ioCtor*/)
+AliMpSegmentation::AliMpSegmentation(TRootIOCtor* ioCtor)
 : TObject(),
+  fDataStreams(ioCtor),
   fDetElements(0),
   fMpSegmentations(),
-  fElCardsMap(),
-  fSlatMotifMap()
+  fElCardsMap(ioCtor),
+  fSlatMotifMap(0)
 {  
 /// Constructor for IO
 
@@ -160,6 +171,8 @@ AliMpSegmentation::~AliMpSegmentation()
   // Segmentations are deleted with fMpSegmentations 
   // El cards arrays are deleted with fElCardsMap
   
+  delete fSlatMotifMap;
+  
   fgInstance = 0;
 }
 
@@ -197,24 +210,24 @@ AliMpSegmentation::CreateMpSegmentation(Int_t detElemId, AliMp::CathodType cath)
   AliMpVSegmentation* mpSegmentation = 0;
 
   if ( stationType == AliMp::kStation1 || stationType == AliMp::kStation2 ) {
-    AliMpSectorReader reader(stationType, planeType);
+    AliMpSectorReader reader(fDataStreams, stationType, planeType);
     AliMpSector* sector = reader.BuildSector();
     mpSegmentation = new AliMpSectorSegmentation(sector, true);
   }
   else if ( stationType == AliMp::kStation345 ) { 
-    AliMpSt345Reader reader(fSlatMotifMap);
+    AliMpSt345Reader reader(fDataStreams,fSlatMotifMap);
     AliMpSlat* slat = reader.ReadSlat(deTypeName, planeType);
     mpSegmentation =  new AliMpSlatSegmentation(slat, true);
   }
   else if ( stationType == AliMp::kStationTrigger ) {
-    AliMpTriggerReader reader(fSlatMotifMap);
+    AliMpTriggerReader reader(fDataStreams,fSlatMotifMap);
     AliMpTrigger* trigger = reader.ReadSlat(deTypeName, planeType);
     mpSegmentation = new AliMpTriggerSegmentation(trigger, true);
   }
   else   
     AliErrorStream() << "Unknown station type" << endl;
 
-  fMpSegmentations.Add(deSegName, mpSegmentation); 
+  if ( mpSegmentation ) fMpSegmentations.Add(deSegName, mpSegmentation); 
   
 //  StdoutToAliDebug(3, fSlatMotifMap.Print(););
   
@@ -230,33 +243,27 @@ AliMpSegmentation::FillElCardsMap(Int_t detElemId)
 
   AliDebugStream(2) << "detElemId=" << detElemId << endl;;
   
-  AliMpExMap* mde = new AliMpExMap(true);
+  AliMpExMap* mde = new AliMpExMap;
   mde->SetOwner(kFALSE);
   fElCardsMap.Add(detElemId,mde);
 
   const AliMpVSegmentation* seg[2];
   TArrayI ecn[2];
   
-  // Do it in 2 steps to be able to set the AliMpExMap size once for all,
-  // to avoid annoying warning message in case of dynamical resizing.
-  // (not critical).
   for ( Int_t cathode = AliMp::kCath0; cathode <= AliMp::kCath1; ++cathode )
   {
     seg[cathode] = GetMpSegmentation(detElemId,AliMp::GetCathodType(cathode));
     seg[cathode]->GetAllElectronicCardIDs(ecn[cathode]);
-  }
-  
-  mde->SetSize(ecn[0].GetSize()+ecn[1].GetSize());
-  
-  for ( Int_t cathode = AliMp::kCath0; cathode <= AliMp::kCath1; ++ cathode )
-  {
     for ( Int_t i = 0; i < ecn[cathode].GetSize(); ++i )
     {
       mde->Add(ecn[cathode][i],const_cast<AliMpVSegmentation*>(seg[cathode]));
     }
   }
   
+  assert( mde->GetSize() > 0 );
+  
   return mde;
+  
 }
 
 //