Changes for #94138: Port update in Ali*CaloCells to trunk and release
[u/mrichter/AliRoot.git] / STEER / AOD / AliAODCaloCells.h
index 53c05e4..83d4303 100644 (file)
@@ -21,58 +21,82 @@ class AliAODCaloCells : public AliVCaloCells
   AliAODCaloCells(const char* name, const char* title, VCells_t ttype=kUndef);
   AliAODCaloCells(const AliAODCaloCells& cells); 
   AliAODCaloCells& operator=(const AliAODCaloCells& cells);
-  virtual void Copy(TObject &obj) const;
-  virtual AliVCaloCells* CopyCaloCells(Bool_t all) const;
-
   virtual ~AliAODCaloCells();
-  void Clear(const Option_t*);
 
-  void CreateContainer(Short_t nCells);
-  void DeleteContainer();
-  void Sort();
+  virtual AliVCaloCells* CopyCaloCells(Bool_t all) const;
+  virtual void    Copy(TObject &obj) const;
+  void            Clear(const Option_t*);
+  void            CreateContainer(Short_t nCells);
+  void            DeleteContainer();
+  void            Sort();
   
-  Bool_t SetCell(Short_t pos, Short_t cellNumber, Double_t amplitude, Double_t time = -1);
+  inline Bool_t   GetCell(Short_t pos, Short_t &cellNumber, Double_t &amplitude,  Double_t &time, Short_t &mclabel,      Double_t &efrac) const ;
+  Bool_t          SetCell(Short_t pos, Short_t  cellNumber, Double_t  amplitude,  Double_t  time, Short_t  mclabel = -1, Double_t  efrac = 0.)  ;
+  
+  Short_t         GetNumberOfCells() const  { return fNCells ; }
+  void            SetNumberOfCells(Int_t n) { fNCells = n    ; }
   
-  Short_t GetNumberOfCells() const { return fNCells; }
-  void    SetNumberOfCells(Int_t n) { fNCells = n ; }
-  inline Bool_t   GetCell(Short_t pos, Short_t &cellNumber, Double_t &amplitude, Double_t &time) const;
   inline Double_t GetCellAmplitude(Short_t cellNumber);
   inline Short_t  GetCellPosition(Short_t cellNumber);
+  inline Double_t GetCellTime(Short_t cellNumber);
+  
   inline Double_t GetAmplitude(Short_t pos) const;
-  Double_t GetCellTime(Short_t /*cellNumber*/) {return -1;}
   inline Short_t  GetCellNumber(Short_t pos) const;
-  Double_t GetTime(Short_t /*pos*/) const {return -1;}
-  Bool_t IsEMCAL() const {return (fType == kEMCALCell);}
-  Bool_t IsPHOS() const {return (fType == kPHOSCell);}
-  Char_t  GetType() const { return fType;}
-  void    SetType(Char_t ttype) { fType=ttype; }
-
-
+  inline Double_t GetTime(Short_t pos) const;
+  
+  Bool_t          IsEMCAL() const { return (fType == kEMCALCell); }
+  Bool_t          IsPHOS()  const { return (fType == kPHOSCell) ; }
+  
+  Char_t          GetType() const { return fType;}
+  void            SetType(Char_t ttype) { fType=ttype; }
+  
+  // MC & embedding
+  inline Short_t  GetCellMCLabel(Short_t cellNumber) ;
+  inline Short_t  GetMCLabel(Short_t pos) const ;
+  
+  inline Double_t GetCellEFraction(Short_t cellNumber) ;
+  inline Double_t GetEFraction(Short_t pos) const ;  
+  
+  inline void     SetEFraction    (Short_t pos,         Double32_t efrac) ;
+  inline void     SetCellEFraction(Short_t cellNumber,  Double32_t efrac) ;
+  
  protected:
+  
   Int_t       fNCells;       // Number of cells
   Short_t    *fCellNumber;   //[fNCells] array of cell numbers
   Double32_t *fAmplitude;    //[fNCells][0.,0.,16] array with cell amplitudes (= energy!)
+  Double32_t *fTime;         //[fNCells][0.,0.,16] array with cell times
+  Double32_t *fEFraction;    //[fNCells][0.,0.,16] array with fraction of MC energy and data - for embedding
+  Short_t    *fMCLabel;      //[fNCells] array of MC labels
   Bool_t      fIsSorted;     //! true if cell arrays are sorted by index
   Char_t      fType;         // Cell type
   
+  ClassDef(AliAODCaloCells, 3);
   
-  ClassDef(AliAODCaloCells, 2);
 };
 
-
-Bool_t AliAODCaloCells::GetCell(Short_t pos, Short_t &cellNumber, Double_t &amplitude, Double_t& /*time*/) const 
+Bool_t AliAODCaloCells::GetCell(Short_t pos, Short_t &cellNumber, Double_t &amplitude, 
+                                Double_t &time, Short_t & mclabel, Double_t & efrac) const 
 { 
-  if (pos>=0 && pos<fNCells) {
+  if (pos>=0 && pos<fNCells) 
+  {
     cellNumber = fCellNumber[pos];
-    amplitude = fAmplitude[pos];
+    amplitude  = fAmplitude[pos];
+    
+    if(fTime)      time    = fTime[pos];
+    else           time    =-1.;
+    if(fMCLabel)   mclabel = fMCLabel[pos];
+    else           mclabel =-1 ; 
+    if(fEFraction) efrac   = fEFraction[pos];
+    else           efrac   = 0 ;
+    
     return kTRUE;
+    
   } else {
-    Warning("GetCell","Invalid cell array index %d", pos);
     return kFALSE;
   }
 }
 
-
 Double_t AliAODCaloCells::GetCellAmplitude(Short_t cellNumber)
 { 
   if (!fIsSorted) {
@@ -88,24 +112,46 @@ Double_t AliAODCaloCells::GetCellAmplitude(Short_t cellNumber)
   }
 }
 
+Double_t AliAODCaloCells::GetCellTime(Short_t cellNumber)
+{ 
+  if(!fTime) return -1;
+  
+  if (!fIsSorted) {
+    Sort();
+    fIsSorted=kTRUE;
+  }
+  
+  Short_t pos = TMath::BinarySearch(fNCells, fCellNumber, cellNumber);
+  if (pos>=0 && pos < fNCells && fCellNumber[pos] == cellNumber) {
+    return fTime[pos];
+  } else {
+    return -1.;
+  }
+}
 
 Double_t AliAODCaloCells::GetAmplitude(Short_t pos) const 
 { 
   if (pos>=0 && pos<fNCells) {
     return fAmplitude[pos];
   } else {
-    Warning("GetAmplitude","Invalid cell array index %d", pos);
     return 0.;
   }
 }
 
+Double_t AliAODCaloCells::GetTime(Short_t pos) const 
+{ 
+  if (pos>=0 && pos<fNCells && fTime) {
+    return fTime[pos];
+  } else {
+    return -1.;
+  }
+}
 
 Short_t AliAODCaloCells::GetCellNumber(Short_t pos) const 
 { 
   if (pos>=0 && pos<fNCells) {
     return fCellNumber[pos];
   } else {
-    Warning("GetCellNumber","Invalid cell array index %d", pos);
     return fNCells;
   }
 }
@@ -135,5 +181,84 @@ Short_t AliAODCaloCells::GetCellPosition(Short_t cellNumber)
   return pos;
 }
 
+Short_t AliAODCaloCells::GetMCLabel(Short_t pos) const 
+{ 
+  if (pos>=0 && pos<fNCells && fMCLabel) {
+    return fMCLabel[pos];
+  } else {
+    return 0.;
+  }
+}
+
+Double_t AliAODCaloCells::GetEFraction(Short_t pos) const 
+{ 
+  if (pos>=0 && pos<fNCells && fEFraction) {
+    return fEFraction[pos];
+  } else {
+    return 0.;
+  }
+}
+
+Short_t AliAODCaloCells::GetCellMCLabel(Short_t cellNumber)
+{ 
+  if(!fMCLabel) return -1;
+  
+  if (!fIsSorted) {
+    Sort();
+    fIsSorted=kTRUE;
+  }
+  
+  Short_t pos = TMath::BinarySearch(fNCells, fCellNumber, cellNumber);
+  if (pos>=0 && fCellNumber[pos] == cellNumber) {
+    return fMCLabel[pos];
+  } else {
+    return 0.;
+  }
+}
+
+Double_t AliAODCaloCells::GetCellEFraction(Short_t cellNumber)
+{ 
+  if(!fEFraction) return 0;
+
+  if (!fIsSorted) {
+    Sort();
+    fIsSorted=kTRUE;
+  }
+  
+  Short_t pos = TMath::BinarySearch(fNCells, fCellNumber, cellNumber);
+  if (pos>=0 && pos < fNCells && fCellNumber[pos] == cellNumber) {
+    return fEFraction[pos];
+  } else {
+    return -1.;
+  }
+}
+
+void AliAODCaloCells::SetEFraction(Short_t pos,  Double32_t efrac)
+{
+  // Sets the fraction of energy from MC with respect to data at the given position
+  
+  
+  if (pos>=0 && pos < fNCells) 
+  {
+    if(!fEFraction) fEFraction = new Double32_t[fNCells];
+    fEFraction[pos]  = efrac;
+  } 
+}
+
+void AliAODCaloCells::SetCellEFraction(Short_t cellNumber, Double32_t efrac)
+{ 
+  if (!fIsSorted) {
+    Sort();
+    fIsSorted=kTRUE;
+  }
+  
+  Short_t pos = TMath::BinarySearch(fNCells, fCellNumber, cellNumber);
+  if (pos>=0 && pos < fNCells && fCellNumber[pos] == cellNumber) 
+  {
+    if(!fEFraction) fEFraction = new Double32_t[fNCells];
+    fEFraction[pos] = efrac;
+  } 
+}
+
 
 #endif