]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliAnalysisTaskESDfilter.cxx
Conding violations fixed. The code is now included in libSTEER (Mikolaj)
[u/mrichter/AliRoot.git] / ANALYSIS / AliAnalysisTaskESDfilter.cxx
index d2ab24d810e0aadb9c4a348045bd70b3a9dcd60a..0556bbdf8c4bfe8cec96cd622e17578e99160d5a 100644 (file)
@@ -18,6 +18,7 @@
 #include <TChain.h>
 #include <TFile.h>
 #include <TArrayI.h>
+#include <TRandom.h>
 
 #include "AliAnalysisTaskESDfilter.h"
 #include "AliAnalysisManager.h"
@@ -26,7 +27,6 @@
 #include "AliESDInputHandler.h"
 #include "AliAODHandler.h"
 #include "AliAnalysisFilter.h"
-#include "AliESDtrack.h"
 #include "AliESDMuonTrack.h"
 #include "AliESDVertex.h"
 #include "AliESDv0.h"
@@ -46,7 +46,9 @@ AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter():
     AliAnalysisTaskSE(),
     fTrackFilter(0x0),
     fKinkFilter(0x0),
-    fV0Filter(0x0)
+    fV0Filter(0x0),
+    fHighPthreshold(0),
+    fPtshape(0x0)     
 {
   // Default constructor
 }
@@ -55,7 +57,9 @@ AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter(const char* name):
     AliAnalysisTaskSE(name),
     fTrackFilter(0x0),
     fKinkFilter(0x0),
-    fV0Filter(0x0)
+    fV0Filter(0x0),
+    fHighPthreshold(0),
+    fPtshape(0x0)
 {
   // Constructor
 }
@@ -80,8 +84,9 @@ void AliAnalysisTaskESDfilter::UserExec(Option_t */*option*/)
 //
                                            
   Long64_t ientry = Entry();
-  printf("Filter: Analysing event # %5d\n", (Int_t) ientry);
-
+  if (fDebug > 0) printf("Filter: Analysing event # %5d\n", (Int_t) ientry);
+  if (fHighPthreshold == 0) AliInfo("detector PID signals are stored in each track");
+  if (!fPtshape) AliInfo("detector PID signals are not stored below the pt threshold");
   ConvertESDtoAOD();
 }
 
@@ -96,6 +101,8 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
     Double_t p[3];
     Double_t p_pos[3];
     Double_t p_neg[3];
+    Double_t p_pos_atv0[3];
+    Double_t p_neg_atv0[3];
     Double_t covVtx[6];
     Double_t covTr[21];
     Double_t pid[10];
@@ -108,9 +115,11 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
   
   // Multiplicity information needed by the header (to be revised!)
     Int_t nTracks    = esd->GetNumberOfTracks();
+    //    if (fDebug > 0) printf("-------------------Bo: Number of ESD tracks %d \n",nTracks);
+
     Int_t nPosTracks = 0;
-    for (Int_t iTrack = 0; iTrack < nTracks; ++iTrack) 
-       if (esd->GetTrack(iTrack)->GetSign()> 0) nPosTracks++;
+//    for (Int_t iTrack = 0; iTrack < nTracks; ++iTrack) 
+//     if (esd->GetTrack(iTrack)->GetSign()> 0) nPosTracks++;
     
     // Update the header
 
@@ -140,9 +149,6 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
     header->SetZDCN2Energy(esd->GetZDCN2Energy());
     header->SetZDCP2Energy(esd->GetZDCP2Energy());
     header->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
-    header->SetRefMultiplicity(nTracks);
-    header->SetRefMultiplicityPos(nPosTracks);
-    header->SetRefMultiplicityNeg(nTracks - nPosTracks);
 //
 //    
     Int_t nV0s      = esd->GetNumberOfV0s();
@@ -154,12 +160,20 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
     Int_t nFmdClus  = 0;
     Int_t nPmdClus  = esd->GetNumberOfPmdTracks();
     
-    printf("   NV0=%d  NCASCADES=%d  NKINKS=%d\n", nV0s, nCascades, nKinks);
+    if (fDebug > 0) 
+       printf("   NV0=%d  NCASCADES=%d  NKINKS=%d\n", nV0s, nCascades, nKinks);
 
     AODEvent()->ResetStd(nTracks, nVertices, nV0s+nCascades, nJets, nCaloClus, nFmdClus, nPmdClus);
 
     AliAODTrack *aodTrack = 0x0;
-    
+    AliAODPid   *detpid   = 0x0;
+    Double_t timezero = 0; //TO BE FIXED
+    AliAODv0    *aodV0    = 0x0;
+
+    // RefArray to take into account the tracks associated to V0s
+    TRefArray   *v0DaughterTracks = NULL;
+    if (nTracks>0) v0DaughterTracks = new TRefArray(nTracks);
+
     // Array to take into account the tracks already added to the AOD
     Bool_t * usedTrack = NULL;
     if (nTracks>0) {
@@ -199,8 +213,8 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
     vtx->GetCovMatrix(covVtx); //covariance matrix
     
     AliAODVertex * primary = new(vertices[jVertices++])
-       AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, AliAODVertex::kPrimary);
-    primary->Print();
+       AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, -1, AliAODVertex::kPrimary);
+    if (fDebug > 0) primary->Print();
 
     // Create vertices starting from the most complex objects
     Double_t chi2 = 0.;
@@ -328,8 +342,10 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                                           kFALSE, // check if this is right
                                                                           AliAODTrack::kSecondary)
                );
+       if (esdTrack->GetSign() > 0) nPosTracks++;
            aodTrack->ConvertAliPIDtoAODPID();
            aodTrack->SetFlags(esdTrack->GetStatus());
+            SetAODPID(esdTrack,aodTrack,detpid,timezero);
        }
        else {
 //         cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
@@ -364,8 +380,10 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                                           kFALSE, // check if this is right
                                                                           AliAODTrack::kSecondary)
                );
+       if (esdTrack->GetSign() > 0) nPosTracks++;
            aodTrack->ConvertAliPIDtoAODPID();
            aodTrack->SetFlags(esdTrack->GetStatus());      
+            SetAODPID(esdTrack,aodTrack,detpid,timezero);
        }
        else {
 //         cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
@@ -407,8 +425,10 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                                     kFALSE, // check if this is right
                                                                     AliAODTrack::kSecondary)
                );
+       if (esdTrack->GetSign() > 0) nPosTracks++;
            aodTrack->ConvertAliPIDtoAODPID();
            aodTrack->SetFlags(esdTrack->GetStatus());
+            SetAODPID(esdTrack,aodTrack,detpid,timezero);
        }
        else {
 //         cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
@@ -423,7 +443,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
     
     for (Int_t nV0 = 0; nV0 < nV0s; ++nV0) {
        
-       if (usedV0[nV0]) continue; // skip if aready added to the AOD
+       if (usedV0[nV0]) continue; // skip if already added to the AOD
        
        AliESDv0 *v0 = esd->GetV0(nV0);
        
@@ -449,82 +469,111 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
        
        Int_t posFromV0 = v0->GetPindex();
        Int_t negFromV0 = v0->GetNindex();
+
+       Float_t  dcaPosToPrimVertexXYZ[2]   = { 999., 999.}; // ..[0] = in XY plane and ..[1] = in Z
+       Float_t  dcaNegToPrimVertexXYZ[2]   = { 999., 999.}; // ..[0] = in XY plane and ..[1] = in Z
+       Double_t dcaDaughterToPrimVertex[2] = { 999., 999.}; // ..[0] = Pos and ..[1] = Neg
        
+       Double_t  dcaV0Daughters      = v0->GetDcaV0Daughters();
+       Double_t  dcaV0ToPrimVertex   = v0->GetD();
+
+       v0->GetPPxPyPz(p_pos_atv0[0],p_pos_atv0[1],p_pos_atv0[2]); 
+       v0->GetNPxPyPz(p_neg_atv0[0],p_neg_atv0[1],p_neg_atv0[2]); 
+
        // Add the positive tracks from the V0
        
-       if (posFromV0>-1 && !usedTrack[posFromV0]) {
-           
+       if (posFromV0>-1){
+         AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
+         esdTrack->GetPxPyPz(p_pos);
+         esdTrack->GetXYZ(pos);
+         esdTrack->GetCovarianceXYZPxPyPz(covTr);
+         esdTrack->GetESDpid(pid);
+         esdTrack->GetImpactParameters(dcaPosToPrimVertexXYZ[0],dcaPosToPrimVertexXYZ[1]);
+         if (!usedTrack[posFromV0]) {
            usedTrack[posFromV0] = kTRUE;
-           
-           AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
-           esdTrack->GetPxPyPz(p_pos);
-           esdTrack->GetXYZ(pos);
-           esdTrack->GetCovarianceXYZPxPyPz(covTr);
-           esdTrack->GetESDpid(pid);
-           
-           vV0->AddDaughter(aodTrack =
-                            new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
-                                                               esdTrack->GetLabel(), 
-                                                               p_pos, 
-                                                               kTRUE,
-                                                               pos,
-                                                               kFALSE,
-                                                               covTr, 
-                                                               (Short_t)esdTrack->GetSign(),
-                                                               esdTrack->GetITSClusterMap(), 
-                                                               pid,
-                                                               vV0,
-                                                               kTRUE,  // check if this is right
-                                                               kFALSE, // check if this is right
-                                                               AliAODTrack::kSecondary)
-               );
+           aodTrack = new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
+                                                         esdTrack->GetLabel(), 
+                                                         p_pos, 
+                                                         kTRUE,
+                                                         pos,
+                                                         kFALSE,
+                                                         covTr, 
+                                                         (Short_t)esdTrack->GetSign(),
+                                                         esdTrack->GetITSClusterMap(), 
+                                                         pid,
+                                                         vV0,
+                                                         kTRUE,  // check if this is right
+                                                         kFALSE, // check if this is right
+                                                         AliAODTrack::kSecondary);
+           v0DaughterTracks->AddAt(aodTrack,posFromV0);
+           //      if (fDebug > 0) printf("-------------------Bo: pos track from original pt %.3f \n",aodTrack->Pt());
+           if (esdTrack->GetSign() > 0) nPosTracks++;
            aodTrack->ConvertAliPIDtoAODPID();
            aodTrack->SetFlags(esdTrack->GetStatus());
-       }
-       else {
-//         cerr << "Error: event " << esd->GetEventNumberInFile() << " V0 " << nV0
-//              << " track " << posFromV0 << " has already been used!" << endl;
+            SetAODPID(esdTrack,aodTrack,detpid,timezero);
+         }
+         else {
+           aodTrack = dynamic_cast<AliAODTrack*>(v0DaughterTracks->At(posFromV0));
+           //      if (fDebug > 0) printf("-------------------Bo pos track from refArray pt %.3f \n",aodTrack->Pt());
+         }
+         vV0->AddDaughter(aodTrack);
        }
        
        // Add the negative tracks from the V0
        
-       if (negFromV0>-1 && !usedTrack[negFromV0]) {
-           
+       if (negFromV0>-1){
+         AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
+         esdTrack->GetPxPyPz(p_neg);
+         esdTrack->GetXYZ(pos);
+         esdTrack->GetCovarianceXYZPxPyPz(covTr);
+         esdTrack->GetESDpid(pid);
+         esdTrack->GetImpactParameters(dcaNegToPrimVertexXYZ[0],dcaNegToPrimVertexXYZ[1]);
+
+         if (!usedTrack[negFromV0]) {
            usedTrack[negFromV0] = kTRUE;
-           
-           AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
-           esdTrack->GetPxPyPz(p_neg);
-           esdTrack->GetXYZ(pos);
-           esdTrack->GetCovarianceXYZPxPyPz(covTr);
-           esdTrack->GetESDpid(pid);
-           
-           vV0->AddDaughter(aodTrack =
-                            new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
-                                                               esdTrack->GetLabel(),
-                                                               p_neg,
-                                                               kTRUE,
-                                                               pos,
-                                                               kFALSE,
-                                                               covTr, 
-                                                               (Short_t)esdTrack->GetSign(),
-                                                               esdTrack->GetITSClusterMap(), 
-                                                               pid,
-                                                               vV0,
-                                                               kTRUE,  // check if this is right
-                                                               kFALSE, // check if this is right
-                                                               AliAODTrack::kSecondary)
-               );
+           aodTrack = new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
+                                                         esdTrack->GetLabel(),
+                                                         p_neg,
+                                                         kTRUE,
+                                                         pos,
+                                                         kFALSE,
+                                                         covTr, 
+                                                         (Short_t)esdTrack->GetSign(),
+                                                         esdTrack->GetITSClusterMap(), 
+                                                         pid,
+                                                         vV0,
+                                                         kTRUE,  // check if this is right
+                                                         kFALSE, // check if this is right
+                                                         AliAODTrack::kSecondary);
+
+           v0DaughterTracks->AddAt(aodTrack,negFromV0);
+           //      if (fDebug > 0) printf("-------------------Bo: neg track from original pt %.3f \n",aodTrack->Pt());
+           if (esdTrack->GetSign() > 0) nPosTracks++;
            aodTrack->ConvertAliPIDtoAODPID();
            aodTrack->SetFlags(esdTrack->GetStatus());
+            SetAODPID(esdTrack,aodTrack,detpid,timezero);
+         }
+         else {
+           aodTrack = dynamic_cast<AliAODTrack*>(v0DaughterTracks->At(negFromV0));
+           //      if (fDebug > 0) printf("-------------------Bo neg track from refArray pt %.3f \n",aodTrack->Pt());
+         }
+         vV0->AddDaughter(aodTrack);
        }
-       else {
-//         cerr << "Error: event " << esd->GetEventNumberInFile() << " V0 " << nV0
-//              << " track " << negFromV0 << " has already been used!" << endl;
-       }
-
+       dcaDaughterToPrimVertex[0] = 
+         TMath::Sqrt(dcaPosToPrimVertexXYZ[0]*dcaPosToPrimVertexXYZ[0]
+                     +dcaPosToPrimVertexXYZ[1]*dcaPosToPrimVertexXYZ[1]);
+       dcaDaughterToPrimVertex[1] = 
+         TMath::Sqrt(dcaNegToPrimVertexXYZ[0]*dcaNegToPrimVertexXYZ[0]
+                     +dcaNegToPrimVertexXYZ[1]*dcaNegToPrimVertexXYZ[1]);
        // add it to the V0 array as well
-       Double_t d0[2] = { 999., 99.};
-       new(V0s[jV0s++]) AliAODv0(vV0, 999., 99., p_pos, p_neg, d0); // to be refined
+       aodV0 = new(V0s[jV0s++]) 
+         AliAODv0(vV0, dcaV0Daughters, dcaV0ToPrimVertex, p_pos_atv0, p_neg_atv0, dcaDaughterToPrimVertex); // to be refined
+       // set the aod v0 on-the-fly status
+       aodV0->SetOnFlyStatus(v0->GetOnFlyStatus());
+//     if (fDebug > 0) 
+//       printf("-------------------Bo: In the v0 loop: onFlyStatus=%d,dcaV0Daughters=%.3f dcaV0ToPrimVertex=%.3f dcaDaughterToPrimVertex=[%.3f,%.3f]\n",
+//              aodV0->GetOnFlyStatus(), aodV0->DcaV0Daughters(), aodV0->DcaV0ToPrimVertex(), 
+//              aodV0->DcaPosToPrimVertex(),aodV0->DcaNegToPrimVertex());
     } 
     V0s.Expand(jV0s);   
     // end of the loop on V0s
@@ -583,31 +632,33 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                        
                        usedTrack[imother] = kTRUE;
                        
-                       AliESDtrack *esdTrack = esd->GetTrack(imother);
-                       esdTrack->GetPxPyPz(p);
-                       esdTrack->GetXYZ(pos);
-                       esdTrack->GetCovarianceXYZPxPyPz(covTr);
-                       esdTrack->GetESDpid(pid);
+                       AliESDtrack *esdTrackM = esd->GetTrack(imother);
+                       esdTrackM->GetPxPyPz(p);
+                       esdTrackM->GetXYZ(pos);
+                       esdTrackM->GetCovarianceXYZPxPyPz(covTr);
+                       esdTrackM->GetESDpid(pid);
                        
                        mother = 
-                           new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
-                                                              esdTrack->GetLabel(),
+                           new(tracks[jTracks++]) AliAODTrack(esdTrackM->GetID(),
+                                                              esdTrackM->GetLabel(),
                                                               p,
                                                               kTRUE,
                                                               pos,
                                                               kFALSE,
                                                               covTr, 
-                                                              (Short_t)esdTrack->GetSign(),
-                                                              esdTrack->GetITSClusterMap(), 
+                                                              (Short_t)esdTrackM->GetSign(),
+                                                              esdTrackM->GetITSClusterMap(), 
                                                               pid,
                                                               primary,
                                                               kTRUE, // check if this is right
                                                               kTRUE, // check if this is right
                                                               AliAODTrack::kPrimary);
-                       mother->SetFlags(esdTrack->GetStatus());
+                       if (esdTrackM->GetSign() > 0) nPosTracks++;
+                       mother->SetFlags(esdTrackM->GetStatus());
                        mother->ConvertAliPIDtoAODPID();
                        primary->AddDaughter(mother);
                        mother->ConvertAliPIDtoAODPID();
+                        SetAODPID(esdTrackM,mother,detpid,timezero);
                    }
                    else {
 //                     cerr << "Error: event " << esd->GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
@@ -632,31 +683,33 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                        
                        usedTrack[idaughter] = kTRUE;
                        
-                       AliESDtrack *esdTrack = esd->GetTrack(idaughter);
-                       esdTrack->GetPxPyPz(p);
-                       esdTrack->GetXYZ(pos);
-                       esdTrack->GetCovarianceXYZPxPyPz(covTr);
-                       esdTrack->GetESDpid(pid);
+                       AliESDtrack *esdTrackD = esd->GetTrack(idaughter);
+                       esdTrackD->GetPxPyPz(p);
+                       esdTrackD->GetXYZ(pos);
+                       esdTrackD->GetCovarianceXYZPxPyPz(covTr);
+                       esdTrackD->GetESDpid(pid);
                        
                        daughter = 
-                           new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
-                                                              esdTrack->GetLabel(),
+                           new(tracks[jTracks++]) AliAODTrack(esdTrackD->GetID(),
+                                                              esdTrackD->GetLabel(),
                                                               p,
                                                               kTRUE,
                                                               pos,
                                                               kFALSE,
                                                               covTr, 
-                                                              (Short_t)esdTrack->GetSign(),
-                                                              esdTrack->GetITSClusterMap(), 
+                                                              (Short_t)esdTrackD->GetSign(),
+                                                              esdTrackD->GetITSClusterMap(), 
                                                               pid,
                                                               vkink,
                                                               kTRUE, // check if this is right
                                                               kTRUE, // check if this is right
-                                                              AliAODTrack::kPrimary);
-                       daughter->SetFlags(esdTrack->GetStatus());
+                                                              AliAODTrack::kSecondary);
+                       if (esdTrackD->GetSign() > 0) nPosTracks++;
+                       daughter->SetFlags(esdTrackD->GetStatus());
                        daughter->ConvertAliPIDtoAODPID();
                        vkink->AddDaughter(daughter);
                        daughter->ConvertAliPIDtoAODPID();
+                       SetAODPID(esdTrackD,daughter,detpid,timezero);
                    }
                    else {
 //                     cerr << "Error: event " << esd->GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
@@ -670,7 +723,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
   
     // Tracks (primary and orphan)
 
-    printf("NUMBER OF TRACKS %5d\n", nTracks);
+    if (fDebug > 0) printf("NUMBER OF ESD TRACKS %5d\n", nTracks);
     
     for (Int_t nTrack = 0; nTrack < nTracks; ++nTrack) {
        
@@ -716,8 +769,10 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                                    AliAODTrack::kPrimary, 
                                                                    selectInfo)
                );
+       if (esdTrack->GetSign() > 0) nPosTracks++;
            aodTrack->SetFlags(esdTrack->GetStatus());
            aodTrack->ConvertAliPIDtoAODPID();
+            SetAODPID(esdTrack,aodTrack,detpid,timezero);
        }
        else {
          // outside the beam pipe: orphan track
@@ -740,54 +795,21 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                               kFALSE, // check if this is right
                                               AliAODTrack::kOrphan,
                                               selectInfo);
+     if (esdTrack->GetSign() > 0) nPosTracks++;
          aodTrack->SetFlags(esdTrack->GetStatus());
          aodTrack->ConvertAliPIDtoAODPID();
          */
        }       
     } // end of loop on tracks
     
-    // muon tracks
-    Int_t nMuTracks = esd->GetNumberOfMuonTracks();
-    for (Int_t nMuTrack = 0; nMuTrack < nMuTracks; ++nMuTrack) {
-       
-       AliESDMuonTrack *esdMuTrack = esd->GetMuonTrack(nMuTrack);     
-       p[0] = esdMuTrack->Px(); 
-       p[1] = esdMuTrack->Py(); 
-       p[2] = esdMuTrack->Pz();
-       pos[0] = primary->GetX(); 
-       pos[1] = primary->GetY(); 
-       pos[2] = primary->GetZ();
-       
-       // has to be changed once the muon pid is provided by the ESD
-       for (Int_t i = 0; i < 10; pid[i++] = 0.); pid[AliAODTrack::kMuon]=1.;
-       
-       primary->AddDaughter(aodTrack =
-           new(tracks[jTracks++]) AliAODTrack(0, // no ID provided
-                                              0, // no label provided
-                                              p,
-                                              kTRUE,
-                                              pos,
-                                              kFALSE,
-                                              NULL, // no covariance matrix provided
-                                              (Short_t)-99, // no charge provided
-                                              0, // no ITSClusterMap
-                                              pid,
-                                              primary,
-                                              kTRUE,  // check if this is right
-                                              kTRUE,  // not used for vertex fit
-                                              AliAODTrack::kPrimary)
-           );
-  
-       aodTrack->ConvertAliPIDtoAODPID();
-       aodTrack->SetHitsPatternInTrigCh(esdMuTrack->GetHitsPatternInTrigCh());
-       Int_t track2Trigger = esdMuTrack->GetMatchTrigger();
-       aodTrack->SetMatchTrigger(track2Trigger);
-       if (track2Trigger) 
-         aodTrack->SetChi2MatchTrigger(esdMuTrack->GetChi2MatchTrigger());
-       else 
-         aodTrack->SetChi2MatchTrigger(0.);
-    }
-    tracks.Expand(jTracks); // remove 'empty slots' due to unwritten tracks
+    // Update number of AOD tracks in header at the end of track loop (M.G.)
+    header->SetRefMultiplicity(jTracks);
+    header->SetRefMultiplicityPos(nPosTracks);
+    header->SetRefMultiplicityNeg(jTracks - nPosTracks);
+    if (fDebug > 0) 
+      printf("   NAODTRACKS=%d  NPOS=%d  NNEG=%d\n", jTracks, nPosTracks, jTracks - nPosTracks);
+    // Do not shrink the array of tracks - other filters may add to it (M.G)
+//    tracks.Expand(jTracks); // remove 'empty slots' due to unwritten tracks
   
     // Access to the AOD container of PMD clusters
     TClonesArray &pmdClusters = *(AODEvent()->GetPmdClusters());
@@ -798,11 +820,11 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
       AliESDPmdTrack *pmdTrack = esd->GetPmdTrack(iPmd);
       Int_t nLabel = 0;
       Int_t *label = 0x0;
-      Double_t pos[3] = { pmdTrack->GetClusterX(), pmdTrack->GetClusterY(), pmdTrack->GetClusterZ() };
-      Double_t pid[9] = { 0., 0., 0., 0., 0., 0., 0., 0., 0. }; // to be revised!
+      Double_t posPmd[3] = { pmdTrack->GetClusterX(), pmdTrack->GetClusterY(), pmdTrack->GetClusterZ()};
+      Double_t pidPmd[9] = { 0., 0., 0., 0., 0., 0., 0., 0., 0. }; // to be revised!
       // type not set!
       // assoc cluster not set
-      new(pmdClusters[jPmdClusters++]) AliAODPmdCluster(iPmd, nLabel, label, pmdTrack->GetClusterADC(), pos, pid);
+      new(pmdClusters[jPmdClusters++]) AliAODPmdCluster(iPmd, nLabel, label, pmdTrack->GetClusterADC(), posPmd, pidPmd);
     }
 
     // Access to the AOD container of clusters
@@ -835,18 +857,28 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                                                        nLabel,
                                                                                        label,
                                                                                        energy,
-                                                                                       pos,
+                                                                                       posF,
                                                                                        NULL,
                                                                                        ttype);
       
       caloCluster->SetCaloCluster(cluster->GetDistanceToBadChannel(),
                                  cluster->GetClusterDisp(),
-                                 cluster->GetM20(), cluster->GetM02(), cluster->GetM11(),
-                                 cluster->GetEmcCpvDistance(),  cluster->GetNExMax()) ;
+                                 cluster->GetM20(), cluster->GetM02(),
+                                 cluster->GetEmcCpvDistance(),  
+                                 cluster->GetNExMax(),cluster->GetTOF()) ;
 
+      caloCluster->SetPIDFromESD(cluster->GetPid());
       caloCluster->SetNCells(cluster->GetNCells());
       caloCluster->SetCellsAbsId(cluster->GetCellsAbsId());
       caloCluster->SetCellsAmplitudeFraction(cluster->GetCellsAmplitudeFraction());
+
+      TArrayI* matchedT =      cluster->GetTracksMatched();
+      if (matchedT && cluster->GetTrackMatched() >= 0) {       
+       for (Int_t im = 0; im < matchedT->GetSize(); im++) {
+         caloCluster->AddTrackMatched((esd->GetTrack(im)));
+       }
+      }
+
     } 
     caloClusters.Expand(jClusters); // resize TObjArray to 'remove' slots for pseudo clusters   
     // end of loop on calo clusters
@@ -897,10 +929,36 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
     delete [] usedTrack;
     delete [] usedV0;
     delete [] usedKink;
+    delete    v0DaughterTracks;
 
     return;
 }
 
+void AliAnalysisTaskESDfilter::SetAODPID(AliESDtrack *esdtrack, AliAODTrack *aodtrack, AliAODPid *detpid, Double_t timezero)
+{
+  //
+  // Setter for the raw PID detector signals
+  //
+
+  if(esdtrack->Pt()>fHighPthreshold) {
+    detpid = new AliAODPid();
+    detpid->SetDetectorRawSignals(esdtrack,timezero);
+    aodtrack->SetDetPID(detpid);
+  } else {
+    if(fPtshape){
+      if(esdtrack->Pt()> fPtshape->GetXmin()){
+       Double_t y = fPtshape->Eval(esdtrack->Pt())/fPtshape->Eval(fHighPthreshold);
+       if(gRandom->Rndm(0)<1./y){
+         detpid = new AliAODPid();
+         detpid->SetDetectorRawSignals(esdtrack,timezero);
+         aodtrack->SetDetPID(detpid);
+       }//end rndm
+      }//end if p < pmin
+    }//end if p function
+  }// end else
+}
+
+
 void AliAnalysisTaskESDfilter::Terminate(Option_t */*option*/)
 {
 // Terminate analysis