ALIROOT-5420 Changes for CDH v3
[u/mrichter/AliRoot.git] / MUON / AliMUONTrackerDataHistogrammer.cxx
index d3fb150..a5f74e6 100644 (file)
@@ -32,6 +32,7 @@
 #include <TH1.h>
 #include <TObjArray.h>
 #include <TROOT.h>
+#include <TMath.h>
 
 ///\class AliMUONTrackerDataHistogrammer
 ///
@@ -50,7 +51,7 @@ AliMUONTrackerDataHistogrammer::AliMUONTrackerDataHistogrammer(const AliMUONVTra
                                                                Int_t externalDim,
                                                                Int_t internalDim)
 : TObject(),
-fData(data),
+fkData(data),
 fExternalDim(externalDim),
 fInternalDim(internalDim)
 {
@@ -92,7 +93,7 @@ AliMUONTrackerDataHistogrammer::AddBusPatchHisto(TH1& h, Int_t busPatchId) const
 {
   /// Add data from one bus patch to the histogram
   
-  if ( fData.HasBusPatch(busPatchId ) )
+  if ( fkData.HasBusPatch(busPatchId ) )
   {
     AliMpBusPatch* busPatch = AliMpDDLStore::Instance()->GetBusPatch(busPatchId);
     for ( Int_t i = 0; i < busPatch->GetNofManus(); ++i ) 
@@ -108,7 +109,7 @@ AliMUONTrackerDataHistogrammer::AddDEHisto(TH1& h, Int_t detElemId) const
 {
   /// Add data from one detection element to the histogram
   
-  if ( fData.HasDetectionElement(detElemId) )
+  if ( fkData.HasDetectionElement(detElemId) )
   {
     AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId);
     for ( Int_t i = 0; i < de->GetNofBusPatches(); ++ i ) 
@@ -125,24 +126,42 @@ AliMUONTrackerDataHistogrammer::AddManuHisto(TH1& h, Int_t detElemId, Int_t manu
 {
   /// Add data from a given manu to histogram
   
-  if ( fData.HasManu(detElemId,manuId) )
+  if ( fkData.HasManu(detElemId,manuId) )
   {
-    for ( Int_t i = 0; i < AliMpConstants::ManuNofChannels(); ++i ) 
+    if ( fkData.IsChannelLevelEnabled() )
     {
-      if ( fData.HasChannel(detElemId,manuId,i) )
+      for ( Int_t i = 0; i < AliMpConstants::ManuNofChannels(); ++i ) 
       {
-        if ( IsInternalMode() ) 
+        if ( fkData.HasChannel(detElemId,manuId,i) )
         {
-          h.Fill(fData.Channel(detElemId,manuId,i,fInternalDim));
+          if ( IsInternalMode() ) 
+          {
+            h.Fill(fkData.Channel(detElemId,manuId,i,fInternalDim));
+          }
+          else
+          {
+            AliMUONSparseHisto* sh = fkData.GetChannelSparseHisto(detElemId,manuId,i,fExternalDim);
+            
+            if ( sh ) 
+            {       
+              Add(h,*sh);
+            }
+          }
         }
-        else
+      }
+    }
+    else
+    {
+      if ( IsInternalMode() ) 
+      {
+        h.Fill(fkData.Manu(detElemId,manuId,fInternalDim));
+      }
+      else
+      {
+        AliMUONSparseHisto* sh = fkData.GetManuSparseHisto(detElemId,manuId,fExternalDim);
+        if (sh)
         {
-          AliMUONSparseHisto* sh = fData.GetChannelSparseHisto(detElemId,manuId,i);
-        
-          if ( sh ) 
-          {       
-            Add(h,*sh);
-          }
+          Add(h,*sh);
         }
       }
     }
@@ -159,15 +178,15 @@ AliMUONTrackerDataHistogrammer::CreateChannelHisto(Int_t detElemId,
   /// to keep memory footprint as low as possible, you should delete
   /// the returned pointer as soon as possible...
   
-  if ( fData.HasChannel(detElemId, manuId, manuChannel) && fData.IsHistogrammed(fExternalDim) )
+  if ( fkData.HasChannel(detElemId, manuId, manuChannel) && fkData.IsHistogrammed(fExternalDim) )
   {
-    AliMUONSparseHisto* sh = fData.GetChannelSparseHisto(detElemId,manuId,manuChannel);
+    AliMUONSparseHisto* sh = fkData.GetChannelSparseHisto(detElemId,manuId,manuChannel);
     
     if ( sh ) 
     {
       Int_t nbins((1<<sh->Nbits()));
       Double_t xmin,xmax;
-      fData.HistogramRange(xmin,xmax);
+      fkData.HistogramRange(xmin,xmax);
       
       TH1* h = CreateHisto(Form("DE%04dMANU%04dCH%02d",detElemId,manuId,manuChannel),
                            nbins,xmin,xmax);
@@ -197,14 +216,18 @@ AliMUONTrackerDataHistogrammer::CreateHisto(const char* name,
     h = new TH1F(name,name,nbins,xmin,xmax);
     h->SetDirectory(gROOT);
   }
+       else
+       {
+               AliError(Form("Cannot create histo for name=%s nbins=%d xmin=%e xmax=%e",name,nbins,xmin,xmax));
+       }
   return h;
 }
 
 //_____________________________________________________________________________
 TH1* 
 AliMUONTrackerDataHistogrammer::CreateHisto(const AliMUONVPainter& painter, 
-                                                    Int_t externalDim,
-                                                    Int_t internalDim)
+                                                                                                                                                                               Int_t externalDim,
+                                                                                                                                                                               Int_t internalDim)
 {
   /// Create an histogram, from given dim of given data, 
   /// for all the channels handled by painter
@@ -282,10 +305,13 @@ AliMUONTrackerDataHistogrammer::CreateHisto(const AliMUONVPainter& painter,
   }
   else
   {
-    AliErrorClass(Form("Could not create histo for painter %s external dim %d internal dim %d",
-                       painter.PathName().Data(),externalDim,internalDim));
+    AliErrorClass(Form("Could not create histo for painter %s (%p) data %s (%p) external dim %d internal dim %d",
+                       painter.PathName().Data(),&painter,
+                       data->GetName(),data,externalDim,internalDim));
   }
   
+  if (histo) histo->SetDirectory(gROOT);
+  
   return histo;
 }
 
@@ -302,10 +328,10 @@ AliMUONTrackerDataHistogrammer::CreateManuHisto(Int_t detElemId, Int_t manuId,
   
   TH1* h(0x0);
   
-  if ( !fData.HasManu(detElemId,manuId) ) return 0x0;
+  if ( !fkData.HasManu(detElemId,manuId) ) return 0x0;
   
-  if ( ( fExternalDim >= 0 && fData.IsHistogrammed(fExternalDim) ) ||
-       ( fInternalDim >= 0 && fInternalDim < fData.NumberOfDimensions() ) )
+  if ( ( fExternalDim >= 0 && fkData.IsHistogrammed(fExternalDim) ) ||
+       ( fInternalDim >= 0 && fInternalDim < fkData.NumberOfDimensions() ) )
   {
     h = CreateHisto(Form("DE%04dMANU%04d",detElemId,manuId),
                     nbins,xmin,xmax);
@@ -341,11 +367,19 @@ AliMUONTrackerDataHistogrammer::GetDataRange(const TObjArray& manuArray,
     
     for ( Int_t i = 0; i < AliMpConstants::ManuNofChannels(); ++i ) 
     {
-      if ( fData.HasChannel(detElemId,manuId,i) ) 
+      if ( fkData.HasChannel(detElemId,manuId,i) ) 
       {
-        Double_t value = fData.Channel(detElemId,manuId,i,fInternalDim);
-        xmin = TMath::Min(xmin,value);
-        xmax = TMath::Max(xmax,value);
+        Double_t value = fkData.Channel(detElemId,manuId,i,fInternalDim);
+                               
+                               if ( ! TMath::Finite(value) )
+                               {
+                                       AliError(Form("Got a NaN for DE %d manu %d ch %d",detElemId,manuId,i));
+                               }
+                               else
+                               {
+                                       xmin = TMath::Min(xmin,value);
+                                       xmax = TMath::Max(xmax,value);
+                               }
       }
     }
   }