]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STEER/AliESDEvent.cxx
going from local to alien OCDB
[u/mrichter/AliRoot.git] / STEER / AliESDEvent.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, 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 /* $Id$ */
17
18 //-----------------------------------------------------------------
19 //           Implementation of the AliESDEvent class
20 //   This is the class to deal with during the physics analysis of data.
21 //   It also ensures the backward compatibility with the old ESD format.
22 /*
23    AliESDEvent *ev= new AliESDEvent();
24    ev->ReadFromTree(esdTree);
25    ...
26     for (Int_t i=0; i<nev; i++) {
27       esdTree->GetEntry(i);
28       if(ev->GetAliESDOld())ev->CopyFromOldESD();
29 */
30 //   The AliESDInputHandler does this automatically for you
31 //
32 // Origin: Christian Klein-Boesing, CERN, Christian.Klein-Boesing@cern.ch
33 //-----------------------------------------------------------------
34
35 #include "TList.h"
36 #include "TRefArray.h"
37 #include <TNamed.h>
38
39 #include "AliESDEvent.h"
40 #include "AliESDfriend.h"
41 #include "AliESDVZERO.h"
42 #include "AliESDFMD.h"
43 #include "AliESD.h"
44 #include "AliESDMuonTrack.h"
45 #include "AliESDPmdTrack.h"
46 #include "AliESDTrdTrack.h"
47 #include "AliESDVertex.h"
48 #include "AliESDcascade.h"
49 #include "AliESDPmdTrack.h"
50 #include "AliESDTrdTrack.h"
51 #include "AliESDVertex.h"
52 #include "AliESDcascade.h"
53 #include "AliESDkink.h"
54 #include "AliESDtrack.h"
55 #include "AliESDHLTtrack.h"
56 #include "AliESDCaloCluster.h"
57 #include "AliESDCaloCells.h"
58 #include "AliESDv0.h"
59 #include "AliESDFMD.h"
60 #include "AliESDVZERO.h"
61 #include "AliMultiplicity.h"
62 #include "AliRawDataErrorLog.h"
63 #include "AliLog.h"
64
65 ClassImp(AliESDEvent)
66
67
68
69 // here we define the names, some classes are no TNamed, therefore the classnames 
70 // are the Names
71   const char* AliESDEvent::fgkESDListName[kESDListN] = {"AliESDRun",
72                                                        "AliESDHeader",
73                                                        "AliESDZDC",
74                                                        "AliESDFMD",
75                                                        "AliESDVZERO",
76                                                        "AliESDTZERO",
77                                                        "TPCVertex",
78                                                        "SPDVertex",
79                                                        "PrimaryVertex",
80                                                        "AliMultiplicity",
81                                                        "PHOSTrigger",
82                                                        "EMCALTrigger",
83                                                        "Tracks",
84                                                        "MuonTracks",
85                                                        "PmdTracks",
86                                                        "TrdTracks",
87                                                        "V0s",
88                                                        "Cascades",
89                                                        "Kinks",
90                                                        "CaloClusters",
91                                                       "EMCALCells",
92                                                       "PHOSCells",
93                                                        "AliRawDataErrorLogs"};
94 //______________________________________________________________________________
95 AliESDEvent::AliESDEvent():
96   AliVEvent(),
97   fESDObjects(new TList()),
98   fESDRun(0),
99   fHeader(0),
100   fESDZDC(0),
101   fESDFMD(0),
102   fESDVZERO(0),
103   fESDTZERO(0),
104   fTPCVertex(0),
105   fSPDVertex(0),
106   fPrimaryVertex(0),
107   fSPDMult(0),
108   fPHOSTrigger(0),
109   fEMCALTrigger(0),
110   fTracks(0),
111   fMuonTracks(0),
112   fPmdTracks(0),
113   fTrdTracks(0),
114   fV0s(0),  
115   fCascades(0),
116   fKinks(0),
117   fCaloClusters(0),
118   fEMCALCells(0), fPHOSCells(0),
119   fErrorLogs(0),
120   fESDOld(0),
121   fESDFriendOld(0),
122   fConnected(kFALSE),
123   fEMCALClusters(0), 
124   fFirstEMCALCluster(-1),
125   fPHOSClusters(0), 
126   fFirstPHOSCluster(-1)
127 {
128 }
129 //______________________________________________________________________________
130 AliESDEvent::AliESDEvent(const AliESDEvent& esd):
131   AliVEvent(esd),
132   fESDObjects(new TList()),
133   fESDRun(new AliESDRun(*esd.fESDRun)),
134   fHeader(new AliESDHeader(*esd.fHeader)),
135   fESDZDC(new AliESDZDC(*esd.fESDZDC)),
136   fESDFMD(new AliESDFMD(*esd.fESDFMD)),
137   fESDVZERO(new AliESDVZERO(*esd.fESDVZERO)),
138   fESDTZERO(new AliESDTZERO(*esd.fESDTZERO)),
139   fTPCVertex(new AliESDVertex(*esd.fTPCVertex)),
140   fSPDVertex(new AliESDVertex(*esd.fSPDVertex)),
141   fPrimaryVertex(new AliESDVertex(*esd.fPrimaryVertex)),
142   fSPDMult(new AliMultiplicity(*esd.fSPDMult)),
143   fPHOSTrigger(new AliESDCaloTrigger(*esd.fPHOSTrigger)),
144   fEMCALTrigger(new AliESDCaloTrigger(*esd.fEMCALTrigger)),
145   fTracks(new TClonesArray(*esd.fTracks)),
146   fMuonTracks(new TClonesArray(*esd.fMuonTracks)),
147   fPmdTracks(new TClonesArray(*esd.fPmdTracks)),
148   fTrdTracks(new TClonesArray(*esd.fTrdTracks)),
149   fV0s(new TClonesArray(*esd.fV0s)),  
150   fCascades(new TClonesArray(*esd.fCascades)),
151   fKinks(new TClonesArray(*esd.fKinks)),
152   fCaloClusters(new TClonesArray(*esd.fCaloClusters)),
153   fEMCALCells(new AliESDCaloCells(*esd.fEMCALCells)),
154   fPHOSCells(new AliESDCaloCells(*esd.fPHOSCells)),
155   fErrorLogs(new TClonesArray(*esd.fErrorLogs)),
156   fESDOld(new AliESD(*esd.fESDOld)),
157   fESDFriendOld(new AliESDfriend(*esd.fESDFriendOld)),
158   fConnected(esd.fConnected),
159   fEMCALClusters(esd.fEMCALClusters), 
160   fFirstEMCALCluster(esd.fFirstEMCALCluster),
161   fPHOSClusters(esd.fPHOSClusters), 
162   fFirstPHOSCluster(esd.fFirstPHOSCluster)
163
164 {
165   // CKB init in the constructor list and only add here ...
166   AddObject(fESDRun);
167   AddObject(fHeader);
168   AddObject(fESDZDC);
169   AddObject(fESDFMD);
170   AddObject(fESDVZERO);
171   AddObject(fESDTZERO);
172   AddObject(fTPCVertex);
173   AddObject(fSPDVertex);
174   AddObject(fPrimaryVertex);
175   AddObject(fSPDMult);
176   AddObject(fPHOSTrigger);
177   AddObject(fEMCALTrigger);
178   AddObject(fTracks);
179   AddObject(fMuonTracks);
180   AddObject(fPmdTracks);
181   AddObject(fTrdTracks);
182   AddObject(fV0s);
183   AddObject(fCascades);
184   AddObject(fKinks);
185   AddObject(fCaloClusters);
186   AddObject(fEMCALCells);
187   AddObject(fPHOSCells);
188   AddObject(fErrorLogs);
189
190   GetStdContent();
191
192 }
193
194 //______________________________________________________________________________
195 AliESDEvent & AliESDEvent::operator=(const AliESDEvent& source) {
196
197   // Assignment operator
198
199   if(&source == this) return *this;
200   AliVEvent::operator=(source);
201
202   fESDRun = new AliESDRun(*source.fESDRun);
203   fHeader = new AliESDHeader(*source.fHeader);
204   fESDZDC = new AliESDZDC(*source.fESDZDC);
205   fESDFMD = new AliESDFMD(*source.fESDFMD);
206   fESDVZERO = new AliESDVZERO(*source.fESDVZERO);
207   fESDTZERO = new AliESDTZERO(*source.fESDTZERO);
208   fTPCVertex = new AliESDVertex(*source.fTPCVertex);
209   fSPDVertex = new AliESDVertex(*source.fSPDVertex);
210   fPrimaryVertex = new AliESDVertex(*source.fPrimaryVertex);
211   fSPDMult = new AliMultiplicity(*source.fSPDMult);
212   fPHOSTrigger = new AliESDCaloTrigger(*source.fPHOSTrigger);
213   fEMCALTrigger = new AliESDCaloTrigger(*source.fEMCALTrigger);
214   fTracks = new TClonesArray(*source.fTracks);
215   fMuonTracks = new TClonesArray(*source.fMuonTracks);
216   fPmdTracks = new TClonesArray(*source.fPmdTracks);
217   fTrdTracks = new TClonesArray(*source.fTrdTracks);
218   fV0s = new TClonesArray(*source.fV0s);
219   fCascades = new TClonesArray(*source.fCascades);
220   fKinks = new TClonesArray(*source.fKinks);
221   fCaloClusters = new TClonesArray(*source.fCaloClusters);
222   fEMCALCells = new AliESDCaloCells(*source.fEMCALCells);
223   fPHOSCells = new AliESDCaloCells(*source.fPHOSCells);
224   fErrorLogs = new TClonesArray(*source.fErrorLogs);
225   fESDOld       = new AliESD(*source.fESDOld);
226   fESDFriendOld = new AliESDfriend(*source.fESDFriendOld);
227   // CKB this way?? or 
228   // or AddObject(  fESDZDC = new AliESDZDC(*source.fESDZDC));
229
230   fESDObjects = new TList();
231   AddObject(fESDRun);
232   AddObject(fHeader);
233   AddObject(fESDZDC);
234   AddObject(fESDFMD);
235   AddObject(fESDVZERO);
236   AddObject(fESDTZERO);
237   AddObject(fTPCVertex);
238   AddObject(fSPDVertex);
239   AddObject(fPrimaryVertex);
240   AddObject(fSPDMult);
241   AddObject(fPHOSTrigger);
242   AddObject(fEMCALTrigger);
243   AddObject(fTracks);
244   AddObject(fMuonTracks);
245   AddObject(fPmdTracks);
246   AddObject(fTrdTracks);
247   AddObject(fV0s);
248   AddObject(fCascades);
249   AddObject(fKinks);
250   AddObject(fCaloClusters);
251   AddObject(fEMCALCells);
252   AddObject(fPHOSCells);
253   AddObject(fErrorLogs);
254
255   fConnected = source.fConnected;
256   fEMCALClusters = source.fEMCALClusters;
257   fFirstEMCALCluster = source.fFirstEMCALCluster;
258   fPHOSClusters = source.fPHOSClusters;
259   fFirstPHOSCluster = source.fFirstPHOSCluster;
260
261
262
263   return *this;
264
265 }
266
267
268 //______________________________________________________________________________
269 AliESDEvent::~AliESDEvent()
270 {
271   //
272   // Standard destructor
273   //
274
275   // everthing on the list gets deleted automatically
276
277   
278   if(fESDObjects&&!fConnected)
279     {
280       delete fESDObjects;
281       fESDObjects = 0;
282     }
283
284   
285 }
286
287 //______________________________________________________________________________
288 void AliESDEvent::Reset()
289 {
290
291   
292   // Reset the standard contents
293   ResetStdContent(); 
294   if(fESDOld)fESDOld->Reset();
295   //  reset for the friends...
296   if(fESDFriendOld){
297     fESDFriendOld->~AliESDfriend();
298     new (fESDFriendOld) AliESDfriend();
299   }
300   // for new data we have to fetch the Pointer from the list 
301   AliESDfriend *fr = (AliESDfriend*)FindListObject("AliESDfriend");
302   if(fr){
303     // delete the content
304     fr->~AliESDfriend();
305     // make a new valid ESDfriend at the same place
306     new (fr) AliESDfriend();
307   }
308
309   // call reset for user supplied data?
310 }
311
312 void AliESDEvent::ResetStdContent()
313 {
314   // Reset the standard contents
315   if(fESDRun) fESDRun->Reset();
316   if(fHeader) fHeader->Reset();
317   if(fESDZDC) fESDZDC->Reset();
318   if(fESDFMD) fESDFMD->Clear(); // why clear.... need consistend names
319   if(fESDVZERO){
320     // reset by callin d'to /c'tor keep the pointer
321     fESDVZERO->~AliESDVZERO();
322     new (fESDVZERO) AliESDVZERO();
323   }  
324   if(fESDTZERO) fESDTZERO->Reset(); 
325   // CKB no clear/reset implemented
326   if(fTPCVertex){
327     fTPCVertex->~AliESDVertex();
328     new (fTPCVertex) AliESDVertex();
329     fTPCVertex->SetName(fgkESDListName[kTPCVertex]);
330   }
331   if(fSPDVertex){
332     fSPDVertex->~AliESDVertex();
333     new (fSPDVertex) AliESDVertex();
334     fSPDVertex->SetName(fgkESDListName[kSPDVertex]);
335   }
336   if(fPrimaryVertex){
337     fPrimaryVertex->~AliESDVertex();
338     new (fPrimaryVertex) AliESDVertex();
339     fPrimaryVertex->SetName(fgkESDListName[kPrimaryVertex]);
340   }
341   if(fSPDMult){
342     fSPDMult->~AliMultiplicity();
343     new (fSPDMult) AliMultiplicity();
344   }
345   if(fPHOSTrigger)fPHOSTrigger->Reset(); 
346   if(fEMCALTrigger)fEMCALTrigger->Reset(); 
347   if(fTracks)fTracks->Delete();
348   if(fMuonTracks)fMuonTracks->Delete();
349   if(fPmdTracks)fPmdTracks->Delete();
350   if(fTrdTracks)fTrdTracks->Delete();
351   if(fV0s)fV0s->Delete();
352   if(fCascades)fCascades->Delete();
353   if(fKinks)fKinks->Delete();
354   if(fCaloClusters)fCaloClusters->Delete();
355   if(fPHOSCells)fPHOSCells->DeleteContainer();
356   if(fEMCALCells)fEMCALCells->DeleteContainer();
357   if(fErrorLogs) fErrorLogs->Delete();
358
359   // don't reset fconnected fConnected and the list
360
361   fEMCALClusters=0; 
362   fFirstEMCALCluster=-1; 
363   fPHOSClusters=0; 
364   fFirstPHOSCluster=-1; 
365 }
366
367
368 Int_t AliESDEvent::AddV0(const AliESDv0 *v) {
369   //
370   // Add V0
371   //
372   TClonesArray &fv = *fV0s;
373   Int_t idx=fV0s->GetEntriesFast();
374   new(fv[idx]) AliESDv0(*v);
375   return idx;
376 }  
377
378 //______________________________________________________________________________
379 void AliESDEvent::Print(Option_t *) const 
380 {
381   //
382   // Print header information of the event
383   //
384   printf("ESD run information\n");
385   printf("Event # in file %d Bunch crossing # %d Orbit # %d Period # %d Run # %d Trigger %lld Magnetic field %f \n",
386          GetEventNumberInFile(),
387          GetBunchCrossNumber(),
388          GetOrbitNumber(),
389          GetPeriodNumber(),
390          GetRunNumber(),
391          GetTriggerMask(),
392          GetMagneticField() );
393   printf("Vertex: (%.4f +- %.4f, %.4f +- %.4f, %.4f +- %.4f) cm\n",
394            fPrimaryVertex->GetXv(), fPrimaryVertex->GetXRes(),
395            fPrimaryVertex->GetYv(), fPrimaryVertex->GetYRes(),
396            fPrimaryVertex->GetZv(), fPrimaryVertex->GetZRes());
397     printf("Mean vertex in RUN: X=%.4f Y=%.4f cm\n",
398            GetDiamondX(),GetDiamondY());
399     printf("SPD Multiplicity. Number of tracklets %d \n",
400            fSPDMult->GetNumberOfTracklets());
401   printf("Number of tracks: \n");
402   printf("                 charged   %d\n", GetNumberOfTracks());
403   printf("                 muon      %d\n", GetNumberOfMuonTracks());
404   printf("                 pmd       %d\n", GetNumberOfPmdTracks());
405   printf("                 trd       %d\n", GetNumberOfTrdTracks());
406   printf("                 v0        %d\n", GetNumberOfV0s());
407   printf("                 cascades  %d\n", GetNumberOfCascades());
408   printf("                 kinks     %d\n", GetNumberOfKinks());
409   if(fPHOSCells)printf("                 PHOSCells %d\n", fPHOSCells->GetNumberOfCells());
410   else printf("                 PHOSCells not in the Event\n");
411   if(fEMCALCells)printf("                 EMCALCells %d\n", fEMCALCells->GetNumberOfCells());
412   else printf("                 EMCALCells not in the Event\n");
413   printf("                 CaloClusters %d\n", GetNumberOfCaloClusters());
414   printf("                 phos      %d\n", GetNumberOfPHOSClusters());
415   printf("                 emcal     %d\n", GetNumberOfEMCALClusters());
416   printf("                 FMD       %s\n", (fESDFMD ? "yes" : "no"));
417   printf("                 VZERO     %s\n", (fESDVZERO ? "yes" : "no"));
418
419   return;
420 }
421
422 void AliESDEvent::SetESDfriend(const AliESDfriend *ev) const {
423   //
424   // Attaches the complementary info to the ESD
425   //
426   if (!ev) return;
427
428   // to be sure that we set the tracks also
429   // in case of old esds 
430   // if(fESDOld)CopyFromOldESD();
431
432   Int_t ntrk=ev->GetNumberOfTracks();
433  
434   for (Int_t i=0; i<ntrk; i++) {
435     const AliESDfriendTrack *f=ev->GetTrack(i);
436     GetTrack(i)->SetFriendTrack(f);
437   }
438 }
439
440 Bool_t  AliESDEvent::RemoveKink(Int_t rm) const {
441   // ---------------------------------------------------------
442   // Remove a kink candidate and references to it from ESD,
443   // if this candidate does not come from a reconstructed decay
444   // Not yet implemented...
445   // ---------------------------------------------------------
446   Int_t last=GetNumberOfKinks()-1;
447   if ((rm<0)||(rm>last)) return kFALSE;
448
449   return kTRUE;
450 }
451
452 Bool_t  AliESDEvent::RemoveV0(Int_t rm) const {
453   // ---------------------------------------------------------
454   // Remove a V0 candidate and references to it from ESD,
455   // if this candidate does not come from a reconstructed decay
456   // ---------------------------------------------------------
457   Int_t last=GetNumberOfV0s()-1;
458   if ((rm<0)||(rm>last)) return kFALSE;
459
460   AliESDv0 *v0=GetV0(rm);
461   Int_t idxP=v0->GetPindex(), idxN=v0->GetNindex();
462
463   v0=GetV0(last);
464   Int_t lastIdxP=v0->GetPindex(), lastIdxN=v0->GetNindex();
465
466   Int_t used=0;
467
468   // Check if this V0 comes from a reconstructed decay
469   Int_t ncs=GetNumberOfCascades();
470   for (Int_t n=0; n<ncs; n++) {
471     AliESDcascade *cs=GetCascade(n);
472
473     Int_t csIdxP=cs->GetPindex();
474     Int_t csIdxN=cs->GetNindex();
475
476     if (idxP==csIdxP)
477        if (idxN==csIdxN) return kFALSE;
478
479     if (csIdxP==lastIdxP)
480        if (csIdxN==lastIdxN) used++;
481   }
482
483   //Replace the removed V0 with the last V0 
484   TClonesArray &a=*fV0s;
485   delete a.RemoveAt(rm);
486
487   if (rm==last) return kTRUE;
488
489   //v0 is pointing to the last V0 candidate... 
490   new (a[rm]) AliESDv0(*v0);
491   delete a.RemoveAt(last);
492
493   if (!used) return kTRUE;
494   
495
496   // Remap the indices of the daughters of reconstructed decays
497   for (Int_t n=0; n<ncs; n++) {
498     AliESDcascade *cs=GetCascade(n);
499
500
501     Int_t csIdxP=cs->GetPindex();
502     Int_t csIdxN=cs->GetNindex();
503
504     if (csIdxP==lastIdxP)
505       if (csIdxN==lastIdxN) {
506          cs->AliESDv0::SetIndex(1,idxP);
507          cs->AliESDv0::SetIndex(0,idxN);
508          used--;
509          if (!used) return kTRUE;
510       }
511   }
512
513   return kTRUE;
514 }
515
516 Bool_t  AliESDEvent::RemoveTrack(Int_t rm) const {
517   // ---------------------------------------------------------
518   // Remove a track and references to it from ESD,
519   // if this track does not come from a reconstructed decay
520   // ---------------------------------------------------------
521   Int_t last=GetNumberOfTracks()-1;
522   if ((rm<0)||(rm>last)) return kFALSE;
523
524   Int_t used=0;
525
526   // Check if this track comes from a reconstructed decay
527   Int_t nv0=GetNumberOfV0s();
528   for (Int_t n=0; n<nv0; n++) {
529     AliESDv0 *v0=GetV0(n);
530
531     Int_t idx=v0->GetNindex();
532     if (rm==idx) return kFALSE;
533     if (idx==last) used++;
534
535     idx=v0->GetPindex();
536     if (rm==idx) return kFALSE;
537     if (idx==last) used++;
538   }
539
540   Int_t ncs=GetNumberOfCascades();
541   for (Int_t n=0; n<ncs; n++) {
542     AliESDcascade *cs=GetCascade(n);
543
544     Int_t idx=cs->GetIndex();
545     if (rm==idx) return kFALSE;
546     if (idx==last) used++;
547   }
548
549   Int_t nkn=GetNumberOfKinks();
550   for (Int_t n=0; n<nkn; n++) {
551     AliESDkink *kn=GetKink(n);
552
553     Int_t idx=kn->GetIndex(0);
554     if (rm==idx) return kFALSE;
555     if (idx==last) used++;
556
557     idx=kn->GetIndex(1);
558     if (rm==idx) return kFALSE;
559     if (idx==last) used++;
560   }
561
562
563   //Replace the removed track with the last track 
564   TClonesArray &a=*fTracks;
565   delete a.RemoveAt(rm);
566
567   if (rm==last) return kTRUE;
568
569   AliESDtrack *t=GetTrack(last);
570   t->SetID(rm);
571   new (a[rm]) AliESDtrack(*t);
572   delete a.RemoveAt(last);
573
574   if (!used) return kTRUE;
575   
576
577   // Remap the indices of the daughters of reconstructed decays
578   for (Int_t n=0; n<nv0; n++) {
579     AliESDv0 *v0=GetV0(n);
580     if (v0->GetIndex(0)==last) {
581        v0->SetIndex(0,rm);
582        used--;
583        if (!used) return kTRUE;
584     }
585     if (v0->GetIndex(1)==last) {
586        v0->SetIndex(1,rm);
587        used--;
588        if (!used) return kTRUE;
589     }
590   }
591
592   for (Int_t n=0; n<ncs; n++) {
593     AliESDcascade *cs=GetCascade(n);
594     if (cs->GetIndex()==last) {
595        cs->SetIndex(rm);
596        used--;
597        if (!used) return kTRUE;
598     }
599   }
600
601   for (Int_t n=0; n<nkn; n++) {
602     AliESDkink *kn=GetKink(n);
603     if (kn->GetIndex(0)==last) {
604        kn->SetIndex(rm,0);
605        used--;
606        if (!used) return kTRUE;
607     }
608     if (kn->GetIndex(1)==last) {
609        kn->SetIndex(rm,1);
610        used--;
611        if (!used) return kTRUE;
612     }
613   }
614
615   return kTRUE;
616 }
617
618
619 Bool_t AliESDEvent::Clean(Float_t *cleanPars) {
620   //
621   // Remove the data which are not needed for the physics analysis.
622   //
623   // 1) Cleaning the V0 candidates
624   //    ---------------------------
625   //    If the cosine of the V0 pointing angle "csp" and 
626   //    the DCA between the daughter tracks "dca" does not satisfy 
627   //    the conditions 
628   //
629   //     csp > cleanPars[1] + dca/cleanPars[0]*(1.- cleanPars[1])
630   //
631   //    an attempt to remove this V0 candidate from ESD is made.
632   //
633   //    The V0 candidate gets removed if it does not belong to any 
634   //    recosntructed cascade decay
635   //
636   //    12.11.2007, optimal values: cleanPars[0]=0.5, cleanPars[1]=0.999
637   //
638   // 2) Cleaning the tracks
639   //    ----------------------
640   //    If track's transverse parameter is larger than cleanPars[2]
641   //                       OR
642   //    track's longitudinal parameter is larger than cleanPars[3]
643   //    an attempt to remove this track from ESD is made.
644   //
645   //    The track gets removed if it does not come 
646   //    from a reconstructed decay
647   //
648   Bool_t rc=kFALSE;
649
650   Float_t dcaMax=cleanPars[0];
651   Float_t cspMin=cleanPars[1];
652
653   Int_t nV0s=GetNumberOfV0s();
654   for (Int_t i=nV0s-1; i>=0; i--) {
655     AliESDv0 *v0=GetV0(i);
656
657     Float_t dca=v0->GetDcaV0Daughters();
658     Float_t csp=v0->GetV0CosineOfPointingAngle();
659     Float_t cspcut=cspMin + dca/dcaMax*(1.-cspMin);
660     if (csp > cspcut) continue;
661     if (RemoveV0(i)) rc=kTRUE;
662   }
663
664
665   Float_t dmax=cleanPars[2], zmax=cleanPars[3];
666
667   const AliESDVertex *vertex=GetPrimaryVertexSPD();
668   Bool_t vtxOK=vertex->GetStatus();
669   
670   Int_t nTracks=GetNumberOfTracks();
671   for (Int_t i=nTracks-1; i>=0; i--) {
672     AliESDtrack *track=GetTrack(i);
673     Float_t xy,z; track->GetImpactParameters(xy,z);
674     if ((TMath::Abs(xy) > dmax) || (vtxOK && (TMath::Abs(z) > zmax))) {
675       if (RemoveTrack(i)) rc=kTRUE;
676     }
677   }
678
679   return rc;
680 }
681
682 Int_t  AliESDEvent::AddTrack(const AliESDtrack *t) 
683 {
684     // Add track
685     TClonesArray &ftr = *fTracks;
686     AliESDtrack * track = new(ftr[fTracks->GetEntriesFast()])AliESDtrack(*t);
687     track->SetID(fTracks->GetEntriesFast()-1);
688     return  track->GetID();    
689 }
690
691  void AliESDEvent::AddMuonTrack(const AliESDMuonTrack *t) 
692 {
693     TClonesArray &fmu = *fMuonTracks;
694     new(fmu[fMuonTracks->GetEntriesFast()]) AliESDMuonTrack(*t);
695 }
696
697 void AliESDEvent::AddPmdTrack(const AliESDPmdTrack *t) 
698 {
699   TClonesArray &fpmd = *fPmdTracks;
700   new(fpmd[fPmdTracks->GetEntriesFast()]) AliESDPmdTrack(*t);
701 }
702
703 void AliESDEvent::AddTrdTrack(const AliESDTrdTrack *t) 
704 {
705   TClonesArray &ftrd = *fTrdTracks;
706   new(ftrd[fTrdTracks->GetEntriesFast()]) AliESDTrdTrack(*t);
707 }
708
709
710
711
712 Int_t AliESDEvent::AddKink(const AliESDkink *c) 
713 {
714     // Add kink
715     TClonesArray &fk = *fKinks;
716     AliESDkink * kink = new(fk[fKinks->GetEntriesFast()]) AliESDkink(*c);
717     kink->SetID(fKinks->GetEntriesFast()); // CKB different from the other imps..
718     return fKinks->GetEntriesFast()-1;
719 }
720
721
722 void AliESDEvent::AddCascade(const AliESDcascade *c) 
723 {
724   TClonesArray &fc = *fCascades;
725   new(fc[fCascades->GetEntriesFast()]) AliESDcascade(*c);
726 }
727
728
729 Int_t AliESDEvent::AddCaloCluster(const AliESDCaloCluster *c) 
730 {
731     // Add calocluster
732     TClonesArray &fc = *fCaloClusters;
733     AliESDCaloCluster *clus = new(fc[fCaloClusters->GetEntriesFast()]) AliESDCaloCluster(*c);
734     clus->SetID(fCaloClusters->GetEntriesFast()-1);
735     return fCaloClusters->GetEntriesFast()-1;
736   }
737
738
739 void  AliESDEvent::AddRawDataErrorLog(const AliRawDataErrorLog *log) const {
740   TClonesArray &errlogs = *fErrorLogs;
741   new(errlogs[errlogs.GetEntriesFast()])  AliRawDataErrorLog(*log);
742 }
743
744 void  AliESDEvent::SetPrimaryVertexTPC(const AliESDVertex *vertex) 
745 {
746   // Set the TPC vertex
747   // use already allocated space
748   if(fTPCVertex){
749     *fTPCVertex = *vertex;
750     fTPCVertex->SetName(fgkESDListName[kTPCVertex]);
751   }
752 }
753
754 void  AliESDEvent::SetPrimaryVertexSPD(const AliESDVertex *vertex) 
755 {
756   // Set the SPD vertex
757   // use already allocated space
758   if(fSPDVertex){
759     *fSPDVertex = *vertex;
760     fSPDVertex->SetName(fgkESDListName[kSPDVertex]);
761   }
762 }
763
764 void  AliESDEvent::SetPrimaryVertex(const AliESDVertex *vertex) 
765 {
766   // Set the primary vertex
767   // use already allocated space
768   if(fPrimaryVertex){
769     *fPrimaryVertex = *vertex;
770     fPrimaryVertex->SetName(fgkESDListName[kPrimaryVertex]);
771   }
772 }
773
774 void AliESDEvent::SetMultiplicity(const AliMultiplicity *mul) 
775 {
776   // Set the SPD Multiplicity
777   if(fSPDMult){
778     *fSPDMult = *mul;
779   }
780 }
781
782
783 void AliESDEvent::SetFMDData(AliESDFMD * obj) 
784
785   // use already allocated space
786   if(fESDFMD){
787     *fESDFMD = *obj;
788   }
789 }
790
791 void AliESDEvent::SetVZEROData(AliESDVZERO * obj)
792
793   // use already allocated space
794   if(fESDVZERO)
795     *fESDVZERO = *obj;
796 }
797
798 void AliESDEvent::GetESDfriend(AliESDfriend *ev) const 
799 {
800   //
801   // Extracts the complementary info from the ESD
802   //
803   if (!ev) return;
804
805   Int_t ntrk=GetNumberOfTracks();
806
807   for (Int_t i=0; i<ntrk; i++) {
808     AliESDtrack *t=GetTrack(i);
809     const AliESDfriendTrack *f=t->GetFriendTrack();
810     ev->AddTrack(f);
811
812     t->ReleaseESDfriendTrack();// Not to have two copies of "friendTrack"
813
814   }
815 }
816
817
818 void AliESDEvent::AddObject(TObject* obj) 
819 {
820   // Add an object to the list of object.
821   // Please be aware that in order to increase performance you should
822   // refrain from using TObjArrays (if possible). Use TClonesArrays, instead.
823   fESDObjects->SetOwner(kTRUE);
824   fESDObjects->AddLast(obj);
825 }
826
827
828 void AliESDEvent::GetStdContent() 
829 {
830   // set pointers for standard content
831   // get by name much safer and not a big overhead since not called very often
832  
833   fESDRun = (AliESDRun*)fESDObjects->FindObject(fgkESDListName[kESDRun]);
834   fHeader = (AliESDHeader*)fESDObjects->FindObject(fgkESDListName[kHeader]);
835   fESDZDC = (AliESDZDC*)fESDObjects->FindObject(fgkESDListName[kESDZDC]);
836   fESDFMD = (AliESDFMD*)fESDObjects->FindObject(fgkESDListName[kESDFMD]);
837   fESDVZERO = (AliESDVZERO*)fESDObjects->FindObject(fgkESDListName[kESDVZERO]);
838   fESDTZERO = (AliESDTZERO*)fESDObjects->FindObject(fgkESDListName[kESDTZERO]);
839   fTPCVertex = (AliESDVertex*)fESDObjects->FindObject(fgkESDListName[kTPCVertex]);
840   fSPDVertex = (AliESDVertex*)fESDObjects->FindObject(fgkESDListName[kSPDVertex]);
841   fPrimaryVertex = (AliESDVertex*)fESDObjects->FindObject(fgkESDListName[kPrimaryVertex]);
842   fSPDMult =       (AliMultiplicity*)fESDObjects->FindObject(fgkESDListName[kSPDMult]);
843   fPHOSTrigger = (AliESDCaloTrigger*)fESDObjects->FindObject(fgkESDListName[kPHOSTrigger]);
844   fEMCALTrigger = (AliESDCaloTrigger*)fESDObjects->FindObject(fgkESDListName[kEMCALTrigger]);
845   fTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kTracks]);
846   fMuonTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kMuonTracks]);
847   fPmdTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kPmdTracks]);
848   fTrdTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kTrdTracks]);
849   fV0s = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kV0s]);
850   fCascades = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kCascades]);
851   fKinks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kKinks]);
852   fCaloClusters = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kCaloClusters]);
853   fEMCALCells = (AliESDCaloCells*)fESDObjects->FindObject(fgkESDListName[kEMCALCells]);
854   fPHOSCells = (AliESDCaloCells*)fESDObjects->FindObject(fgkESDListName[kPHOSCells]);
855   fErrorLogs = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kErrorLogs]);
856
857 }
858
859 void AliESDEvent::SetStdNames(){
860   // Set the names of the standard contents
861   // 
862   if(fESDObjects->GetEntries()==kESDListN){
863     for(int i = 0;i < fESDObjects->GetEntries();i++){
864       TObject *fObj = fESDObjects->At(i);
865       if(fObj->InheritsFrom("TNamed")){
866         ((TNamed*)fObj)->SetName(fgkESDListName[i]);
867       }
868       else if(fObj->InheritsFrom("TClonesArray")){
869         ((TClonesArray*)fObj)->SetName(fgkESDListName[i]);
870       }
871     }
872   }
873   else{
874     printf("%s:%d SetStdNames() Wrong number of Std Entries \n",(char*)__FILE__,__LINE__);
875   }
876
877
878 void AliESDEvent::CreateStdContent() 
879 {
880   // create the standard AOD content and set pointers
881
882   // create standard objects and add them to the TList of objects
883   AddObject(new AliESDRun());
884   AddObject(new AliESDHeader());
885   AddObject(new AliESDZDC());
886   AddObject(new AliESDFMD());
887   AddObject(new AliESDVZERO());
888   AddObject(new AliESDTZERO());
889   AddObject(new AliESDVertex());
890   AddObject(new AliESDVertex());
891   AddObject(new AliESDVertex());
892   AddObject(new AliMultiplicity());
893   AddObject(new AliESDCaloTrigger());
894   AddObject(new AliESDCaloTrigger());
895   AddObject(new TClonesArray("AliESDtrack",0));
896   AddObject(new TClonesArray("AliESDMuonTrack",0));
897   AddObject(new TClonesArray("AliESDPmdTrack",0));
898   AddObject(new TClonesArray("AliESDTrdTrack",0));
899   AddObject(new TClonesArray("AliESDv0",0));
900   AddObject(new TClonesArray("AliESDcascade",0));
901   AddObject(new TClonesArray("AliESDkink",0));
902   AddObject(new TClonesArray("AliESDCaloCluster",0));
903   AddObject(new AliESDCaloCells());
904   AddObject(new AliESDCaloCells());
905   AddObject(new TClonesArray("AliRawDataErrorLog",0));
906
907   // check the order of the indices against enum...
908
909   // set names
910   SetStdNames();
911   // read back pointers
912   GetStdContent();
913 }
914
915 TObject* AliESDEvent::FindListObject(const char *name){
916 //
917 // Find object with name "name" in the list of branches
918 //
919   if(fESDObjects){
920     return fESDObjects->FindObject(name);
921   }
922   return 0;
923
924
925 Int_t AliESDEvent::GetPHOSClusters(TRefArray *clusters) const
926 {
927   // fills the provided TRefArray with all found phos clusters
928   
929   clusters->Clear();
930   
931   AliESDCaloCluster *cl = 0;
932   for (Int_t i = 0; i < GetNumberOfCaloClusters(); i++) {
933     
934     if ( (cl = GetCaloCluster(i)) ) {
935       if (cl->IsPHOS()){
936         clusters->Add(cl);
937         AliDebug(1,Form("IsPHOS cluster %d Size: %d \n",i,clusters->GetEntriesFast()));
938       }
939     }
940   }
941   return clusters->GetEntriesFast();
942 }
943
944 Int_t AliESDEvent::GetEMCALClusters(TRefArray *clusters) const
945 {
946   // fills the provided TRefArray with all found emcal clusters
947
948   clusters->Clear();
949
950   AliESDCaloCluster *cl = 0;
951   for (Int_t i = 0; i < GetNumberOfCaloClusters(); i++) {
952
953     if ( (cl = GetCaloCluster(i)) ) {
954       if (cl->IsEMCAL()){
955         clusters->Add(cl);
956         AliDebug(1,Form("IsEMCAL cluster %d Size: %d \n",i,clusters->GetEntriesFast()));
957       }
958     }
959   }
960   return clusters->GetEntriesFast();
961 }
962
963 const void AliESDEvent::WriteToTree(TTree* tree) const {
964   // Book the branches as in TTree::Branch(TCollection*)
965   // but add a "." at the end of top level branches which are
966   // not a TClonesArray
967
968
969   TString branchname;
970   TIter next(fESDObjects);
971   const Int_t kSplitlevel = 99; // default value in TTree::Branch()
972   const Int_t kBufsize = 32000; // default value in TTree::Branch()
973   TObject *obj = 0;
974
975   while ((obj = next())) {
976     branchname.Form("%s", obj->GetName());
977     if ((kSplitlevel > 1) &&  !obj->InheritsFrom(TClonesArray::Class())) {
978       branchname += ".";
979     }
980     tree->Bronch(branchname, obj->ClassName(), fESDObjects->GetObjectRef(obj),
981                  kBufsize, kSplitlevel - 1);
982   }
983
984 }
985
986
987 void AliESDEvent::ReadFromTree(TTree *tree){
988 //
989 // Connect the ESDEvent to a tree
990 //
991   if(!tree){
992     Printf("%s %d AliESDEvent::ReadFromTree() Zero Pointer to Tree \n",(char*)__FILE__,__LINE__);
993     return;
994   }
995   // load the TTree
996   if(!tree->GetTree())tree->LoadTree(0);
997
998   // if we find the "ESD" branch on the tree we do have the old structure
999   if(tree->GetBranch("ESD")) {
1000     char ** address  = (char **)(tree->GetBranch("ESD")->GetAddress());
1001     // do we have the friend branch
1002     TBranch * esdFB = tree->GetBranch("ESDfriend.");
1003     char ** addressF = 0;
1004     if(esdFB)addressF = (char **)(esdFB->GetAddress());
1005     if (!address) {
1006       printf("%s %d AliESDEvent::ReadFromTree() Reading old Tree \n",(char*)__FILE__,__LINE__);
1007       tree->SetBranchAddress("ESD",       &fESDOld);
1008       if(esdFB){
1009         tree->SetBranchAddress("ESDfriend.",&fESDFriendOld);
1010       }
1011     } else {
1012       printf("%s %d AliESDEvent::ReadFromTree() Reading old Tree \n",(char*)__FILE__,__LINE__);
1013       printf("%s %d Branch already connected. Using existing branch address. \n",(char*)__FILE__,__LINE__);
1014       fESDOld       = (AliESD*)       (*address);
1015       // addressF can still be 0, since branch needs to switched on
1016       if(addressF)fESDFriendOld = (AliESDfriend*) (*addressF);
1017     }
1018                                        
1019     //  have already connected the old ESD structure... ?
1020     // reuse also the pointer of the AlliESDEvent
1021     // otherwise create new ones
1022     TList* connectedList = (TList*) (tree->GetUserInfo()->FindObject("ESDObjectsConnectedToTree"));
1023   
1024     if(connectedList){
1025       // If connected use the connected list of objects
1026       if(fESDObjects!= connectedList){
1027         // protect when called twice 
1028         fESDObjects->Delete();
1029         fESDObjects = connectedList;
1030       }
1031       GetStdContent(); 
1032
1033       
1034       // The pointer to the friend changes when called twice via InitIO
1035       // since AliESDEvent is deleted
1036       TObject* oldf = FindListObject("AliESDfriend");
1037       TObject* newf = 0;
1038       if(addressF){
1039         newf = (TObject*)*addressF;
1040       }
1041       if(newf!=0&&oldf!=newf){
1042         // remove the old reference
1043         // Should we also delete it? Or is this handled in TTree I/O
1044         // since it is created by the first SetBranchAddress
1045         fESDObjects->Remove(oldf);
1046         // add the new one 
1047         fESDObjects->Add(newf);
1048       }
1049       
1050       fConnected = true;
1051       return;
1052     }
1053     // else...    
1054     CreateStdContent(); // create for copy
1055     // if we have the esdfriend add it, so we always can access it via the userinfo
1056     if(fESDFriendOld)AddObject(fESDFriendOld);
1057     // we are not owner of the list objects 
1058     // must not delete it
1059     fESDObjects->SetOwner(kFALSE);
1060     fESDObjects->SetName("ESDObjectsConnectedToTree");
1061     tree->GetUserInfo()->Add(fESDObjects);
1062     fConnected = true;
1063     return;
1064   }
1065   
1066   delete fESDOld;
1067   fESDOld = 0;
1068   // Try to find AliESDEvent
1069   AliESDEvent *esdEvent = 0;
1070   esdEvent = (AliESDEvent*)tree->GetTree()->GetUserInfo()->FindObject("AliESDEvent");
1071   if(esdEvent){   
1072       // Check if already connected to tree
1073     TList* connectedList = (TList*) (tree->GetUserInfo()->FindObject("ESDObjectsConnectedToTree"));
1074     if (connectedList) {
1075       // If connected use the connected list if objects
1076       fESDObjects->Delete();
1077       fESDObjects = connectedList;
1078       GetStdContent(); 
1079       fConnected = true;
1080       return;
1081     }
1082     // Connect to tree
1083     // prevent a memory leak when reading back the TList
1084     delete fESDObjects;
1085     fESDObjects = 0;
1086     // create a new TList from the UserInfo TList... 
1087     // copy constructor does not work...
1088     fESDObjects = (TList*)(esdEvent->GetList()->Clone());
1089     fESDObjects->SetOwner(kFALSE);
1090     if(fESDObjects->GetEntries()<kESDListN){
1091       printf("%s %d AliESDEvent::ReadFromTree() TList contains less than the standard contents %d < %d \n",
1092              (char*)__FILE__,__LINE__,fESDObjects->GetEntries(),kESDListN);
1093     }
1094     // set the branch addresses
1095     TIter next(fESDObjects);
1096     TNamed *el;
1097     while((el=(TNamed*)next())){
1098       TString bname(el->GetName());
1099       if(bname.CompareTo("AliESDfriend")==0)
1100         {
1101           // AliESDfriend does not have a name ...
1102           tree->SetBranchAddress("ESDfriend.",fESDObjects->GetObjectRef(el));
1103         }
1104       else{
1105         // check if branch exists under this Name
1106         TBranch *br = tree->GetBranch(bname.Data());
1107         if(br){
1108           tree->SetBranchAddress(bname.Data(),fESDObjects->GetObjectRef(el));
1109         }
1110         else{
1111           br = tree->GetBranch(Form("%s.",bname.Data()));
1112           if(br){
1113             tree->SetBranchAddress(Form("%s.",bname.Data()),fESDObjects->GetObjectRef(el));
1114           }
1115           else{
1116             printf("%s %d AliESDEvent::ReadFromTree() No Branch found with Name %s or %s. \n",
1117                    (char*)__FILE__,__LINE__,bname.Data(),bname.Data());
1118           }
1119
1120         }
1121       }
1122     }
1123     GetStdContent();
1124     // when reading back we are not owner of the list 
1125     // must not delete it
1126     fESDObjects->SetOwner(kFALSE);
1127     fESDObjects->SetName("ESDObjectsConnectedToTree");
1128     // we are not owner of the list objects 
1129     // must not delete it
1130     tree->GetUserInfo()->Add(fESDObjects);
1131     fConnected = true;
1132   }// no esdEvent
1133   else {
1134     // we can't get the list from the user data, create standard content
1135     // and set it by hand (no ESDfriend at the moment
1136     CreateStdContent();
1137     TIter next(fESDObjects);
1138     TNamed *el;
1139     while((el=(TNamed*)next())){
1140       TString bname(el->GetName());    
1141       tree->SetBranchAddress(bname.Data(),fESDObjects->GetObjectRef(el));
1142     }
1143     GetStdContent();
1144     // when reading back we are not owner of the list 
1145     // must not delete it
1146     fESDObjects->SetOwner(kFALSE);
1147   }
1148 }
1149
1150
1151 void AliESDEvent::CopyFromOldESD()
1152 {
1153   // Method which copies over everthing from the old esd structure to the 
1154   // new  
1155   if(fESDOld){
1156     ResetStdContent();
1157      // Run
1158     SetRunNumber(fESDOld->GetRunNumber());
1159     SetPeriodNumber(fESDOld->GetPeriodNumber());
1160     SetMagneticField(fESDOld->GetMagneticField());
1161   
1162     // leave out diamond ...
1163     // SetDiamond(const AliESDVertex *vertex) { fESDRun->SetDiamond(vertex);}
1164
1165     // header
1166     SetTriggerMask(fESDOld->GetTriggerMask());
1167     SetOrbitNumber(fESDOld->GetOrbitNumber());
1168     SetTimeStamp(fESDOld->GetTimeStamp());
1169     SetEventType(fESDOld->GetEventType());
1170     SetEventNumberInFile(fESDOld->GetEventNumberInFile());
1171     SetBunchCrossNumber(fESDOld->GetBunchCrossNumber());
1172     SetTriggerCluster(fESDOld->GetTriggerCluster());
1173
1174     // ZDC
1175
1176     SetZDC(fESDOld->GetZDCN1Energy(),
1177            fESDOld->GetZDCP1Energy(),
1178            fESDOld->GetZDCEMEnergy(),
1179            0,
1180            fESDOld->GetZDCN2Energy(),
1181            fESDOld->GetZDCP2Energy(),
1182            fESDOld->GetZDCParticipants());
1183
1184     // FMD
1185     
1186     if(fESDOld->GetFMDData())SetFMDData(fESDOld->GetFMDData());
1187
1188     // T0
1189
1190     SetT0zVertex(fESDOld->GetT0zVertex());
1191     SetT0(fESDOld->GetT0());
1192     //  leave amps out
1193
1194     // VZERO
1195     if (fESDOld->GetVZEROData()) SetVZEROData(fESDOld->GetVZEROData());
1196
1197     if(fESDOld->GetVertex())SetPrimaryVertexSPD(fESDOld->GetVertex());
1198
1199     if(fESDOld->GetPrimaryVertex())SetPrimaryVertex(fESDOld->GetPrimaryVertex());
1200
1201     if(fESDOld->GetMultiplicity())SetMultiplicity(fESDOld->GetMultiplicity());
1202
1203     for(int i = 0;i<fESDOld->GetNumberOfTracks();i++){
1204       AddTrack(fESDOld->GetTrack(i));
1205     }
1206
1207     for(int i = 0;i<fESDOld->GetNumberOfMuonTracks();i++){
1208       AddMuonTrack(fESDOld->GetMuonTrack(i));
1209     }
1210
1211     for(int i = 0;i<fESDOld->GetNumberOfPmdTracks();i++){
1212       AddPmdTrack(fESDOld->GetPmdTrack(i));
1213     }
1214
1215     for(int i = 0;i<fESDOld->GetNumberOfTrdTracks();i++){
1216       AddTrdTrack(fESDOld->GetTrdTrack(i));
1217     }
1218
1219     for(int i = 0;i<fESDOld->GetNumberOfV0s();i++){
1220       AddV0(fESDOld->GetV0(i));
1221     }
1222
1223     for(int i = 0;i<fESDOld->GetNumberOfCascades();i++){
1224       AddCascade(fESDOld->GetCascade(i));
1225     }
1226
1227     for(int i = 0;i<fESDOld->GetNumberOfKinks();i++){
1228       AddKink(fESDOld->GetKink(i));
1229     }
1230
1231
1232     for(int i = 0;i<fESDOld->GetNumberOfCaloClusters();i++){
1233       AddCaloCluster(fESDOld->GetCaloCluster(i));
1234     }
1235
1236   }// if fesdold
1237 }
1238
1239
1240