]> git.uio.no Git - u/mrichter/AliRoot.git/blob - ANALYSIS/AliAnalysisTaskESDfilter.cxx
printf hidden by debug flag.
[u/mrichter/AliRoot.git] / ANALYSIS / AliAnalysisTaskESDfilter.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: AliAnalysisTaskESDfilter.cxx 24535 2008-03-16 22:43:30Z fca $ */
17  
18 #include <TChain.h>
19 #include <TFile.h>
20 #include <TArrayI.h>
21
22 #include "AliAnalysisTaskESDfilter.h"
23 #include "AliAnalysisManager.h"
24 #include "AliESDEvent.h"
25 #include "AliAODEvent.h"
26 #include "AliESDInputHandler.h"
27 #include "AliAODHandler.h"
28 #include "AliAnalysisFilter.h"
29 #include "AliESDtrack.h"
30 #include "AliESDMuonTrack.h"
31 #include "AliESDVertex.h"
32 #include "AliESDv0.h"
33 #include "AliESDkink.h"
34 #include "AliESDcascade.h"
35 #include "AliESDPmdTrack.h"
36 #include "AliESDCaloCluster.h"
37 #include "AliESDCaloCells.h"
38 #include "AliMultiplicity.h"
39 #include "AliLog.h"
40
41 ClassImp(AliAnalysisTaskESDfilter)
42
43 ////////////////////////////////////////////////////////////////////////
44
45 AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter():
46     AliAnalysisTaskSE(),
47     fTrackFilter(0x0),
48     fKinkFilter(0x0),
49     fV0Filter(0x0)
50 {
51   // Default constructor
52 }
53
54 AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter(const char* name):
55     AliAnalysisTaskSE(name),
56     fTrackFilter(0x0),
57     fKinkFilter(0x0),
58     fV0Filter(0x0)
59 {
60   // Constructor
61 }
62
63 void AliAnalysisTaskESDfilter::UserCreateOutputObjects()
64 {
65 // Create the output container
66     OutputTree()->GetUserInfo()->Add(fTrackFilter);
67 }
68
69 void AliAnalysisTaskESDfilter::Init()
70 {
71     // Initialization
72     if (fDebug > 1) AliInfo("Init() \n");
73     // Call configuration file
74 }
75
76
77 void AliAnalysisTaskESDfilter::UserExec(Option_t */*option*/)
78 {
79 // Execute analysis for current event
80 //
81                                             
82   Long64_t ientry = Entry();
83   if (fDebug > 0) printf("Filter: Analysing event # %5d\n", (Int_t) ientry);
84
85   ConvertESDtoAOD();
86 }
87
88 void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
89     // ESD Filter analysis task executed for each event
90     AliESDEvent* esd = dynamic_cast<AliESDEvent*>(InputEvent());
91     AliESD* old = esd->GetAliESDOld();
92     
93     // set arrays and pointers
94     Float_t posF[3];
95     Double_t pos[3];
96     Double_t p[3];
97     Double_t p_pos[3];
98     Double_t p_neg[3];
99     Double_t covVtx[6];
100     Double_t covTr[21];
101     Double_t pid[10];
102
103     for (Int_t i = 0; i < 6; i++)  covVtx[i] = 0.;
104     for (Int_t i = 0; i < 21; i++) covTr [i] = 0.;
105
106     
107   // loop over events and fill them
108   
109   // Multiplicity information needed by the header (to be revised!)
110     Int_t nTracks    = esd->GetNumberOfTracks();
111     Int_t nPosTracks = 0;
112     for (Int_t iTrack = 0; iTrack < nTracks; ++iTrack) 
113         if (esd->GetTrack(iTrack)->GetSign()> 0) nPosTracks++;
114     
115     // Update the header
116
117     AliAODHeader* header = AODEvent()->GetHeader();
118     header->SetRunNumber(esd->GetRunNumber());
119     if (old) {
120         header->SetBunchCrossNumber(0);
121         header->SetOrbitNumber(0);
122         header->SetPeriodNumber(0);
123         header->SetEventType(0);
124         header->SetMuonMagFieldScale(-999.); // FIXME
125         header->SetCentrality(-999.);        // FIXME
126     } else {
127         header->SetBunchCrossNumber(esd->GetBunchCrossNumber());
128         header->SetOrbitNumber(esd->GetOrbitNumber());
129         header->SetPeriodNumber(esd->GetPeriodNumber());
130         header->SetEventType(esd->GetEventType());
131         header->SetMuonMagFieldScale(-999.); // FIXME
132         header->SetCentrality(-999.);        // FIXME
133     }
134     
135     header->SetTriggerMask(esd->GetTriggerMask()); 
136     header->SetTriggerCluster(esd->GetTriggerCluster());
137     header->SetMagneticField(esd->GetMagneticField());
138     header->SetZDCN1Energy(esd->GetZDCN1Energy());
139     header->SetZDCP1Energy(esd->GetZDCP1Energy());
140     header->SetZDCN2Energy(esd->GetZDCN2Energy());
141     header->SetZDCP2Energy(esd->GetZDCP2Energy());
142     header->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
143     header->SetRefMultiplicity(nTracks);
144     header->SetRefMultiplicityPos(nPosTracks);
145     header->SetRefMultiplicityNeg(nTracks - nPosTracks);
146 //
147 //    
148     Int_t nV0s      = esd->GetNumberOfV0s();
149     Int_t nCascades = esd->GetNumberOfCascades();
150     Int_t nKinks    = esd->GetNumberOfKinks();
151     Int_t nVertices = nV0s + 2*nCascades /*could lead to two vertices, one V0 and the Xi */+ nKinks + 1 /* = prim. vtx*/;    
152     Int_t nJets     = 0;
153     Int_t nCaloClus = esd->GetNumberOfCaloClusters();
154     Int_t nFmdClus  = 0;
155     Int_t nPmdClus  = esd->GetNumberOfPmdTracks();
156     
157     if (fDebug > 0) 
158         printf("   NV0=%d  NCASCADES=%d  NKINKS=%d\n", nV0s, nCascades, nKinks);
159
160     AODEvent()->ResetStd(nTracks, nVertices, nV0s+nCascades, nJets, nCaloClus, nFmdClus, nPmdClus);
161
162     AliAODTrack *aodTrack = 0x0;
163     
164     // Array to take into account the tracks already added to the AOD
165     Bool_t * usedTrack = NULL;
166     if (nTracks>0) {
167         usedTrack = new Bool_t[nTracks];
168         for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) usedTrack[iTrack]=kFALSE;
169     }
170     // Array to take into account the V0s already added to the AOD
171     Bool_t * usedV0 = NULL;
172     if (nV0s>0) {
173         usedV0 = new Bool_t[nV0s];
174         for (Int_t iV0=0; iV0<nV0s; ++iV0) usedV0[iV0]=kFALSE;
175     }
176     // Array to take into account the kinks already added to the AOD
177     Bool_t * usedKink = NULL;
178     if (nKinks>0) {
179         usedKink = new Bool_t[nKinks];
180         for (Int_t iKink=0; iKink<nKinks; ++iKink) usedKink[iKink]=kFALSE;
181     }
182     
183     // Access to the AOD container of vertices
184     TClonesArray &vertices = *(AODEvent()->GetVertices());
185     Int_t jVertices=0;
186     
187     // Access to the AOD container of tracks
188     TClonesArray &tracks = *(AODEvent()->GetTracks());
189     Int_t jTracks=0; 
190     
191     // Access to the AOD container of V0s
192     TClonesArray &V0s = *(AODEvent()->GetV0s());
193     Int_t jV0s=0;
194     
195     // Add primary vertex. The primary tracks will be defined
196     // after the loops on the composite objects (V0, cascades, kinks)
197     const AliESDVertex *vtx = esd->GetPrimaryVertex();
198     
199     vtx->GetXYZ(pos); // position
200     vtx->GetCovMatrix(covVtx); //covariance matrix
201     
202     AliAODVertex * primary = new(vertices[jVertices++])
203         AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, AliAODVertex::kPrimary);
204     if (fDebug > 0) primary->Print();
205
206     // Create vertices starting from the most complex objects
207     Double_t chi2 = 0.;
208     
209     // Cascades
210     for (Int_t nCascade = 0; nCascade < nCascades; ++nCascade) {
211         AliESDcascade *cascade = esd->GetCascade(nCascade);
212         
213         cascade->GetXYZ(pos[0], pos[1], pos[2]);
214
215         if (!old) {
216             chi2 = cascade->GetChi2Xi(); // = chi2/NDF since NDF = 2*2-3
217             cascade->GetPosCovXi(covVtx);
218         } else {
219             chi2 = -999.;
220             for (Int_t i = 0; i < 6; i++)  covVtx[i] = 0.;
221         }
222         // Add the cascade vertex
223         AliAODVertex * vcascade = new(vertices[jVertices++]) AliAODVertex(pos,
224                                                                           covVtx,
225                                                                           chi2,
226                                                                           primary,
227                                                                           nCascade,
228                                                                           AliAODVertex::kCascade);
229         
230         primary->AddDaughter(vcascade);
231         
232         // Add the V0 from the cascade. The ESD class have to be optimized...
233         // Now we have to search for the corresponding Vo in the list of V0s
234         // using the indeces of the positive and negative tracks
235         
236         Int_t posFromV0 = cascade->GetPindex();
237         Int_t negFromV0 = cascade->GetNindex();
238         
239       
240         AliESDv0 * v0 = 0x0;
241         Int_t indV0 = -1;
242         
243         for (Int_t iV0=0; iV0<nV0s; ++iV0) {
244             
245             v0 = esd->GetV0(iV0);
246             Int_t posV0 = v0->GetPindex();
247             Int_t negV0 = v0->GetNindex();
248             
249             if (posV0==posFromV0 && negV0==negFromV0) {
250                 indV0 = iV0;
251                 break;
252             }
253         }
254         
255         AliAODVertex * vV0FromCascade = 0x0;
256         
257         if (indV0>-1 && !usedV0[indV0] ) {
258             
259             // the V0 exists in the array of V0s and is not used
260             
261             usedV0[indV0] = kTRUE;
262             
263             v0->GetXYZ(pos[0], pos[1], pos[2]);
264             if (!old) {
265                 chi2 = v0->GetChi2V0();  // = chi2/NDF since NDF = 2*2-3                             
266                 v0->GetPosCov(covVtx);
267             } else {
268                 chi2 = -999.;
269                 for (Int_t i = 0; i < 6; i++)  covVtx[i] = 0.;
270             }
271
272             vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
273                                                                      covVtx,
274                                                                      chi2,
275                                                                      vcascade,
276                                                                      indV0,
277                                                                      AliAODVertex::kV0);
278         } else {
279             
280             // the V0 doesn't exist in the array of V0s or was used
281 //          cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
282 //               << " The V0 " << indV0 
283 //               << " doesn't exist in the array of V0s or was used!" << endl;
284             
285             cascade->GetXYZ(pos[0], pos[1], pos[2]);
286             
287             if (!old) {
288                 chi2 = v0->GetChi2V0();
289                 cascade->GetPosCov(covVtx);
290             } else {
291                 chi2 = -999.;
292                 for (Int_t i = 0; i < 6; i++)  covVtx[i] = 0.;
293             }
294
295             vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
296                                                                      covVtx,
297                                                                      chi2, // = chi2/NDF since NDF = 2*2-3 (AM)
298                                                                      vcascade,
299                                                                      indV0,
300                                                                      AliAODVertex::kV0);
301             vcascade->AddDaughter(vV0FromCascade);
302         }
303         
304         // Add the positive tracks from the V0
305         
306         if (posFromV0>-1 && !usedTrack[posFromV0]) {
307             
308             usedTrack[posFromV0] = kTRUE;
309             
310             AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
311             esdTrack->GetPxPyPz(p_pos);
312             esdTrack->GetXYZ(pos);
313             esdTrack->GetCovarianceXYZPxPyPz(covTr);
314             esdTrack->GetESDpid(pid);
315             
316             vV0FromCascade->AddDaughter(aodTrack =
317                                         new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
318                                                                            esdTrack->GetLabel(), 
319                                                                            p_pos, 
320                                                                            kTRUE,
321                                                                            pos,
322                                                                            kFALSE,
323                                                                            covTr, 
324                                                                            (Short_t)esdTrack->GetSign(),
325                                                                            esdTrack->GetITSClusterMap(), 
326                                                                            pid,
327                                                                            vV0FromCascade,
328                                                                            kTRUE,  // check if this is right
329                                                                            kFALSE, // check if this is right
330                                                                            AliAODTrack::kSecondary)
331                 );
332             aodTrack->ConvertAliPIDtoAODPID();
333             aodTrack->SetFlags(esdTrack->GetStatus());
334         }
335         else {
336 //          cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
337 //               << " track " << posFromV0 << " has already been used!" << endl;
338         }
339         
340         // Add the negative tracks from the V0
341         
342         if (negFromV0>-1 && !usedTrack[negFromV0]) {
343             
344             usedTrack[negFromV0] = kTRUE;
345             
346             AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
347             esdTrack->GetPxPyPz(p_neg);
348             esdTrack->GetXYZ(pos);
349             esdTrack->GetCovarianceXYZPxPyPz(covTr);
350             esdTrack->GetESDpid(pid);
351             
352             vV0FromCascade->AddDaughter(aodTrack =
353                                         new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
354                                                                            esdTrack->GetLabel(),
355                                                                            p_neg,
356                                                                            kTRUE,
357                                                                            pos,
358                                                                            kFALSE,
359                                                                            covTr, 
360                                                                            (Short_t)esdTrack->GetSign(),
361                                                                            esdTrack->GetITSClusterMap(), 
362                                                                            pid,
363                                                                            vV0FromCascade,
364                                                                            kTRUE,  // check if this is right
365                                                                            kFALSE, // check if this is right
366                                                                            AliAODTrack::kSecondary)
367                 );
368             aodTrack->ConvertAliPIDtoAODPID();
369             aodTrack->SetFlags(esdTrack->GetStatus());      
370         }
371         else {
372 //          cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
373 //               << " track " << negFromV0 << " has already been used!" << endl;
374         }
375         
376         // add it to the V0 array as well
377         Double_t d0[2] = { -999., -99.};
378         // counting is probably wrong
379         new(V0s[jV0s++]) AliAODv0(vV0FromCascade, -999., -99., p_pos, p_neg, d0); // to be refined
380
381         // Add the bachelor track from the cascade
382         
383         Int_t bachelor = cascade->GetBindex();
384         
385         if(bachelor>-1 && !usedTrack[bachelor]) {
386             
387             usedTrack[bachelor] = kTRUE;
388             
389             AliESDtrack *esdTrack = esd->GetTrack(bachelor);
390             esdTrack->GetPxPyPz(p);
391             esdTrack->GetXYZ(pos);
392             esdTrack->GetCovarianceXYZPxPyPz(covTr);
393             esdTrack->GetESDpid(pid);
394             
395             vcascade->AddDaughter(aodTrack =
396                                   new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
397                                                                      esdTrack->GetLabel(),
398                                                                      p,
399                                                                      kTRUE,
400                                                                      pos,
401                                                                      kFALSE,
402                                                                      covTr, 
403                                                                      (Short_t)esdTrack->GetSign(),
404                                                                      esdTrack->GetITSClusterMap(), 
405                                                                      pid,
406                                                                      vcascade,
407                                                                      kTRUE,  // check if this is right
408                                                                      kFALSE, // check if this is right
409                                                                      AliAODTrack::kSecondary)
410                 );
411             aodTrack->ConvertAliPIDtoAODPID();
412             aodTrack->SetFlags(esdTrack->GetStatus());
413         }
414         else {
415 //          cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
416 //               << " track " << bachelor << " has already been used!" << endl;
417         }
418         
419         // Add the primary track of the cascade (if any)
420         
421     } // end of the loop on cascades
422    
423     // V0s
424     
425     for (Int_t nV0 = 0; nV0 < nV0s; ++nV0) {
426         
427         if (usedV0[nV0]) continue; // skip if aready added to the AOD
428         
429         AliESDv0 *v0 = esd->GetV0(nV0);
430         
431         v0->GetXYZ(pos[0], pos[1], pos[2]);
432
433         if (!old) {
434             chi2 = v0->GetChi2V0(); // = chi2/NDF since NDF = 2*2-3
435             v0->GetPosCov(covVtx);
436         } else {
437             chi2 = -999.;
438             for (Int_t i = 0; i < 6; i++)  covVtx[i] = 0.;
439         }
440
441
442         AliAODVertex * vV0 = 
443           new(vertices[jVertices++]) AliAODVertex(pos,
444                                                   covVtx,
445                                                   chi2,
446                                                   primary,
447                                                   nV0,
448                                                   AliAODVertex::kV0);
449         primary->AddDaughter(vV0);
450         
451         Int_t posFromV0 = v0->GetPindex();
452         Int_t negFromV0 = v0->GetNindex();
453         
454         // Add the positive tracks from the V0
455         
456         if (posFromV0>-1 && !usedTrack[posFromV0]) {
457             
458             usedTrack[posFromV0] = kTRUE;
459             
460             AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
461             esdTrack->GetPxPyPz(p_pos);
462             esdTrack->GetXYZ(pos);
463             esdTrack->GetCovarianceXYZPxPyPz(covTr);
464             esdTrack->GetESDpid(pid);
465             
466             vV0->AddDaughter(aodTrack =
467                              new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
468                                                                 esdTrack->GetLabel(), 
469                                                                 p_pos, 
470                                                                 kTRUE,
471                                                                 pos,
472                                                                 kFALSE,
473                                                                 covTr, 
474                                                                 (Short_t)esdTrack->GetSign(),
475                                                                 esdTrack->GetITSClusterMap(), 
476                                                                 pid,
477                                                                 vV0,
478                                                                 kTRUE,  // check if this is right
479                                                                 kFALSE, // check if this is right
480                                                                 AliAODTrack::kSecondary)
481                 );
482             aodTrack->ConvertAliPIDtoAODPID();
483             aodTrack->SetFlags(esdTrack->GetStatus());
484         }
485         else {
486 //          cerr << "Error: event " << esd->GetEventNumberInFile() << " V0 " << nV0
487 //               << " track " << posFromV0 << " has already been used!" << endl;
488         }
489         
490         // Add the negative tracks from the V0
491         
492         if (negFromV0>-1 && !usedTrack[negFromV0]) {
493             
494             usedTrack[negFromV0] = kTRUE;
495             
496             AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
497             esdTrack->GetPxPyPz(p_neg);
498             esdTrack->GetXYZ(pos);
499             esdTrack->GetCovarianceXYZPxPyPz(covTr);
500             esdTrack->GetESDpid(pid);
501             
502             vV0->AddDaughter(aodTrack =
503                              new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
504                                                                 esdTrack->GetLabel(),
505                                                                 p_neg,
506                                                                 kTRUE,
507                                                                 pos,
508                                                                 kFALSE,
509                                                                 covTr, 
510                                                                 (Short_t)esdTrack->GetSign(),
511                                                                 esdTrack->GetITSClusterMap(), 
512                                                                 pid,
513                                                                 vV0,
514                                                                 kTRUE,  // check if this is right
515                                                                 kFALSE, // check if this is right
516                                                                 AliAODTrack::kSecondary)
517                 );
518             aodTrack->ConvertAliPIDtoAODPID();
519             aodTrack->SetFlags(esdTrack->GetStatus());
520         }
521         else {
522 //          cerr << "Error: event " << esd->GetEventNumberInFile() << " V0 " << nV0
523 //               << " track " << negFromV0 << " has already been used!" << endl;
524         }
525
526         // add it to the V0 array as well
527         Double_t d0[2] = { 999., 99.};
528         new(V0s[jV0s++]) AliAODv0(vV0, 999., 99., p_pos, p_neg, d0); // to be refined
529     } 
530     V0s.Expand(jV0s);    
531     // end of the loop on V0s
532     
533     // Kinks: it is a big mess the access to the information in the kinks
534     // The loop is on the tracks in order to find the mother and daugther of each kink
535     
536     
537     for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) {
538         
539         AliESDtrack * esdTrack = esd->GetTrack(iTrack);
540         
541         Int_t ikink = esdTrack->GetKinkIndex(0);
542         
543         if (ikink && nKinks) {
544             // Negative kink index: mother, positive: daughter
545             
546             // Search for the second track of the kink
547             
548             for (Int_t jTrack = iTrack+1; jTrack<nTracks; ++jTrack) {
549                 
550                 AliESDtrack * esdTrack1 = esd->GetTrack(jTrack);
551                 
552                 Int_t jkink = esdTrack1->GetKinkIndex(0);
553                 
554                 if ( TMath::Abs(ikink)==TMath::Abs(jkink) ) {
555                     
556                     // The two tracks are from the same kink
557                     
558                     if (usedKink[TMath::Abs(ikink)-1]) continue; // skip used kinks
559                     
560                     Int_t imother = -1;
561                     Int_t idaughter = -1;
562                     
563                     if (ikink<0 && jkink>0) {
564                         
565                         imother = iTrack;
566                         idaughter = jTrack;
567                     }
568                     else if (ikink>0 && jkink<0) {
569                         
570                         imother = jTrack;
571                         idaughter = iTrack;
572                     }
573                     else {
574 //                      cerr << "Error: Wrong combination of kink indexes: "
575 //                           << ikink << " " << jkink << endl;
576                         continue;
577                     }
578                     
579                     // Add the mother track
580                     
581                     AliAODTrack * mother = NULL;
582                     
583                     if (!usedTrack[imother]) {
584                         
585                         usedTrack[imother] = kTRUE;
586                         
587                         AliESDtrack *esdTrack = esd->GetTrack(imother);
588                         esdTrack->GetPxPyPz(p);
589                         esdTrack->GetXYZ(pos);
590                         esdTrack->GetCovarianceXYZPxPyPz(covTr);
591                         esdTrack->GetESDpid(pid);
592                         
593                         mother = 
594                             new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
595                                                                esdTrack->GetLabel(),
596                                                                p,
597                                                                kTRUE,
598                                                                pos,
599                                                                kFALSE,
600                                                                covTr, 
601                                                                (Short_t)esdTrack->GetSign(),
602                                                                esdTrack->GetITSClusterMap(), 
603                                                                pid,
604                                                                primary,
605                                                                kTRUE, // check if this is right
606                                                                kTRUE, // check if this is right
607                                                                AliAODTrack::kPrimary);
608                         mother->SetFlags(esdTrack->GetStatus());
609                         mother->ConvertAliPIDtoAODPID();
610                         primary->AddDaughter(mother);
611                         mother->ConvertAliPIDtoAODPID();
612                     }
613                     else {
614 //                      cerr << "Error: event " << esd->GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
615 //                           << " track " << imother << " has already been used!" << endl;
616                   }
617                     
618                     // Add the kink vertex
619                     AliESDkink * kink = esd->GetKink(TMath::Abs(ikink)-1);
620                     
621                     AliAODVertex * vkink = 
622                         new(vertices[jVertices++]) AliAODVertex(kink->GetPosition(),
623                                                                 NULL,
624                                                                 0.,
625                                                                 mother,
626                                                                 esdTrack->GetID(),  // This is the track ID of the mother's track!
627                                                                 AliAODVertex::kKink);
628                     // Add the daughter track
629                   
630                     AliAODTrack * daughter = NULL;
631                     
632                     if (!usedTrack[idaughter]) {
633                         
634                         usedTrack[idaughter] = kTRUE;
635                         
636                         AliESDtrack *esdTrack = esd->GetTrack(idaughter);
637                         esdTrack->GetPxPyPz(p);
638                         esdTrack->GetXYZ(pos);
639                         esdTrack->GetCovarianceXYZPxPyPz(covTr);
640                         esdTrack->GetESDpid(pid);
641                         
642                         daughter = 
643                             new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
644                                                                esdTrack->GetLabel(),
645                                                                p,
646                                                                kTRUE,
647                                                                pos,
648                                                                kFALSE,
649                                                                covTr, 
650                                                                (Short_t)esdTrack->GetSign(),
651                                                                esdTrack->GetITSClusterMap(), 
652                                                                pid,
653                                                                vkink,
654                                                                kTRUE, // check if this is right
655                                                                kTRUE, // check if this is right
656                                                                AliAODTrack::kPrimary);
657                         daughter->SetFlags(esdTrack->GetStatus());
658                         daughter->ConvertAliPIDtoAODPID();
659                         vkink->AddDaughter(daughter);
660                         daughter->ConvertAliPIDtoAODPID();
661                     }
662                     else {
663 //                      cerr << "Error: event " << esd->GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
664 //                           << " track " << idaughter << " has already been used!" << endl;
665                     }
666                 }
667             }
668         }      
669     }
670     
671   
672     // Tracks (primary and orphan)
673
674     if (fDebug > 0) printf("NUMBER OF TRACKS %5d\n", nTracks);
675     
676     for (Int_t nTrack = 0; nTrack < nTracks; ++nTrack) {
677         
678         
679         if (usedTrack[nTrack]) continue;
680
681         AliESDtrack *esdTrack = esd->GetTrack(nTrack);
682         UInt_t selectInfo = 0;
683         //
684         // Track selection
685         if (fTrackFilter) {
686             selectInfo = fTrackFilter->IsSelected(esdTrack);
687             if (!selectInfo) continue;
688         }
689         
690         //
691         esdTrack->GetPxPyPz(p);
692         esdTrack->GetXYZ(pos);
693         esdTrack->GetCovarianceXYZPxPyPz(covTr);
694         esdTrack->GetESDpid(pid);
695         
696         Float_t impactXY, impactZ;
697         
698         esdTrack->GetImpactParameters(impactXY,impactZ);
699         
700         if (impactXY<3) {
701             // track inside the beam pipe
702             
703             primary->AddDaughter(aodTrack =
704                                  new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
705                                                                     esdTrack->GetLabel(),
706                                                                     p,
707                                                                     kTRUE,
708                                                                     pos,
709                                                                     kFALSE,
710                                                                     covTr, 
711                                                                     (Short_t)esdTrack->GetSign(),
712                                                                     esdTrack->GetITSClusterMap(), 
713                                                                     pid,
714                                                                     primary,
715                                                                     kTRUE, // check if this is right
716                                                                     kTRUE, // check if this is right
717                                                                     AliAODTrack::kPrimary, 
718                                                                     selectInfo)
719                 );
720             aodTrack->SetFlags(esdTrack->GetStatus());
721             aodTrack->ConvertAliPIDtoAODPID();
722         }
723         else {
724           // outside the beam pipe: orphan track
725           // Don't write them anymore!
726           continue;
727           /*
728           aodTrack =
729             new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
730                                                esdTrack->GetLabel(),
731                                                p,
732                                                kTRUE,
733                                                pos,
734                                                kFALSE,
735                                                covTr, 
736                                                (Short_t)esdTrack->GetSign(),
737                                                esdTrack->GetITSClusterMap(), 
738                                                pid,
739                                                NULL,
740                                                kFALSE, // check if this is right
741                                                kFALSE, // check if this is right
742                                                AliAODTrack::kOrphan,
743                                                selectInfo);
744           aodTrack->SetFlags(esdTrack->GetStatus());
745           aodTrack->ConvertAliPIDtoAODPID();
746           */
747         }       
748     } // end of loop on tracks
749     
750     tracks.Expand(jTracks); // remove 'empty slots' due to unwritten tracks
751   
752     // Access to the AOD container of PMD clusters
753     TClonesArray &pmdClusters = *(AODEvent()->GetPmdClusters());
754     Int_t jPmdClusters=0;
755   
756     for (Int_t iPmd = 0; iPmd < nPmdClus; ++iPmd) {
757       // file pmd clusters, to be revised!
758       AliESDPmdTrack *pmdTrack = esd->GetPmdTrack(iPmd);
759       Int_t nLabel = 0;
760       Int_t *label = 0x0;
761       Double_t pos[3] = { pmdTrack->GetClusterX(), pmdTrack->GetClusterY(), pmdTrack->GetClusterZ() };
762       Double_t pid[9] = { 0., 0., 0., 0., 0., 0., 0., 0., 0. }; // to be revised!
763       // type not set!
764       // assoc cluster not set
765       new(pmdClusters[jPmdClusters++]) AliAODPmdCluster(iPmd, nLabel, label, pmdTrack->GetClusterADC(), pos, pid);
766     }
767
768     // Access to the AOD container of clusters
769     TClonesArray &caloClusters = *(AODEvent()->GetCaloClusters());
770     Int_t jClusters=0;
771  
772     for (Int_t iClust=0; iClust<nCaloClus; ++iClust) {
773
774       AliESDCaloCluster * cluster = esd->GetCaloCluster(iClust);
775
776       Int_t id        = cluster->GetID();
777       Int_t nLabel    = cluster->GetNLabels();
778       TArrayI* labels = cluster->GetLabels();
779       Int_t *label = 0;
780       if (labels) label = (cluster->GetLabels())->GetArray();
781
782       Float_t energy = cluster->E();
783       cluster->GetPosition(posF);
784       Char_t ttype = AliAODCluster::kUndef; 
785
786       if (cluster->GetClusterType() == AliESDCaloCluster::kPHOSCluster) {
787         ttype=AliAODCluster::kPHOSNeutral;
788       } 
789       else if (cluster->GetClusterType() == AliESDCaloCluster::kEMCALClusterv1) {
790         ttype = AliAODCluster::kEMCALClusterv1;
791       }
792
793       
794       AliAODCaloCluster *caloCluster = new(caloClusters[jClusters++]) AliAODCaloCluster(id,
795                                                                                         nLabel,
796                                                                                         label,
797                                                                                         energy,
798                                                                                         pos,
799                                                                                         NULL,
800                                                                                         ttype);
801       
802       caloCluster->SetCaloCluster(cluster->GetDistanceToBadChannel(),
803                                   cluster->GetClusterDisp(),
804                                   cluster->GetM20(), cluster->GetM02(),
805                                   cluster->GetEmcCpvDistance(),  
806                                   cluster->GetNExMax(),cluster->GetTOF()) ;
807
808       caloCluster->SetNCells(cluster->GetNCells());
809       caloCluster->SetCellsAbsId(cluster->GetCellsAbsId());
810       caloCluster->SetCellsAmplitudeFraction(cluster->GetCellsAmplitudeFraction());
811
812       TArrayI* matchedT =       cluster->GetTracksMatched();
813       if (matchedT) {   
814         for (Int_t im = 0; im < matchedT->GetSize(); im++) {
815           caloCluster->AddTrackMatched((esd->GetTrack(im)));
816         }
817       }
818
819     } 
820     caloClusters.Expand(jClusters); // resize TObjArray to 'remove' slots for pseudo clusters    
821     // end of loop on calo clusters
822
823     // fill EMCAL cell info
824     if (esd->GetEMCALCells()) { // protection against missing ESD information
825       AliESDCaloCells &esdEMcells = *(esd->GetEMCALCells());
826       Int_t nEMcell = esdEMcells.GetNumberOfCells() ;
827       
828       AliAODCaloCells &aodEMcells = *(AODEvent()->GetEMCALCells());
829       aodEMcells.CreateContainer(nEMcell);
830       aodEMcells.SetType(AliAODCaloCells::kEMCAL);
831       for (Int_t iCell = 0; iCell < nEMcell; iCell++) {      
832         aodEMcells.SetCell(iCell,esdEMcells.GetCellNumber(iCell),esdEMcells.GetAmplitude(iCell));
833       }
834       aodEMcells.Sort();
835     }
836
837     // fill PHOS cell info
838     if (esd->GetPHOSCells()) { // protection against missing ESD information
839       AliESDCaloCells &esdPHcells = *(esd->GetPHOSCells());
840       Int_t nPHcell = esdPHcells.GetNumberOfCells() ;
841       
842       AliAODCaloCells &aodPHcells = *(AODEvent()->GetPHOSCells());
843       aodPHcells.CreateContainer(nPHcell);
844       aodPHcells.SetType(AliAODCaloCells::kPHOS);
845       for (Int_t iCell = 0; iCell < nPHcell; iCell++) {      
846         aodPHcells.SetCell(iCell,esdPHcells.GetCellNumber(iCell),esdPHcells.GetAmplitude(iCell));
847       }
848       aodPHcells.Sort();
849     }
850
851     // tracklets    
852     AliAODTracklets &SPDTracklets = *(AODEvent()->GetTracklets());
853     const AliMultiplicity *mult = esd->GetMultiplicity();
854     if (mult) {
855       if (mult->GetNumberOfTracklets()>0) {
856         SPDTracklets.CreateContainer(mult->GetNumberOfTracklets());
857
858         for (Int_t n=0; n<mult->GetNumberOfTracklets(); n++) {
859           SPDTracklets.SetTracklet(n, mult->GetTheta(n), mult->GetPhi(n), mult->GetDeltaPhi(n), mult->GetLabel(n, 0), mult->GetLabel(n, 1));
860         }
861       }
862     } else {
863       //Printf("ERROR: AliMultiplicity could not be retrieved from ESD");
864     }
865
866     delete [] usedTrack;
867     delete [] usedV0;
868     delete [] usedKink;
869
870     return;
871 }
872
873 void AliAnalysisTaskESDfilter::Terminate(Option_t */*option*/)
874 {
875 // Terminate analysis
876 //
877     if (fDebug > 1) printf("AnalysisESDfilter: Terminate() \n");
878 }
879