]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG2/FEMTOSCOPY/AliFemto/AliFemtoEvent.cxx
004edf006a29822feb63dd576abda098081798d2
[u/mrichter/AliRoot.git] / PWG2 / FEMTOSCOPY / AliFemto / AliFemtoEvent.cxx
1 ///////////////////////////////////////////////////////////////////////////
2 //                                                                       //
3 //  AliFemtoEvent: hold the information specific to the event and a      //
4 //  track list                                                           //
5 //  AliFemtoEvent is the "transient microDST"  Objects of this class are //
6 //   generated from the input data by a Reader, and then presented to    //
7 //   the Cuts of the various active Analyses.                            //
8 //                                                                       //
9 ///////////////////////////////////////////////////////////////////////////
10 #include "AliFemtoEvent.h"
11 #include "AliFemtoTrack.h"
12 #include "AliFemtoV0.h"
13 #include "AliFemtoXi.h"
14 #include "AliFemtoKink.h"
15 #include "AliFemtoTrackCut.h"
16 #include "AliFemtoV0Cut.h"
17 #include "AliFemtoXiCut.h"
18 #include "AliFemtoKinkCut.h"
19 #include "PhysicalConstants.h"
20 #include "SystemOfUnits.h"
21
22 // Mike removed all of the AliFemtoTTree stuff here 21apr2006 - it was not used for a long time.
23
24
25
26 //___________________
27 AliFemtoEvent::AliFemtoEvent():
28   fEventNumber(0),
29   fRunNumber(0),
30   fNumberOfTracks(0),
31   fMagneticField(0),
32   fIsCollisionCandidate(kTRUE),
33   fPrimVertPos(0,0,0),
34   fPrimVertCov(),
35   fTrackCollection(0),
36   fV0Collection(0),
37   fXiCollection(0),
38   fKinkCollection(0),
39   fZDCN1Energy(0),   
40   fZDCP1Energy(0),   
41   fZDCN2Energy(0),   
42   fZDCP2Energy(0),   
43   fZDCEMEnergy(0),   
44   fZDCParticipants(0),
45   fTriggerMask(0),  
46   fTriggerCluster(0),
47   fReactionPlaneAngle(0)
48 {
49   // Default constructor
50   fPrimVertPos[0]=-999.0;
51   fPrimVertPos[1]=-999.0;
52   fPrimVertPos[2]=-999.0;
53   fPrimVertCov[0]=0.000000000001;
54   fPrimVertCov[1]=0.000000000001;
55   fPrimVertCov[2]=0.000000000001;
56   fPrimVertCov[3]=0.000000000001;
57   fPrimVertCov[4]=0.000000000001;
58   fPrimVertCov[5]=0.000000000001;
59   fTrackCollection = new AliFemtoTrackCollection;
60   fV0Collection = new AliFemtoV0Collection;
61   fXiCollection = new AliFemtoXiCollection;
62   fKinkCollection = new AliFemtoKinkCollection;
63   fMagneticField=0.0;
64 }
65 //___________________
66 AliFemtoEvent::AliFemtoEvent(const AliFemtoEvent& ev, AliFemtoTrackCut* tCut, AliFemtoV0Cut* vCut, AliFemtoXiCut* xCut, AliFemtoKinkCut* kCut):
67   fEventNumber(0),
68   fRunNumber(0),
69   fNumberOfTracks(0),
70   fMagneticField(0),
71   fIsCollisionCandidate(kTRUE),
72   fPrimVertPos(0,0,0),
73   fPrimVertCov(),
74   fTrackCollection(0),
75   fV0Collection(0),
76   fXiCollection(0),
77   fKinkCollection(0),
78   fZDCN1Energy(0),   
79   fZDCP1Energy(0),   
80   fZDCN2Energy(0),   
81   fZDCP2Energy(0),   
82   fZDCEMEnergy(0),   
83   fZDCParticipants(0),
84   fTriggerMask(0),  
85   fTriggerCluster(0),
86   fReactionPlaneAngle(0)
87 { // copy constructor with track and v0 cuts
88   //cout << "AliFemtoEvent::AliFemtoEvent(const AliFemtoEvent& ev, AliFemtoTrackCut* tCut, AliFemtoV0Cut* vCut, AliFemtoV0Cut* kCut)" << endl;
89   fEventNumber = ev.fEventNumber;
90   fRunNumber = ev.fRunNumber;
91   
92   SetPrimVertCov(ev.PrimVertCov());
93
94   fZDCN1Energy=ev.fZDCN1Energy;     
95   fZDCP1Energy=ev.fZDCP1Energy;      
96   fZDCN2Energy=ev.fZDCN2Energy;      
97   fZDCP2Energy=ev.fZDCP2Energy;      
98   fZDCEMEnergy=ev.fZDCEMEnergy;
99   fZDCParticipants=ev.fZDCParticipants;
100   fNumberOfTracks = ev.fNumberOfTracks;
101   fMagneticField= ev.fMagneticField;
102   fIsCollisionCandidate = ev.fIsCollisionCandidate;
103
104   fTriggerMask=ev.fTriggerMask;     // Trigger Type (mask)
105   fTriggerCluster=ev.fTriggerCluster;
106   fReactionPlaneAngle=ev.fReactionPlaneAngle;
107
108   // create collections
109   fTrackCollection = new AliFemtoTrackCollection;
110   fV0Collection = new AliFemtoV0Collection;
111   fXiCollection = new AliFemtoXiCollection;
112   fKinkCollection = new AliFemtoKinkCollection;
113   // copy track collection  
114   for ( AliFemtoTrackIterator tIter=ev.fTrackCollection->begin(); tIter!=ev.fTrackCollection->end(); tIter++) {
115     if ( !tCut || tCut->Pass(*tIter) ) {
116       AliFemtoTrack* trackCopy = new AliFemtoTrack(**tIter);
117       fTrackCollection->push_back(trackCopy);
118     }
119   }
120   // copy v0 collection
121   for ( AliFemtoV0Iterator vIter=ev.fV0Collection->begin(); vIter!=ev.fV0Collection->end(); vIter++) {
122     if ( !vCut || vCut->Pass(*vIter) ) {
123       AliFemtoV0* v0Copy = new AliFemtoV0(**vIter);
124       fV0Collection->push_back(v0Copy);
125     }
126   }
127   // copy xi collection
128   for ( AliFemtoXiIterator xIter=ev.fXiCollection->begin(); xIter!=ev.fXiCollection->end(); xIter++) {
129     if ( !xCut || xCut->Pass(*xIter) ) {
130       AliFemtoXi* xiCopy = new AliFemtoXi(**xIter);
131       fXiCollection->push_back(xiCopy);
132     }
133   }
134   // copy kink collection  
135   for ( AliFemtoKinkIterator kIter=ev.fKinkCollection->begin(); kIter!=ev.fKinkCollection->end(); kIter++) {
136     if ( !kCut || kCut->Pass(*kIter) ) {
137       //cout << " kinkCut passed " << endl;
138       AliFemtoKink* kinkCopy = new AliFemtoKink(**kIter);
139       fKinkCollection->push_back(kinkCopy);
140     }
141   }
142 }
143 //___________________
144 AliFemtoEvent::AliFemtoEvent(const AliFemtoEvent& ev):
145   fEventNumber(0),
146   fRunNumber(0),
147   fNumberOfTracks(0),
148   fMagneticField(0),
149   fIsCollisionCandidate(kTRUE),
150   fPrimVertPos(0,0,0),
151   fPrimVertCov(),
152   fTrackCollection(0),
153   fV0Collection(0),
154   fXiCollection(0),
155   fKinkCollection(0),
156   fZDCN1Energy(0),   
157   fZDCP1Energy(0),   
158   fZDCN2Energy(0),   
159   fZDCP2Energy(0),   
160   fZDCEMEnergy(0),   
161   fZDCParticipants(0),
162   fTriggerMask(0),  
163   fTriggerCluster(0),
164   fReactionPlaneAngle(0)
165
166   // copy constructor 
167   fEventNumber = ev.fEventNumber;
168   fRunNumber = ev.fRunNumber;
169   
170   SetPrimVertCov(ev.PrimVertCov());
171
172   fZDCN1Energy=ev.fZDCN1Energy;     
173   fZDCP1Energy=ev.fZDCP1Energy;      
174   fZDCN2Energy=ev.fZDCN2Energy;      
175   fZDCP2Energy=ev.fZDCP2Energy;      
176   fZDCEMEnergy=ev.fZDCEMEnergy;
177   fZDCParticipants=ev.fZDCParticipants;
178   fNumberOfTracks = ev.fNumberOfTracks;
179   fMagneticField= ev.fMagneticField;
180   fIsCollisionCandidate = ev.fIsCollisionCandidate;
181   fTriggerMask=ev.fTriggerMask;     // Trigger Type (mask)
182   fTriggerCluster=ev.fTriggerCluster;
183   fReactionPlaneAngle=ev.fReactionPlaneAngle;
184   // create collections
185   fTrackCollection = new AliFemtoTrackCollection;
186   fV0Collection = new AliFemtoV0Collection;
187   fXiCollection = new AliFemtoXiCollection;
188   fKinkCollection = new AliFemtoKinkCollection;
189   // copy track collection  
190   for ( AliFemtoTrackIterator tIter=ev.fTrackCollection->begin(); tIter!=ev.fTrackCollection->end(); tIter++) {
191     AliFemtoTrack* trackCopy = new AliFemtoTrack(**tIter);
192     fTrackCollection->push_back(trackCopy);
193   }
194   // copy v0 collection
195   for ( AliFemtoV0Iterator vIter=ev.fV0Collection->begin(); vIter!=ev.fV0Collection->end(); vIter++) {
196     AliFemtoV0* v0Copy = new AliFemtoV0(**vIter);
197     fV0Collection->push_back(v0Copy);
198   }
199   // copy xi collection
200   for ( AliFemtoXiIterator xIter=ev.fXiCollection->begin(); xIter!=ev.fXiCollection->end(); xIter++) {
201     AliFemtoXi* xiCopy = new AliFemtoXi(**xIter);
202     fXiCollection->push_back(xiCopy);
203   }
204   // copy kink collection  
205   for ( AliFemtoKinkIterator kIter=ev.fKinkCollection->begin(); kIter!=ev.fKinkCollection->end(); kIter++) {
206     //cout << " kinkCut passed " << endl;
207     AliFemtoKink* kinkCopy = new AliFemtoKink(**kIter);
208     fKinkCollection->push_back(kinkCopy);
209   }
210 }
211 //______________________________
212 AliFemtoEvent& AliFemtoEvent::operator=(const AliFemtoEvent& aEvent)
213 {
214   // assignment operator
215   if (this == &aEvent)
216     return *this;
217
218   fEventNumber = aEvent.fEventNumber;
219   fRunNumber = aEvent.fRunNumber;
220   
221   fZDCN1Energy=aEvent.fZDCN1Energy;     
222   fZDCP1Energy=aEvent.fZDCP1Energy;      
223   fZDCN2Energy=aEvent.fZDCN2Energy;      
224   fZDCP2Energy=aEvent.fZDCP2Energy;      
225   fZDCEMEnergy=aEvent.fZDCEMEnergy;
226   fZDCParticipants=aEvent.fZDCParticipants;
227   fNumberOfTracks = aEvent.fNumberOfTracks;
228   fMagneticField= aEvent.fMagneticField;
229   fIsCollisionCandidate = aEvent.fIsCollisionCandidate;
230
231   fTriggerMask=aEvent.fTriggerMask;     // Trigger Type (mask)
232   fTriggerCluster=aEvent.fTriggerCluster;
233   fReactionPlaneAngle=aEvent.fReactionPlaneAngle;
234   // create collections
235   fTrackCollection = new AliFemtoTrackCollection;
236   fV0Collection = new AliFemtoV0Collection;
237   fXiCollection = new AliFemtoXiCollection;
238   fKinkCollection = new AliFemtoKinkCollection;
239   // copy track collection  
240   for ( AliFemtoTrackIterator tIter=aEvent.fTrackCollection->begin(); tIter!=aEvent.fTrackCollection->end(); tIter++) {
241     AliFemtoTrack* trackCopy = new AliFemtoTrack(**tIter);
242     fTrackCollection->push_back(trackCopy);
243   }
244   // copy v0 collection
245   for ( AliFemtoV0Iterator vIter=aEvent.fV0Collection->begin(); vIter!=aEvent.fV0Collection->end(); vIter++) {
246     AliFemtoV0* v0Copy = new AliFemtoV0(**vIter);
247     fV0Collection->push_back(v0Copy);
248   }
249   // copy xi collection
250   for ( AliFemtoXiIterator xIter=aEvent.fXiCollection->begin(); xIter!=aEvent.fXiCollection->end(); xIter++) {
251     AliFemtoXi* xiCopy = new AliFemtoXi(**xIter);
252     fXiCollection->push_back(xiCopy);
253   }
254   // copy kink collection  
255   for ( AliFemtoKinkIterator kIter=aEvent.fKinkCollection->begin(); kIter!=aEvent.fKinkCollection->end(); kIter++) {
256     AliFemtoKink* kinkCopy = new AliFemtoKink(**kIter);
257     fKinkCollection->push_back(kinkCopy);
258   }
259
260   return *this;
261 }
262
263 //___________________
264 AliFemtoEvent::~AliFemtoEvent(){
265   // destructor
266 #ifdef STHBTDEBUG
267   cout << " AliFemtoEvent::~AliFemtoEvent() " << endl;
268 #endif
269   for (AliFemtoTrackIterator iter=fTrackCollection->begin();iter!=fTrackCollection->end();iter++){
270     delete *iter;
271   }
272   fTrackCollection->clear();
273   delete fTrackCollection;
274   //must do the same for the V0 collection
275   for (AliFemtoV0Iterator tV0iter=fV0Collection->begin();tV0iter!=fV0Collection->end();tV0iter++){
276     delete *tV0iter;
277   }//added by M Chojnacki To avodid memory leak 
278   fV0Collection->clear();
279   delete fV0Collection;
280   //must do the same for the Xi collection
281   for (AliFemtoXiIterator tXiIter=fXiCollection->begin();tXiIter!=fXiCollection->end();tXiIter++){
282     delete *tXiIter;
283   }
284   fXiCollection->clear();
285   delete fXiCollection;
286   //must do the same for the Kink collection
287   for (AliFemtoKinkIterator kinkIter=fKinkCollection->begin();kinkIter!=fKinkCollection->end();kinkIter++){
288     delete *kinkIter;
289   }
290   fKinkCollection->clear();
291   delete fKinkCollection;
292 }
293 //___________________
294
295
296
297 void AliFemtoEvent::SetEventNumber(const unsigned short& event){fEventNumber = event;}
298 void AliFemtoEvent::SetRunNumber(const int& runNum){fRunNumber = runNum;}
299
300
301 void AliFemtoEvent::SetZDCN1Energy(const float& aZDCN1Energy){fZDCN1Energy=aZDCN1Energy;}
302 void AliFemtoEvent::SetZDCP1Energy(const float& aZDCP1Energy){fZDCP1Energy=aZDCP1Energy;}      
303 void AliFemtoEvent::SetZDCN2Energy(const float& aZDCN2Energy){fZDCN2Energy=aZDCN2Energy;}      
304 void AliFemtoEvent::SetZDCP2Energy(const float& aZDCP2Energy){fZDCP2Energy=aZDCP2Energy;}      
305 void AliFemtoEvent::SetZDCEMEnergy(const float& aZDCEMEnergy){fZDCEMEnergy=aZDCEMEnergy;}    
306 void AliFemtoEvent::SetZDCParticipants(const unsigned int& aZDCParticipants){fZDCParticipants=aZDCParticipants;}
307     
308
309 void AliFemtoEvent::SetNumberOfTracks(const unsigned short& tracks){fNumberOfTracks = tracks;}
310
311
312
313 void AliFemtoEvent::SetPrimVertPos(const AliFemtoThreeVector& vp){fPrimVertPos = vp;}
314 void AliFemtoEvent::SetPrimVertCov(const double* v){
315   fPrimVertCov[0] = v[0];
316   fPrimVertCov[1] = v[1];
317   fPrimVertCov[2] = v[2];
318   fPrimVertCov[3] = v[3];
319   fPrimVertCov[4] = v[4];
320   fPrimVertCov[5] = v[5];
321 }
322 void AliFemtoEvent::SetMagneticField(const double& magF){fMagneticField = magF;}
323 void AliFemtoEvent::SetIsCollisionCandidate(const bool& is){fIsCollisionCandidate = is;}
324
325 void AliFemtoEvent::SetTriggerMask(const unsigned long int& aTriggerMask) {fTriggerMask=aTriggerMask;}
326 void AliFemtoEvent::SetTriggerCluster(const unsigned char& aTriggerCluster) {fTriggerCluster=aTriggerCluster;}
327
328
329 unsigned short AliFemtoEvent::EventNumber() const {return fEventNumber;}
330 int            AliFemtoEvent::RunNumber() const {return fRunNumber;}
331
332
333
334 unsigned short AliFemtoEvent::NumberOfTracks() const {return fNumberOfTracks;}
335
336 AliFemtoV0Collection* AliFemtoEvent::V0Collection() const {return fV0Collection;}
337 AliFemtoXiCollection* AliFemtoEvent::XiCollection() const {return fXiCollection;}
338 AliFemtoKinkCollection* AliFemtoEvent::KinkCollection() const {return fKinkCollection;}
339 AliFemtoTrackCollection* AliFemtoEvent::TrackCollection() const {return fTrackCollection;}
340 AliFemtoThreeVector AliFemtoEvent::PrimVertPos() const {return fPrimVertPos;}
341 const double* AliFemtoEvent::PrimVertCov() const {return fPrimVertCov;}
342 double AliFemtoEvent::MagneticField() const {return fMagneticField;}
343 unsigned long int AliFemtoEvent::TriggerMask() const {return fTriggerMask;}
344 unsigned char AliFemtoEvent::TriggerCluster() const {return fTriggerCluster;}
345 bool AliFemtoEvent::IsCollisionCandidate() const {return fIsCollisionCandidate;}
346
347
348 float AliFemtoEvent::ZDCN1Energy() const {return fZDCN1Energy;}       
349 float AliFemtoEvent::ZDCP1Energy() const {return fZDCP1Energy;}       
350 float AliFemtoEvent::ZDCN2Energy() const {return fZDCN2Energy;}       
351 float AliFemtoEvent::ZDCP2Energy() const {return fZDCP2Energy;}       
352 float AliFemtoEvent::ZDCEMEnergy() const {return fZDCEMEnergy;}   
353 unsigned int  AliFemtoEvent::ZDCParticipants() const {return fZDCParticipants;}
354
355 void AliFemtoEvent::SetReactionPlaneAngle(const float& a) { fReactionPlaneAngle = a;}
356 float AliFemtoEvent::ReactionPlaneAngle() const { return fReactionPlaneAngle; }
357
358 //----------------------------- below here is only for star
359
360 double AliFemtoEvent::UncorrectedNumberOfNegativePrimaries() const
361 {
362   return NumberOfTracks()/2;
363 }
364
365 double AliFemtoEvent::UncorrectedNumberOfPrimaries() const
366 {
367   // Count number of normalized charged tracks 
368   Int_t tNormTrackCount = 0;
369   for (AliFemtoTrackIterator iter=fTrackCollection->begin();iter!=fTrackCollection->end();iter++){
370     if (!((*iter)->Flags()&(AliFemtoTrack::kTPCrefit))) continue;
371     if ((*iter)->TPCncls() < 50) continue;
372     if ((*iter)->TPCchi2()/(*iter)->TPCncls() > 60.0) continue;
373     if ((*iter)->ImpactD() > 6.0) continue;
374     if ((*iter)->ImpactZ() > 6.0) continue;
375     if (fabs((*iter)->P().pseudoRapidity()) > 0.9) continue;
376
377     tNormTrackCount++;
378   }
379
380   return tNormTrackCount;
381   //  return NumberOfTracks();
382 }