Line data Source code
1 : #ifndef AliAODEvent_H
2 : #define AliAODEvent_H
3 : /* Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
4 : * See cxx source for full Copyright notice */
5 :
6 : /* $Id$ */
7 :
8 : //-------------------------------------------------------------------------
9 : // AOD base class
10 : // Author: Markus Oldenburg, CERN
11 : //-------------------------------------------------------------------------
12 :
13 : #include <TBuffer.h>
14 : #include <TClonesArray.h>
15 : #include <TList.h>
16 : #include <TTree.h>
17 : #include <TNamed.h>
18 :
19 : #include "AliVEvent.h"
20 : #include "AliVParticle.h"
21 : #include "AliVHeader.h"
22 : #include "AliAODHeader.h"
23 : #include "AliNanoAODHeader.h"
24 : #include "AliAODTrack.h"
25 : #include "AliAODVertex.h"
26 : #include "AliAODv0.h"
27 : #include "AliAODcascade.h"
28 : #include "AliAODTracklets.h"
29 : #include "AliAODJet.h"
30 : #include "AliAODCaloCells.h"
31 : #include "AliAODCaloCluster.h"
32 : #include "AliAODCaloTrigger.h"
33 : #include "AliAODPmdCluster.h"
34 : #include "AliAODFmdCluster.h"
35 : #include "AliAODDimuon.h"
36 : #include "AliAODTZERO.h"
37 : #include "AliAODVZERO.h"
38 : #include "AliAODHMPIDrings.h"
39 : #include "AliAODZDC.h"
40 : #include "AliAODAD.h"
41 : #include "AliAODTrdTrack.h"
42 :
43 : class TTree;
44 : class TFolder;
45 : class AliCentrality;
46 : class AliEventplane;
47 :
48 : class AliAODEvent : public AliVEvent {
49 :
50 : public :
51 : enum AODListIndex_t {kAODHeader,
52 : kAODTracks,
53 : kAODVertices,
54 : kAODv0,
55 : kAODcascade,
56 : kAODTracklets,
57 : kAODJets,
58 : kAODEmcalCells,
59 : kAODPhosCells,
60 : kAODCaloClusters,
61 : kAODEMCALTrigger,
62 : kAODPHOSTrigger,
63 : kAODFmdClusters,
64 : kAODPmdClusters,
65 : kAODHMPIDrings,
66 : kAODDimuons,
67 : kAODTZERO,
68 : kAODVZERO,
69 : kAODZDC,
70 : kAODAD,
71 : kTOFHeader,
72 : kAODTrdTracks,
73 : kAODListN
74 : };
75 :
76 : AliAODEvent();
77 : virtual ~AliAODEvent();
78 :
79 : AliAODEvent(const AliAODEvent& aodevent);
80 : AliAODEvent& operator=(const AliAODEvent& aodevent);
81 :
82 : void AddObject(TObject *obj);
83 : void RemoveObject(TObject *obj);
84 : TObject *FindListObject(const char *objName) const;
85 8 : TList *GetList() const { return fAODObjects; }
86 0 : void SetConnected(Bool_t conn=kTRUE) {fConnected=conn;}
87 0 : Bool_t GetConnected() const {return fConnected;}
88 0 : Bool_t AreTracksConnected() const {return fTracksConnected;}
89 :
90 : // -- Header
91 32 : AliVHeader *GetHeader() const { return fHeader; }
92 : void AddHeader(const AliVHeader* hdx)
93 : {
94 0 : delete fHeader;
95 0 : if(dynamic_cast<const AliAODHeader*>(hdx)) {
96 0 : fHeader = new AliAODHeader(*(const AliAODHeader*)hdx);
97 0 : } else if (dynamic_cast<const AliNanoAODHeader*>(hdx)) {
98 0 : fHeader = new AliNanoAODHeader(*(const AliNanoAODHeader*)hdx);
99 0 : }
100 : else {
101 0 : AliError(Form("Unknown header type %s", hdx->ClassName()));
102 : }
103 0 : (fAODObjects->FirstLink())->SetObject(fHeader);
104 0 : }
105 :
106 0 : virtual Bool_t InitMagneticField() const {return fHeader ? fHeader->InitMagneticField() : kFALSE;}
107 :
108 0 : void SetDAQAttributes(UInt_t attributes) {if (fHeader) fHeader->SetDAQAttributes(attributes);}
109 0 : UInt_t GetDAQAttributes() const {return fHeader ? fHeader->GetDAQAttributes() : 0;}
110 : Bool_t IsIncompleteDAQ();
111 :
112 :
113 : // setters and getters for header information
114 0 : void SetRunNumber(Int_t n) {if (fHeader) fHeader->SetRunNumber(n);}
115 0 : void SetPeriodNumber(UInt_t n){if (fHeader) fHeader->SetPeriodNumber(n);}
116 0 : void SetOrbitNumber(UInt_t n) {if (fHeader) fHeader->SetOrbitNumber(n);}
117 0 : void SetBunchCrossNumber(UShort_t n) {if (fHeader) fHeader->SetBunchCrossNumber(n);}
118 0 : void SetMagneticField(Double_t mf){if (fHeader) fHeader->SetMagneticField(mf);}
119 0 : void SetMuonMagFieldScale(Double_t mf){if (fHeader) fHeader->SetMuonMagFieldScale(mf);}
120 0 : void SetDiamond(Float_t xy[2],Float_t cov[3]){if (fHeader) fHeader->SetDiamond(xy,cov);}
121 0 : void SetDiamondZ(Float_t z, Float_t sig2z){if (fHeader) fHeader->SetDiamondZ(z,sig2z);}
122 0 : Int_t GetRunNumber() const {return fHeader ? fHeader->GetRunNumber() : -999;}
123 0 : UInt_t GetPeriodNumber() const {return fHeader ? fHeader->GetPeriodNumber() : 0;}
124 0 : UInt_t GetOrbitNumber() const {return fHeader ? fHeader->GetOrbitNumber() : 0;}
125 0 : UShort_t GetBunchCrossNumber() const {return fHeader ? fHeader->GetBunchCrossNumber() : 0;}
126 0 : Double_t GetMagneticField() const {return fHeader ? fHeader->GetMagneticField() : -999.;}
127 0 : Double_t GetMuonMagFieldScale() const {return fHeader ? fHeader->GetMuonMagFieldScale() : -999.;}
128 0 : Double_t GetDiamondX() const {return fHeader ? fHeader->GetDiamondX() : -999.;}
129 0 : Double_t GetDiamondY() const {return fHeader ? fHeader->GetDiamondY() : -999.;}
130 0 : Double_t GetDiamondZ() const {return fHeader ? fHeader->GetDiamondZ() : -999.;}
131 0 : void GetDiamondCovXY(Float_t cov[3]) const {cov[0]=-999.; if(fHeader) fHeader->GetDiamondCovXY(cov);}
132 0 : Double_t GetSigma2DiamondX() const {return fHeader ? fHeader->GetSigma2DiamondX() : -999.;}
133 0 : Double_t GetSigma2DiamondY() const {return fHeader ? fHeader->GetSigma2DiamondY() : -999.;}
134 0 : Double_t GetSigma2DiamondZ() const {return fHeader ? fHeader->GetSigma2DiamondZ() : -999.;}
135 :
136 0 : void SetEventType(UInt_t eventType){fHeader->SetEventType(eventType);}
137 0 : void SetTriggerMask(ULong64_t n) {fHeader->SetTriggerMask(n);}
138 0 : void SetTriggerCluster(UChar_t n) {fHeader->SetTriggerCluster(n);}
139 :
140 0 : UInt_t GetEventType() const { return fHeader ? fHeader->GetEventType() : 0;}
141 0 : ULong64_t GetTriggerMask() const { return fHeader ? fHeader->GetTriggerMask() : 0;}
142 0 : UChar_t GetTriggerCluster() const { return fHeader ? fHeader->GetTriggerCluster() : 0;}
143 0 : TString GetFiredTriggerClasses()const { return fHeader->GetFiredTriggerClasses();};
144 0 : Double_t GetZDCN1Energy() const { return fHeader ? fHeader->GetZDCN1Energy() : -999.; }
145 0 : Double_t GetZDCP1Energy() const { return fHeader ? fHeader->GetZDCP1Energy() : -999.; }
146 0 : Double_t GetZDCN2Energy() const { return fHeader ? fHeader->GetZDCN2Energy() : -999.; }
147 0 : Double_t GetZDCP2Energy() const { return fHeader ? fHeader->GetZDCP2Energy() : -999.; }
148 0 : Double_t GetZDCEMEnergy(Int_t i) const { return fHeader ? fHeader->GetZDCEMEnergy(i) : -999.; }
149 0 : Int_t GetNumberOfESDTracks() const { return fHeader ? fHeader->GetNumberOfESDTracks() : 0; }
150 0 : Int_t GetNumberOfITSClusters(Int_t lr) const {return fHeader ? (int)fHeader->GetNumberOfITSClusters(lr) : 0;}
151 : void SetTOFHeader(const AliTOFHeader * tofEventTime);
152 0 : const AliTOFHeader *GetTOFHeader() const {return fTOFHeader;}
153 0 : Float_t GetEventTimeSpread() const {if (fTOFHeader) return fTOFHeader->GetT0spread(); else return 0.;}
154 0 : Float_t GetTOFTimeResolution() const {if (fTOFHeader) return fTOFHeader->GetTOFResolution(); else return 0.;}
155 0 : Float_t GetT0spread(Int_t i) const {return fHeader->GetT0spread(i);}
156 :
157 :
158 : // -- Tracks
159 266 : TClonesArray *GetTracks() const { return fTracks; }
160 : void ConnectTracks();
161 292 : Int_t GetNumberOfTracks() const { return fTracks? fTracks->GetEntriesFast() : 0; }
162 824 : AliVTrack *GetTrack(Int_t nTrack) const { return fTracks ? (AliVTrack*)fTracks->UncheckedAt(nTrack):0; }
163 : Int_t AddTrack(const AliAODTrack* trk);
164 : Int_t GetMuonTracks(TRefArray *muonTracks) const;
165 : Int_t GetNumberOfMuonTracks() const;
166 : Int_t GetMuonGlobalTracks(TRefArray *muonGlobalTracks) const; // AU
167 : Int_t GetNumberOfMuonGlobalTracks() const; // AU
168 :
169 : // -- Vertex
170 104 : TClonesArray *GetVertices() const { return fVertices; }
171 32 : Int_t GetNumberOfVertices() const { return fVertices?fVertices->GetEntriesFast():0; }
172 240 : AliAODVertex *GetVertex(Int_t nVertex) const { return fVertices?(AliAODVertex*)fVertices->At(nVertex):0; }
173 : Int_t AddVertex(const AliAODVertex* vtx)
174 0 : {new((*fVertices)[fVertices->GetEntriesFast()]) AliAODVertex(*vtx); return fVertices->GetEntriesFast()-1;}
175 :
176 : // primary vertex
177 : using AliVEvent::GetPrimaryVertex;
178 : using AliVEvent::GetPrimaryVertexSPD;
179 : using AliVEvent::GetPrimaryVertexTPC;
180 32 : virtual AliAODVertex *GetPrimaryVertex() const { return GetVertex(0); }
181 : virtual AliAODVertex *GetPrimaryVertexSPD() const;
182 0 : virtual AliAODVertex *GetVertex() const { return GetPrimaryVertexSPD(); }
183 : virtual AliAODVertex *GetPrimaryVertexTPC() const;
184 :
185 : // -- Pileup vertices
186 : Int_t GetNumberOfPileupVerticesTracks() const;
187 : Int_t GetNumberOfPileupVerticesSPD() const;
188 : virtual AliAODVertex *GetPileupVertexSPD(Int_t iV=0) const;
189 : virtual AliAODVertex *GetPileupVertexTracks(Int_t iV=0) const;
190 : virtual Bool_t IsPileupFromSPD(Int_t minContributors=3, Double_t minZdist=0.8, Double_t nSigmaZdist=3., Double_t nSigmaDiamXY=2., Double_t nSigmaDiamZ=5.) const;
191 : virtual Bool_t IsPileupFromSPDInMultBins() const;
192 :
193 :
194 : // V0
195 48 : TClonesArray *GetV0s() const { return fV0s; }
196 0 : Int_t GetNumberOfV0s() const { return fV0s->GetEntriesFast(); }
197 : using AliVEvent::GetV0;
198 0 : AliAODv0 *GetV0(Int_t nV0) const { return (AliAODv0*)fV0s->UncheckedAt(nV0); }
199 : Int_t AddV0(const AliAODv0* v0)
200 0 : {new((*fV0s)[fV0s->GetEntriesFast()]) AliAODv0(*v0); return fV0s->GetEntriesFast()-1;}
201 :
202 : // Cascades
203 32 : TClonesArray *GetCascades() const { return fCascades; }
204 0 : Int_t GetNumberOfCascades() const { return fCascades->GetEntriesFast(); }
205 0 : AliAODcascade *GetCascade(Int_t nCasc) const { return (AliAODcascade*)fCascades->UncheckedAt(nCasc); }
206 : Int_t AddCascade(const AliAODcascade* cascade)
207 0 : {new((*fCascades)[fCascades->GetEntriesFast()]) AliAODcascade(*cascade); return fCascades->GetEntriesFast()-1;}
208 :
209 : // -- EMCAL and PHOS Cluster
210 24 : TClonesArray *GetCaloClusters() const { return fCaloClusters; }
211 512 : Int_t GetNumberOfCaloClusters() const { return fCaloClusters?fCaloClusters->GetEntriesFast():0; }
212 432 : AliAODCaloCluster *GetCaloCluster(Int_t nCluster) const { return fCaloClusters?(AliAODCaloCluster*)fCaloClusters->UncheckedAt(nCluster):0x0; }
213 : Int_t AddCaloCluster(const AliAODCaloCluster* clus)
214 0 : {new((*fCaloClusters)[fCaloClusters->GetEntriesFast()]) AliAODCaloCluster(*clus); return fCaloClusters->GetEntriesFast()-1;}
215 : AliAODCaloTrigger *GetCaloTrigger(TString calo) const
216 : {
217 40 : if (calo.Contains("EMCAL")) return fEMCALTrigger;
218 : else
219 8 : return fPHOSTrigger;
220 16 : }
221 :
222 : Int_t GetEMCALClusters(TRefArray *clusters) const;
223 : Int_t GetPHOSClusters(TRefArray *clusters) const;
224 :
225 :
226 : // -- FMD Cluster
227 0 : TClonesArray *GetFmdClusters() const { return fFmdClusters; }
228 0 : Int_t GetNFmdClusters() const { return fFmdClusters->GetEntriesFast(); }
229 0 : AliAODFmdCluster *GetFmdCluster(Int_t nCluster) const { return (AliAODFmdCluster*)fFmdClusters->UncheckedAt(nCluster); }
230 : Int_t AddFmdCluster(const AliAODFmdCluster* clus)
231 0 : {new((*fFmdClusters)[fFmdClusters->GetEntriesFast()]) AliAODFmdCluster(*clus); return fFmdClusters->GetEntriesFast()-1;}
232 :
233 : // -- PMD Cluster
234 16 : TClonesArray *GetPmdClusters() const { return fPmdClusters; }
235 0 : Int_t GetNPmdClusters() const { return fPmdClusters->GetEntriesFast(); }
236 0 : AliAODPmdCluster *GetPmdCluster(Int_t nCluster) const { return (AliAODPmdCluster*)fPmdClusters->UncheckedAt(nCluster); }
237 : Int_t AddPmdCluster(const AliAODPmdCluster* clus)
238 0 : {new((*fPmdClusters)[fPmdClusters->GetEntriesFast()]) AliAODPmdCluster(*clus); return fPmdClusters->GetEntriesFast()-1;}
239 :
240 : // -- HMPID objects
241 16 : TClonesArray *GetHMPIDrings() const {return fHMPIDrings; }
242 : Int_t GetNHMPIDrings() const;
243 : AliAODHMPIDrings *GetHMPIDring(Int_t nRings) const;
244 : Int_t AddHMPIDrings(const AliAODHMPIDrings* ring)
245 0 : {new((*fHMPIDrings)[fHMPIDrings->GetEntriesFast()]) AliAODHMPIDrings(*ring); return fHMPIDrings->GetEntriesFast()-1;}
246 :
247 : AliAODHMPIDrings *GetHMPIDringForTrackID(Int_t trackID) const;
248 :
249 :
250 : // -- Jet
251 0 : TClonesArray *GetJets() const { return fJets; }
252 0 : Int_t GetNJets() const { return fJets?fJets->GetEntriesFast():0; }
253 0 : AliAODJet *GetJet(Int_t nJet) const { return fJets?(AliAODJet*)fJets->UncheckedAt(nJet):0; }
254 : Int_t AddJet(const AliAODJet* vtx)
255 0 : {new((*fJets)[fJets->GetEntriesFast()]) AliAODJet(*vtx); return fJets->GetEntriesFast()-1;}
256 :
257 : // -- Tracklets
258 24 : AliAODTracklets *GetTracklets() const { return fTracklets; }
259 0 : AliAODTracklets *GetMultiplicity() const {return GetTracklets();}
260 : // -- Calorimeter Cells
261 24 : AliAODCaloCells *GetEMCALCells() const { return fEmcalCells; }
262 24 : AliAODCaloCells *GetPHOSCells() const { return fPhosCells; }
263 0 : const TGeoHMatrix* GetPHOSMatrix(Int_t /*i*/) const { return NULL; }
264 0 : const TGeoHMatrix* GetEMCALMatrix(Int_t /*i*/)const { return NULL; }
265 :
266 :
267 : // -- Dimuons (\deprecated)
268 : TClonesArray *GetDimuons() const;
269 : Int_t GetNDimuons() const;
270 : Int_t GetNumberOfDimuons() const;
271 : AliAODDimuon *GetDimuon(Int_t nDimu) const;
272 : Int_t AddDimuon(const AliAODDimuon* dimu);
273 :
274 : // // -- TRD
275 0 : Int_t GetNumberOfTrdTracks() const { return fTrdTracks ? fTrdTracks->GetEntriesFast() : 0; }
276 : AliAODTrdTrack* GetTrdTrack(Int_t i) const {
277 0 : return (AliAODTrdTrack *) (fTrdTracks ? fTrdTracks->At(i) : 0x0);
278 : }
279 : AliAODTrdTrack& AddTrdTrack(const AliVTrdTrack *track);
280 :
281 : // -- Services
282 : void CreateStdContent();
283 : void SetStdNames();
284 : void GetStdContent();
285 : void CreateStdFolders();
286 : void ResetStd(Int_t trkArrSize = 0,
287 : Int_t vtxArrSize = 0,
288 : Int_t v0ArrSize = 0,
289 : Int_t cascadeArrSize = 0,
290 : Int_t jetSize = 0,
291 : Int_t caloClusSize = 0,
292 : Int_t fmdClusSize = 0,
293 : Int_t pmdClusSize = 0,
294 : Int_t hmpidRingsSize = 0,
295 : Int_t dimuonArrsize =0,
296 : Int_t nTrdTracks = 0
297 : );
298 : void ClearStd();
299 : void Reset();
300 : void ReadFromTree(TTree *tree, Option_t* opt = "");
301 0 : void WriteToTree(TTree* tree) const {tree->Branch(fAODObjects);}
302 :
303 : void Print(Option_t *option="") const;
304 : void MakeEntriesReferencable();
305 : static void AssignIDtoCollection(const TCollection* col);
306 :
307 : //Following needed only for mixed event
308 0 : virtual Int_t EventIndex(Int_t) const {return 0;}
309 0 : virtual Int_t EventIndexForCaloCluster(Int_t) const {return 0;}
310 0 : virtual Int_t EventIndexForPHOSCell(Int_t) const {return 0;}
311 0 : virtual Int_t EventIndexForEMCALCell(Int_t) const {return 0;}
312 0 : AliCentrality* GetCentrality() {return fHeader->GetCentralityP();}
313 0 : AliEventplane* GetEventplane() {return fHeader->GetEventplaneP();}
314 :
315 : // TZERO
316 16 : AliAODTZERO *GetTZEROData() const { return fAODTZERO; }
317 0 : Double32_t GetT0TOF(Int_t icase) const { return fAODTZERO?fAODTZERO->GetT0TOF(icase):999999;}
318 0 : const Double32_t * GetT0TOF() const { return fAODTZERO?fAODTZERO->GetT0TOF():0x0;}
319 :
320 : // VZERO
321 16 : AliAODVZERO *GetVZEROData() const { return fAODVZERO; }
322 0 : virtual const Float_t* GetVZEROEqFactors() const {return fHeader?fHeader->GetVZEROEqFactors():0x0;}
323 : virtual Float_t GetVZEROEqMultiplicity(Int_t i) const;
324 : virtual void SetVZEROEqFactors(Float_t factors[64]) const {
325 0 : if(fHeader)
326 0 : fHeader->SetVZEROEqFactors(factors);}
327 :
328 : //ZDC
329 16 : AliAODZDC *GetZDCData() const { return fAODZDC; }
330 :
331 : //AD
332 16 : AliAODAD *GetADData() const { return fAODAD; }
333 :
334 : virtual AliVEvent::EDataLayoutType GetDataLayoutType() const;
335 :
336 : private :
337 :
338 : TList *fAODObjects; // list of AODObjects
339 : TFolder *fAODFolder; // folder structure of branches
340 : Bool_t fConnected; //! flag if leaves are alreday connected
341 : Bool_t fTracksConnected; //! flag if tracks have already pointer to event set
342 : // standard content
343 : AliVAODHeader *fHeader; //! event information
344 : TClonesArray *fTracks; //! charged tracks
345 : TClonesArray *fVertices; //! vertices
346 : TClonesArray *fV0s; //! V0s
347 : TClonesArray *fCascades; //! Cascades
348 : AliAODTracklets *fTracklets; //! SPD tracklets
349 : TClonesArray *fJets; //! jets
350 : AliAODCaloCells *fEmcalCells; //! EMCAL calorimenter cells
351 : AliAODCaloCells *fPhosCells; //! PHOS calorimenter cells
352 : TClonesArray *fCaloClusters; //! calorimeter clusters
353 : AliAODCaloTrigger *fEMCALTrigger; //! EMCAL Trigger information
354 : AliAODCaloTrigger *fPHOSTrigger; //! PHOS Trigger information
355 : TClonesArray *fFmdClusters; //! FMDclusters
356 : TClonesArray *fPmdClusters; //! PMDclusters
357 : TClonesArray *fHMPIDrings; //! HMPID signals
358 : TClonesArray *fDimuons; //! dimuons
359 : AliAODTZERO *fAODTZERO; //! TZERO AOD
360 : AliAODVZERO *fAODVZERO; //! VZERO AOD
361 : AliAODZDC *fAODZDC; //! ZDC AOD
362 : AliAODAD *fAODAD; //! AD AOD
363 : AliTOFHeader *fTOFHeader; //! event times (and sigmas) as estimated by TOF
364 : // combinatorial algorithm.
365 : // It contains also TOF time resolution
366 : // and T0spread as written in OCDB
367 : TClonesArray *fTrdTracks; //! TRD AOD tracks (triggered)
368 :
369 : static const char* fAODListName[kAODListN]; //!
370 :
371 182 : ClassDef(AliAODEvent,94);
372 : };
373 :
374 : #endif
|