]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliAnalysisTaskESDfilter.cxx
Tag creation removed from task.
[u/mrichter/AliRoot.git] / ANALYSIS / AliAnalysisTaskESDfilter.cxx
index 8d9583017b8dacd690c6722796afc05df86a2c69..0cdd7ceeda25cf8c10dd5a4b94504d6a2ce51940 100644 (file)
 /* $Id: AliAnalysisTaskESDfilter.cxx 24535 2008-03-16 22:43:30Z fca $ */
  
 #include <TChain.h>
-#include <TFile.h>
+#include <TTree.h>
+#include <TList.h>
+#include <TArrayI.h>
+#include <TRandom.h>
 
 #include "AliAnalysisTaskESDfilter.h"
 #include "AliAnalysisManager.h"
@@ -25,7 +28,6 @@
 #include "AliESDInputHandler.h"
 #include "AliAODHandler.h"
 #include "AliAnalysisFilter.h"
-#include "AliESDtrack.h"
 #include "AliESDMuonTrack.h"
 #include "AliESDVertex.h"
 #include "AliESDv0.h"
@@ -45,7 +47,9 @@ AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter():
     AliAnalysisTaskSE(),
     fTrackFilter(0x0),
     fKinkFilter(0x0),
-    fV0Filter(0x0)
+    fV0Filter(0x0),
+    fHighPthreshold(0),
+    fPtshape(0x0)
 {
   // Default constructor
 }
@@ -54,7 +58,9 @@ AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter(const char* name):
     AliAnalysisTaskSE(name),
     fTrackFilter(0x0),
     fKinkFilter(0x0),
-    fV0Filter(0x0)
+    fV0Filter(0x0),
+    fHighPthreshold(0),
+    fPtshape(0x0)
 {
   // Constructor
 }
@@ -79,8 +85,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();
 }
 
@@ -95,6 +102,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];
@@ -107,9 +116,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
 
@@ -139,9 +150,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();
@@ -153,12 +161,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 store the mapping between esd track number and newly created AOD-Track
+    TRefArray   *aodRefs = NULL;
+    if (nTracks > 0) aodRefs = new TRefArray(nTracks);
+
     // Array to take into account the tracks already added to the AOD
     Bool_t * usedTrack = NULL;
     if (nTracks>0) {
@@ -198,8 +214,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.;
@@ -310,6 +326,10 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
            esdTrack->GetXYZ(pos);
            esdTrack->GetCovarianceXYZPxPyPz(covTr);
            esdTrack->GetESDpid(pid);
+           UInt_t selectInfo = 0;
+           if (fTrackFilter) {
+               selectInfo = fTrackFilter->IsSelected(esdTrack);
+           }
            
            vV0FromCascade->AddDaughter(aodTrack =
                                        new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
@@ -325,10 +345,15 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                                           vV0FromCascade,
                                                                           kTRUE,  // check if this is right
                                                                           kFALSE, // check if this is right
-                                                                          AliAODTrack::kSecondary)
-               );
+                                                                          AliAODTrack::kSecondary,
+                                                                          selectInfo)
+                                       );
+           aodRefs->AddAt(aodTrack, posFromV0);
+           
+       if (esdTrack->GetSign() > 0) nPosTracks++;
            aodTrack->ConvertAliPIDtoAODPID();
            aodTrack->SetFlags(esdTrack->GetStatus());
+            SetAODPID(esdTrack,aodTrack,detpid,timezero);
        }
        else {
 //         cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
@@ -346,7 +371,9 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
            esdTrack->GetXYZ(pos);
            esdTrack->GetCovarianceXYZPxPyPz(covTr);
            esdTrack->GetESDpid(pid);
-           
+           UInt_t selectInfo = 0;
+           if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdTrack);      
+
            vV0FromCascade->AddDaughter(aodTrack =
                                        new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
                                                                           esdTrack->GetLabel(),
@@ -361,10 +388,15 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                                           vV0FromCascade,
                                                                           kTRUE,  // check if this is right
                                                                           kFALSE, // check if this is right
-                                                                          AliAODTrack::kSecondary)
-               );
+                                                                          AliAODTrack::kSecondary,
+                                                                          selectInfo)
+                                       );
+           aodRefs->AddAt(aodTrack, negFromV0);
+
+       if (esdTrack->GetSign() > 0) nPosTracks++;
            aodTrack->ConvertAliPIDtoAODPID();
            aodTrack->SetFlags(esdTrack->GetStatus());      
+            SetAODPID(esdTrack,aodTrack,detpid,timezero);
        }
        else {
 //         cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
@@ -389,6 +421,8 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
            esdTrack->GetXYZ(pos);
            esdTrack->GetCovarianceXYZPxPyPz(covTr);
            esdTrack->GetESDpid(pid);
+           UInt_t selectInfo = 0;
+           if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdTrack);
            
            vcascade->AddDaughter(aodTrack =
                                  new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
@@ -404,10 +438,14 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                                     vcascade,
                                                                     kTRUE,  // check if this is right
                                                                     kFALSE, // check if this is right
-                                                                    AliAODTrack::kSecondary)
-               );
+                                                                    AliAODTrack::kSecondary,
+                                                                    selectInfo)
+                                 );
+           aodRefs->AddAt(aodTrack, bachelor);
+       if (esdTrack->GetSign() > 0) nPosTracks++;
            aodTrack->ConvertAliPIDtoAODPID();
            aodTrack->SetFlags(esdTrack->GetStatus());
+            SetAODPID(esdTrack,aodTrack,detpid,timezero);
        }
        else {
 //         cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
@@ -417,15 +455,44 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
        // Add the primary track of the cascade (if any)
        
     } // end of the loop on cascades
-   
+
+    //
     // V0s
+    //
     
     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);
+       Int_t posFromV0 = v0->GetPindex();
+       Int_t negFromV0 = v0->GetNindex();
+       if (posFromV0 < 0 || negFromV0 < 0) continue;
+
+       // V0 selection 
+       //
+       AliESDVertex *esdVtx = new AliESDVertex(*(esd->GetPrimaryVertex()));
        
+       AliESDtrack *esdV0Pos = esd->GetTrack(posFromV0);
+       AliESDtrack *esdV0Neg = esd->GetTrack(negFromV0);
+       TList v0objects;
+       v0objects.AddAt(v0,                      0);
+       v0objects.AddAt(esdV0Pos,                1);
+       v0objects.AddAt(esdV0Neg,                2);
+       v0objects.AddAt(esdVtx,                  3);
+       UInt_t selectV0 = 0;
+       if (fV0Filter) {
+         selectV0 = fV0Filter->IsSelected(&v0objects);
+         // this is a little awkward but otherwise the 
+         // list wants to access the pointer again when going out of scope
+         delete v0objects.RemoveAt(3);
+         if (!selectV0) 
+           continue;
+       }
+       else{
+         delete v0objects.RemoveAt(3);
+       }
+    
        v0->GetXYZ(pos[0], pos[1], pos[2]);
 
        if (!old) {
@@ -446,84 +513,108 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                  AliAODVertex::kV0);
        primary->AddDaughter(vV0);
        
-       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]) {
-           
+
+       esdV0Pos->GetPxPyPz(p_pos);
+       esdV0Pos->GetXYZ(pos);
+       esdV0Pos->GetCovarianceXYZPxPyPz(covTr);
+       esdV0Pos->GetESDpid(pid);
+       esdV0Pos->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)
-               );
+           UInt_t selectInfo = 0;
+           if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdV0Pos);
+           aodTrack = new(tracks[jTracks++]) AliAODTrack(esdV0Pos->GetID(),
+                                                         esdV0Pos->GetLabel(), 
+                                                         p_pos, 
+                                                         kTRUE,
+                                                         pos,
+                                                         kFALSE,
+                                                         covTr, 
+                                                         (Short_t)esdV0Pos->GetSign(),
+                                                         esdV0Pos->GetITSClusterMap(), 
+                                                         pid,
+                                                         vV0,
+                                                         kTRUE,  // check if this is right
+                                                         kFALSE, // check if this is right
+                                                         AliAODTrack::kSecondary,
+                                                         selectInfo);
+           aodRefs->AddAt(aodTrack,posFromV0);
+           //      if (fDebug > 0) printf("-------------------Bo: pos track from original pt %.3f \n",aodTrack->Pt());
+           if (esdV0Pos->GetSign() > 0) nPosTracks++;
            aodTrack->ConvertAliPIDtoAODPID();
-           aodTrack->SetFlags(esdTrack->GetStatus());
+           aodTrack->SetFlags(esdV0Pos->GetStatus());
+            SetAODPID(esdV0Pos,aodTrack,detpid,timezero);
        }
        else {
-//         cerr << "Error: event " << esd->GetEventNumberInFile() << " V0 " << nV0
-//              << " track " << posFromV0 << " has already been used!" << endl;
+           aodTrack = dynamic_cast<AliAODTrack*>(aodRefs->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]) {
-           
+       esdV0Neg->GetPxPyPz(p_neg);
+       esdV0Neg->GetXYZ(pos);
+       esdV0Neg->GetCovarianceXYZPxPyPz(covTr);
+       esdV0Neg->GetESDpid(pid);
+       esdV0Neg->GetImpactParameters(dcaNegToPrimVertexXYZ[0],dcaNegToPrimVertexXYZ[1]);
+       
+       if (!usedTrack[negFromV0]) {
            usedTrack[negFromV0] = kTRUE;
+           UInt_t selectInfo = 0;
+           if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdV0Neg);
+           aodTrack = new(tracks[jTracks++]) AliAODTrack(esdV0Neg->GetID(),
+                                                         esdV0Neg->GetLabel(),
+                                                         p_neg,
+                                                         kTRUE,
+                                                         pos,
+                                                         kFALSE,
+                                                         covTr, 
+                                                         (Short_t)esdV0Neg->GetSign(),
+                                                         esdV0Neg->GetITSClusterMap(), 
+                                                         pid,
+                                                         vV0,
+                                                         kTRUE,  // check if this is right
+                                                         kFALSE, // check if this is right
+                                                         AliAODTrack::kSecondary,
+                                                         selectInfo);
            
-           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)
-               );
+           aodRefs->AddAt(aodTrack,negFromV0);
+           //      if (fDebug > 0) printf("-------------------Bo: neg track from original pt %.3f \n",aodTrack->Pt());
+           if (esdV0Neg->GetSign() > 0) nPosTracks++;
            aodTrack->ConvertAliPIDtoAODPID();
-           aodTrack->SetFlags(esdTrack->GetStatus());
+           aodTrack->SetFlags(esdV0Neg->GetStatus());
+            SetAODPID(esdV0Neg,aodTrack,detpid,timezero);
        }
        else {
-//         cerr << "Error: event " << esd->GetEventNumberInFile() << " V0 " << nV0
-//              << " track " << negFromV0 << " has already been used!" << endl;
+           aodTrack = dynamic_cast<AliAODTrack*>(aodRefs->At(negFromV0));
+           //      if (fDebug > 0) printf("-------------------Bo neg track from refArray pt %.3f \n",aodTrack->Pt());
        }
-
+       vV0->AddDaughter(aodTrack);
+       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());
     } 
     V0s.Expand(jV0s);   
     // end of the loop on V0s
@@ -574,39 +665,50 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                        continue;
                    }
                    
-                   // Add the mother track
+                   // Add the mother track if it passed primary track selection cuts
                    
                    AliAODTrack * mother = NULL;
                    
+                   UInt_t selectInfo = 0;
+                   if (fTrackFilter) {
+                       selectInfo = fTrackFilter->IsSelected(esd->GetTrack(imother));
+                       if (!selectInfo) continue;
+                   }
+                   
                    if (!usedTrack[imother]) {
                        
                        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());
+                                                              AliAODTrack::kPrimary,
+                                                              selectInfo);
+                       aodRefs->AddAt(mother, imother);
+                       
+                       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
@@ -631,31 +733,38 @@ 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);
+                       selectInfo = 0;
+                       if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdTrackD);
                        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,
+                                                              selectInfo);
+                       
+                       aodRefs->AddAt(daughter, idaughter);
+                       
+                       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
@@ -669,7 +778,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) {
        
@@ -691,102 +800,40 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
        esdTrack->GetCovarianceXYZPxPyPz(covTr);
        esdTrack->GetESDpid(pid);
        
-       Float_t impactXY, impactZ;
-       
-       esdTrack->GetImpactParameters(impactXY,impactZ);
-       
-       if (impactXY<3) {
-           // track inside the beam pipe
            
-           primary->AddDaughter(aodTrack =
-                                new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
-                                                                   esdTrack->GetLabel(),
-                                                                   p,
-                                                                   kTRUE,
-                                                                   pos,
-                                                                   kFALSE,
-                                                                   covTr, 
-                                                                   (Short_t)esdTrack->GetSign(),
-                                                                   esdTrack->GetITSClusterMap(), 
-                                                                   pid,
-                                                                   primary,
-                                                                   kTRUE, // check if this is right
-                                                                   kTRUE, // check if this is right
-                                                                   AliAODTrack::kPrimary, 
-                                                                   selectInfo)
-               );
-           aodTrack->SetFlags(esdTrack->GetStatus());
-           aodTrack->ConvertAliPIDtoAODPID();
-       }
-       else {
-         // outside the beam pipe: orphan track
-         // Don't write them anymore!
-         continue;
-         /*
-         aodTrack =
-           new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
-                                              esdTrack->GetLabel(),
-                                              p,
-                                              kTRUE,
-                                              pos,
-                                              kFALSE,
-                                              covTr, 
-                                              (Short_t)esdTrack->GetSign(),
-                                              esdTrack->GetITSClusterMap(), 
-                                              pid,
-                                              NULL,
-                                              kFALSE, // check if this is right
-                                              kFALSE, // check if this is right
-                                              AliAODTrack::kOrphan,
-                                              selectInfo);
-         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)
+                            new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
+                                                               esdTrack->GetLabel(),
+                                                               p,
+                                                               kTRUE,
+                                                               pos,
+                                                               kFALSE,
+                                                               covTr, 
+                                                               (Short_t)esdTrack->GetSign(),
+                                                               esdTrack->GetITSClusterMap(), 
+                                                               pid,
+                                                               primary,
+                                                               kTRUE, // check if this is right
+                                                               kTRUE, // check if this is right
+                                                               AliAODTrack::kPrimary, 
+                                                               selectInfo)
            );
-  
+       aodRefs->AddAt(aodTrack, nTrack);
+       
+       if (esdTrack->GetSign() > 0) nPosTracks++;
+       aodTrack->SetFlags(esdTrack->GetStatus());
        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
+       SetAODPID(esdTrack,aodTrack,detpid,timezero);
+    } // end of loop on 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());
@@ -797,11 +844,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
@@ -812,12 +859,15 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
 
       AliESDCaloCluster * cluster = esd->GetCaloCluster(iClust);
 
-      Int_t id = cluster->GetID();
-      Int_t nLabel = 0;
-      Int_t *label = 0x0;
+      Int_t id        = cluster->GetID();
+      Int_t nLabel    = cluster->GetNLabels();
+      TArrayI* labels = cluster->GetLabels();
+      Int_t *label = 0;
+      if (labels) label = (cluster->GetLabels())->GetArray();
+
       Float_t energy = cluster->E();
       cluster->GetPosition(posF);
-      Char_t ttype=AliAODCluster::kUndef;
+      Char_t ttype = AliAODCluster::kUndef; 
 
       if (cluster->GetClusterType() == AliESDCaloCluster::kPHOSCluster) {
        ttype=AliAODCluster::kPHOSNeutral;
@@ -831,12 +881,31 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                                                        nLabel,
                                                                                        label,
                                                                                        energy,
-                                                                                       pos,
+                                                                                       posF,
                                                                                        NULL,
                                                                                        ttype);
       
-      caloCluster->SetCaloCluster(); // to be refined!
+      caloCluster->SetCaloCluster(cluster->GetDistanceToBadChannel(),
+                                 cluster->GetClusterDisp(),
+                                 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++) {
+           Int_t iESDtrack = matchedT->At(im);;
+           if (aodRefs->At(iESDtrack) != 0) {
+               caloCluster->AddTrackMatched((AliAODTrack*)aodRefs->At(iESDtrack));
+           }
+       }
+      }
+      
     } 
     caloClusters.Expand(jClusters); // resize TObjArray to 'remove' slots for pseudo clusters   
     // end of loop on calo clusters
@@ -887,10 +956,66 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
     delete [] usedTrack;
     delete [] usedV0;
     delete [] usedKink;
+    delete    aodRefs;
 
     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();
+    SetDetectorRawSignals(detpid,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();
+         SetDetectorRawSignals(detpid,esdtrack,timezero);
+         aodtrack->SetDetPID(detpid);
+       }//end rndm
+      }//end if p < pmin
+    }//end if p function
+  }// end else
+}
+
+void AliAnalysisTaskESDfilter::SetDetectorRawSignals(AliAODPid *aodpid, AliESDtrack *track, Double_t timezero)
+{
+//
+//assignment of the detector signals (AliXXXesdPID inspired)
+//
+ if(!track){
+ AliInfo("no ESD track found. .....exiting");
+ return;
+ }
+
+ aodpid->SetITSsignal(track->GetITSsignal());
+ aodpid->SetTPCsignal(track->GetTPCsignal());
+ //n TRD planes = 6
+
+ Int_t nslices = track->GetNumberOfTRDslices()*6;
+ Double_t *trdslices = new Double_t[nslices];
+ for(Int_t iSl =0; iSl < track->GetNumberOfTRDslices(); iSl++) {
+     for(Int_t iPl =0; iPl<6; iPl++) trdslices[iPl*track->GetNumberOfTRDslices()+iSl] = track->GetTRDslice(iPl,iSl);
+    }
+
+
+ aodpid->SetTRDsignal(track->GetNumberOfTRDslices()*6,trdslices);
+ Double_t times[AliAODPid::kSPECIES]; track->GetIntegratedTimes(times);
+ aodpid->SetIntegratedTimes(times);
+
+ aodpid->SetTOFsignal(track->GetTOFsignal()-timezero); // to be fixed
+ aodpid->SetHMPIDsignal(track->GetHMPIDsignal());
+
+}
+
 void AliAnalysisTaskESDfilter::Terminate(Option_t */*option*/)
 {
 // Terminate analysis