1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
19 //-----------------------------------------------------------------
20 // Implementation of the ESD Calorimeter cluster class
21 // ESD = Event Summary Data
22 // This is the class to deal with during the phisics analysis of data
25 //-----------------------------------------------------------------
27 #include <TLorentzVector.h>
28 #include "AliESDCaloCluster.h"
30 ClassImp(AliESDCaloCluster)
32 //_______________________________________________________________________
33 AliESDCaloCluster::AliESDCaloCluster() :
39 fCellsAmpFraction(0x0),
40 fDigitAmplitude(0x0),//not in use
41 fDigitTime(0x0),//not in use
42 fDigitIndex(0x0),//not in use
48 fEmcCpvDistance(1024),
49 fTrackDx(1024),fTrackDz(1024),
50 fDistToBadChannel(1024),
53 fClusterType(kUndef), fTOF(0.)
56 // The default ESD constructor
58 fGlobalPos[0] = fGlobalPos[1] = fGlobalPos[2] = 0.;
59 for(Int_t i=0; i<AliPID::kSPECIESN; i++) fPID[i] = 0.;
62 //_______________________________________________________________________
63 AliESDCaloCluster::AliESDCaloCluster(const AliESDCaloCluster& clus) :
65 fTracksMatched(clus.fTracksMatched?new TArrayI(*clus.fTracksMatched):0x0),
66 fLabels(clus.fLabels?new TArrayI(*clus.fLabels):0x0),
67 fNCells(clus.fNCells),
70 fDigitAmplitude(clus.fDigitAmplitude?new TArrayS(*clus.fDigitAmplitude):0x0),//not in use
71 fDigitTime(clus.fDigitTime?new TArrayS(*clus.fDigitTime):0x0),//not in use
72 fDigitIndex(clus.fDigitIndex?new TArrayS(*clus.fDigitIndex):0x0),//not in use
73 fEnergy(clus.fEnergy),
74 fDispersion(clus.fDispersion),
78 fEmcCpvDistance(clus.fEmcCpvDistance),
79 fTrackDx(clus.fTrackDx),
80 fTrackDz(clus.fTrackDz),
81 fDistToBadChannel(clus.fDistToBadChannel),
83 fNExMax(clus.fNExMax),
84 fClusterType(clus.fClusterType),
88 // The copy constructor
90 fGlobalPos[0] = clus.fGlobalPos[0];
91 fGlobalPos[1] = clus.fGlobalPos[1];
92 fGlobalPos[2] = clus.fGlobalPos[2];
94 for(Int_t i=0; i<AliPID::kSPECIESN; i++) fPID[i] = clus.fPID[i];
96 if (clus.fNCells > 0) {
99 fCellsAbsId = new UShort_t[clus.fNCells];
100 for (Int_t i=0; i<clus.fNCells; i++)
101 fCellsAbsId[i]=clus.fCellsAbsId[i];
104 if(clus.fCellsAmpFraction){
105 fCellsAmpFraction = new Double32_t[clus.fNCells];
106 for (Int_t i=0; i<clus.fNCells; i++)
107 fCellsAmpFraction[i]=clus.fCellsAmpFraction[i];
114 //_______________________________________________________________________
115 AliESDCaloCluster &AliESDCaloCluster::operator=(const AliESDCaloCluster& source)
117 // assignment operator
119 if(&source == this) return *this;
120 TObject::operator=(source);
121 fGlobalPos[0] = source.fGlobalPos[0];
122 fGlobalPos[1] = source.fGlobalPos[1];
123 fGlobalPos[2] = source.fGlobalPos[2];
125 fEnergy = source.fEnergy;
126 fDispersion = source.fDispersion;
127 fChi2 = source.fChi2;
130 fEmcCpvDistance = source.fEmcCpvDistance;
131 fTrackDx= source.fTrackDx ;
132 fTrackDz= source.fTrackDz ;
133 fDistToBadChannel = source.fDistToBadChannel ;
134 for(Int_t i=0; i<AliPID::kSPECIESN; i++) fPID[i] = source.fPID[i];
137 fNCells= source.fNCells;
139 if (source.fNCells > 0) {
140 if(source.fCellsAbsId){
141 if(fNCells != source.fNCells||!fCellsAbsId){
142 if(fCellsAbsId)delete [] fCellsAbsId;
143 fCellsAbsId = new UShort_t[source.fNCells];
145 for (Int_t i=0; i<source.fNCells; i++){
146 fCellsAbsId[i]=source.fCellsAbsId[i];
150 if(source.fCellsAmpFraction){
151 if(fNCells != source.fNCells||!fCellsAmpFraction){
152 if(fCellsAmpFraction) delete [] fCellsAmpFraction;
153 fCellsAmpFraction = new Double32_t[source.fNCells];
155 for (Int_t i=0; i<source.fNCells; i++)
156 fCellsAmpFraction[i]=source.fCellsAmpFraction[i];
160 fNExMax = source.fNExMax;
161 fClusterType = source.fClusterType;
165 if(source.fTracksMatched){
166 // assign or copy construct
168 *fTracksMatched = *source.fTracksMatched;
170 else fTracksMatched = new TArrayI(*source.fTracksMatched);
173 if(fTracksMatched)delete fTracksMatched;
178 // assign or copy construct
180 *fLabels = *source.fLabels;
182 else fLabels = new TArrayI(*source.fLabels);
185 if(fLabels)delete fLabels;
190 if(source.fDigitAmplitude){
191 // assign or copy construct
192 if(fDigitAmplitude) *fDigitAmplitude = *source.fDigitAmplitude;
193 else fDigitAmplitude = new TArrayS(*source.fDigitAmplitude);
196 delete fDigitAmplitude;
202 if(source.fDigitTime){
203 // assign or copy construct
204 if(fDigitTime) *fDigitTime = *source.fDigitTime;
205 else fDigitTime = new TArrayS(*source.fDigitTime);
214 if(source.fDigitIndex){
215 // assign or copy construct
216 if(fDigitIndex) *fDigitIndex = *source.fDigitIndex;
217 else fDigitIndex = new TArrayS(*source.fDigitIndex);
228 void AliESDCaloCluster::Copy(TObject &obj) const {
230 // this overwrites the virtual TOBject::Copy()
231 // to allow run time copying without casting
234 if(this==&obj)return;
235 AliESDCaloCluster *robj = dynamic_cast<AliESDCaloCluster*>(&obj);
236 if(!robj)return; // not an AliESDCluster
241 //_______________________________________________________________________
242 AliESDCaloCluster::~AliESDCaloCluster(){
244 // This is destructor according Coding Conventions
246 if(fTracksMatched)delete fTracksMatched;fTracksMatched = 0;
247 if(fLabels) delete fLabels; fLabels = 0;
248 delete fDigitAmplitude; //not in use
249 delete fDigitTime; //not in use
250 delete fDigitIndex; //not in use
251 if(fCellsAmpFraction){ delete[] fCellsAmpFraction; fCellsAmpFraction=0;}
252 if(fCellsAbsId){ delete[] fCellsAbsId; fCellsAbsId = 0;}
255 //_______________________________________________________________________
256 void AliESDCaloCluster::SetPid(const Float_t *p) {
257 // Sets the probability of each particle type
258 // Copied from AliESDtrack SetPIDValues
259 // This function copies "n" PID weights from "scr" to "dest"
260 // and normalizes their sum to 1 thus producing conditional
262 // The negative weights are set to 0.
263 // In case all the weights are non-positive they are replaced by
264 // uniform probabilities
266 Int_t n = AliPID::kSPECIESN;
268 Float_t uniform = 1./(Float_t)n;
271 for (Int_t i=0; i<n; i++)
281 for (Int_t i=0; i<n; i++) fPID[i] /= sum;
283 for (Int_t i=0; i<n; i++) fPID[i] = uniform;
287 //_______________________________________________________________________
288 void AliESDCaloCluster::GetMomentum(TLorentzVector& p, Double_t *vertex ) {
289 // Returns TLorentzVector with momentum of the cluster. Only valid for clusters
290 // identified as photons or pi0 (overlapped gamma) produced on the vertex
291 //Vertex can be recovered with esd pointer doing:
292 //" Double_t vertex[3] ; esd->GetVertex()->GetXYZ(vertex) ; "
294 if(vertex){//calculate direction from vertex
295 fGlobalPos[0]-=vertex[0];
296 fGlobalPos[1]-=vertex[1];
297 fGlobalPos[2]-=vertex[2];
300 Double_t r = TMath::Sqrt(fGlobalPos[0]*fGlobalPos[0]+
301 fGlobalPos[1]*fGlobalPos[1]+
302 fGlobalPos[2]*fGlobalPos[2] ) ;
304 p.SetPxPyPzE( fEnergy*fGlobalPos[0]/r, fEnergy*fGlobalPos[1]/r, fEnergy*fGlobalPos[2]/r, fEnergy) ;
308 //_______________________________________________________________________
309 void AliESDCaloCluster::SetCellsAbsId(UShort_t *array)
311 // Set the array of cell absId numbers
313 fCellsAbsId = new UShort_t[fNCells];
314 for (Int_t i = 0; i < fNCells; i++) fCellsAbsId[i] = array[i];
318 //_______________________________________________________________________
319 void AliESDCaloCluster::SetCellsAmplitudeFraction(Double32_t *array)
321 // Set the array of cell amplitude fraction
323 fCellsAmpFraction = new Double32_t[fNCells];
324 for (Int_t i = 0; i < fNCells; i++) fCellsAmpFraction[i] = array[i];