]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/CreateAODfromESD.C
Fill muon charge correctly. Rename AOD TTree from AOD to aodTree. Code clean-up ...
[u/mrichter/AliRoot.git] / STEER / CreateAODfromESD.C
CommitLineData
e985a35a 1#if !defined(__CINT__) || defined(__MAKECINT__)
2
cf22b3fc 3#include <Riostream.h>
4#include <TFile.h>
5#include <TTree.h>
6#include <TMath.h>
df9db588 7
8#include "AliAODEvent.h"
31fd97b2 9#include "AliAODHeader.h"
cf22b3fc 10#include "AliAODVertex.h"
11#include "AliAODTrack.h"
a9255000 12#include "AliAODCluster.h"
821f8f1d 13#include "AliAODTracklets.h"
cf22b3fc 14
86ad5fcb 15#include "AliESDEvent.h"
df9db588 16#include "AliESDtrack.h"
200161ad 17#include "AliESDMuonTrack.h"
df9db588 18#include "AliESDVertex.h"
19#include "AliESDv0.h"
31fd97b2 20#include "AliESDcascade.h"
cf22b3fc 21#include "AliESDCaloCluster.h"
df9db588 22
e985a35a 23#endif
24
cf22b3fc 25void CreateAODfromESD(const char *inFileName = "AliESDs.root",
26 const char *outFileName = "AliAOD.root") {
df9db588 27
28 // create an AliAOD object
29 AliAODEvent *aod = new AliAODEvent();
30 aod->CreateStdContent();
31
32 // open the file
33 TFile *outFile = TFile::Open(outFileName, "RECREATE");
34
35 // create the tree
b97637d4 36 TTree *aodTree = new TTree("aodTree", "AliAOD tree");
df9db588 37 aodTree->Branch(aod->GetList());
38
39 // connect to ESD
40 TFile *inFile = TFile::Open(inFileName, "READ");
41 TTree *t = (TTree*) inFile->Get("esdTree");
86ad5fcb 42 AliESDEvent *esd = new AliESDEvent();
f5661047 43 esd->ReadFromTree(t);
df9db588 44
f5661047 45 Int_t nEvents = t->GetEntries();
df9db588 46
9e2a7f16 47 // set arrays and pointers
48 Float_t posF[3];
49 Double_t pos[3];
50 Double_t p[3];
51 Double_t covVtx[6];
52 Double_t covTr[21];
53 Double_t pid[10];
54
df9db588 55 // loop over events and fill them
56 for (Int_t iEvent = 0; iEvent < nEvents; ++iEvent) {
f5661047 57 t->GetEntry(iEvent);
df9db588 58
59 // Multiplicity information needed by the header (to be revised!)
60 Int_t nTracks = esd->GetNumberOfTracks();
61 Int_t nPosTracks = 0;
62 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack)
b97637d4 63 if (esd->GetTrack(iTrack)->Charge()> 0) nPosTracks++;
a206f034 64
65 // Access to the header
66 AliAODHeader *header = aod->GetHeader();
67
68 // fill the header
69 *header = AliAODHeader(esd->GetRunNumber(),
70 esd->GetBunchCrossNumber(),
71 esd->GetOrbitNumber(),
72 esd->GetPeriodNumber(),
73 nTracks,
74 nPosTracks,
75 nTracks-nPosTracks,
76 esd->GetMagneticField(),
77 -999., // fill muon magnetic field
78 -999., // centrality; to be filled, still
79 esd->GetZDCN1Energy(),
80 esd->GetZDCP1Energy(),
81 esd->GetZDCN2Energy(),
82 esd->GetZDCP2Energy(),
83 esd->GetZDCEMEnergy(),
84 esd->GetTriggerMask(),
85 esd->GetTriggerCluster(),
86 esd->GetEventType());
87
df9db588 88 Int_t nV0s = esd->GetNumberOfV0s();
89 Int_t nCascades = esd->GetNumberOfCascades();
90 Int_t nKinks = esd->GetNumberOfKinks();
91 Int_t nVertices = nV0s + nCascades + nKinks;
92
93 aod->ResetStd(nTracks, nVertices);
9e2a7f16 94 AliAODTrack *aodTrack;
df9db588 95
df9db588 96 // Array to take into account the tracks already added to the AOD
97 Bool_t * usedTrack = NULL;
98 if (nTracks>0) {
99 usedTrack = new Bool_t[nTracks];
100 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) usedTrack[iTrack]=kFALSE;
101 }
102 // Array to take into account the V0s already added to the AOD
103 Bool_t * usedV0 = NULL;
104 if (nV0s>0) {
105 usedV0 = new Bool_t[nV0s];
106 for (Int_t iV0=0; iV0<nV0s; ++iV0) usedV0[iV0]=kFALSE;
107 }
cf22b3fc 108 // Array to take into account the kinks already added to the AOD
109 Bool_t * usedKink = NULL;
110 if (nKinks>0) {
111 usedKink = new Bool_t[nKinks];
112 for (Int_t iKink=0; iKink<nKinks; ++iKink) usedKink[iKink]=kFALSE;
113 }
df9db588 114
115 // Access to the AOD container of vertices
116 TClonesArray &vertices = *(aod->GetVertices());
117 Int_t jVertices=0;
118
119 // Access to the AOD container of tracks
120 TClonesArray &tracks = *(aod->GetTracks());
121 Int_t jTracks=0;
122
123 // Add primary vertex. The primary tracks will be defined
124 // after the loops on the composite objects (V0, cascades, kinks)
125 const AliESDVertex *vtx = esd->GetPrimaryVertex();
126
df9db588 127 vtx->GetXYZ(pos); // position
31fd97b2 128 vtx->GetCovMatrix(covVtx); //covariance matrix
df9db588 129
130 AliAODVertex * primary = new(vertices[jVertices++])
00946a1a 131 AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, AliAODVertex::kPrimary);
df9db588 132
133 // Create vertices starting from the most complex objects
134
135 // Cascades
136 for (Int_t nCascade = 0; nCascade < nCascades; ++nCascade) {
137 AliESDcascade *cascade = esd->GetCascade(nCascade);
138
9e2a7f16 139 cascade->GetXYZ(pos[0], pos[1], pos[2]);
140 cascade->GetPosCovXi(covVtx);
df9db588 141
142 // Add the cascade vertex
9e2a7f16 143 AliAODVertex * vcascade = new(vertices[jVertices++]) AliAODVertex(pos,
144 covVtx,
00946a1a 145 cascade->GetChi2Xi(), // = chi2/NDF since NDF = 2*2-3
df9db588 146 primary,
147 AliAODVertex::kCascade);
148
149 primary->AddDaughter(vcascade);
150
151 // Add the V0 from the cascade. The ESD class have to be optimized...
152 // Now we have to search for the corresponding Vo in the list of V0s
153 // using the indeces of the positive and negative tracks
154
155 Int_t posFromV0 = cascade->GetPindex();
156 Int_t negFromV0 = cascade->GetNindex();
157
158
159 AliESDv0 * v0 = 0x0;
160 Int_t indV0 = -1;
161
162 for (Int_t iV0=0; iV0<nV0s; ++iV0) {
163
164 v0 = esd->GetV0(iV0);
31fd97b2 165 Int_t posV0 = v0->GetPindex();
166 Int_t negV0 = v0->GetNindex();
df9db588 167
31fd97b2 168 if (posV0==posFromV0 && negV0==negFromV0) {
df9db588 169 indV0 = iV0;
170 break;
171 }
172 }
173
174 AliAODVertex * vV0FromCascade = 0x0;
175
cf22b3fc 176 if (indV0>-1 && !usedV0[indV0] ) {
df9db588 177
cf22b3fc 178 // the V0 exists in the array of V0s and is not used
179
df9db588 180 usedV0[indV0] = kTRUE;
181
9e2a7f16 182 v0->GetXYZ(pos[0], pos[1], pos[2]);
183 v0->GetPosCov(covVtx);
cf22b3fc 184
9e2a7f16 185 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
186 covVtx,
00946a1a 187 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
df9db588 188 vcascade,
189 AliAODVertex::kV0);
190 } else {
191
cf22b3fc 192 // the V0 doesn't exist in the array of V0s or was used
193 cerr << "Error: event " << iEvent << " cascade " << nCascade
194 << " The V0 " << indV0
195 << " doesn't exist in the array of V0s or was used!" << endl;
196
9e2a7f16 197 cascade->GetXYZ(pos[0], pos[1], pos[2]);
198 cascade->GetPosCov(covVtx);
df9db588 199
9e2a7f16 200 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
201 covVtx,
00946a1a 202 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
df9db588 203 vcascade,
204 AliAODVertex::kV0);
205 vcascade->AddDaughter(vV0FromCascade);
206 }
207
208 // Add the positive tracks from the V0
209
cf22b3fc 210 if (! usedTrack[posFromV0]) {
211
212 usedTrack[posFromV0] = kTRUE;
df9db588 213
214 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
9e2a7f16 215 esdTrack->GetPxPyPz(p);
216 esdTrack->GetXYZ(pos);
217 esdTrack->GetCovarianceXYZPxPyPz(covTr);
218 esdTrack->GetESDpid(pid);
cf22b3fc 219
9e2a7f16 220 vV0FromCascade->AddDaughter(aodTrack =
cf22b3fc 221 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
df9db588 222 esdTrack->GetLabel(),
9e2a7f16 223 p,
31fd97b2 224 kTRUE,
9e2a7f16 225 pos,
df9db588 226 kFALSE,
9e2a7f16 227 covTr,
b97637d4 228 (Short_t)esdTrack->Charge(),
df9db588 229 esdTrack->GetITSClusterMap(),
9e2a7f16 230 pid,
df9db588 231 vV0FromCascade,
00946a1a 232 kTRUE, // check if this is right
4773afc9 233 kFALSE, // check if this is right
df9db588 234 AliAODTrack::kSecondary)
235 );
9e2a7f16 236 aodTrack->ConvertAliPIDtoAODPID();
df9db588 237 }
cf22b3fc 238 else {
239 cerr << "Error: event " << iEvent << " cascade " << nCascade
240 << " track " << posFromV0 << " has already been used!" << endl;
241 }
df9db588 242
243 // Add the negative tracks from the V0
244
cf22b3fc 245 if (!usedTrack[negFromV0]) {
246
247 usedTrack[negFromV0] = kTRUE;
248
df9db588 249 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
9e2a7f16 250 esdTrack->GetPxPyPz(p);
251 esdTrack->GetXYZ(pos);
252 esdTrack->GetCovarianceXYZPxPyPz(covTr);
253 esdTrack->GetESDpid(pid);
cf22b3fc 254
9e2a7f16 255 vV0FromCascade->AddDaughter(aodTrack =
df9db588 256 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
257 esdTrack->GetLabel(),
9e2a7f16 258 p,
df9db588 259 kTRUE,
9e2a7f16 260 pos,
df9db588 261 kFALSE,
9e2a7f16 262 covTr,
b97637d4 263 (Short_t)esdTrack->Charge(),
df9db588 264 esdTrack->GetITSClusterMap(),
9e2a7f16 265 pid,
df9db588 266 vV0FromCascade,
00946a1a 267 kTRUE, // check if this is right
4773afc9 268 kFALSE, // check if this is right
df9db588 269 AliAODTrack::kSecondary)
270 );
9e2a7f16 271 aodTrack->ConvertAliPIDtoAODPID();
df9db588 272 }
cf22b3fc 273 else {
274 cerr << "Error: event " << iEvent << " cascade " << nCascade
275 << " track " << negFromV0 << " has already been used!" << endl;
276 }
df9db588 277
278 // Add the bachelor track from the cascade
279
280 Int_t bachelor = cascade->GetBindex();
df9db588 281
cf22b3fc 282 if(!usedTrack[bachelor]) {
283
284 usedTrack[bachelor] = kTRUE;
285
286 AliESDtrack *esdTrack = esd->GetTrack(bachelor);
9e2a7f16 287 esdTrack->GetPxPyPz(p);
288 esdTrack->GetXYZ(pos);
289 esdTrack->GetCovarianceXYZPxPyPz(covTr);
290 esdTrack->GetESDpid(pid);
df9db588 291
9e2a7f16 292 vcascade->AddDaughter(aodTrack =
df9db588 293 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
294 esdTrack->GetLabel(),
9e2a7f16 295 p,
df9db588 296 kTRUE,
9e2a7f16 297 pos,
df9db588 298 kFALSE,
9e2a7f16 299 covTr,
b97637d4 300 (Short_t)esdTrack->Charge(),
df9db588 301 esdTrack->GetITSClusterMap(),
9e2a7f16 302 pid,
df9db588 303 vcascade,
00946a1a 304 kTRUE, // check if this is right
4773afc9 305 kFALSE, // check if this is right
df9db588 306 AliAODTrack::kSecondary)
307 );
9e2a7f16 308 aodTrack->ConvertAliPIDtoAODPID();
200161ad 309 }
cf22b3fc 310 else {
311 cerr << "Error: event " << iEvent << " cascade " << nCascade
312 << " track " << bachelor << " has already been used!" << endl;
313 }
df9db588 314
315 // Add the primary track of the cascade (if any)
316
cf22b3fc 317 } // end of the loop on cascades
df9db588 318
319 // V0s
320
321 for (Int_t nV0 = 0; nV0 < nV0s; ++nV0) {
322
323 if (usedV0[nV0]) continue; // skip if aready added to the AOD
324
325 AliESDv0 *v0 = esd->GetV0(nV0);
326
9e2a7f16 327 v0->GetXYZ(pos[0], pos[1], pos[2]);
328 v0->GetPosCov(covVtx);
df9db588 329
330 AliAODVertex * vV0 =
9e2a7f16 331 new(vertices[jVertices++]) AliAODVertex(pos,
332 covVtx,
00946a1a 333 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
df9db588 334 primary,
335 AliAODVertex::kV0);
336 primary->AddDaughter(vV0);
337
338 Int_t posFromV0 = v0->GetPindex();
339 Int_t negFromV0 = v0->GetNindex();
31fd97b2 340
df9db588 341 // Add the positive tracks from the V0
342
cf22b3fc 343 if (!usedTrack[posFromV0]) {
344
345 usedTrack[posFromV0] = kTRUE;
df9db588 346
347 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
9e2a7f16 348 esdTrack->GetPxPyPz(p);
349 esdTrack->GetXYZ(pos);
350 esdTrack->GetCovarianceXYZPxPyPz(covTr);
351 esdTrack->GetESDpid(pid);
df9db588 352
9e2a7f16 353 vV0->AddDaughter(aodTrack =
df9db588 354 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
355 esdTrack->GetLabel(),
9e2a7f16 356 p,
31fd97b2 357 kTRUE,
9e2a7f16 358 pos,
df9db588 359 kFALSE,
9e2a7f16 360 covTr,
b97637d4 361 (Short_t)esdTrack->Charge(),
df9db588 362 esdTrack->GetITSClusterMap(),
9e2a7f16 363 pid,
df9db588 364 vV0,
00946a1a 365 kTRUE, // check if this is right
4773afc9 366 kFALSE, // check if this is right
df9db588 367 AliAODTrack::kSecondary)
368 );
9e2a7f16 369 aodTrack->ConvertAliPIDtoAODPID();
df9db588 370 }
cf22b3fc 371 else {
372 cerr << "Error: event " << iEvent << " V0 " << nV0
373 << " track " << posFromV0 << " has already been used!" << endl;
374 }
df9db588 375
376 // Add the negative tracks from the V0
377
cf22b3fc 378 if (!usedTrack[negFromV0]) {
379
380 usedTrack[negFromV0] = kTRUE;
df9db588 381
382 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
9e2a7f16 383 esdTrack->GetPxPyPz(p);
384 esdTrack->GetXYZ(pos);
385 esdTrack->GetCovarianceXYZPxPyPz(covTr);
386 esdTrack->GetESDpid(pid);
df9db588 387
9e2a7f16 388 vV0->AddDaughter(aodTrack =
df9db588 389 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
390 esdTrack->GetLabel(),
9e2a7f16 391 p,
df9db588 392 kTRUE,
9e2a7f16 393 pos,
df9db588 394 kFALSE,
9e2a7f16 395 covTr,
b97637d4 396 (Short_t)esdTrack->Charge(),
df9db588 397 esdTrack->GetITSClusterMap(),
9e2a7f16 398 pid,
df9db588 399 vV0,
00946a1a 400 kTRUE, // check if this is right
4773afc9 401 kFALSE, // check if this is right
df9db588 402 AliAODTrack::kSecondary)
403 );
9e2a7f16 404 aodTrack->ConvertAliPIDtoAODPID();
df9db588 405 }
cf22b3fc 406 else {
407 cerr << "Error: event " << iEvent << " V0 " << nV0
408 << " track " << negFromV0 << " has already been used!" << endl;
409 }
df9db588 410
cf22b3fc 411 } // end of the loop on V0s
df9db588 412
cf22b3fc 413 // Kinks: it is a big mess the access to the information in the kinks
414 // The loop is on the tracks in order to find the mother and daugther of each kink
415
416
417 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) {
418
419
9e2a7f16 420 AliESDtrack * esdTrack = esd->GetTrack(iTrack);
cf22b3fc 421
9e2a7f16 422 Int_t ikink = esdTrack->GetKinkIndex(0);
cf22b3fc 423
424 if (ikink) {
425 // Negative kink index: mother, positive: daughter
426
427 // Search for the second track of the kink
428
429 for (Int_t jTrack = iTrack+1; jTrack<nTracks; ++jTrack) {
430
9e2a7f16 431 AliESDtrack * esdTrack1 = esd->GetTrack(jTrack);
cf22b3fc 432
9e2a7f16 433 Int_t jkink = esdTrack1->GetKinkIndex(0);
cf22b3fc 434
435 if ( TMath::Abs(ikink)==TMath::Abs(jkink) ) {
436
437 // The two tracks are from the same kink
438
439 if (usedKink[TMath::Abs(ikink)-1]) continue; // skip used kinks
440
441 Int_t imother = -1;
442 Int_t idaughter = -1;
443
444 if (ikink<0 && jkink>0) {
445
446 imother = iTrack;
447 idaughter = jTrack;
448 }
449 else if (ikink>0 && jkink<0) {
450
451 imother = jTrack;
452 idaughter = iTrack;
453 }
454 else {
455 cerr << "Error: Wrong combination of kink indexes: "
456 << ikink << " " << jkink << endl;
457 continue;
458 }
459
460 // Add the mother track
461
462 AliAODTrack * mother = NULL;
463
464 if (!usedTrack[imother]) {
465
466 usedTrack[imother] = kTRUE;
467
468 AliESDtrack *esdTrack = esd->GetTrack(imother);
9e2a7f16 469 esdTrack->GetPxPyPz(p);
470 esdTrack->GetXYZ(pos);
471 esdTrack->GetCovarianceXYZPxPyPz(covTr);
472 esdTrack->GetESDpid(pid);
31fd97b2 473
cf22b3fc 474 mother =
475 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
476 esdTrack->GetLabel(),
9e2a7f16 477 p,
cf22b3fc 478 kTRUE,
9e2a7f16 479 pos,
cf22b3fc 480 kFALSE,
9e2a7f16 481 covTr,
b97637d4 482 (Short_t)esdTrack->Charge(),
cf22b3fc 483 esdTrack->GetITSClusterMap(),
9e2a7f16 484 pid,
cf22b3fc 485 primary,
4773afc9 486 kTRUE, // check if this is right
00946a1a 487 kTRUE, // check if this is right
cf22b3fc 488 AliAODTrack::kPrimary);
489 primary->AddDaughter(mother);
200161ad 490 mother->ConvertAliPIDtoAODPID();
cf22b3fc 491 }
492 else {
493 cerr << "Error: event " << iEvent << " kink " << TMath::Abs(ikink)-1
494 << " track " << imother << " has already been used!" << endl;
495 }
496
497 // Add the kink vertex
498 AliESDkink * kink = esd->GetKink(TMath::Abs(ikink)-1);
499
500 AliAODVertex * vkink =
501 new(vertices[jVertices++]) AliAODVertex(kink->GetPosition(),
502 NULL,
503 0.,
504 mother,
505 AliAODVertex::kKink);
506 // Add the daughter track
507
508 AliAODTrack * daughter = NULL;
509
510 if (!usedTrack[idaughter]) {
511
512 usedTrack[idaughter] = kTRUE;
513
514 AliESDtrack *esdTrack = esd->GetTrack(idaughter);
9e2a7f16 515 esdTrack->GetPxPyPz(p);
516 esdTrack->GetXYZ(pos);
517 esdTrack->GetCovarianceXYZPxPyPz(covTr);
518 esdTrack->GetESDpid(pid);
31fd97b2 519
cf22b3fc 520 daughter =
521 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
522 esdTrack->GetLabel(),
9e2a7f16 523 p,
cf22b3fc 524 kTRUE,
9e2a7f16 525 pos,
cf22b3fc 526 kFALSE,
9e2a7f16 527 covTr,
b97637d4 528 (Short_t)esdTrack->Charge(),
cf22b3fc 529 esdTrack->GetITSClusterMap(),
9e2a7f16 530 pid,
cf22b3fc 531 vkink,
4773afc9 532 kTRUE, // check if this is right
00946a1a 533 kTRUE, // check if this is right
cf22b3fc 534 AliAODTrack::kPrimary);
535 vkink->AddDaughter(daughter);
200161ad 536 daughter->ConvertAliPIDtoAODPID();
cf22b3fc 537 }
538 else {
539 cerr << "Error: event " << iEvent << " kink " << TMath::Abs(ikink)-1
540 << " track " << idaughter << " has already been used!" << endl;
541 }
542
543
544 }
545 }
546
547 }
df9db588 548
df9db588 549 }
cf22b3fc 550
df9db588 551
cf22b3fc 552 // Tracks (primary and orphan)
df9db588 553
554 for (Int_t nTrack = 0; nTrack < nTracks; ++nTrack) {
555
556
557 if (usedTrack[nTrack]) continue;
558
559 AliESDtrack *esdTrack = esd->GetTrack(nTrack);
9e2a7f16 560 esdTrack->GetPxPyPz(p);
561 esdTrack->GetXYZ(pos);
31fd97b2 562 esdTrack->GetCovarianceXYZPxPyPz(covTr);
9e2a7f16 563 esdTrack->GetESDpid(pid);
cf22b3fc 564
565 Float_t impactXY, impactZ;
566
567 esdTrack->GetImpactParameters(impactXY,impactZ);
568
569 if (impactXY<3) {
570 // track inside the beam pipe
df9db588 571
9e2a7f16 572 primary->AddDaughter(aodTrack =
cf22b3fc 573 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
df9db588 574 esdTrack->GetLabel(),
9e2a7f16 575 p,
df9db588 576 kTRUE,
9e2a7f16 577 pos,
df9db588 578 kFALSE,
31fd97b2 579 covTr,
b97637d4 580 (Short_t)esdTrack->Charge(),
df9db588 581 esdTrack->GetITSClusterMap(),
9e2a7f16 582 pid,
df9db588 583 primary,
4773afc9 584 kTRUE, // check if this is right
00946a1a 585 kTRUE, // check if this is right
df9db588 586 AliAODTrack::kPrimary)
cf22b3fc 587 );
9e2a7f16 588 aodTrack->ConvertAliPIDtoAODPID();
cf22b3fc 589 }
590 else {
591 // outside the beam pipe: orphan track
9e2a7f16 592 aodTrack =
cf22b3fc 593 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
594 esdTrack->GetLabel(),
9e2a7f16 595 p,
cf22b3fc 596 kTRUE,
9e2a7f16 597 pos,
cf22b3fc 598 kFALSE,
31fd97b2 599 covTr,
b97637d4 600 (Short_t)esdTrack->Charge(),
cf22b3fc 601 esdTrack->GetITSClusterMap(),
9e2a7f16 602 pid,
cf22b3fc 603 NULL,
4773afc9 604 kFALSE, // check if this is right
00946a1a 605 kFALSE, // check if this is right
cf22b3fc 606 AliAODTrack::kOrphan);
9e2a7f16 607 aodTrack->ConvertAliPIDtoAODPID();
cf22b3fc 608 }
609 } // end of loop on tracks
610
200161ad 611 // muon tracks
612 Int_t nMuTracks = esd->GetNumberOfMuonTracks();
613 for (Int_t nMuTrack = 0; nMuTrack < nMuTracks; ++nMuTrack) {
614
9e2a7f16 615 AliESDMuonTrack *esdMuTrack = esd->GetMuonTrack(nMuTrack);
616 p[0] = esdMuTrack->Px();
617 p[1] = esdMuTrack->Py();
618 p[2] = esdMuTrack->Pz();
619 pos[0] = primary->GetX();
620 pos[1] = primary->GetY();
621 pos[2] = primary->GetZ();
200161ad 622
9e2a7f16 623 // has to be changed once the muon pid is provided by the ESD
624 for (Int_t i = 0; i < 10; pid[i++] = 0.); pid[AliAODTrack::kMuon]=1.;
200161ad 625
e1c744ca 626 primary->AddDaughter( aodTrack =
200161ad 627 new(tracks[jTracks++]) AliAODTrack(0, // no ID provided
628 0, // no label provided
9e2a7f16 629 p,
200161ad 630 kTRUE,
9e2a7f16 631 pos,
200161ad 632 kFALSE,
9e2a7f16 633 NULL, // no covariance matrix provided
b97637d4 634 esdMuTrack->Charge(),
635 0, // no ITSMuonClusterMap
9e2a7f16 636 pid,
200161ad 637 primary,
7eb019e8 638 kFALSE, // muon tracks are not used to fit the primary vtx
639 kFALSE, // not used for vertex fit
200161ad 640 AliAODTrack::kPrimary)
641 );
e1c744ca 642 aodTrack->SetHitsPatternInTrigCh(esdMuTrack->GetHitsPatternInTrigCh());
643 Int_t track2Trigger = esdMuTrack->GetMatchTrigger();
644 aodTrack->SetMatchTrigger(track2Trigger);
645 if (track2Trigger)
646 aodTrack->SetChi2MatchTrigger(esdMuTrack->GetChi2MatchTrigger());
647 else
648 aodTrack->SetChi2MatchTrigger(0.);
200161ad 649 }
650
4773afc9 651 // Access to the AOD container of clusters
a9255000 652 TClonesArray &clusters = *(aod->GetClusters());
cf22b3fc 653 Int_t jClusters=0;
654
4773afc9 655 // Calo Clusters
cf22b3fc 656 Int_t nClusters = esd->GetNumberOfCaloClusters();
657
658 for (Int_t iClust=0; iClust<nClusters; ++iClust) {
659
660 AliESDCaloCluster * cluster = esd->GetCaloCluster(iClust);
661
662 Int_t id = cluster->GetID();
663 Int_t label = -1;
f5661047 664 Float_t energy = cluster->E();
665 cluster->GetPosition(posF);
cf22b3fc 666 AliAODVertex *prodVertex = primary;
667 AliAODTrack *primTrack = NULL;
a9255000 668 Char_t ttype=AliAODCluster::kUndef;
cf22b3fc 669
a9255000 670 if (cluster->IsPHOS()) ttype=AliAODCluster::kPHOSNeutral;
cf22b3fc 671 else if (cluster->IsEMCAL()) {
672
673 if (cluster->GetClusterType() == AliESDCaloCluster::kPseudoCluster)
a9255000 674 ttype = AliAODCluster::kEMCALPseudoCluster;
cf22b3fc 675 else
a9255000 676 ttype = AliAODCluster::kEMCALClusterv1;
cf22b3fc 677
678 }
df9db588 679
a9255000 680 new(clusters[jClusters++]) AliAODCluster(id,
cf22b3fc 681 label,
682 energy,
9e2a7f16 683 pos,
684 NULL, // no covariance matrix provided
685 NULL, // no pid for clusters provided
cf22b3fc 686 prodVertex,
687 primTrack,
688 ttype);
689
4773afc9 690 } // end of loop on calo clusters
cf22b3fc 691
821f8f1d 692 // tracklets
693 const AliMultiplicity *mult = esd->GetMultiplicity();
694 if (mult) {
695 if (mult->GetNumberOfTracklets()>0) {
696 aod->GetTracklets()->CreateContainer(mult->GetNumberOfTracklets());
697
698 for (Int_t n=0; n<mult->GetNumberOfTracklets(); n++) {
699 aod->GetTracklets()->SetTracklet(n, mult->GetTheta(n), mult->GetPhi(n), mult->GetDeltaPhi(n), mult->GetLabel(n));
700 }
701 }
702 } else {
703 Printf("ERROR: AliMultiplicity could not be retrieved from ESD");
704 }
705
cf22b3fc 706 delete [] usedTrack;
707 delete [] usedV0;
708 delete [] usedKink;
709
df9db588 710 // fill the tree for this event
711 aodTree->Fill();
cf22b3fc 712 } // end of event loop
df9db588 713
714 aodTree->GetUserInfo()->Add(aod);
715
716 // close ESD file
717 inFile->Close();
718
719 // write the tree to the specified file
720 outFile = aodTree->GetCurrentFile();
721 outFile->cd();
722 aodTree->Write();
723 outFile->Close();
724
725}