]> git.uio.no Git - u/mrichter/AliRoot.git/blob - ANALYSIS/AliAnalysisTaskESDfilter.cxx
Update on caloCluster. (Gustavo)
[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   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     printf("   NV0=%d  NCASCADES=%d  NKINKS=%d\n", nV0s, nCascades, nKinks);
158
159     AODEvent()->ResetStd(nTracks, nVertices, nV0s+nCascades, nJets, nCaloClus, nFmdClus, nPmdClus);
160
161     AliAODTrack *aodTrack = 0x0;
162     
163     // Array to take into account the tracks already added to the AOD
164     Bool_t * usedTrack = NULL;
165     if (nTracks>0) {
166         usedTrack = new Bool_t[nTracks];
167         for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) usedTrack[iTrack]=kFALSE;
168     }
169     // Array to take into account the V0s already added to the AOD
170     Bool_t * usedV0 = NULL;
171     if (nV0s>0) {
172         usedV0 = new Bool_t[nV0s];
173         for (Int_t iV0=0; iV0<nV0s; ++iV0) usedV0[iV0]=kFALSE;
174     }
175     // Array to take into account the kinks already added to the AOD
176     Bool_t * usedKink = NULL;
177     if (nKinks>0) {
178         usedKink = new Bool_t[nKinks];
179         for (Int_t iKink=0; iKink<nKinks; ++iKink) usedKink[iKink]=kFALSE;
180     }
181     
182     // Access to the AOD container of vertices
183     TClonesArray &vertices = *(AODEvent()->GetVertices());
184     Int_t jVertices=0;
185     
186     // Access to the AOD container of tracks
187     TClonesArray &tracks = *(AODEvent()->GetTracks());
188     Int_t jTracks=0; 
189     
190     // Access to the AOD container of V0s
191     TClonesArray &V0s = *(AODEvent()->GetV0s());
192     Int_t jV0s=0;
193     
194     // Add primary vertex. The primary tracks will be defined
195     // after the loops on the composite objects (V0, cascades, kinks)
196     const AliESDVertex *vtx = esd->GetPrimaryVertex();
197     
198     vtx->GetXYZ(pos); // position
199     vtx->GetCovMatrix(covVtx); //covariance matrix
200     
201     AliAODVertex * primary = new(vertices[jVertices++])
202         AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, AliAODVertex::kPrimary);
203     primary->Print();
204
205     // Create vertices starting from the most complex objects
206     Double_t chi2 = 0.;
207     
208     // Cascades
209     for (Int_t nCascade = 0; nCascade < nCascades; ++nCascade) {
210         AliESDcascade *cascade = esd->GetCascade(nCascade);
211         
212         cascade->GetXYZ(pos[0], pos[1], pos[2]);
213
214         if (!old) {
215             chi2 = cascade->GetChi2Xi(); // = chi2/NDF since NDF = 2*2-3
216             cascade->GetPosCovXi(covVtx);
217         } else {
218             chi2 = -999.;
219             for (Int_t i = 0; i < 6; i++)  covVtx[i] = 0.;
220         }
221         // Add the cascade vertex
222         AliAODVertex * vcascade = new(vertices[jVertices++]) AliAODVertex(pos,
223                                                                           covVtx,
224                                                                           chi2,
225                                                                           primary,
226                                                                           nCascade,
227                                                                           AliAODVertex::kCascade);
228         
229         primary->AddDaughter(vcascade);
230         
231         // Add the V0 from the cascade. The ESD class have to be optimized...
232         // Now we have to search for the corresponding Vo in the list of V0s
233         // using the indeces of the positive and negative tracks
234         
235         Int_t posFromV0 = cascade->GetPindex();
236         Int_t negFromV0 = cascade->GetNindex();
237         
238       
239         AliESDv0 * v0 = 0x0;
240         Int_t indV0 = -1;
241         
242         for (Int_t iV0=0; iV0<nV0s; ++iV0) {
243             
244             v0 = esd->GetV0(iV0);
245             Int_t posV0 = v0->GetPindex();
246             Int_t negV0 = v0->GetNindex();
247             
248             if (posV0==posFromV0 && negV0==negFromV0) {
249                 indV0 = iV0;
250                 break;
251             }
252         }
253         
254         AliAODVertex * vV0FromCascade = 0x0;
255         
256         if (indV0>-1 && !usedV0[indV0] ) {
257             
258             // the V0 exists in the array of V0s and is not used
259             
260             usedV0[indV0] = kTRUE;
261             
262             v0->GetXYZ(pos[0], pos[1], pos[2]);
263             if (!old) {
264                 chi2 = v0->GetChi2V0();  // = chi2/NDF since NDF = 2*2-3                             
265                 v0->GetPosCov(covVtx);
266             } else {
267                 chi2 = -999.;
268                 for (Int_t i = 0; i < 6; i++)  covVtx[i] = 0.;
269             }
270
271             vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
272                                                                      covVtx,
273                                                                      chi2,
274                                                                      vcascade,
275                                                                      indV0,
276                                                                      AliAODVertex::kV0);
277         } else {
278             
279             // the V0 doesn't exist in the array of V0s or was used
280 //          cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
281 //               << " The V0 " << indV0 
282 //               << " doesn't exist in the array of V0s or was used!" << endl;
283             
284             cascade->GetXYZ(pos[0], pos[1], pos[2]);
285             
286             if (!old) {
287                 chi2 = v0->GetChi2V0();
288                 cascade->GetPosCov(covVtx);
289             } else {
290                 chi2 = -999.;
291                 for (Int_t i = 0; i < 6; i++)  covVtx[i] = 0.;
292             }
293
294             vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
295                                                                      covVtx,
296                                                                      chi2, // = chi2/NDF since NDF = 2*2-3 (AM)
297                                                                      vcascade,
298                                                                      indV0,
299                                                                      AliAODVertex::kV0);
300             vcascade->AddDaughter(vV0FromCascade);
301         }
302         
303         // Add the positive tracks from the V0
304         
305         if (posFromV0>-1 && !usedTrack[posFromV0]) {
306             
307             usedTrack[posFromV0] = kTRUE;
308             
309             AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
310             esdTrack->GetPxPyPz(p_pos);
311             esdTrack->GetXYZ(pos);
312             esdTrack->GetCovarianceXYZPxPyPz(covTr);
313             esdTrack->GetESDpid(pid);
314             
315             vV0FromCascade->AddDaughter(aodTrack =
316                                         new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
317                                                                            esdTrack->GetLabel(), 
318                                                                            p_pos, 
319                                                                            kTRUE,
320                                                                            pos,
321                                                                            kFALSE,
322                                                                            covTr, 
323                                                                            (Short_t)esdTrack->GetSign(),
324                                                                            esdTrack->GetITSClusterMap(), 
325                                                                            pid,
326                                                                            vV0FromCascade,
327                                                                            kTRUE,  // check if this is right
328                                                                            kFALSE, // check if this is right
329                                                                            AliAODTrack::kSecondary)
330                 );
331             aodTrack->ConvertAliPIDtoAODPID();
332             aodTrack->SetFlags(esdTrack->GetStatus());
333         }
334         else {
335 //          cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
336 //               << " track " << posFromV0 << " has already been used!" << endl;
337         }
338         
339         // Add the negative tracks from the V0
340         
341         if (negFromV0>-1 && !usedTrack[negFromV0]) {
342             
343             usedTrack[negFromV0] = kTRUE;
344             
345             AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
346             esdTrack->GetPxPyPz(p_neg);
347             esdTrack->GetXYZ(pos);
348             esdTrack->GetCovarianceXYZPxPyPz(covTr);
349             esdTrack->GetESDpid(pid);
350             
351             vV0FromCascade->AddDaughter(aodTrack =
352                                         new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
353                                                                            esdTrack->GetLabel(),
354                                                                            p_neg,
355                                                                            kTRUE,
356                                                                            pos,
357                                                                            kFALSE,
358                                                                            covTr, 
359                                                                            (Short_t)esdTrack->GetSign(),
360                                                                            esdTrack->GetITSClusterMap(), 
361                                                                            pid,
362                                                                            vV0FromCascade,
363                                                                            kTRUE,  // check if this is right
364                                                                            kFALSE, // check if this is right
365                                                                            AliAODTrack::kSecondary)
366                 );
367             aodTrack->ConvertAliPIDtoAODPID();
368             aodTrack->SetFlags(esdTrack->GetStatus());      
369         }
370         else {
371 //          cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
372 //               << " track " << negFromV0 << " has already been used!" << endl;
373         }
374         
375         // add it to the V0 array as well
376         Double_t d0[2] = { -999., -99.};
377         // counting is probably wrong
378         new(V0s[jV0s++]) AliAODv0(vV0FromCascade, -999., -99., p_pos, p_neg, d0); // to be refined
379
380         // Add the bachelor track from the cascade
381         
382         Int_t bachelor = cascade->GetBindex();
383         
384         if(bachelor>-1 && !usedTrack[bachelor]) {
385             
386             usedTrack[bachelor] = kTRUE;
387             
388             AliESDtrack *esdTrack = esd->GetTrack(bachelor);
389             esdTrack->GetPxPyPz(p);
390             esdTrack->GetXYZ(pos);
391             esdTrack->GetCovarianceXYZPxPyPz(covTr);
392             esdTrack->GetESDpid(pid);
393             
394             vcascade->AddDaughter(aodTrack =
395                                   new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
396                                                                      esdTrack->GetLabel(),
397                                                                      p,
398                                                                      kTRUE,
399                                                                      pos,
400                                                                      kFALSE,
401                                                                      covTr, 
402                                                                      (Short_t)esdTrack->GetSign(),
403                                                                      esdTrack->GetITSClusterMap(), 
404                                                                      pid,
405                                                                      vcascade,
406                                                                      kTRUE,  // check if this is right
407                                                                      kFALSE, // check if this is right
408                                                                      AliAODTrack::kSecondary)
409                 );
410             aodTrack->ConvertAliPIDtoAODPID();
411             aodTrack->SetFlags(esdTrack->GetStatus());
412         }
413         else {
414 //          cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
415 //               << " track " << bachelor << " has already been used!" << endl;
416         }
417         
418         // Add the primary track of the cascade (if any)
419         
420     } // end of the loop on cascades
421    
422     // V0s
423     
424     for (Int_t nV0 = 0; nV0 < nV0s; ++nV0) {
425         
426         if (usedV0[nV0]) continue; // skip if aready added to the AOD
427         
428         AliESDv0 *v0 = esd->GetV0(nV0);
429         
430         v0->GetXYZ(pos[0], pos[1], pos[2]);
431
432         if (!old) {
433             chi2 = v0->GetChi2V0(); // = chi2/NDF since NDF = 2*2-3
434             v0->GetPosCov(covVtx);
435         } else {
436             chi2 = -999.;
437             for (Int_t i = 0; i < 6; i++)  covVtx[i] = 0.;
438         }
439
440
441         AliAODVertex * vV0 = 
442           new(vertices[jVertices++]) AliAODVertex(pos,
443                                                   covVtx,
444                                                   chi2,
445                                                   primary,
446                                                   nV0,
447                                                   AliAODVertex::kV0);
448         primary->AddDaughter(vV0);
449         
450         Int_t posFromV0 = v0->GetPindex();
451         Int_t negFromV0 = v0->GetNindex();
452         
453         // Add the positive tracks from the V0
454         
455         if (posFromV0>-1 && !usedTrack[posFromV0]) {
456             
457             usedTrack[posFromV0] = kTRUE;
458             
459             AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
460             esdTrack->GetPxPyPz(p_pos);
461             esdTrack->GetXYZ(pos);
462             esdTrack->GetCovarianceXYZPxPyPz(covTr);
463             esdTrack->GetESDpid(pid);
464             
465             vV0->AddDaughter(aodTrack =
466                              new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
467                                                                 esdTrack->GetLabel(), 
468                                                                 p_pos, 
469                                                                 kTRUE,
470                                                                 pos,
471                                                                 kFALSE,
472                                                                 covTr, 
473                                                                 (Short_t)esdTrack->GetSign(),
474                                                                 esdTrack->GetITSClusterMap(), 
475                                                                 pid,
476                                                                 vV0,
477                                                                 kTRUE,  // check if this is right
478                                                                 kFALSE, // check if this is right
479                                                                 AliAODTrack::kSecondary)
480                 );
481             aodTrack->ConvertAliPIDtoAODPID();
482             aodTrack->SetFlags(esdTrack->GetStatus());
483         }
484         else {
485 //          cerr << "Error: event " << esd->GetEventNumberInFile() << " V0 " << nV0
486 //               << " track " << posFromV0 << " has already been used!" << endl;
487         }
488         
489         // Add the negative tracks from the V0
490         
491         if (negFromV0>-1 && !usedTrack[negFromV0]) {
492             
493             usedTrack[negFromV0] = kTRUE;
494             
495             AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
496             esdTrack->GetPxPyPz(p_neg);
497             esdTrack->GetXYZ(pos);
498             esdTrack->GetCovarianceXYZPxPyPz(covTr);
499             esdTrack->GetESDpid(pid);
500             
501             vV0->AddDaughter(aodTrack =
502                              new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
503                                                                 esdTrack->GetLabel(),
504                                                                 p_neg,
505                                                                 kTRUE,
506                                                                 pos,
507                                                                 kFALSE,
508                                                                 covTr, 
509                                                                 (Short_t)esdTrack->GetSign(),
510                                                                 esdTrack->GetITSClusterMap(), 
511                                                                 pid,
512                                                                 vV0,
513                                                                 kTRUE,  // check if this is right
514                                                                 kFALSE, // check if this is right
515                                                                 AliAODTrack::kSecondary)
516                 );
517             aodTrack->ConvertAliPIDtoAODPID();
518             aodTrack->SetFlags(esdTrack->GetStatus());
519         }
520         else {
521 //          cerr << "Error: event " << esd->GetEventNumberInFile() << " V0 " << nV0
522 //               << " track " << negFromV0 << " has already been used!" << endl;
523         }
524
525         // add it to the V0 array as well
526         Double_t d0[2] = { 999., 99.};
527         new(V0s[jV0s++]) AliAODv0(vV0, 999., 99., p_pos, p_neg, d0); // to be refined
528     } 
529     V0s.Expand(jV0s);    
530     // end of the loop on V0s
531     
532     // Kinks: it is a big mess the access to the information in the kinks
533     // The loop is on the tracks in order to find the mother and daugther of each kink
534     
535     
536     for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) {
537         
538         AliESDtrack * esdTrack = esd->GetTrack(iTrack);
539         
540         Int_t ikink = esdTrack->GetKinkIndex(0);
541         
542         if (ikink && nKinks) {
543             // Negative kink index: mother, positive: daughter
544             
545             // Search for the second track of the kink
546             
547             for (Int_t jTrack = iTrack+1; jTrack<nTracks; ++jTrack) {
548                 
549                 AliESDtrack * esdTrack1 = esd->GetTrack(jTrack);
550                 
551                 Int_t jkink = esdTrack1->GetKinkIndex(0);
552                 
553                 if ( TMath::Abs(ikink)==TMath::Abs(jkink) ) {
554                     
555                     // The two tracks are from the same kink
556                     
557                     if (usedKink[TMath::Abs(ikink)-1]) continue; // skip used kinks
558                     
559                     Int_t imother = -1;
560                     Int_t idaughter = -1;
561                     
562                     if (ikink<0 && jkink>0) {
563                         
564                         imother = iTrack;
565                         idaughter = jTrack;
566                     }
567                     else if (ikink>0 && jkink<0) {
568                         
569                         imother = jTrack;
570                         idaughter = iTrack;
571                     }
572                     else {
573 //                      cerr << "Error: Wrong combination of kink indexes: "
574 //                           << ikink << " " << jkink << endl;
575                         continue;
576                     }
577                     
578                     // Add the mother track
579                     
580                     AliAODTrack * mother = NULL;
581                     
582                     if (!usedTrack[imother]) {
583                         
584                         usedTrack[imother] = kTRUE;
585                         
586                         AliESDtrack *esdTrack = esd->GetTrack(imother);
587                         esdTrack->GetPxPyPz(p);
588                         esdTrack->GetXYZ(pos);
589                         esdTrack->GetCovarianceXYZPxPyPz(covTr);
590                         esdTrack->GetESDpid(pid);
591                         
592                         mother = 
593                             new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
594                                                                esdTrack->GetLabel(),
595                                                                p,
596                                                                kTRUE,
597                                                                pos,
598                                                                kFALSE,
599                                                                covTr, 
600                                                                (Short_t)esdTrack->GetSign(),
601                                                                esdTrack->GetITSClusterMap(), 
602                                                                pid,
603                                                                primary,
604                                                                kTRUE, // check if this is right
605                                                                kTRUE, // check if this is right
606                                                                AliAODTrack::kPrimary);
607                         mother->SetFlags(esdTrack->GetStatus());
608                         mother->ConvertAliPIDtoAODPID();
609                         primary->AddDaughter(mother);
610                         mother->ConvertAliPIDtoAODPID();
611                     }
612                     else {
613 //                      cerr << "Error: event " << esd->GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
614 //                           << " track " << imother << " has already been used!" << endl;
615                   }
616                     
617                     // Add the kink vertex
618                     AliESDkink * kink = esd->GetKink(TMath::Abs(ikink)-1);
619                     
620                     AliAODVertex * vkink = 
621                         new(vertices[jVertices++]) AliAODVertex(kink->GetPosition(),
622                                                                 NULL,
623                                                                 0.,
624                                                                 mother,
625                                                                 esdTrack->GetID(),  // This is the track ID of the mother's track!
626                                                                 AliAODVertex::kKink);
627                     // Add the daughter track
628                   
629                     AliAODTrack * daughter = NULL;
630                     
631                     if (!usedTrack[idaughter]) {
632                         
633                         usedTrack[idaughter] = kTRUE;
634                         
635                         AliESDtrack *esdTrack = esd->GetTrack(idaughter);
636                         esdTrack->GetPxPyPz(p);
637                         esdTrack->GetXYZ(pos);
638                         esdTrack->GetCovarianceXYZPxPyPz(covTr);
639                         esdTrack->GetESDpid(pid);
640                         
641                         daughter = 
642                             new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
643                                                                esdTrack->GetLabel(),
644                                                                p,
645                                                                kTRUE,
646                                                                pos,
647                                                                kFALSE,
648                                                                covTr, 
649                                                                (Short_t)esdTrack->GetSign(),
650                                                                esdTrack->GetITSClusterMap(), 
651                                                                pid,
652                                                                vkink,
653                                                                kTRUE, // check if this is right
654                                                                kTRUE, // check if this is right
655                                                                AliAODTrack::kPrimary);
656                         daughter->SetFlags(esdTrack->GetStatus());
657                         daughter->ConvertAliPIDtoAODPID();
658                         vkink->AddDaughter(daughter);
659                         daughter->ConvertAliPIDtoAODPID();
660                     }
661                     else {
662 //                      cerr << "Error: event " << esd->GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
663 //                           << " track " << idaughter << " has already been used!" << endl;
664                     }
665                 }
666             }
667         }      
668     }
669     
670   
671     // Tracks (primary and orphan)
672
673     printf("NUMBER OF TRACKS %5d\n", nTracks);
674     
675     for (Int_t nTrack = 0; nTrack < nTracks; ++nTrack) {
676         
677         
678         if (usedTrack[nTrack]) continue;
679
680         AliESDtrack *esdTrack = esd->GetTrack(nTrack);
681         UInt_t selectInfo = 0;
682         //
683         // Track selection
684         if (fTrackFilter) {
685             selectInfo = fTrackFilter->IsSelected(esdTrack);
686             if (!selectInfo) continue;
687         }
688         
689         //
690         esdTrack->GetPxPyPz(p);
691         esdTrack->GetXYZ(pos);
692         esdTrack->GetCovarianceXYZPxPyPz(covTr);
693         esdTrack->GetESDpid(pid);
694         
695         Float_t impactXY, impactZ;
696         
697         esdTrack->GetImpactParameters(impactXY,impactZ);
698         
699         if (impactXY<3) {
700             // track inside the beam pipe
701             
702             primary->AddDaughter(aodTrack =
703                                  new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
704                                                                     esdTrack->GetLabel(),
705                                                                     p,
706                                                                     kTRUE,
707                                                                     pos,
708                                                                     kFALSE,
709                                                                     covTr, 
710                                                                     (Short_t)esdTrack->GetSign(),
711                                                                     esdTrack->GetITSClusterMap(), 
712                                                                     pid,
713                                                                     primary,
714                                                                     kTRUE, // check if this is right
715                                                                     kTRUE, // check if this is right
716                                                                     AliAODTrack::kPrimary, 
717                                                                     selectInfo)
718                 );
719             aodTrack->SetFlags(esdTrack->GetStatus());
720             aodTrack->ConvertAliPIDtoAODPID();
721         }
722         else {
723           // outside the beam pipe: orphan track
724           // Don't write them anymore!
725           continue;
726           /*
727           aodTrack =
728             new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
729                                                esdTrack->GetLabel(),
730                                                p,
731                                                kTRUE,
732                                                pos,
733                                                kFALSE,
734                                                covTr, 
735                                                (Short_t)esdTrack->GetSign(),
736                                                esdTrack->GetITSClusterMap(), 
737                                                pid,
738                                                NULL,
739                                                kFALSE, // check if this is right
740                                                kFALSE, // check if this is right
741                                                AliAODTrack::kOrphan,
742                                                selectInfo);
743           aodTrack->SetFlags(esdTrack->GetStatus());
744           aodTrack->ConvertAliPIDtoAODPID();
745           */
746         }       
747     } // end of loop on tracks
748     
749     // muon tracks
750     Int_t nMuTracks = esd->GetNumberOfMuonTracks();
751     for (Int_t nMuTrack = 0; nMuTrack < nMuTracks; ++nMuTrack) {
752         
753         AliESDMuonTrack *esdMuTrack = esd->GetMuonTrack(nMuTrack);     
754         p[0] = esdMuTrack->Px(); 
755         p[1] = esdMuTrack->Py(); 
756         p[2] = esdMuTrack->Pz();
757         pos[0] = primary->GetX(); 
758         pos[1] = primary->GetY(); 
759         pos[2] = primary->GetZ();
760         
761         // has to be changed once the muon pid is provided by the ESD
762         for (Int_t i = 0; i < 10; pid[i++] = 0.); pid[AliAODTrack::kMuon]=1.;
763         
764         primary->AddDaughter(aodTrack =
765             new(tracks[jTracks++]) AliAODTrack(0, // no ID provided
766                                                0, // no label provided
767                                                p,
768                                                kTRUE,
769                                                pos,
770                                                kFALSE,
771                                                NULL, // no covariance matrix provided
772                                                (Short_t)-99, // no charge provided
773                                                0, // no ITSClusterMap
774                                                pid,
775                                                primary,
776                                                kTRUE,  // check if this is right
777                                                kTRUE,  // not used for vertex fit
778                                                AliAODTrack::kPrimary)
779             );
780   
781         aodTrack->ConvertAliPIDtoAODPID();
782         aodTrack->SetHitsPatternInTrigCh(esdMuTrack->GetHitsPatternInTrigCh());
783         Int_t track2Trigger = esdMuTrack->GetMatchTrigger();
784         aodTrack->SetMatchTrigger(track2Trigger);
785         if (track2Trigger) 
786           aodTrack->SetChi2MatchTrigger(esdMuTrack->GetChi2MatchTrigger());
787         else 
788           aodTrack->SetChi2MatchTrigger(0.);
789     }
790     tracks.Expand(jTracks); // remove 'empty slots' due to unwritten tracks
791   
792     // Access to the AOD container of PMD clusters
793     TClonesArray &pmdClusters = *(AODEvent()->GetPmdClusters());
794     Int_t jPmdClusters=0;
795   
796     for (Int_t iPmd = 0; iPmd < nPmdClus; ++iPmd) {
797       // file pmd clusters, to be revised!
798       AliESDPmdTrack *pmdTrack = esd->GetPmdTrack(iPmd);
799       Int_t nLabel = 0;
800       Int_t *label = 0x0;
801       Double_t pos[3] = { pmdTrack->GetClusterX(), pmdTrack->GetClusterY(), pmdTrack->GetClusterZ() };
802       Double_t pid[9] = { 0., 0., 0., 0., 0., 0., 0., 0., 0. }; // to be revised!
803       // type not set!
804       // assoc cluster not set
805       new(pmdClusters[jPmdClusters++]) AliAODPmdCluster(iPmd, nLabel, label, pmdTrack->GetClusterADC(), pos, pid);
806     }
807
808     // Access to the AOD container of clusters
809     TClonesArray &caloClusters = *(AODEvent()->GetCaloClusters());
810     Int_t jClusters=0;
811  
812     for (Int_t iClust=0; iClust<nCaloClus; ++iClust) {
813
814       AliESDCaloCluster * cluster = esd->GetCaloCluster(iClust);
815
816       Int_t id        = cluster->GetID();
817       Int_t nLabel    = cluster->GetNLabels();
818       TArrayI* labels = cluster->GetLabels();
819       Int_t *label = 0;
820       if (labels) label = (cluster->GetLabels())->GetArray();
821
822       Float_t energy = cluster->E();
823       cluster->GetPosition(posF);
824       Char_t ttype = AliAODCluster::kUndef; 
825
826       if (cluster->GetClusterType() == AliESDCaloCluster::kPHOSCluster) {
827         ttype=AliAODCluster::kPHOSNeutral;
828       } 
829       else if (cluster->GetClusterType() == AliESDCaloCluster::kEMCALClusterv1) {
830         ttype = AliAODCluster::kEMCALClusterv1;
831       }
832
833       
834       AliAODCaloCluster *caloCluster = new(caloClusters[jClusters++]) AliAODCaloCluster(id,
835                                                                                         nLabel,
836                                                                                         label,
837                                                                                         energy,
838                                                                                         pos,
839                                                                                         NULL,
840                                                                                         ttype);
841       
842       caloCluster->SetCaloCluster(cluster->GetDistanceToBadChannel(),
843                                   cluster->GetClusterDisp(),
844                                   cluster->GetM20(), cluster->GetM02(), cluster->GetM11(),
845                                   cluster->GetEmcCpvDistance(),  cluster->GetNExMax()) ;
846
847       caloCluster->SetNCells(cluster->GetNCells());
848       caloCluster->SetCellsAbsId(cluster->GetCellsAbsId());
849       caloCluster->SetCellsAmplitudeFraction(cluster->GetCellsAmplitudeFraction());
850     } 
851     caloClusters.Expand(jClusters); // resize TObjArray to 'remove' slots for pseudo clusters    
852     // end of loop on calo clusters
853
854     // fill EMCAL cell info
855     if (esd->GetEMCALCells()) { // protection against missing ESD information
856       AliESDCaloCells &esdEMcells = *(esd->GetEMCALCells());
857       Int_t nEMcell = esdEMcells.GetNumberOfCells() ;
858       
859       AliAODCaloCells &aodEMcells = *(AODEvent()->GetEMCALCells());
860       aodEMcells.CreateContainer(nEMcell);
861       aodEMcells.SetType(AliAODCaloCells::kEMCAL);
862       for (Int_t iCell = 0; iCell < nEMcell; iCell++) {      
863         aodEMcells.SetCell(iCell,esdEMcells.GetCellNumber(iCell),esdEMcells.GetAmplitude(iCell));
864       }
865       aodEMcells.Sort();
866     }
867
868     // fill PHOS cell info
869     if (esd->GetPHOSCells()) { // protection against missing ESD information
870       AliESDCaloCells &esdPHcells = *(esd->GetPHOSCells());
871       Int_t nPHcell = esdPHcells.GetNumberOfCells() ;
872       
873       AliAODCaloCells &aodPHcells = *(AODEvent()->GetPHOSCells());
874       aodPHcells.CreateContainer(nPHcell);
875       aodPHcells.SetType(AliAODCaloCells::kPHOS);
876       for (Int_t iCell = 0; iCell < nPHcell; iCell++) {      
877         aodPHcells.SetCell(iCell,esdPHcells.GetCellNumber(iCell),esdPHcells.GetAmplitude(iCell));
878       }
879       aodPHcells.Sort();
880     }
881
882     // tracklets    
883     AliAODTracklets &SPDTracklets = *(AODEvent()->GetTracklets());
884     const AliMultiplicity *mult = esd->GetMultiplicity();
885     if (mult) {
886       if (mult->GetNumberOfTracklets()>0) {
887         SPDTracklets.CreateContainer(mult->GetNumberOfTracklets());
888
889         for (Int_t n=0; n<mult->GetNumberOfTracklets(); n++) {
890           SPDTracklets.SetTracklet(n, mult->GetTheta(n), mult->GetPhi(n), mult->GetDeltaPhi(n), mult->GetLabel(n, 0), mult->GetLabel(n, 1));
891         }
892       }
893     } else {
894       //Printf("ERROR: AliMultiplicity could not be retrieved from ESD");
895     }
896
897     delete [] usedTrack;
898     delete [] usedV0;
899     delete [] usedKink;
900
901     return;
902 }
903
904 void AliAnalysisTaskESDfilter::Terminate(Option_t */*option*/)
905 {
906 // Terminate analysis
907 //
908     if (fDebug > 1) printf("AnalysisESDfilter: Terminate() \n");
909 }
910