]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliESDCaloCluster.cxx
Fix for Coverity 10007: BAD_FREE
[u/mrichter/AliRoot.git] / STEER / AliESDCaloCluster.cxx
index f575ebce9ae727057bc8fcb26bdc3186c3f8dee1..4aaa0bc03c25881725e1b46579b80b0e976f8cdc 100644 (file)
 //   J.L. Klay (LLNL)
 //-----------------------------------------------------------------
 
+#include <TLorentzVector.h>
 #include "AliESDCaloCluster.h"
 
 ClassImp(AliESDCaloCluster)
 
 //_______________________________________________________________________
 AliESDCaloCluster::AliESDCaloCluster() : 
-  fID(0),
-  fClusterType(-1),
-  fEMCALCluster(kFALSE),
-  fPHOSCluster(kFALSE),
-  fEnergy(-1),
-  fDispersion(-1),
-  fChi2(-1),
-  fPrimaryIndex(-1),
+  AliVCluster(),
+  fTracksMatched(0x0),
+  fLabels(0x0),
+  fNCells(0),
+  fCellsAbsId(0x0),
+  fCellsAmpFraction(0x0),
+  fEnergy(0),
+  fDispersion(0),
+  fChi2(0),
   fM20(0),
   fM02(0),
-  fM11(0),
+  fEmcCpvDistance(1024),
+  fTrackDx(1024),fTrackDz(1024),
+  fDistToBadChannel(1024),
+  fID(0),
   fNExMax(0),
-  fEmcCpvDistance(9999),
-  fNumberOfDigits(0),
-  fDigitAmplitude(0x0),
-  fDigitTime(0x0),
-  fDigitIndex(0x0)
+  fClusterType(kUndef), fTOF(0.)
 {
   //
   // The default ESD constructor 
@@ -57,24 +58,25 @@ AliESDCaloCluster::AliESDCaloCluster() :
 
 //_______________________________________________________________________
 AliESDCaloCluster::AliESDCaloCluster(const AliESDCaloCluster& clus) : 
-  TObject(clus),
-  fID(clus.fID),
-  fClusterType(clus.fClusterType),
-  fEMCALCluster(clus.fEMCALCluster),
-  fPHOSCluster(clus.fPHOSCluster),
+  AliVCluster(clus),
+  fTracksMatched(clus.fTracksMatched?new TArrayI(*clus.fTracksMatched):0x0),
+  fLabels(clus.fLabels?new TArrayI(*clus.fLabels):0x0),
+  fNCells(clus.fNCells),
+  fCellsAbsId(),
+  fCellsAmpFraction(),
   fEnergy(clus.fEnergy),
   fDispersion(clus.fDispersion),
   fChi2(clus.fChi2),
-  fPrimaryIndex(clus.fPrimaryIndex),
   fM20(clus.fM20),
   fM02(clus.fM02),
-  fM11(clus.fM11),
-  fNExMax(clus.fNExMax),
   fEmcCpvDistance(clus.fEmcCpvDistance),
-  fNumberOfDigits(clus.fNumberOfDigits),
-  fDigitAmplitude(0x0),
-  fDigitTime(0x0),
-  fDigitIndex(0x0)
+  fTrackDx(clus.fTrackDx),
+  fTrackDz(clus.fTrackDz),
+  fDistToBadChannel(clus.fDistToBadChannel),
+  fID(clus.fID),
+  fNExMax(clus.fNExMax),
+  fClusterType(clus.fClusterType),
+  fTOF(clus.fTOF)
 {
   //
   // The copy constructor 
@@ -85,23 +87,22 @@ AliESDCaloCluster::AliESDCaloCluster(const AliESDCaloCluster& clus) :
 
   for(Int_t i=0; i<AliPID::kSPECIESN; i++) fPID[i] = clus.fPID[i];
 
-  if (clus.fNumberOfDigits > 0) {
-    if (clus.fDigitAmplitude) {
-      fDigitAmplitude = new UShort_t[clus.fNumberOfDigits];
-      for (Int_t i=0; i<clus.fNumberOfDigits; i++)
-       fDigitAmplitude[i]=clus.fDigitAmplitude[i];
-    }
-    if (clus.fDigitTime) {
-      fDigitTime = new UShort_t[clus.fNumberOfDigits];
-      for (Int_t i=0; i<clus.fNumberOfDigits; i++)
-       fDigitTime[i]=clus.fDigitTime[i];
+  if (clus.fNCells > 0) {
+
+    if(clus.fCellsAbsId){
+      fCellsAbsId = new UShort_t[clus.fNCells];
+      for (Int_t i=0; i<clus.fNCells; i++)
+       fCellsAbsId[i]=clus.fCellsAbsId[i];
     }
-    if (clus.fDigitIndex) {
-      fDigitIndex = new UShort_t[clus.fNumberOfDigits];
-      for (Int_t i=0; i<clus.fNumberOfDigits; i++)
-       fDigitIndex[i]=clus.fDigitIndex[i];
+    
+    if(clus.fCellsAmpFraction){
+      fCellsAmpFraction = new Double32_t[clus.fNCells];
+      for (Int_t i=0; i<clus.fNCells; i++)
+       fCellsAmpFraction[i]=clus.fCellsAmpFraction[i];
     }
+    
   }
+
 }
 
 //_______________________________________________________________________
@@ -110,70 +111,119 @@ AliESDCaloCluster &AliESDCaloCluster::operator=(const AliESDCaloCluster& source)
   // assignment operator
 
   if(&source == this) return *this;
+  AliVCluster::operator=(source);
+  fGlobalPos[0] = source.fGlobalPos[0];
+  fGlobalPos[1] = source.fGlobalPos[1];
+  fGlobalPos[2] = source.fGlobalPos[2];
 
-  fID = source.fID;
-  fClusterType = source.fClusterType;
-  fEMCALCluster = source.fEMCALCluster;
-  fPHOSCluster = source.fPHOSCluster;
   fEnergy = source.fEnergy;
   fDispersion = source.fDispersion;
   fChi2 = source.fChi2;
-  fPrimaryIndex = source.fPrimaryIndex;
   fM20 = source.fM20;
   fM02 = source.fM02;
-  fM11 = source.fM11;
-  fNExMax = source.fNExMax;
   fEmcCpvDistance = source.fEmcCpvDistance;
-  fNumberOfDigits = source.fNumberOfDigits;
-  delete fDigitAmplitude; fDigitAmplitude=0x0;
-  delete fDigitTime; fDigitTime = 0x0;
-  delete fDigitIndex; fDigitIndex = 0x0;
-
-  fGlobalPos[0] = source.fGlobalPos[0];
-  fGlobalPos[1] = source.fGlobalPos[1];
-  fGlobalPos[2] = source.fGlobalPos[2];
-
+  fTrackDx= source.fTrackDx ;
+  fTrackDz= source.fTrackDz ;
+  fDistToBadChannel = source.fDistToBadChannel ;
   for(Int_t i=0; i<AliPID::kSPECIESN; i++) fPID[i] = source.fPID[i];
+  fID = source.fID;
+
+  fNCells= source.fNCells;
 
-  if (source.fNumberOfDigits > 0) {
-    if (source.fDigitAmplitude) {
-      fDigitAmplitude = new UShort_t[source.fNumberOfDigits];
-      for (Int_t i=0; i<source.fNumberOfDigits; i++)
-       fDigitAmplitude[i]=source.fDigitAmplitude[i];
+  if (source.fNCells > 0) {
+    if(source.fCellsAbsId){
+      if(fNCells != source.fNCells||!fCellsAbsId){
+       if(fCellsAbsId)delete [] fCellsAbsId;
+       fCellsAbsId = new UShort_t[source.fNCells];
+      }
+      for (Int_t i=0; i<source.fNCells; i++){
+       fCellsAbsId[i]=source.fCellsAbsId[i];
+      }
     }
-    if (source.fDigitTime) {
-      fDigitTime = new UShort_t[source.fNumberOfDigits];
-      for (Int_t i=0; i<source.fNumberOfDigits; i++)
-       fDigitTime[i]=source.fDigitTime[i];
+    
+    if(source.fCellsAmpFraction){
+      if(fNCells != source.fNCells||!fCellsAmpFraction){
+       if(fCellsAmpFraction) delete [] fCellsAmpFraction;
+       fCellsAmpFraction = new Double32_t[source.fNCells];
+      }
+      for (Int_t i=0; i<source.fNCells; i++)
+       fCellsAmpFraction[i]=source.fCellsAmpFraction[i];
+    }  
+  }
+
+  fNExMax = source.fNExMax;
+  fClusterType = source.fClusterType;
+  fTOF = source.fTOF;
+
+  //not in use
+  if(source.fTracksMatched){
+    // assign or copy construct
+    if(fTracksMatched){
+      *fTracksMatched = *source.fTracksMatched;
     }
-    if (source.fDigitIndex) {
-      fDigitIndex = new UShort_t[source.fNumberOfDigits];
-      for (Int_t i=0; i<source.fNumberOfDigits; i++)
-       fDigitIndex[i]=source.fDigitIndex[i];
+    else fTracksMatched = new TArrayI(*source.fTracksMatched);
+  }
+  else{
+    if(fTracksMatched)delete fTracksMatched;
+    fTracksMatched = 0;
+  }
+
+  if(source.fLabels){
+    // assign or copy construct
+    if(fLabels){ 
+      *fLabels = *source.fLabels;
     }
+    else fLabels = new TArrayI(*source.fLabels);
+  }
+  else{
+    if(fLabels)delete fLabels;
+    fLabels = 0;
   }
 
+  
   return *this;
 
 }
 
+//_______________________________________________________________________
+void AliESDCaloCluster::Copy(TObject &obj) const {
+  
+  // this overwrites the virtual TOBject::Copy()
+  // to allow run time copying without casting
+  // in AliESDEvent
+
+  if(this==&obj)return;
+  AliESDCaloCluster *robj = dynamic_cast<AliESDCaloCluster*>(&obj);
+  if(!robj)return; // not an AliESDCluster
+  *robj = *this;
+
+}
 
 //_______________________________________________________________________
 AliESDCaloCluster::~AliESDCaloCluster(){ 
   //
-  // This is destructor according Coding Conventrions 
+  // This is destructor according Coding Conventions 
   //
-  // AliESDCaloCluster is the owner of the arrays
-  // even if they are created outside
-
-  delete[] fDigitAmplitude;
-  delete[] fDigitTime;
-  delete[] fDigitIndex;
+  if(fTracksMatched)delete fTracksMatched;fTracksMatched = 0;
+  if(fLabels) delete fLabels; fLabels = 0;
+  if(fCellsAmpFraction){ delete[] fCellsAmpFraction; fCellsAmpFraction=0;}
+  if(fCellsAbsId){ delete[] fCellsAbsId;  fCellsAbsId = 0;}
+}
 
+//_______________________________________________________________________
+void AliESDCaloCluster::Clear(const Option_t*){ 
+  //
+  // This is destructor according Coding Conventions 
+  //
+  if(fTracksMatched)delete fTracksMatched;fTracksMatched = 0;
+  if(fLabels) delete fLabels; fLabels = 0;
+  if(fCellsAmpFraction){ delete[] fCellsAmpFraction; fCellsAmpFraction=0;}
+  if(fCellsAbsId){ delete[] fCellsAbsId;  fCellsAbsId = 0;}
 }
 
+
 //_______________________________________________________________________
-void AliESDCaloCluster::SetPid(const Float_t *p) {
+void AliESDCaloCluster::SetPID(const Float_t *p) {
   // Sets the probability of each particle type
   // Copied from AliESDtrack SetPIDValues
   // This function copies "n" PID weights from "scr" to "dest"
@@ -203,3 +253,61 @@ void AliESDCaloCluster::SetPid(const Float_t *p) {
     for (Int_t i=0; i<n; i++) fPID[i] = uniform;
 
 }
+
+//_______________________________________________________________________
+void AliESDCaloCluster::GetMomentum(TLorentzVector& p, Double_t *vertex ) {
+  // Returns TLorentzVector with momentum of the cluster. Only valid for clusters 
+  // identified as photons or pi0 (overlapped gamma) produced on the vertex
+  //Vertex can be recovered with esd pointer doing:  
+  //" Double_t vertex[3] ; esd->GetVertex()->GetXYZ(vertex) ; "
+
+  Double32_t pos[3]={ fGlobalPos[0], fGlobalPos[1], fGlobalPos[2]};
+  if(vertex){//calculate direction from vertex
+    pos[0]-=vertex[0];
+    pos[1]-=vertex[1];
+    pos[2]-=vertex[2];
+  }
+  
+  Double_t r = TMath::Sqrt(pos[0]*pos[0]+pos[1]*pos[1]+pos[2]*pos[2]   ) ; 
+  
+  p.SetPxPyPzE( fEnergy*pos[0]/r,  fEnergy*pos[1]/r,  fEnergy*pos[2]/r,  fEnergy) ;   
+}
+
+//_______________________________________________________________________
+void  AliESDCaloCluster::SetCellsAbsId(UShort_t *array)
+{
+    //  Set the array of cell absId numbers 
+  if (fNCells) {
+    fCellsAbsId = new  UShort_t[fNCells];
+    for (Int_t i = 0; i < fNCells; i++) fCellsAbsId[i] = array[i];
+  }
+}
+
+//_______________________________________________________________________
+void  AliESDCaloCluster::SetCellsAmplitudeFraction(Double32_t *array)
+{
+  //  Set the array of cell amplitude fraction
+  if (fNCells) {
+    fCellsAmpFraction = new  Double32_t[fNCells];
+    for (Int_t i = 0; i < fNCells; i++) fCellsAmpFraction[i] = array[i];
+  }
+}
+
+//______________________________________________________________________________
+void AliESDCaloCluster::SetPosition(Float_t *x) 
+{
+  // set the position
+  
+  if (x) {
+    fGlobalPos[0] = x[0];
+    fGlobalPos[1] = x[1];
+    fGlobalPos[2] = x[2];
+  } else {
+    
+    fGlobalPos[0] = -999.;
+    fGlobalPos[1] = -999.;
+    fGlobalPos[2] = -999.;
+  }
+}
+
+