]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGDQ/dielectron/AliDielectronEvent.cxx
Change Mult binning scheme
[u/mrichter/AliRoot.git] / PWGDQ / dielectron / AliDielectronEvent.cxx
1 /*************************************************************************
2 * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
3 *                                                                        *
4 * Author: The ALICE Off-line Project.                                    *
5 * Contributors are mentioned in the code where appropriate.              *
6 *                                                                        *
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 **************************************************************************/
15
16 ///////////////////////////////////////////////////////////////////////////
17 //                Dielectron Event                                  //
18 //                                                                       //
19 //                                                                       //
20 /*
21 Detailed description
22
23
24 */
25 //                                                                       //
26 ///////////////////////////////////////////////////////////////////////////
27
28 #include <TObjArray.h>
29 #include <TExMap.h>
30 #include <TProcessID.h>
31
32 #include <AliVTrack.h>
33 #include <AliESDtrack.h>
34 #include <AliAODTrack.h>
35
36 #include "AliDielectronEvent.h"
37
38 ClassImp(AliDielectronEvent)
39
40 AliDielectronEvent::AliDielectronEvent() :
41   TNamed(),
42   fArrTrackP(),
43   fArrTrackN(),
44   fArrVertex("AliAODVertex",1000),
45   fArrPairs("AliKFParticle",0),
46   fNTracksP(0),
47   fNTracksN(0),
48   fIsAOD(kFALSE),
49   fEventData(),
50   fPID(0x0),
51   fPIDIndex(0)
52 {
53   //
54   // Default Constructor
55   //
56   
57 }
58
59 //______________________________________________
60 AliDielectronEvent::AliDielectronEvent(const char* name, const char* title) :
61   TNamed(name, title),
62   fArrTrackP(),
63   fArrTrackN(),
64   fArrVertex("AliAODVertex",1000),
65   fArrPairs("AliKFParticle",0),
66   fNTracksP(0),
67   fNTracksN(0),
68   fIsAOD(kFALSE),
69   fEventData(),
70   fPID(0x0),
71   fPIDIndex(0)
72 {
73   //
74   // Named Constructor
75   //
76 }
77
78 //______________________________________________
79 AliDielectronEvent::~AliDielectronEvent()
80 {
81   //
82   // Default Destructor
83   //
84   fArrTrackP.Delete();
85   fArrTrackN.Delete();
86   fArrVertex.Delete();
87   fArrPairs.Delete();
88 }
89
90 //______________________________________________
91 void AliDielectronEvent::SetTracks(const TObjArray &arrP, const TObjArray &arrN, const TObjArray &/*arrPairs*/)
92 {
93   //
94   // Setup AliKFParticles
95   // assumes that the objects in arrP and arrN are AliVTracks
96   //
97
98   //Clear out old entries before filling new ones
99   Clear();
100   // we keep the tracks buffered to minimise new / delete operations
101   fNTracksN=0;
102   fNTracksP=0;
103
104   //check size of the arrays
105   if (fArrTrackP.GetSize()<arrP.GetSize()) {
106     fArrTrackP.Expand(arrP.GetSize());
107   }
108   if (fArrTrackN.GetSize()<arrN.GetSize()) {
109     fArrTrackN.Expand(arrN.GetSize());
110   }
111
112   TExMap mapStoredVertices;
113   fPIDIndex=TProcessID::GetPIDs()->IndexOf(fPID);
114   // fill particles
115   Int_t tracks=0;
116   for (Int_t itrack=0; itrack<arrP.GetEntriesFast(); ++itrack){
117     if (!fIsAOD){
118       AliESDtrack *track=dynamic_cast<AliESDtrack*>(arrP.At(itrack));
119       if (!track) continue;
120       new (fArrTrackP[tracks]) AliESDtrack(*track);
121       ++tracks;
122     } else {
123       AliAODTrack *track=dynamic_cast<AliAODTrack*>(arrP.At(itrack));
124       if (!track) continue;
125
126       // buffer track
127       AliAODTrack   *ctrack = new (fArrTrackP[tracks]) AliAODTrack(*track);
128
129       // buffer vertex, don't duplicate
130       // most particles will be assiciated to the primary vertex ...
131       AliAODVertex *vtx=track->GetProdVertex();
132       AliAODVertex *cvertex = 0x0;
133       if (vtx){
134         cvertex = reinterpret_cast<AliAODVertex*>(mapStoredVertices.GetValue(reinterpret_cast<ULong64_t>(vtx)));
135         if (!cvertex) {
136           if (mapStoredVertices.Capacity()<=mapStoredVertices.GetSize()) mapStoredVertices.Expand(2*mapStoredVertices.GetSize());
137           if (fArrVertex.GetSize()<=fArrVertex.GetEntriesFast()) fArrVertex.Expand(2*fArrVertex.GetSize());
138           cvertex = new (fArrVertex[fArrVertex.GetEntriesFast()]) AliAODVertex(*vtx);
139           AssignID(cvertex);
140           mapStoredVertices.Add(reinterpret_cast<ULong64_t>(vtx),reinterpret_cast<ULong64_t>(cvertex));
141         }
142       }
143       ctrack->SetProdVertex(cvertex);
144       ++tracks;
145     }
146   }
147   fNTracksP=tracks;
148
149   tracks=0;
150   for (Int_t itrack=0; itrack<arrN.GetEntriesFast(); ++itrack){
151     if (!fIsAOD){
152       AliESDtrack *track=dynamic_cast<AliESDtrack*>(arrN.At(itrack));
153       if (!track) continue;
154       new (fArrTrackN[tracks]) AliESDtrack(*track);
155       ++tracks;
156     } else {
157       AliAODTrack *track=dynamic_cast<AliAODTrack*>(arrN.At(itrack));
158       if (!track) continue;
159
160       //buffer track
161       AliAODTrack   *ctrack = new (fArrTrackN[tracks]) AliAODTrack(*track);
162       
163       // buffer vertex, don't duplicate
164       // most particles will be assiciated to the primary vertex ...
165       AliAODVertex *vtx=track->GetProdVertex();
166       AliAODVertex *cvertex = 0x0;
167       if (vtx){
168         cvertex = reinterpret_cast<AliAODVertex*>(mapStoredVertices.GetValue(reinterpret_cast<ULong64_t>(vtx)));
169         if (!cvertex) {
170           if (mapStoredVertices.Capacity()<=mapStoredVertices.GetSize()) mapStoredVertices.Expand(2*mapStoredVertices.GetSize());
171           if (fArrVertex.GetSize()<=fArrVertex.GetEntriesFast()) fArrVertex.Expand(2*fArrVertex.GetSize());
172           cvertex = new (fArrVertex[fArrVertex.GetEntriesFast()]) AliAODVertex(*vtx);
173           AssignID(cvertex);
174           mapStoredVertices.Add(reinterpret_cast<ULong64_t>(vtx),reinterpret_cast<ULong64_t>(cvertex));
175         }
176       }
177       ctrack->SetProdVertex(cvertex);
178       ++tracks;
179     }
180   }
181   fNTracksN=tracks;
182
183   //TODO: pair arrays
184 }
185
186 //______________________________________________
187 void AliDielectronEvent::Clear(Option_t *opt)
188 {
189   //
190   // clear arrays
191   //
192 //   fArrTrackP.Clear(opt);
193 //   fArrTrackN.Clear(opt);
194
195   for (Int_t i=fArrTrackP.GetEntriesFast()-1; i>=0; --i){
196     delete fArrTrackP.RemoveAt(i);
197   }
198   
199   for (Int_t i=fArrTrackN.GetEntriesFast()-1; i>=0; --i){
200     delete fArrTrackN.RemoveAt(i);
201   }
202
203   for (Int_t i=0; i<fArrVertex.GetEntriesFast(); ++i){
204     delete fArrVertex.RemoveAt(i);
205   }
206   
207   fArrPairs.Clear(opt);
208 }
209
210 //______________________________________________
211 void AliDielectronEvent::SetAOD()
212 {
213   //
214   // use AOD as input
215   //
216   fArrTrackP.SetClass("AliAODTrack",1000);
217   fArrTrackN.SetClass("AliAODTrack",1000);
218   fIsAOD=kTRUE;
219 }
220
221 //______________________________________________
222 void AliDielectronEvent::SetESD()
223 {
224   //
225   // use ESD as input
226   //
227   fArrTrackP.SetClass("AliESDtrack",1000);
228   fArrTrackN.SetClass("AliESDtrack",1000);
229   fIsAOD=kFALSE;
230 }
231
232 //______________________________________________
233 void AliDielectronEvent::SetEventData(const Double_t data[AliDielectronVarManager::kNMaxValues])
234 {
235   //
236   // copy only evnet variables
237   //
238   for (Int_t i=AliDielectronVarManager::kPairMax; i<AliDielectronVarManager::kNMaxValues;++i) fEventData[i]=data[i];
239 }
240
241 //______________________________________________
242 void AliDielectronEvent::AssignID(TObject *obj)
243 {
244   //
245   // Custom function to assign a uid to an object with an own process id
246   // to avoid problems buffering the vertices
247   //
248   UInt_t uid=1;
249   if (fPID->GetObjects()) uid=fPID->GetObjects()->GetEntriesFast();
250   uid+=(fPIDIndex<<24);
251   obj->SetBit(kIsReferenced);
252   obj->SetUniqueID(uid);
253   fPID->PutObjectWithID(obj);
254 }