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