#include <TH1.h>
#include <TObjArray.h>
#include <TROOT.h>
+#include <TMath.h>
///\class AliMUONTrackerDataHistogrammer
///
Int_t externalDim,
Int_t internalDim)
: TObject(),
-fData(data),
+fkData(data),
fExternalDim(externalDim),
fInternalDim(internalDim)
{
{
/// 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 )
{
/// 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 )
{
/// 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);
}
}
}
/// 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);
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
}
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;
}
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);
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);
+ }
}
}
}