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