LCOV - code coverage report
Current view: top level - ANALYSIS/ESDfilter - AliAnalysisTaskESDfilter.cxx (source / functions) Hit Total Coverage
Test: coverage.info Lines: 955 1511 63.2 %
Date: 2016-06-14 17:26:59 Functions: 37 47 78.7 %

          Line data    Source code
       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$ */
      17             :  
      18             : #include <Riostream.h>
      19             : #include <TChain.h>
      20             : #include <TTree.h>
      21             : #include <TList.h>
      22             : #include <TArrayI.h>
      23             : #include <TParameter.h>
      24             : #include <TRandom.h>
      25             : #include <TParticle.h>
      26             : #include <TFile.h>
      27             : #include <TVector3.h>
      28             : 
      29             : #include "AliAnalysisTaskESDfilter.h"
      30             : #include "AliAnalysisManager.h"
      31             : #include "AliESDEvent.h"
      32             : #include "AliESDRun.h"
      33             : #include "AliStack.h"
      34             : #include "AliAODEvent.h"
      35             : #include "AliMCEvent.h"
      36             : #include "AliMCEventHandler.h"
      37             : #include "AliESDInputHandler.h"
      38             : #include "AliAODHandler.h"
      39             : #include "AliAODMCParticle.h"
      40             : #include "AliAnalysisFilter.h"
      41             : #include "AliESDMuonTrack.h"
      42             : #include "AliESDVertex.h"
      43             : #include "AliCentrality.h"
      44             : #include "AliEventplane.h"
      45             : #include "AliESDv0.h"
      46             : #include "AliESDkink.h"
      47             : #include "AliESDcascade.h"
      48             : #include "AliESDPmdTrack.h"
      49             : #include "AliESDCaloCluster.h"
      50             : #include "AliESDCaloCells.h"
      51             : #include "AliMultiplicity.h"
      52             : #include "AliLog.h"
      53             : #include "AliCodeTimer.h"
      54             : #include "AliESDtrackCuts.h"
      55             : #include "AliESDpid.h"
      56             : #include "AliAODHMPIDrings.h"
      57             : #include "AliV0vertexer.h"
      58             : #include "AliCascadeVertexer.h"
      59             : #include "AliExternalTrackParam.h"
      60             : #include "AliTrackerBase.h"
      61             : #include "AliTPCdEdxInfo.h"
      62             : 
      63             : #include "AliESDTrdTrack.h"
      64             : #include "AliESDTrdTracklet.h"
      65             : #include "AliAODTrdTrack.h"
      66             : #include "AliAODTrdTracklet.h"
      67             : #include "AliEMCALRecoUtils.h"
      68             : #include "AliESDUtils.h"
      69             : 
      70             : using std::cout;
      71             : using std::endl;
      72          10 : ClassImp(AliAnalysisTaskESDfilter)
      73             : 
      74             : ////////////////////////////////////////////////////////////////////////
      75             : 
      76             : AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter():
      77           0 :   AliAnalysisTaskSE(),
      78           0 :   fTrackFilter(0x0),
      79           0 :   fKinkFilter(0x0),
      80           0 :   fV0Filter(0x0),
      81           0 :   fCascadeFilter(0x0),
      82           0 :   fHighPthreshold(0),
      83           0 :   fPtshape(0x0),
      84           0 :   fEnableFillAOD(kTRUE),
      85           0 :   fUsedTrack(0x0),
      86           0 :   fUsedTrackCopy(0x0),
      87           0 :   fUsedKink(0x0),
      88           0 :   fUsedV0(0x0),
      89           0 :   fAODTrackRefs(0x0),
      90           0 :   fAODV0VtxRefs(0x0),
      91           0 :   fAODV0Refs(0x0),
      92           0 :   fMChandler(0x0),
      93           0 :   fNumberOfTracks(0),
      94           0 :   fNumberOfPositiveTracks(0),
      95           0 :   fNumberOfV0s(0),
      96           0 :   fNumberOfVertices(0),
      97           0 :   fNumberOfCascades(0),
      98           0 :   fNumberOfKinks(0),
      99           0 :   fOldESDformat(kFALSE),
     100           0 :   fPrimaryVertex(0x0),
     101           0 :   fTPCConstrainedFilterMask(0),
     102           0 :   fHybridFilterMaskTPCCG(0),
     103           0 :   fWriteHybridTPCCOnly(kFALSE),
     104           0 :   fGlobalConstrainedFilterMask(0),
     105           0 :   fHybridFilterMaskGCG(0),
     106           0 :   fWriteHybridGCOnly(kFALSE),
     107           0 :   fIsVZEROEnabled(kTRUE),
     108           0 :   fIsTZEROEnabled(kTRUE),
     109           0 :   fIsZDCEnabled(kTRUE),
     110           0 :   fIsADEnabled(kTRUE),
     111           0 :   fIsHMPIDEnabled(kTRUE), 
     112           0 :   fIsV0CascadeRecoEnabled(kFALSE),
     113           0 :   fAreCascadesEnabled(kTRUE),
     114           0 :   fAreV0sEnabled(kTRUE),
     115           0 :   fAreKinksEnabled(kTRUE),
     116           0 :   fAreTracksEnabled(kTRUE),
     117           0 :   fArePmdClustersEnabled(kTRUE),
     118           0 :   fAreCaloClustersEnabled(kTRUE),
     119           0 :   fAreEMCALCellsEnabled(kTRUE),
     120           0 :   fArePHOSCellsEnabled(kTRUE),
     121           0 :   fAreEMCALTriggerEnabled(kTRUE),
     122           0 :   fArePHOSTriggerEnabled(kTRUE),
     123           0 :   fAreTrackletsEnabled(kTRUE),
     124           0 :   fIsTRDEnabled(kTRUE),
     125           0 :   fESDpid(0x0),
     126           0 :   fIsPidOwner(kFALSE),
     127           0 :   fTPCaloneTrackCuts(0),
     128           0 :   fDoPropagateTrackToEMCal(kTRUE),
     129           0 :   fEMCalSurfaceDistance(440),
     130           0 :   fRefitVertexTracks(-1),
     131           0 :   fRefitVertexTracksNCuts(0),
     132           0 :   fRefitVertexTracksCuts(0),
     133           0 :   fIsMuonCaloPass(kFALSE)
     134           0 : {
     135             :   // Default constructor
     136           0 :   fV0Cuts[0] =  33.   ;   // max allowed chi2
     137           0 :   fV0Cuts[1] =   0.1  ;   // min allowed impact parameter for the 1st daughter
     138           0 :   fV0Cuts[2] =   0.1  ;   // min allowed impact parameter for the 2nd daughter
     139           0 :   fV0Cuts[3] =   1.   ;   // max allowed DCA between the daughter tracks
     140           0 :   fV0Cuts[4] =    .998;   // min allowed cosine of V0's pointing angle
     141           0 :   fV0Cuts[5] =   0.9  ;   // min radius of the fiducial volume
     142           0 :   fV0Cuts[6] = 100.   ;   // max radius of the fiducial volume
     143             : 
     144           0 :   fCascadeCuts[0] =  33.   ; // max allowed chi2 (same as PDC07)
     145           0 :   fCascadeCuts[1] =   0.05 ; // min allowed V0 impact parameter
     146           0 :   fCascadeCuts[2] =   0.008; // "window" around the Lambda mass
     147           0 :   fCascadeCuts[3] =   0.03 ; // min allowed bachelor's impact parameter
     148           0 :   fCascadeCuts[4] =   0.3  ; // max allowed DCA between the V0 and the bachelor
     149           0 :   fCascadeCuts[5] =   0.999; // min allowed cosine of the cascade pointing angle
     150           0 :   fCascadeCuts[6] =   0.9  ; // min radius of the fiducial volume
     151           0 :   fCascadeCuts[7] = 100.   ; // max radius of the fiducial volume
     152           0 : }
     153             : 
     154             : //______________________________________________________________________________
     155             : AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter(const char* name):
     156           2 :   AliAnalysisTaskSE(name),
     157           2 :   fTrackFilter(0x0),
     158           2 :   fKinkFilter(0x0),
     159           2 :   fV0Filter(0x0),
     160           2 :   fCascadeFilter(0x0),
     161           2 :   fHighPthreshold(0),
     162           2 :   fPtshape(0x0),
     163           2 :   fEnableFillAOD(kTRUE),
     164           2 :   fUsedTrack(0x0),
     165           2 :   fUsedTrackCopy(0x0),
     166           2 :   fUsedKink(0x0),
     167           2 :   fUsedV0(0x0),
     168           2 :   fAODTrackRefs(0x0),
     169           2 :   fAODV0VtxRefs(0x0),
     170           2 :   fAODV0Refs(0x0),
     171           2 :   fMChandler(0x0),
     172           2 :   fNumberOfTracks(0),
     173           2 :   fNumberOfPositiveTracks(0),
     174           2 :   fNumberOfV0s(0),
     175           2 :   fNumberOfVertices(0),
     176           2 :   fNumberOfCascades(0),
     177           2 :   fNumberOfKinks(0),
     178           2 :   fOldESDformat(kFALSE),
     179           2 :   fPrimaryVertex(0x0),
     180           2 :   fTPCConstrainedFilterMask(0),
     181           2 :   fHybridFilterMaskTPCCG(0),
     182           2 :   fWriteHybridTPCCOnly(kFALSE),
     183           2 :   fGlobalConstrainedFilterMask(0),
     184           2 :   fHybridFilterMaskGCG(0),
     185           2 :   fWriteHybridGCOnly(kFALSE),
     186           2 :   fIsVZEROEnabled(kTRUE),
     187           2 :   fIsTZEROEnabled(kTRUE),
     188           2 :   fIsZDCEnabled(kTRUE),
     189           2 :   fIsADEnabled(kTRUE),
     190           2 :   fIsHMPIDEnabled(kTRUE), 
     191           2 :   fIsV0CascadeRecoEnabled(kFALSE),
     192           2 :   fAreCascadesEnabled(kTRUE),
     193           2 :   fAreV0sEnabled(kTRUE),
     194           2 :   fAreKinksEnabled(kTRUE),
     195           2 :   fAreTracksEnabled(kTRUE),
     196           2 :   fArePmdClustersEnabled(kTRUE),
     197           2 :   fAreCaloClustersEnabled(kTRUE),
     198           2 :   fAreEMCALCellsEnabled(kTRUE),
     199           2 :   fArePHOSCellsEnabled(kTRUE),
     200           2 :   fAreEMCALTriggerEnabled(kTRUE),
     201           2 :   fArePHOSTriggerEnabled(kTRUE),
     202           2 :   fAreTrackletsEnabled(kTRUE),
     203           2 :   fIsTRDEnabled(kTRUE),
     204           2 :   fESDpid(0x0),
     205           2 :   fIsPidOwner(kFALSE),
     206           2 :   fTPCaloneTrackCuts(0),
     207           2 :   fDoPropagateTrackToEMCal(kTRUE),
     208           2 :   fEMCalSurfaceDistance(440),
     209           2 :   fRefitVertexTracks(-1),
     210           2 :   fRefitVertexTracksNCuts(0),
     211           2 :   fRefitVertexTracksCuts(0),
     212           2 :   fIsMuonCaloPass(kFALSE)
     213          10 : {
     214             :   // Constructor
     215             : 
     216           2 :   fV0Cuts[0] =  33.   ;   // max allowed chi2
     217           2 :   fV0Cuts[1] =   0.1  ;   // min allowed impact parameter for the 1st daughter
     218           2 :   fV0Cuts[2] =   0.1  ;   // min allowed impact parameter for the 2nd daughter
     219           2 :   fV0Cuts[3] =   1.   ;   // max allowed DCA between the daughter tracks
     220           2 :   fV0Cuts[4] =    .998;   // min allowed cosine of V0's pointing angle
     221           2 :   fV0Cuts[5] =   0.9  ;   // min radius of the fiducial volume
     222           2 :   fV0Cuts[6] = 100.   ;   // max radius of the fiducial volume
     223             : 
     224           2 :   fCascadeCuts[0] =  33.   ; // max allowed chi2 (same as PDC07)
     225           2 :   fCascadeCuts[1] =   0.05 ; // min allowed V0 impact parameter
     226           2 :   fCascadeCuts[2] =   0.008; // "window" around the Lambda mass
     227           2 :   fCascadeCuts[3] =   0.03 ; // min allowed bachelor's impact parameter
     228           2 :   fCascadeCuts[4] =   0.3  ; // max allowed DCA between the V0 and the bachelor
     229           2 :   fCascadeCuts[5] =   0.999; // min allowed cosine of the cascade pointing angle
     230           2 :   fCascadeCuts[6] =   0.9  ; // min radius of the fiducial volume
     231           2 :   fCascadeCuts[7] = 100.   ; // max radius of the fiducial volume
     232           4 : }
     233             : 
     234             : AliAnalysisTaskESDfilter::~AliAnalysisTaskESDfilter()
     235           0 : {
     236           0 :   if(fIsPidOwner) delete fESDpid;
     237           0 :   delete[] fRefitVertexTracksCuts;
     238           0 : }
     239             : 
     240             : //______________________________________________________________________________
     241             : void AliAnalysisTaskESDfilter::UserCreateOutputObjects()
     242             : {
     243             :   //
     244             :   // Create Output Objects conenct filter to outputtree
     245             :   // 
     246           4 :   if(OutputTree())
     247             :   {
     248           2 :     OutputTree()->GetUserInfo()->Add(fTrackFilter);
     249           2 :   }
     250             :   else
     251             :   {
     252           0 :     AliError("No OutputTree() for adding the track filter");
     253             :   }
     254           2 :   if (!fIsMuonCaloPass)
     255             :   {
     256           2 :     fTPCaloneTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
     257           2 :   }
     258           2 : }
     259             : 
     260             : //______________________________________________________________________________
     261             : void AliAnalysisTaskESDfilter::Init()
     262             : {
     263             :   // Initialization
     264           4 :   if (fDebug > 1) AliInfo("Init() \n");
     265           2 : }
     266             : 
     267             : //______________________________________________________________________________
     268             : Bool_t AliAnalysisTaskESDfilter::Notify()
     269             : {
     270             :   // Notify method.
     271           4 :   AddMetadataToUserInfo();
     272           2 :   return kTRUE;
     273             : }   
     274             : 
     275             : //______________________________________________________________________________
     276             : Bool_t AliAnalysisTaskESDfilter::AddMetadataToUserInfo()
     277             : {
     278             :   // Copy metadata to AOD user info.
     279             :   static Bool_t copyFirst = kFALSE;
     280           4 :   if (!copyFirst) {
     281           2 :     AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
     282           2 :     if (!mgr) {
     283           0 :       AliError("AliAnalysisTaskESDfilter::AddMetadataToUserInfo() : No analysis manager !");
     284           0 :       return kFALSE;
     285             :     }   
     286           2 :     TTree *esdTree = mgr->GetTree()->GetTree();
     287           2 :     if (!esdTree) return kFALSE;
     288           2 :     TNamed *alirootVersion = (TNamed*)esdTree->GetUserInfo()->FindObject("alirootVersion");
     289           2 :     if (!alirootVersion) return kFALSE;    
     290           6 :     AliAODHandler *aodHandler = dynamic_cast<AliAODHandler*>(mgr->GetOutputEventHandler());
     291           2 :     if (!aodHandler) return kFALSE;
     292           2 :     TTree *aodTree = aodHandler->GetTree();
     293           2 :     if (!aodTree) return kFALSE;
     294           4 :     aodTree->GetUserInfo()->Add(new TNamed(*alirootVersion));
     295           2 :     copyFirst = kTRUE;
     296           2 :   }
     297           2 :   return kTRUE;
     298           2 : }
     299             : 
     300             : //______________________________________________________________________________
     301             : void AliAnalysisTaskESDfilter::PrintTask(Option_t *option, Int_t indent) const
     302             : {
     303             :   // Print selection task information
     304           4 :   AliInfo("");
     305             :   
     306           2 :   AliAnalysisTaskSE::PrintTask(option,indent);
     307             :   
     308           2 :   TString spaces(' ',indent+3);
     309             :   
     310          10 :   cout << spaces.Data() << Form("Cascades       are %s",fAreCascadesEnabled ? "ENABLED":"DISABLED") << endl;
     311          10 :   cout << spaces.Data() << Form("V0s            are %s",fAreV0sEnabled ? "ENABLED":"DISABLED") << endl;
     312          10 :   cout << spaces.Data() << Form("Kinks          are %s",fAreKinksEnabled ? "ENABLED":"DISABLED") << endl;
     313          10 :   cout << spaces.Data() << Form("Tracks         are %s",fAreTracksEnabled ? "ENABLED":"DISABLED") << endl;
     314          10 :   cout << spaces.Data() << Form("PmdClusters    are %s",fArePmdClustersEnabled ? "ENABLED":"DISABLED") << endl;
     315          10 :   cout << spaces.Data() << Form("CaloClusters   are %s",fAreCaloClustersEnabled ? "ENABLED":"DISABLED") << endl;
     316          10 :   cout << spaces.Data() << Form("EMCAL cells    are %s",fAreEMCALCellsEnabled ? "ENABLED":"DISABLED") << endl;
     317          10 :   cout << spaces.Data() << Form("EMCAL triggers are %s",fAreEMCALTriggerEnabled ? "ENABLED":"DISABLED") << endl;
     318          10 :   cout << spaces.Data() << Form("PHOS triggers  are %s",fArePHOSTriggerEnabled ? "ENABLED":"DISABLED") << endl;
     319          10 :   cout << spaces.Data() << Form("Tracklets      are %s",fAreTrackletsEnabled ? "ENABLED":"DISABLED") << endl;  
     320          10 :   cout << spaces.Data() << Form("HMPID          is  %s",fIsHMPIDEnabled ? "ENABLED":"DISABLED") << endl;
     321          10 :   cout << spaces.Data() << Form("TRD            is  %s",fIsTRDEnabled ? "ENABLED":"DISABLED") << endl;
     322          10 :   cout << spaces.Data() << Form("PropagateTrackToEMCal  is %s", fDoPropagateTrackToEMCal ? "ENABLED":"DISABLED") << endl;
     323          12 :   if (fRefitVertexTracks<0) cout << spaces.Data() << Form("RefitVerteTracks is DISABLED") << endl;
     324           0 :   else cout << spaces.Data() << Form("RefitVerteTracks is ENABLED to %d",fRefitVertexTracks) << endl;
     325           2 : }
     326             : 
     327             : //______________________________________________________________________________
     328             : void AliAnalysisTaskESDfilter::UserExec(Option_t */*option*/)
     329             : {
     330             :   // Execute analysis for current event
     331             :                                             
     332          16 :   Long64_t ientry = Entry();
     333           8 :   if (fDebug > 0) {
     334           0 :     printf("Filter: Analysing event # %5d\n", (Int_t) ientry);
     335           0 :     if (fHighPthreshold == 0) AliInfo("detector PID signals are stored in each track");
     336           0 :     if (!fPtshape) AliInfo("detector PID signals are not stored below the pt threshold");
     337             :   }
     338             :   // Filters must explicitely enable AOD filling in their UserExec (AG)
     339           8 :   if (!AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()) 
     340           0 :     AliFatal("Cannot run ESD filter without an output event handler");
     341           8 :   if(fEnableFillAOD) {
     342           8 :     AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()->SetFillAOD(kTRUE);
     343           8 :     AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()->SetFillExtension(kTRUE);
     344           8 :   }   
     345           8 :   ConvertESDtoAOD();
     346           8 : }
     347             : 
     348             : //______________________________________________________________________________
     349             : TClonesArray& AliAnalysisTaskESDfilter::Cascades()
     350             : {
     351          32 :   return *(AODEvent()->GetCascades());
     352             : }
     353             : 
     354             : //______________________________________________________________________________
     355             : TClonesArray& AliAnalysisTaskESDfilter::Tracks()
     356             : {
     357         258 :   return *(AODEvent()->GetTracks());
     358             : }
     359             : 
     360             : //______________________________________________________________________________
     361             : TClonesArray& AliAnalysisTaskESDfilter::V0s()
     362             : {
     363          48 :   return *(AODEvent()->GetV0s());
     364             : }
     365             : 
     366             : //______________________________________________________________________________
     367             : TClonesArray& AliAnalysisTaskESDfilter::Vertices()
     368             : {
     369         104 :   return *(AODEvent()->GetVertices());
     370             : }
     371             : 
     372             : //______________________________________________________________________________
     373             : AliAODHeader* AliAnalysisTaskESDfilter::ConvertHeader(const AliESDEvent& esd)
     374             : {
     375             :   // Convert header information
     376             : 
     377          16 :   AliCodeTimerAuto("",0);
     378          40 :   AliAODHeader* header = dynamic_cast<AliAODHeader*>(AODEvent()->GetHeader());
     379           8 :   if(!header) AliFatal("Not a standard AOD");
     380             :   
     381          16 :   header->SetRunNumber(esd.GetRunNumber());
     382          16 :   header->SetOfflineTrigger(fInputHandler->IsEventSelected()); // propagate the decision of the physics selection
     383          16 :   header->SetNumberOfESDTracks(esd.GetNumberOfTracks());
     384           8 :   header->SetDAQAttributes(esd.GetDAQAttributes());
     385             : 
     386           8 :   TTree* tree = fInputHandler->GetTree();
     387           8 :   if (tree) {
     388           8 :     TFile* file = tree->GetCurrentFile();
     389          40 :     if (file) header->SetESDFileName(file->GetName());
     390           8 :   }
     391             :   
     392          16 :   if (fOldESDformat) {
     393           8 :     header->SetBunchCrossNumber(0);
     394           0 :     header->SetOrbitNumber(0);
     395           0 :     header->SetPeriodNumber(0);
     396           0 :     header->SetEventType(0);
     397           0 :     header->SetMuonMagFieldScale(-999.);
     398           0 :     header->SetCentrality(0);       
     399           0 :     header->SetEventplane(0);
     400             :   } else {
     401          16 :     header->SetBunchCrossNumber(esd.GetBunchCrossNumber());
     402          16 :     header->SetOrbitNumber(esd.GetOrbitNumber());
     403          16 :     header->SetPeriodNumber(esd.GetPeriodNumber());
     404          16 :     header->SetEventType(esd.GetEventType());
     405             :     
     406          16 :     header->SetEventNumberESDFile(esd.GetHeader()->GetEventNumberInFile());
     407          16 :     if(const_cast<AliESDEvent&>(esd).GetCentrality()){
     408          16 :       header->SetCentrality(const_cast<AliESDEvent&>(esd).GetCentrality());
     409             :     }
     410             :     else{
     411           0 :       header->SetCentrality(0);
     412             :     }
     413          16 :     if(const_cast<AliESDEvent&>(esd).GetEventplane()){
     414          16 :       header->SetEventplane(const_cast<AliESDEvent&>(esd).GetEventplane());
     415             :     }
     416             :     else{
     417           0 :       header->SetEventplane(0);
     418             :     }
     419             :   }
     420             :   
     421             :   // Trigger
     422          24 :   header->SetFiredTriggerClasses(esd.GetFiredTriggerClasses());
     423          16 :   header->SetTriggerMask(esd.GetTriggerMask()); 
     424          16 :   header->SetTriggerMaskNext50(esd.GetTriggerMaskNext50()); 
     425          16 :   header->SetTriggerCluster(esd.GetTriggerCluster());
     426          24 :   header->SetL0TriggerInputs(esd.GetHeader()->GetL0TriggerInputs());    
     427          24 :   header->SetL1TriggerInputs(esd.GetHeader()->GetL1TriggerInputs());    
     428          24 :   header->SetL2TriggerInputs(esd.GetHeader()->GetL2TriggerInputs());    
     429             :   
     430          16 :   header->SetMagneticField(esd.GetMagneticField());
     431          16 :   header->SetMuonMagFieldScale(esd.GetCurrentDip()/6000.);
     432          16 :   header->SetZDCN1Energy(esd.GetZDCN1Energy());
     433          16 :   header->SetZDCP1Energy(esd.GetZDCP1Energy());
     434          16 :   header->SetZDCN2Energy(esd.GetZDCN2Energy());
     435          16 :   header->SetZDCP2Energy(esd.GetZDCP2Energy());
     436          24 :   header->SetZDCEMEnergy(esd.GetZDCEMEnergy(0),esd.GetZDCEMEnergy(1));
     437             : 
     438          32 :   header->SetIRInt2InteractionMap(esd.GetHeader()->GetIRInt2InteractionMap());
     439          32 :   header->SetIRInt1InteractionMap(esd.GetHeader()->GetIRInt1InteractionMap());
     440             :   
     441             :   // ITS Cluster Multiplicty
     442           8 :   const AliMultiplicity *mult = esd.GetMultiplicity();
     443         160 :   for (Int_t ilay = 0; ilay < 6; ilay++) header->SetITSClusters(ilay, mult->GetNumberOfITSClusters(ilay));
     444             :   
     445             :   // TPC only Reference Multiplicty
     446          32 :   Int_t refMult  = fTPCaloneTrackCuts ? (Short_t)fTPCaloneTrackCuts->GetReferenceMultiplicity(&esd, kTRUE) : -1;
     447           8 :   header->SetTPConlyRefMultiplicity(refMult);
     448             :   //
     449          24 :   AliESDtrackCuts::MultEstTrackType estType = esd.GetPrimaryVertexTracks()->GetStatus() ? AliESDtrackCuts::kTrackletsITSTPC : AliESDtrackCuts::kTracklets;
     450          16 :   header->SetRefMultiplicityComb05(AliESDtrackCuts::GetReferenceMultiplicity(&esd,estType,0.5));
     451          16 :   header->SetRefMultiplicityComb08(AliESDtrackCuts::GetReferenceMultiplicity(&esd,estType,0.8));
     452          16 :   header->SetRefMultiplicityComb10(AliESDtrackCuts::GetReferenceMultiplicity(&esd,estType,1.0));
     453             :   //
     454          24 :   Float_t diamxy[2]={(Float_t)esd.GetDiamondX(),(Float_t)esd.GetDiamondY()};
     455           8 :   Float_t diamcov[3]; 
     456           8 :   esd.GetDiamondCovXY(diamcov);
     457           8 :   header->SetDiamond(diamxy,diamcov);
     458          24 :   header->SetDiamondZ(esd.GetDiamondZ(),esd.GetSigma2DiamondZ());
     459             :   
     460             :   // VZERO channel equalization factors for event-plane reconstruction   
     461          16 :   header->SetVZEROEqFactors(esd.GetVZEROEqFactors());
     462             : 
     463             :   // T0 Resolution information                                                                                                                                          
     464           8 :   const AliESDRun* esdRun = esd.GetESDRun();
     465          80 :   for (Int_t i=0;i<AliESDRun::kT0spreadSize;i++) header->SetT0spread(i,esdRun->GetT0spread(i));
     466             : 
     467             :   return header;
     468           8 : }
     469             : 
     470             : //______________________________________________________________________________
     471             : void AliAnalysisTaskESDfilter::ConvertCascades(const AliESDEvent& esd) 
     472             : {
     473             :   // Convert the cascades part of the ESD.
     474             :   // Return the number of cascades
     475             :  
     476          16 :   AliCodeTimerAuto("",0);
     477             :   
     478             :   // Create vertices starting from the most complex objects
     479             :   Double_t chi2 = 0.;
     480             :   
     481           8 :   const AliESDVertex* vtx = esd.GetPrimaryVertex();
     482           8 :   Double_t pos[3] = { 0. };
     483           8 :   Double_t covVtx[6] = { 0. };
     484           8 :   Double_t momBach[3]={0.};
     485           8 :   Double_t covTr[21]={0.};
     486             :   //  Double_t pid[10]={0.};
     487             :   AliAODPid* detpid(0x0);
     488             :   AliAODVertex* vV0FromCascade(0x0);
     489             :   AliAODv0* aodV0(0x0);
     490             :   AliAODcascade* aodCascade(0x0);
     491             :   AliAODTrack* aodTrack(0x0);
     492           8 :   Double_t momPos[3]={0.};
     493           8 :   Double_t momNeg[3] = { 0. };
     494           8 :   Double_t momPosAtV0vtx[3]={0.};
     495           8 :   Double_t momNegAtV0vtx[3]={0.};
     496           8 :   Int_t    tofLabel[3] = {0};
     497           8 :   TClonesArray& verticesArray = Vertices();
     498           8 :   TClonesArray& tracksArray = Tracks();
     499           8 :   TClonesArray& cascadesArray = Cascades();
     500             :   
     501             :   // Cascades (Modified by A.Maire - February 2009)
     502          24 :   for (Int_t nCascade = 0; nCascade < esd.GetNumberOfCascades(); ++nCascade) {
     503             :     
     504             :     // 0- Preparation
     505             :     //
     506           0 :     AliESDcascade *esdCascade = esd.GetCascade(nCascade);
     507           0 :                 Int_t  idxPosFromV0Dghter  = esdCascade->GetPindex();
     508           0 :                 Int_t  idxNegFromV0Dghter  = esdCascade->GetNindex();
     509           0 :                 Int_t  idxBachFromCascade  = esdCascade->GetBindex();
     510             :     
     511           0 :     AliESDtrack  *esdCascadePos  = esd.GetTrack( idxPosFromV0Dghter);
     512           0 :     AliESDtrack  *esdCascadeNeg  = esd.GetTrack( idxNegFromV0Dghter);
     513           0 :     AliESDtrack  *esdCascadeBach = esd.GetTrack( idxBachFromCascade);
     514             :     
     515             :     // Identification of the V0 within the esdCascade (via both daughter track indices)
     516             :     AliESDv0 * currentV0   = 0x0;
     517             :     Int_t      idxV0FromCascade = -1;
     518             :     
     519           0 :     for (Int_t iV0=0; iV0<esd.GetNumberOfV0s(); ++iV0) {
     520             :       
     521           0 :       currentV0 = esd.GetV0(iV0);
     522           0 :       Int_t posCurrentV0 = currentV0->GetPindex();
     523           0 :       Int_t negCurrentV0 = currentV0->GetNindex();
     524             :       
     525           0 :       if (posCurrentV0==idxPosFromV0Dghter && negCurrentV0==idxNegFromV0Dghter) {
     526             :         idxV0FromCascade = iV0;
     527           0 :         break;
     528             :       }
     529           0 :     }
     530             :     
     531           0 :     if(idxV0FromCascade < 0){
     532           0 :       printf("Cascade - no matching for the V0 (index V0 = -1) ! Skip ... \n");
     533           0 :       continue;
     534             :     }// a priori, useless check, but safer ... in case of pb with tracks "out of bounds"
     535             :     
     536           0 :     AliESDv0 *esdV0FromCascade   = esd.GetV0(idxV0FromCascade);
     537             :         
     538             :     // 1 - Cascade selection 
     539             :     
     540             :     //  AliESDVertex *esdPrimVtx = new AliESDVertex(*(esd.GetPrimaryVertex()));
     541             :     //  TList cascadeObjects;
     542             :     //  cascadeObjects.AddAt(esdV0FromCascade, 0);
     543             :     //  cascadeObjects.AddAt(esdCascadePos,    1);
     544             :     //  cascadeObjects.AddAt(esdCascadeNeg,    2);
     545             :     //  cascadeObjects.AddAt(esdCascade,       3);
     546             :     //  cascadeObjects.AddAt(esdCascadeBach,   4);
     547             :     //  cascadeObjects.AddAt(esdPrimVtx,       5);
     548             :     // 
     549             :     //  UInt_t selectCascade = 0;
     550             :     //  if (fCascadeFilter) {
     551             :     //    // selectCascade = fCascadeFilter->IsSelected(&cascadeObjects); 
     552             :     //          // FIXME AliESDCascadeCuts to be implemented ...
     553             :     // 
     554             :     //          // Here we may encounter a moot point at the V0 level 
     555             :     //          // between the cascade selections and the V0 ones :
     556             :     //          // the V0 selected along with the cascade (secondary V0) may 
     557             :     //          // usually be removed from the dedicated V0 selections (prim V0) ...
     558             :     //          // -> To be discussed !
     559             :     // 
     560             :     //    // this is a little awkward but otherwise the 
     561             :     //    // list wants to access the pointer (delete it) 
     562             :     //    // again when going out of scope
     563             :     //    delete cascadeObjects.RemoveAt(5); // esdPrimVtx created via copy construct
     564             :     //    esdPrimVtx = 0;
     565             :     //    if (!selectCascade) 
     566             :     //      continue;
     567             :     //  }
     568             :     //  else{
     569             :     //    delete cascadeObjects.RemoveAt(5); // esdPrimVtx created via copy construct
     570             :     //    esdPrimVtx = 0;
     571             :     //  }
     572             :     
     573             :     // 2 - Add the cascade vertex
     574             :     
     575           0 :     esdCascade->GetXYZcascade(pos[0], pos[1], pos[2]);
     576           0 :     esdCascade->GetPosCovXi(covVtx);
     577           0 :     chi2 = esdCascade->GetChi2Xi(); 
     578             :     
     579           0 :     AliAODVertex *vCascade = new(verticesArray[fNumberOfVertices++]) AliAODVertex(pos,
     580             :                                                                                   covVtx,
     581             :                                                                                   chi2, // FIXME = Chi2/NDF will be needed
     582           0 :                                                                                   fPrimaryVertex,
     583           0 :                                                                                   nCascade, // id
     584             :                                                                                   AliAODVertex::kCascade);
     585           0 :     fPrimaryVertex->AddDaughter(vCascade);
     586             :     
     587             :     // 3 - Add the bachelor track from the cascade
     588             :     
     589           0 :     if (!fUsedTrack[idxBachFromCascade]) {
     590             :       
     591           0 :       esdCascadeBach->GetPxPyPz(momBach);
     592           0 :       esdCascadeBach->GetXYZ(pos);
     593           0 :       esdCascadeBach->GetCovarianceXYZPxPyPz(covTr);
     594             :       //      esdCascadeBach->GetESDpid(pid);
     595           0 :       esdCascadeBach->GetTOFLabel(tofLabel);
     596             : 
     597           0 :       fUsedTrack[idxBachFromCascade] = kTRUE;
     598             :       UInt_t selectInfo = 0;
     599           0 :       if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdCascadeBach);
     600           0 :       if (fMChandler) fMChandler->SelectParticle(esdCascadeBach->GetLabel());
     601           0 :       aodTrack = new(tracksArray[fNumberOfTracks++]) AliAODTrack(esdCascadeBach->GetID(),
     602           0 :                                                                  esdCascadeBach->GetLabel(), 
     603             :                                                                  momBach, 
     604             :                                                                  kTRUE,
     605             :                                                                  pos,
     606             :                                                                  kFALSE, // Why kFALSE for "isDCA" ? FIXME
     607             :                                                                  covTr, 
     608           0 :                                                                  (Short_t)esdCascadeBach->GetSign(),
     609           0 :                                                                  esdCascadeBach->GetITSClusterMap(), 
     610             :                                                                  // pid,
     611             :                                                                  vCascade,
     612             :                                                                  kTRUE,  // usedForVtxFit = kFALSE ? FIXME
     613           0 :                                                                  vtx->UsesTrack(esdCascadeBach->GetID()),
     614             :                                                                  AliAODTrack::kFromDecayVtx,
     615             :                                                                  selectInfo);
     616           0 :       aodTrack->SetITSSharedMap(esdCascadeBach->GetITSSharedMap());
     617           0 :       aodTrack->SetITSchi2(esdCascadeBach->GetITSchi2());      
     618           0 :       aodTrack->SetPIDForTracking(esdCascadeBach->GetPIDForTracking());
     619           0 :       aodTrack->SetTPCFitMap(esdCascadeBach->GetTPCFitMap());
     620           0 :       aodTrack->SetTPCClusterMap(esdCascadeBach->GetTPCClusterMap());
     621           0 :       aodTrack->SetTPCSharedMap (esdCascadeBach->GetTPCSharedMap());
     622           0 :       aodTrack->SetChi2perNDF(Chi2perNDF(esdCascadeBach));
     623           0 :       aodTrack->SetTPCPointsF(esdCascadeBach->GetTPCNclsF());
     624           0 :       aodTrack->SetTPCNCrossedRows(UShort_t(esdCascadeBach->GetTPCCrossedRows()));
     625           0 :       aodTrack->SetIntegratedLength(esdCascadeBach->GetIntegratedLength());
     626           0 :       aodTrack->SetTOFLabel(tofLabel);
     627           0 :       CopyCaloProps(esdCascadeBach,aodTrack);
     628           0 :       fAODTrackRefs->AddAt(aodTrack,idxBachFromCascade);
     629             :             
     630           0 :       if (esdCascadeBach->GetSign() > 0) ++fNumberOfPositiveTracks;
     631           0 :       aodTrack->ConvertAliPIDtoAODPID();
     632           0 :       aodTrack->SetFlags(esdCascadeBach->GetStatus());
     633           0 :       SetAODPID(esdCascadeBach,aodTrack,detpid);
     634           0 :     }
     635             :     else {
     636           0 :       aodTrack = static_cast<AliAODTrack*>( fAODTrackRefs->At(idxBachFromCascade) );
     637             :     }
     638             :     
     639           0 :     vCascade->AddDaughter(aodTrack);
     640             :     
     641             :     // 4 - Add the V0 from the cascade. 
     642             :     // = V0vtx + both pos and neg daughter tracks + the aodV0 itself
     643             :     //
     644             :     
     645           0 :     if ( !fUsedV0[idxV0FromCascade] ) {
     646             :       // 4.A - if VO structure hasn't been created yet
     647             :       
     648             :       // 4.A.1 - Create the V0 vertex of the cascade
     649           0 :       esdV0FromCascade->GetXYZ(pos[0], pos[1], pos[2]);
     650           0 :       esdV0FromCascade->GetPosCov(covVtx);
     651           0 :       chi2 = esdV0FromCascade->GetChi2V0();  // = chi2/NDF since NDF = 2*2-3 ?
     652             :                         
     653           0 :       vV0FromCascade = new(verticesArray[fNumberOfVertices++]) AliAODVertex(pos,
     654             :                                                                             covVtx,
     655             :                                                                             chi2,
     656             :                                                                             vCascade,
     657           0 :                                                                             idxV0FromCascade, //id of ESDv0
     658             :                                                                             AliAODVertex::kV0);
     659             :       // Note:
     660             :       //    one V0 can be used by several cascades.
     661             :       // So, one AOD V0 vtx can have several parent vtx.
     662             :       // This is not directly allowed by AliAODvertex.
     663             :       // Setting the parent vtx (here = param "vCascade") doesn't lead to a crash
     664             :       // but to a problem of consistency within AODEvent.
     665             :       // -> See below paragraph 4.B, for the proposed treatment of such a case.
     666             :       
     667             :       // Add the vV0FromCascade to the aodVOVtxRefs
     668           0 :       fAODV0VtxRefs->AddAt(vV0FromCascade,idxV0FromCascade);
     669             :       
     670             :       // 4.A.2 - Add the positive tracks from the V0
     671             :       
     672           0 :       esdCascadePos->GetPxPyPz(momPos);
     673           0 :       esdCascadePos->GetXYZ(pos);
     674           0 :       esdCascadePos->GetCovarianceXYZPxPyPz(covTr);
     675             :       //      esdCascadePos->GetESDpid(pid);
     676           0 :       esdCascadePos->GetTOFLabel(tofLabel);      
     677             :       
     678           0 :       if (!fUsedTrack[idxPosFromV0Dghter]) {
     679           0 :         fUsedTrack[idxPosFromV0Dghter] = kTRUE;
     680             :         
     681             :         UInt_t selectInfo = 0;
     682           0 :         if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdCascadePos);
     683           0 :         if(fMChandler) fMChandler->SelectParticle(esdCascadePos->GetLabel());
     684           0 :         aodTrack = new(tracksArray[fNumberOfTracks++]) AliAODTrack(esdCascadePos->GetID(),
     685           0 :                                                                    esdCascadePos->GetLabel(), 
     686             :                                                                    momPos, 
     687             :                                                                    kTRUE,
     688             :                                                                    pos,
     689             :                                                                    kFALSE, // Why kFALSE for "isDCA" ? FIXME
     690             :                                                                    covTr, 
     691           0 :                                                                    (Short_t)esdCascadePos->GetSign(),
     692           0 :                                                                    esdCascadePos->GetITSClusterMap(), 
     693             :                                                                    //pid,
     694             :                                                                    vV0FromCascade,
     695             :                                                                    kTRUE,  // usedForVtxFit = kFALSE ? FIXME
     696           0 :                                                                    vtx->UsesTrack(esdCascadePos->GetID()),
     697             :                                                                    AliAODTrack::kFromDecayVtx,
     698             :                                                                    selectInfo);
     699           0 :         aodTrack->SetITSSharedMap(esdCascadePos->GetITSSharedMap());
     700           0 :         aodTrack->SetITSchi2(esdCascadePos->GetITSchi2());      
     701           0 :         aodTrack->SetPIDForTracking(esdCascadePos->GetPIDForTracking());
     702           0 :         aodTrack->SetTPCFitMap(esdCascadePos->GetTPCFitMap());
     703           0 :         aodTrack->SetTPCClusterMap(esdCascadePos->GetTPCClusterMap());
     704           0 :         aodTrack->SetTPCSharedMap (esdCascadePos->GetTPCSharedMap());
     705           0 :         aodTrack->SetChi2perNDF(Chi2perNDF(esdCascadePos));
     706           0 :         aodTrack->SetTPCPointsF(esdCascadePos->GetTPCNclsF());
     707           0 :         aodTrack->SetTPCNCrossedRows(UShort_t(esdCascadePos->GetTPCCrossedRows()));
     708           0 :         aodTrack->SetIntegratedLength(esdCascadePos->GetIntegratedLength());
     709           0 :         aodTrack->SetTOFLabel(tofLabel);
     710           0 :         CopyCaloProps(esdCascadePos,aodTrack);
     711           0 :         fAODTrackRefs->AddAt(aodTrack,idxPosFromV0Dghter);
     712             :         
     713           0 :         if (esdCascadePos->GetSign() > 0) ++fNumberOfPositiveTracks;
     714           0 :         aodTrack->ConvertAliPIDtoAODPID();
     715           0 :         aodTrack->SetFlags(esdCascadePos->GetStatus());
     716           0 :         SetAODPID(esdCascadePos,aodTrack,detpid);
     717           0 :       }
     718             :       else {
     719           0 :         aodTrack = static_cast<AliAODTrack*>(fAODTrackRefs->At(idxPosFromV0Dghter));
     720             :       }
     721           0 :       vV0FromCascade->AddDaughter(aodTrack);
     722             :       
     723             :       // 4.A.3 - Add the negative tracks from the V0
     724             :       
     725           0 :       esdCascadeNeg->GetPxPyPz(momNeg);
     726           0 :       esdCascadeNeg->GetXYZ(pos);
     727           0 :       esdCascadeNeg->GetCovarianceXYZPxPyPz(covTr);
     728             :       //   esdCascadeNeg->GetESDpid(pid);
     729           0 :       esdCascadeNeg->GetTOFLabel(tofLabel);
     730             :       
     731           0 :       if (!fUsedTrack[idxNegFromV0Dghter]) {
     732           0 :         fUsedTrack[idxNegFromV0Dghter] = kTRUE;
     733             :         
     734             :         UInt_t selectInfo = 0;
     735           0 :         if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdCascadeNeg);
     736           0 :         if (fMChandler) 
     737           0 :           fMChandler->SelectParticle(esdCascadeNeg->GetLabel());
     738           0 :         aodTrack = new(tracksArray[fNumberOfTracks++]) AliAODTrack(esdCascadeNeg->GetID(),
     739           0 :                                                                    esdCascadeNeg->GetLabel(),
     740             :                                                                    momNeg,
     741             :                                                                    kTRUE,
     742             :                                                                    pos,
     743             :                                                                    kFALSE, // Why kFALSE for "isDCA" ? FIXME
     744             :                                                                    covTr, 
     745           0 :                                                                    (Short_t)esdCascadeNeg->GetSign(),
     746           0 :                                                                    esdCascadeNeg->GetITSClusterMap(), 
     747             :                                                                    // pid,
     748             :                                                                    vV0FromCascade,
     749             :                                                                    kTRUE,  // usedForVtxFit = kFALSE ? FIXME
     750           0 :                                                                    vtx->UsesTrack(esdCascadeNeg->GetID()),
     751             :                                                                    AliAODTrack::kFromDecayVtx,
     752             :                                                                    selectInfo);
     753           0 :         aodTrack->SetITSSharedMap(esdCascadeNeg->GetITSSharedMap());
     754           0 :         aodTrack->SetITSchi2(esdCascadeNeg->GetITSchi2());      
     755           0 :         aodTrack->SetPIDForTracking(esdCascadeNeg->GetPIDForTracking());
     756           0 :         aodTrack->SetTPCFitMap(esdCascadeNeg->GetTPCFitMap());
     757           0 :         aodTrack->SetTPCClusterMap(esdCascadeNeg->GetTPCClusterMap());
     758           0 :         aodTrack->SetTPCSharedMap (esdCascadeNeg->GetTPCSharedMap());
     759           0 :         aodTrack->SetChi2perNDF(Chi2perNDF(esdCascadeNeg));
     760           0 :         aodTrack->SetTPCPointsF(esdCascadeNeg->GetTPCNclsF());
     761           0 :         aodTrack->SetTPCNCrossedRows(UShort_t(esdCascadeNeg->GetTPCCrossedRows()));
     762           0 :         aodTrack->SetIntegratedLength(esdCascadeNeg->GetIntegratedLength());
     763           0 :         aodTrack->SetTOFLabel(tofLabel);
     764           0 :         CopyCaloProps(esdCascadeNeg,aodTrack);
     765           0 :         fAODTrackRefs->AddAt(aodTrack,idxNegFromV0Dghter);
     766             :         
     767           0 :         if (esdCascadeNeg->GetSign() > 0) ++fNumberOfPositiveTracks;
     768           0 :         aodTrack->ConvertAliPIDtoAODPID();
     769           0 :         aodTrack->SetFlags(esdCascadeNeg->GetStatus());
     770           0 :         SetAODPID(esdCascadeNeg,aodTrack,detpid);
     771           0 :       }
     772             :       else {
     773           0 :         aodTrack = static_cast<AliAODTrack*>(fAODTrackRefs->At(idxNegFromV0Dghter));
     774             :       }
     775             :       
     776           0 :       vV0FromCascade->AddDaughter(aodTrack);
     777             :                         
     778             :       // 4.A.4 - Add the V0 from cascade to the V0 array
     779             :       
     780           0 :       Double_t  dcaV0Daughters      = esdV0FromCascade->GetDcaV0Daughters();
     781           0 :       Double_t  dcaV0ToPrimVertex   = esdV0FromCascade->GetD(esd.GetPrimaryVertex()->GetX(),
     782           0 :                                                              esd.GetPrimaryVertex()->GetY(),
     783           0 :                                                              esd.GetPrimaryVertex()->GetZ() );
     784           0 :       esdV0FromCascade->GetPPxPyPz( momPosAtV0vtx[0],momPosAtV0vtx[1],momPosAtV0vtx[2] ); 
     785           0 :       esdV0FromCascade->GetNPxPyPz( momNegAtV0vtx[0],momNegAtV0vtx[1],momNegAtV0vtx[2] ); 
     786             :       
     787           0 :       Double_t dcaDaughterToPrimVertex[2] = { 999., 999.}; // ..[0] = DCA in (x,y) for Pos and ..[1] = Neg
     788           0 :       dcaDaughterToPrimVertex[0] = TMath::Abs(esdCascadePos->GetD(esd.GetPrimaryVertex()->GetX(),
     789           0 :                                                                   esd.GetPrimaryVertex()->GetY(),
     790           0 :                                                                   esd.GetMagneticField())        );
     791           0 :       dcaDaughterToPrimVertex[1] = TMath::Abs(esdCascadeNeg->GetD(esd.GetPrimaryVertex()->GetX(),
     792           0 :                                                                   esd.GetPrimaryVertex()->GetY(),
     793           0 :                                                                   esd.GetMagneticField())        );
     794             :       
     795           0 :       aodV0 = new(V0s()[fNumberOfV0s++]) AliAODv0(vV0FromCascade, 
     796             :                                                   dcaV0Daughters,
     797             :                                                   dcaV0ToPrimVertex, 
     798           0 :                                                   momPosAtV0vtx, 
     799           0 :                                                   momNegAtV0vtx, 
     800           0 :                                                   dcaDaughterToPrimVertex); 
     801             :       // set the aod v0 on-the-fly status
     802           0 :       aodV0->SetOnFlyStatus(esdV0FromCascade->GetOnFlyStatus());
     803             :       
     804             :       // Add the aodV0 to the aodVORefs
     805           0 :       fAODV0Refs->AddAt(aodV0,idxV0FromCascade);
     806             :       
     807           0 :       fUsedV0[idxV0FromCascade] = kTRUE;
     808             :       
     809           0 :     } else { 
     810             :       // 4.B - if V0 structure already used
     811             :       
     812             :       // Note :
     813             :       //    one V0 can be used by several cascades (frequent in PbPb evts) : 
     814             :       // same V0 which used but attached to different bachelor tracks
     815             :       // -> aodVORefs and fAODV0VtxRefs are needed.
     816             :       // Goal : avoid a redundancy of the info in "Vertices" and "v0s" clones array.
     817             :       
     818           0 :       vV0FromCascade = static_cast<AliAODVertex*>(fAODV0VtxRefs->At(idxV0FromCascade));
     819           0 :       aodV0          = static_cast<AliAODv0*>    (fAODV0Refs   ->At(idxV0FromCascade));
     820             :       
     821             :       // - Treatment of the parent for such a "re-used" V0 :
     822             :       // Insert the cascade that reuses the V0 vertex in the lineage chain
     823             :       // Before : vV0 -> vCascade1 -> vPrimary
     824             :       //  - Hyp : cascade2 uses the same V0 as cascade1
     825             :       //  After :  vV0 -> vCascade2 -> vCascade1 -> vPrimary
     826             :       
     827           0 :       AliAODVertex *vCascadePreviousParent = static_cast<AliAODVertex*> (vV0FromCascade->GetParent());
     828           0 :       vV0FromCascade->SetParent(vCascade);
     829           0 :       vCascade      ->SetParent(vCascadePreviousParent);
     830             :       
     831             :     }// end if V0 structure already used
     832             :     
     833             :     // In any case (used V0 or not), add the V0 vertex to the cascade one.
     834           0 :     vCascade->AddDaughter(vV0FromCascade);   
     835             :                 
     836             :     // 5 - Add the primary track of the cascade (if any)
     837             :     
     838             :     // 6 - Add the cascade to the AOD array of cascades
     839           0 :     Double_t dcaBachToPrimVertexXY = TMath::Abs(esdCascadeBach->GetD(esd.GetPrimaryVertex()->GetX(),
     840           0 :                                                                      esd.GetPrimaryVertex()->GetY(),
     841           0 :                                                                      esd.GetMagneticField())        );
     842             :     
     843           0 :     Double_t momBachAtCascadeVtx[3]={0.};
     844             : 
     845           0 :     esdCascade->GetBPxPyPz(momBachAtCascadeVtx[0], momBachAtCascadeVtx[1], momBachAtCascadeVtx[2]);
     846             :     
     847           0 :     aodCascade = new(cascadesArray[fNumberOfCascades++]) AliAODcascade(vCascade,
     848           0 :                                                                        esdCascade->Charge(),
     849           0 :                                                                        esdCascade->GetDcaXiDaughters(),
     850             :                                                                        -999.,
     851             :                                                                        // DCAXiToPrimVtx -> needs to be calculated   ----|
     852             :                                                                        // doesn't exist at ESD level;
     853             :                                                                        // See AODcascade::DcaXiToPrimVertex(Double, Double, Double)
     854             :                                                                        dcaBachToPrimVertexXY,
     855           0 :                                                                        momBachAtCascadeVtx,
     856             :                                                                        *aodV0);
     857           0 :     if (fDebug > 10) {
     858           0 :       printf("---- Cascade / AOD cascade : \n\n");
     859           0 :       aodCascade->PrintXi(fPrimaryVertex->GetX(), fPrimaryVertex->GetY(), fPrimaryVertex->GetZ());
     860             :     }
     861             :     
     862           0 :   } // end of the loop on cascades
     863             :   
     864          16 :   Cascades().Expand(fNumberOfCascades);
     865           8 : }
     866             : 
     867             : //______________________________________________________________________________
     868             : void AliAnalysisTaskESDfilter::ConvertV0s(const AliESDEvent& esd)
     869             : {
     870             :   // Access to the AOD container of V0s
     871             :   
     872          16 :   AliCodeTimerAuto("",0);
     873             : 
     874             :   //
     875             :   // V0s
     876             :   //
     877           8 :   Double_t pos[3] = { 0. };      
     878             :   Double_t chi2(0.0);
     879           8 :   Double_t covVtx[6] = { 0. };
     880           8 :   Double_t momPos[3]={0.};
     881           8 :   Double_t covTr[21]={0.};
     882             :   //  Double_t pid[10]={0.};
     883             :   AliAODTrack* aodTrack(0x0);
     884             :   AliAODPid* detpid(0x0);
     885           8 :   Double_t momNeg[3]={0.};
     886           8 :   Double_t momPosAtV0vtx[3]={0.};
     887           8 :   Double_t momNegAtV0vtx[3]={0.};
     888           8 :   Int_t    tofLabel[3] = {0};
     889         102 :   for (Int_t nV0 = 0; nV0 < esd.GetNumberOfV0s(); ++nV0) {
     890          26 :     if (fUsedV0[nV0]) continue; // skip if already added to the AOD
     891             :     
     892          26 :     AliESDv0 *v0 = esd.GetV0(nV0);
     893          26 :     Int_t posFromV0 = v0->GetPindex();
     894          26 :     Int_t negFromV0 = v0->GetNindex();
     895             :     
     896             :     // V0 selection 
     897             :     //
     898          78 :     AliESDVertex *esdVtx   = new AliESDVertex(*(esd.GetPrimaryVertex()));
     899          26 :     AliESDtrack  *esdV0Pos = esd.GetTrack(posFromV0);
     900          26 :     AliESDtrack  *esdV0Neg = esd.GetTrack(negFromV0);
     901          26 :     TList v0objects;
     902          26 :     v0objects.AddAt(v0,                      0);
     903          26 :     v0objects.AddAt(esdV0Pos,                1);
     904          26 :     v0objects.AddAt(esdV0Neg,                2);
     905          26 :     v0objects.AddAt(esdVtx,                  3);
     906             :     UInt_t selectV0 = 0;
     907          26 :     if (fV0Filter) {
     908          26 :       selectV0 = fV0Filter->IsSelected(&v0objects);
     909             :       // this is a little awkward but otherwise the 
     910             :       // list wants to access the pointer (delete it) 
     911             :       // again when going out of scope
     912          78 :       delete v0objects.RemoveAt(3); // esdVtx created via copy construct
     913             :       esdVtx = 0;
     914          26 :       if (!selectV0) 
     915          10 :         continue;
     916             :     } else {
     917           0 :       delete v0objects.RemoveAt(3); // esdVtx created via copy construct
     918             :       esdVtx = 0;
     919             :     }
     920             :     
     921          16 :     v0->GetXYZ(pos[0], pos[1], pos[2]);
     922             :     
     923          16 :     if (!fOldESDformat) {
     924          16 :             chi2 = v0->GetChi2V0(); // = chi2/NDF since NDF = 2*2-3
     925          16 :             v0->GetPosCov(covVtx);
     926             :     } else {
     927             :             chi2 = -999.;
     928           0 :             for (Int_t i = 0; i < 6; i++)  covVtx[i] = 0.;
     929             :     }
     930             :     
     931             :     
     932             :     AliAODVertex * vV0 = 
     933          80 :           new(Vertices()[fNumberOfVertices++]) AliAODVertex(pos,
     934          16 :                                                             covVtx,
     935             :                                                             chi2,
     936          16 :                                                             fPrimaryVertex,
     937          16 :                                                             nV0,
     938             :                                                             AliAODVertex::kV0);
     939          16 :     fPrimaryVertex->AddDaughter(vV0);
     940             :     
     941             :     
     942             :     // Add the positive tracks from the V0
     943             : 
     944          16 :     esdV0Pos->GetPxPyPz(momPos);
     945          16 :     esdV0Pos->GetXYZ(pos);
     946          16 :     esdV0Pos->GetCovarianceXYZPxPyPz(covTr);
     947             :     //    esdV0Pos->GetESDpid(pid);
     948          16 :     esdV0Pos->GetTOFLabel(tofLabel);
     949             :     
     950          16 :     const AliESDVertex *vtx = esd.GetPrimaryVertex();
     951             : 
     952          16 :     if (!fUsedTrack[posFromV0]) {
     953           8 :             fUsedTrack[posFromV0] = kTRUE;
     954             :             UInt_t selectInfo = 0;
     955          24 :             if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdV0Pos);
     956          16 :             if(fMChandler)fMChandler->SelectParticle(esdV0Pos->GetLabel());
     957          48 :             aodTrack = new(Tracks()[fNumberOfTracks++]) AliAODTrack(esdV0Pos->GetID(),
     958           8 :                                                                     esdV0Pos->GetLabel(), 
     959             :                                                                     momPos, 
     960             :                                                                     kTRUE,
     961             :                                                                     pos,
     962             :                                                                     kFALSE,
     963             :                                                                     covTr, 
     964          16 :                                                                     (Short_t)esdV0Pos->GetSign(),
     965           8 :                                                                     esdV0Pos->GetITSClusterMap(), 
     966             :                                                                     // pid,
     967             :                                                                     vV0,
     968             :                                                                     kTRUE,  // check if this is right
     969          16 :                                                                     vtx->UsesTrack(esdV0Pos->GetID()),
     970             :                                                                     AliAODTrack::kFromDecayVtx,
     971             :                                                                     selectInfo);
     972           8 :             aodTrack->SetITSSharedMap(esdV0Pos->GetITSSharedMap());
     973          16 :             aodTrack->SetITSchi2(esdV0Pos->GetITSchi2());      
     974          16 :             aodTrack->SetPIDForTracking(esdV0Pos->GetPIDForTracking());
     975          24 :             aodTrack->SetTPCFitMap(esdV0Pos->GetTPCFitMap());
     976          24 :             aodTrack->SetTPCClusterMap(esdV0Pos->GetTPCClusterMap());
     977          24 :             aodTrack->SetTPCSharedMap (esdV0Pos->GetTPCSharedMap());
     978          16 :             aodTrack->SetChi2perNDF(Chi2perNDF(esdV0Pos));
     979          16 :             aodTrack->SetTPCPointsF(esdV0Pos->GetTPCNclsF());
     980          16 :             aodTrack->SetTPCNCrossedRows(UShort_t(esdV0Pos->GetTPCCrossedRows()));
     981          16 :             aodTrack->SetIntegratedLength(esdV0Pos->GetIntegratedLength());
     982           8 :             aodTrack->SetTOFLabel(tofLabel);
     983           8 :             CopyCaloProps(esdV0Pos,aodTrack);
     984           8 :             fAODTrackRefs->AddAt(aodTrack,posFromV0);
     985          20 :             if (esdV0Pos->GetSign() > 0) ++fNumberOfPositiveTracks;
     986           8 :             aodTrack->ConvertAliPIDtoAODPID();
     987          16 :             aodTrack->SetFlags(esdV0Pos->GetStatus());
     988           8 :             SetAODPID(esdV0Pos,aodTrack,detpid);
     989           8 :     } else {
     990          16 :       aodTrack = static_cast<AliAODTrack*>(fAODTrackRefs->At(posFromV0));
     991             :     }
     992          16 :     vV0->AddDaughter(aodTrack);
     993             :     
     994             :     // Add the negative tracks from the V0
     995          16 :     esdV0Neg->GetPxPyPz(momNeg);
     996          16 :     esdV0Neg->GetXYZ(pos);
     997          16 :     esdV0Neg->GetCovarianceXYZPxPyPz(covTr);
     998             :     //    esdV0Neg->GetESDpid(pid);
     999          16 :     esdV0Neg->GetTOFLabel(tofLabel);
    1000             :     
    1001          16 :     if (!fUsedTrack[negFromV0]) {
    1002          10 :       fUsedTrack[negFromV0] = kTRUE;
    1003             :       UInt_t selectInfo = 0;
    1004          30 :       if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdV0Neg);
    1005          20 :       if(fMChandler)fMChandler->SelectParticle(esdV0Neg->GetLabel());
    1006          60 :       aodTrack = new(Tracks()[fNumberOfTracks++]) AliAODTrack(esdV0Neg->GetID(),
    1007          10 :                                                               esdV0Neg->GetLabel(),
    1008             :                                                               momNeg,
    1009             :                                                               kTRUE,
    1010             :                                                               pos,
    1011             :                                                               kFALSE,
    1012             :                                                               covTr, 
    1013          20 :                                                               (Short_t)esdV0Neg->GetSign(),
    1014          10 :                                                               esdV0Neg->GetITSClusterMap(), 
    1015             :                                                               // pid,
    1016             :                                                               vV0,
    1017             :                                                               kTRUE,  // check if this is right
    1018          20 :                                                               vtx->UsesTrack(esdV0Neg->GetID()),
    1019             :                                                               AliAODTrack::kFromDecayVtx,
    1020             :                                                               selectInfo);
    1021          10 :       aodTrack->SetITSSharedMap(esdV0Neg->GetITSSharedMap());
    1022          20 :       aodTrack->SetITSchi2(esdV0Neg->GetITSchi2());      
    1023          20 :       aodTrack->SetPIDForTracking(esdV0Neg->GetPIDForTracking());
    1024          30 :       aodTrack->SetTPCFitMap(esdV0Neg->GetTPCFitMap());
    1025          30 :       aodTrack->SetTPCClusterMap(esdV0Neg->GetTPCClusterMap());
    1026          30 :       aodTrack->SetTPCSharedMap (esdV0Neg->GetTPCSharedMap());
    1027          20 :       aodTrack->SetChi2perNDF(Chi2perNDF(esdV0Neg));
    1028          20 :       aodTrack->SetTPCPointsF(esdV0Neg->GetTPCNclsF());
    1029          20 :       aodTrack->SetTPCNCrossedRows(UShort_t(esdV0Neg->GetTPCCrossedRows()));
    1030          20 :       aodTrack->SetIntegratedLength(esdV0Neg->GetIntegratedLength());
    1031          10 :       aodTrack->SetTOFLabel(tofLabel);
    1032          10 :       CopyCaloProps(esdV0Neg,aodTrack);
    1033          10 :       fAODTrackRefs->AddAt(aodTrack,negFromV0);
    1034          24 :       if (esdV0Neg->GetSign() > 0) ++fNumberOfPositiveTracks;
    1035          10 :       aodTrack->ConvertAliPIDtoAODPID();
    1036          20 :       aodTrack->SetFlags(esdV0Neg->GetStatus());
    1037          10 :       SetAODPID(esdV0Neg,aodTrack,detpid);
    1038          10 :     } else {
    1039          12 :       aodTrack = static_cast<AliAODTrack*>(fAODTrackRefs->At(negFromV0));
    1040             :     }
    1041          16 :     vV0->AddDaughter(aodTrack);
    1042             :     
    1043             :     // Add the V0 the V0 array as well
    1044          16 :     Double_t  dcaV0Daughters      = v0->GetDcaV0Daughters();
    1045          64 :     Double_t  dcaV0ToPrimVertex   = v0->GetD(esd.GetPrimaryVertex()->GetX(),
    1046          32 :                                              esd.GetPrimaryVertex()->GetY(),
    1047          32 :                                              esd.GetPrimaryVertex()->GetZ());
    1048             :     
    1049          16 :     v0->GetPPxPyPz(momPosAtV0vtx[0],momPosAtV0vtx[1],momPosAtV0vtx[2]); 
    1050          16 :     v0->GetNPxPyPz(momNegAtV0vtx[0],momNegAtV0vtx[1],momNegAtV0vtx[2]); 
    1051             :     
    1052          16 :     Double_t dcaDaughterToPrimVertex[2] = { 999., 999.}; // ..[0] = DCA in (x,y) for Pos and ..[1] = Neg
    1053          64 :     dcaDaughterToPrimVertex[0] = TMath::Abs(esdV0Pos->GetD(  esd.GetPrimaryVertex()->GetX(),
    1054          32 :                                                            esd.GetPrimaryVertex()->GetY(),
    1055          16 :                                                            esd.GetMagneticField()) );
    1056          64 :     dcaDaughterToPrimVertex[1] = TMath::Abs(esdV0Neg->GetD(  esd.GetPrimaryVertex()->GetX(),
    1057          32 :                                                            esd.GetPrimaryVertex()->GetY(),
    1058          16 :                                                            esd.GetMagneticField()) );
    1059             :     
    1060          80 :     AliAODv0* aodV0 = new(V0s()[fNumberOfV0s++]) AliAODv0(vV0, 
    1061             :                                                 dcaV0Daughters,
    1062             :                                                 dcaV0ToPrimVertex,
    1063          16 :                                                 momPosAtV0vtx,
    1064          16 :                                                 momNegAtV0vtx,
    1065          16 :                                                 dcaDaughterToPrimVertex);
    1066             :     
    1067             :     // set the aod v0 on-the-fly status
    1068          16 :     aodV0->SetOnFlyStatus(v0->GetOnFlyStatus());
    1069          42 :   }//End of loop on V0s 
    1070             :   
    1071          16 :   V0s().Expand(fNumberOfV0s);    
    1072           8 : }
    1073             : 
    1074             : //______________________________________________________________________________
    1075             : void AliAnalysisTaskESDfilter::ConvertTPCOnlyTracks(const AliESDEvent& esd)
    1076             : {
    1077             :   // Convert TPC only tracks
    1078             :   // Here we have wo hybrid appraoch to remove fakes
    1079             :   // ******* ITSTPC ********
    1080             :   // Uses a cut on the ITS properties to select global tracks
    1081             :   // which are than marked as HybdridITSTPC for the remainder 
    1082             :   // the TPC only tracks are flagged as HybridITSTPConly. 
    1083             :   // Note, in order not to get fakes back in the TPC cuts, one needs 
    1084             :   // two "ITS" cuts one tight (1) (to throw out fakes) and one lose (2) (to NOT flag the trakcs in the TPC only)
    1085             :   // using cut number (3)
    1086             :   // so fHybridFilterMask == (1)|(2) fTPCFilterMask = (3), Usercode needs to slect with mask = (1)|(3) and track->IsHybridITSTPC()
    1087             :   // ******* TPC ********
    1088             :   // Here, only TPC tracks are flagged that pass the tight ITS cuts and tracks that pass the TPC cuts and NOT the loose ITS cuts
    1089             :   // the ITS cuts neeed to be added to the filter as extra cuts, since here the selections info is reset in the global and put to the TPC only track
    1090             : 
    1091           0 :   AliCodeTimerAuto("",0);
    1092             :   
    1093             :   // Loop over the tracks and extract and mask out all aod tracks that pass the selections for AODt racks
    1094           0 :   for(int it = 0;it < fNumberOfTracks;++it)
    1095             :   {
    1096           0 :     AliAODTrack *tr = (AliAODTrack*)(Tracks().At(it));
    1097           0 :     if(!tr)continue;
    1098           0 :     UInt_t map = tr->GetFilterMap();
    1099           0 :     if(map&fTPCConstrainedFilterMask){
    1100             :       // we only reset the track select ionfo, no deletion...
    1101           0 :       tr->SetFilterMap(map&~fTPCConstrainedFilterMask);
    1102           0 :     }
    1103           0 :     if(map&fHybridFilterMaskTPCCG){
    1104             :       // this is one part of the hybrid tracks
    1105             :       // the others not passing the selection will be TPC only selected below
    1106           0 :       tr->SetIsHybridTPCConstrainedGlobal(kTRUE);
    1107             :     }
    1108           0 :   }
    1109             : 
    1110             :   // Loop over the ESD trcks and pick out the tracks passing TPC only cuts
    1111           0 :   const AliESDVertex *vtxSPD = esd.GetPrimaryVertexSPD();
    1112           0 :   const AliESDVertex *vtx = esd.GetPrimaryVertex();
    1113             : 
    1114           0 :   Double_t pos[3] = { 0. };      
    1115           0 :   Double_t covTr[21]={0.};
    1116             :   //  Double_t pid[10]={0.};  
    1117           0 :   Double_t p[3] = { 0. };
    1118           0 :   Double_t pDCA[3] = { 0. }; // momentum at DCA
    1119           0 :   Double_t rDCA[3] = { 0. }; // position at DCA
    1120           0 :   Float_t  dDCA[2] = {0.};    // DCA to the vertex d and z
    1121           0 :   Float_t  cDCA[3] = {0.};    // covariance of impact parameters
    1122           0 :   Int_t    tofLabel[3] = {0};
    1123             : 
    1124             :   AliAODTrack* aodTrack(0x0);
    1125             : 
    1126             :   // account for change in pT after the constraint
    1127             :   Float_t ptMax = 1E10;
    1128             :   Float_t ptMin = 0;
    1129           0 :   for(int i = 0;i<32;i++){
    1130           0 :     if(fTPCConstrainedFilterMask&(1<<i)){
    1131           0 :       AliESDtrackCuts*cuts = (AliESDtrackCuts*)fTrackFilter->GetCuts()->At(i);
    1132           0 :       Float_t tmp1= 0,tmp2 = 0;
    1133           0 :       cuts->GetPtRange(tmp1,tmp2);
    1134           0 :       if(tmp1>ptMin)ptMin=tmp1;
    1135           0 :       if(tmp2<ptMax)ptMax=tmp2;
    1136           0 :     }
    1137             :   } 
    1138             : 
    1139           0 :   for (Int_t nTrack = 0; nTrack < esd.GetNumberOfTracks(); ++nTrack) 
    1140             :   {
    1141           0 :     AliESDtrack* esdTrack = esd.GetTrack(nTrack); //carefull do not modify it othwise  need to work with a copy 
    1142             :     
    1143             :     UInt_t selectInfo = 0;
    1144             :     Bool_t isHybridITSTPC = false;
    1145             :     //
    1146             :     // Track selection
    1147           0 :     if (fTrackFilter) {
    1148           0 :       selectInfo = fTrackFilter->IsSelected(esdTrack);
    1149           0 :     }
    1150             : 
    1151           0 :     if(!(selectInfo&fHybridFilterMaskTPCCG)){
    1152             :       // not already selected tracks, use second part of hybrid tracks
    1153             :       isHybridITSTPC = true;
    1154             :       // too save space one could only store these...
    1155           0 :     }
    1156             : 
    1157           0 :     selectInfo &= fTPCConstrainedFilterMask;
    1158           0 :     if (!selectInfo) continue;
    1159           0 :     if (fWriteHybridTPCCOnly&&!isHybridITSTPC) continue; // write only complementary tracks
    1160             :     // create a tpc only tracl
    1161           0 :     AliESDtrack *track = AliESDtrackCuts::GetTPCOnlyTrack(const_cast<AliESDEvent*>(&esd),esdTrack->GetID());
    1162           0 :     if (!track) continue;
    1163             :     
    1164           0 :     if (track->Pt()>0.) {
    1165             :       // only constrain tracks above threshold
    1166           0 :       AliExternalTrackParam exParam;
    1167             :       // take the B-field from the ESD, no 3D fieldMap available at this point
    1168             :       Bool_t relate = false;
    1169           0 :       relate = track->RelateToVertexTPC(vtxSPD,esd.GetMagneticField(),kVeryBig,&exParam);
    1170           0 :       if(!relate){
    1171           0 :         delete track;
    1172           0 :         continue;
    1173             :       }
    1174             :       // fetch the track parameters at the DCA (unconstraint)
    1175           0 :       if(track->GetTPCInnerParam()){
    1176           0 :         track->GetTPCInnerParam()->GetPxPyPz(pDCA);
    1177           0 :         track->GetTPCInnerParam()->GetXYZ(rDCA);
    1178             :       }
    1179             :       // get the DCA to the vertex:
    1180           0 :       track->GetImpactParametersTPC(dDCA,cDCA);
    1181             :       // set the constrained parameters to the track
    1182           0 :       track->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
    1183           0 :     }
    1184             :     
    1185           0 :     track->GetPxPyPz(p);
    1186             : 
    1187           0 :     Float_t pT = track->Pt();
    1188           0 :     if(pT<ptMin||pT>ptMax){
    1189           0 :       delete track;
    1190           0 :       continue;
    1191             :     }
    1192             : 
    1193           0 :     track->GetXYZ(pos);
    1194           0 :     track->GetCovarianceXYZPxPyPz(covTr);
    1195             :     //    esdTrack->GetESDpid(pid);// original PID
    1196           0 :     esdTrack->GetTOFLabel(tofLabel);
    1197           0 :     if(fMChandler)fMChandler->SelectParticle(esdTrack->GetLabel());
    1198           0 :     fUsedTrackCopy[nTrack] |= selectInfo;
    1199           0 :     aodTrack = new(Tracks()[fNumberOfTracks++]) AliAODTrack((track->GetID()+1)*-1,
    1200           0 :                                                             track->GetLabel(),
    1201             :                                                             p,
    1202             :                                                             kTRUE,
    1203             :                                                             pos,
    1204             :                                                             kFALSE,
    1205             :                                                             covTr, 
    1206           0 :                                                             (Short_t)track->GetSign(),
    1207           0 :                                                             track->GetITSClusterMap(), 
    1208             :                                                             // pid,
    1209           0 :                                                             fPrimaryVertex,
    1210             :                                                             kTRUE, // check if this is right
    1211           0 :                                                             vtx->UsesTrack(track->GetID()),
    1212             :                                                             AliAODTrack::kPrimary, 
    1213             :                                                             selectInfo);
    1214           0 :     aodTrack->SetITSSharedMap(track->GetITSSharedMap());
    1215           0 :     aodTrack->SetITSchi2(track->GetITSchi2());      
    1216           0 :     aodTrack->SetPIDForTracking(track->GetPIDForTracking());
    1217           0 :     aodTrack->SetIsHybridTPCConstrainedGlobal(isHybridITSTPC);    
    1218           0 :     aodTrack->SetTPCFitMap(track->GetTPCFitMap());
    1219           0 :     aodTrack->SetTPCClusterMap(track->GetTPCClusterMap());
    1220           0 :     aodTrack->SetTPCSharedMap (track->GetTPCSharedMap());
    1221           0 :     aodTrack->SetIsTPCConstrained(kTRUE);    
    1222           0 :     aodTrack->SetChi2perNDF(Chi2perNDF(esdTrack)); // original track
    1223             :     // set the DCA values to the AOD track
    1224           0 :     aodTrack->SetPxPyPzAtDCA(pDCA[0],pDCA[1],pDCA[2]);
    1225           0 :     aodTrack->SetXYAtDCA(rDCA[0],rDCA[1]);
    1226           0 :     aodTrack->SetDCA(dDCA[0],dDCA[1]);
    1227           0 :     aodTrack->SetFlags(track->GetStatus());
    1228           0 :     aodTrack->SetTPCPointsF(track->GetTPCNclsF());
    1229           0 :     aodTrack->SetTPCNCrossedRows(UShort_t(track->GetTPCCrossedRows()));
    1230           0 :     aodTrack->SetIntegratedLength(track->GetIntegratedLength());
    1231           0 :     aodTrack->SetTOFLabel(tofLabel);
    1232           0 :     CopyCaloProps(track,aodTrack);
    1233             :     // do not duplicate PID information 
    1234             :     //    aodTrack->ConvertAliPIDtoAODPID();
    1235             :     //    SetAODPID(esdTrack,aodTrack,detpid);
    1236           0 :     delete track;
    1237           0 :   } // end of loop on tracks
    1238           0 : }
    1239             : 
    1240             : //______________________________________________________________________________
    1241             : void AliAnalysisTaskESDfilter::ConvertGlobalConstrainedTracks(const AliESDEvent& esd)
    1242             : {
    1243             :   // Here we have the option to store the complement from global constraint information
    1244             :   // to tracks passing tight cuts (1) in order not to get fakes back in, one needs 
    1245             :   // two sets of cuts one tight (1) (to throw out fakes) and one lose (2) (fakes/bad tracks would pass (2) but not (1))
    1246             :   // using cut number (3) selects the tracks that complement (1) e.g. tracks witout ITS refit or cluster requirement
    1247             : 
    1248           0 :   AliCodeTimerAuto("",0);
    1249             :   
    1250             :   // Loop over the tracks and extract and mask out all aod tracks that pass the selections for AODt racks
    1251           0 :   for(int it = 0;it < fNumberOfTracks;++it)
    1252             :   {
    1253           0 :     AliAODTrack *tr = (AliAODTrack*)(Tracks().At(it));
    1254           0 :     if(!tr)continue;
    1255           0 :     UInt_t map = tr->GetFilterMap();
    1256           0 :     if(map&fGlobalConstrainedFilterMask){
    1257             :       // we only reset the track select info, no deletion...
    1258             :       // mask reset mask in case track is already taken
    1259           0 :       tr->SetFilterMap(map&~fGlobalConstrainedFilterMask);
    1260           0 :     }
    1261           0 :     if(map&fHybridFilterMaskGCG){
    1262             :       // this is one part of the hybrid tracks
    1263             :       // the others not passing the selection will be the ones selected below
    1264           0 :       tr->SetIsHybridGlobalConstrainedGlobal(kTRUE);
    1265           0 :     }
    1266           0 :   }
    1267             :   // Loop over the ESD trcks and pick out the tracks passing the GlobalConstraint cuts
    1268             :  
    1269           0 :   Double_t pos[3] = { 0. };      
    1270           0 :   Double_t covTr[21]={0.};
    1271             :   //  Double_t pid[10]={0.};  
    1272           0 :   Double_t p[3] = { 0. };
    1273             : 
    1274           0 :   Double_t pDCA[3] = { 0. }; // momentum at DCA
    1275           0 :   Double_t rDCA[3] = { 0. }; // position at DCA
    1276           0 :   Float_t  dDCA[2] = {0.};    // DCA to the vertex d and z
    1277           0 :   Float_t  cDCA[3] = {0.};    // covariance of impact parameters
    1278           0 :   Int_t    tofLabel[3] = {0};
    1279             : 
    1280             :   AliAODTrack* aodTrack(0x0);
    1281             :   AliAODPid* detpid(0x0);
    1282           0 :   const AliESDVertex *vtx = esd.GetPrimaryVertex();
    1283             : 
    1284             :   // account for change in pT after the constraint
    1285             :   Float_t ptMax = 1E10;
    1286             :   Float_t ptMin = 0;
    1287           0 :   for(int i = 0;i<32;i++){
    1288           0 :     if(fGlobalConstrainedFilterMask&(1<<i)){
    1289           0 :       AliESDtrackCuts*cuts = (AliESDtrackCuts*)fTrackFilter->GetCuts()->At(i);
    1290           0 :       Float_t tmp1= 0,tmp2 = 0;
    1291           0 :       cuts->GetPtRange(tmp1,tmp2);
    1292           0 :       if(tmp1>ptMin)ptMin=tmp1;
    1293           0 :       if(tmp2<ptMax)ptMax=tmp2;
    1294           0 :     }
    1295             :   } 
    1296             : 
    1297           0 :  for (Int_t nTrack = 0; nTrack < esd.GetNumberOfTracks(); ++nTrack) 
    1298             :   {
    1299           0 :     AliESDtrack* esdTrack = esd.GetTrack(nTrack); //carefull do not modify it othwise  need to work with a copy 
    1300           0 :     const AliExternalTrackParam * exParamGC = esdTrack->GetConstrainedParam();
    1301           0 :     if(!exParamGC)continue;
    1302             : 
    1303             :     UInt_t selectInfo = 0;
    1304             :     Bool_t isHybridGC = false;
    1305             : 
    1306             :     //
    1307             :     // Track selection
    1308           0 :     if (fTrackFilter) {
    1309           0 :       selectInfo = fTrackFilter->IsSelected(esdTrack);
    1310           0 :     }
    1311             : 
    1312           0 :     if (!(selectInfo&fHybridFilterMaskGCG)) isHybridGC = true;
    1313           0 :     if (fWriteHybridGCOnly&&!isHybridGC) continue; // write only complementary tracks
    1314             : 
    1315           0 :     selectInfo &= fGlobalConstrainedFilterMask;
    1316           0 :     if (!selectInfo) continue;
    1317             :     // fetch the track parameters at the DCA (unconstrained)
    1318           0 :     esdTrack->GetPxPyPz(pDCA);
    1319           0 :     esdTrack->GetXYZ(rDCA);
    1320             :     // get the DCA to the vertex:
    1321           0 :     esdTrack->GetImpactParameters(dDCA,cDCA);
    1322           0 :     if (!esdTrack->GetConstrainedPxPyPz(p)) continue;
    1323             : 
    1324           0 :     Float_t pT = exParamGC->Pt();
    1325           0 :     if(pT<ptMin||pT>ptMax){
    1326           0 :       continue;
    1327             :     }
    1328             : 
    1329           0 :     esdTrack->GetConstrainedXYZ(pos);
    1330           0 :     exParamGC->GetCovarianceXYZPxPyPz(covTr);
    1331             :     //    esdTrack->GetESDpid(pid);
    1332           0 :     esdTrack->GetTOFLabel(tofLabel); 
    1333           0 :     if(fMChandler)fMChandler->SelectParticle(esdTrack->GetLabel());
    1334           0 :     fUsedTrackCopy[nTrack] |= selectInfo;
    1335           0 :     aodTrack = new(Tracks()[fNumberOfTracks++]) AliAODTrack((esdTrack->GetID()+1)*-1,
    1336           0 :                                                             esdTrack->GetLabel(),
    1337             :                                                             p,
    1338             :                                                             kTRUE,
    1339             :                                                             pos,
    1340             :                                                             kFALSE,
    1341             :                                                             covTr, 
    1342           0 :                                                             (Short_t)esdTrack->GetSign(),
    1343           0 :                                                             esdTrack->GetITSClusterMap(), 
    1344             :                                                             // pid,
    1345           0 :                                                             fPrimaryVertex,
    1346             :                                                             kTRUE, // check if this is right
    1347           0 :                                                             vtx->UsesTrack(esdTrack->GetID()),
    1348             :                                                             AliAODTrack::kPrimary, 
    1349             :                                                             selectInfo);
    1350           0 :     aodTrack->SetITSSharedMap(esdTrack->GetITSSharedMap());
    1351           0 :     aodTrack->SetITSchi2(esdTrack->GetITSchi2());      
    1352           0 :     aodTrack->SetPIDForTracking(esdTrack->GetPIDForTracking());
    1353           0 :     aodTrack->SetIsHybridGlobalConstrainedGlobal(isHybridGC);    
    1354           0 :     aodTrack->SetIsGlobalConstrained(kTRUE);    
    1355           0 :     aodTrack->SetTPCFitMap(esdTrack->GetTPCFitMap());
    1356           0 :     aodTrack->SetTPCClusterMap(esdTrack->GetTPCClusterMap());
    1357           0 :     aodTrack->SetTPCSharedMap (esdTrack->GetTPCSharedMap());
    1358           0 :     aodTrack->SetChi2perNDF(Chi2perNDF(esdTrack));
    1359             : 
    1360             :     // set the DCA values to the AOD track
    1361           0 :     aodTrack->SetPxPyPzAtDCA(pDCA[0],pDCA[1],pDCA[2]);
    1362           0 :     aodTrack->SetXYAtDCA(rDCA[0],rDCA[1]);
    1363           0 :     aodTrack->SetDCA(dDCA[0],dDCA[1]);
    1364           0 :     aodTrack->SetFlags(esdTrack->GetStatus());
    1365           0 :     aodTrack->SetTPCPointsF(esdTrack->GetTPCNclsF());
    1366           0 :     aodTrack->SetTPCNCrossedRows(UShort_t(esdTrack->GetTPCCrossedRows()));
    1367           0 :     aodTrack->SetIntegratedLength(esdTrack->GetIntegratedLength());
    1368           0 :     aodTrack->SetTOFLabel(tofLabel);
    1369           0 :     CopyCaloProps(esdTrack,aodTrack);
    1370           0 :     if(isHybridGC){
    1371             :       // only copy AOD information for hybrid, no duplicate information
    1372           0 :       aodTrack->ConvertAliPIDtoAODPID();
    1373           0 :       SetAODPID(esdTrack,aodTrack,detpid);
    1374             :     }
    1375           0 :   } // end of loop on tracks
    1376           0 : }
    1377             : 
    1378             : //______________________________________________________________________________
    1379             : void AliAnalysisTaskESDfilter::ConvertTracks(const AliESDEvent& esd)
    1380             : {
    1381             :   // Tracks (primary and orphan)
    1382             : 
    1383          16 :   AliCodeTimerAuto("",0);
    1384             :   
    1385          40 :   AliDebug(1,Form("NUMBER OF ESD TRACKS %5d\n", esd.GetNumberOfTracks()));
    1386             :   
    1387           8 :   const AliESDVertex *vtx = esd.GetPrimaryVertex();
    1388           8 :   Double_t p[3] = { 0. };
    1389           8 :   Double_t pos[3] = { 0. };
    1390           8 :   Double_t covTr[21] = { 0. };
    1391             :   //  Double_t pid[10] = { 0. };
    1392           8 :   Int_t    tofLabel[3] = {0};
    1393             :   AliAODTrack* aodTrack(0x0);
    1394             :   AliAODPid* detpid(0x0);
    1395             :   
    1396         450 :   for (Int_t nTrack = 0; nTrack < esd.GetNumberOfTracks(); ++nTrack) 
    1397             :   {
    1398         142 :     if (fUsedTrack[nTrack]) continue;
    1399             :     
    1400         120 :     AliESDtrack *esdTrack = esd.GetTrack(nTrack);
    1401             :     UInt_t selectInfo = 0;
    1402             :     //
    1403             :     // Track selection
    1404         120 :     if (fTrackFilter) {
    1405         120 :       selectInfo = fTrackFilter->IsSelected(esdTrack);
    1406         208 :       if (!selectInfo && !vtx->UsesTrack(esdTrack->GetID())) continue;
    1407             :     }
    1408             :     
    1409          98 :     esdTrack->GetPxPyPz(p);
    1410          98 :     esdTrack->GetXYZ(pos);
    1411          98 :     esdTrack->GetCovarianceXYZPxPyPz(covTr);
    1412             :     //    esdTrack->GetESDpid(pid);
    1413          98 :     esdTrack->GetTOFLabel(tofLabel);
    1414         196 :     if(fMChandler)fMChandler->SelectParticle(esdTrack->GetLabel());
    1415          98 :     fUsedTrack[nTrack] = kTRUE;
    1416         588 :     aodTrack = new(Tracks()[fNumberOfTracks++]) AliAODTrack(esdTrack->GetID(),
    1417          98 :                                                             esdTrack->GetLabel(),
    1418             :                                                             p,
    1419             :                                                             kTRUE,
    1420             :                                                             pos,
    1421             :                                                             kFALSE,
    1422             :                                                             covTr, 
    1423         196 :                                                             (Short_t)esdTrack->GetSign(),
    1424          98 :                                                             esdTrack->GetITSClusterMap(), 
    1425             :                                                             // pid,
    1426          98 :                                                             fPrimaryVertex,
    1427             :                                                             kTRUE, // check if this is right
    1428         196 :                                                             vtx->UsesTrack(esdTrack->GetID()),
    1429             :                                                             AliAODTrack::kPrimary, 
    1430             :                                                             selectInfo);
    1431          98 :     aodTrack->SetITSSharedMap(esdTrack->GetITSSharedMap());
    1432         196 :     aodTrack->SetITSchi2(esdTrack->GetITSchi2());         
    1433          98 :     fPrimaryVertex->AddDaughter(aodTrack);
    1434         196 :     aodTrack->SetPIDForTracking(esdTrack->GetPIDForTracking());
    1435         294 :     aodTrack->SetTPCFitMap(esdTrack->GetTPCFitMap());
    1436         294 :     aodTrack->SetTPCClusterMap(esdTrack->GetTPCClusterMap());
    1437         294 :     aodTrack->SetTPCSharedMap (esdTrack->GetTPCSharedMap());
    1438         196 :     aodTrack->SetChi2perNDF(Chi2perNDF(esdTrack));
    1439         196 :     aodTrack->SetTPCPointsF(esdTrack->GetTPCNclsF());
    1440         196 :     aodTrack->SetTPCNCrossedRows(UShort_t(esdTrack->GetTPCCrossedRows()));
    1441         196 :     aodTrack->SetIntegratedLength(esdTrack->GetIntegratedLength());
    1442          98 :     aodTrack->SetTOFLabel(tofLabel);
    1443          98 :     CopyCaloProps(esdTrack,aodTrack);
    1444          98 :     fAODTrackRefs->AddAt(aodTrack, nTrack);
    1445         244 :     if (esdTrack->GetSign() > 0) ++fNumberOfPositiveTracks;
    1446         196 :     aodTrack->SetFlags(esdTrack->GetStatus());
    1447          98 :     aodTrack->ConvertAliPIDtoAODPID();
    1448          98 :     SetAODPID(esdTrack,aodTrack,detpid);
    1449          98 :   } // end of loop on tracks
    1450           8 : }
    1451             : 
    1452             : //______________________________________________________________________________
    1453             : void AliAnalysisTaskESDfilter::ConvertPmdClusters(const AliESDEvent& esd)
    1454             : {
    1455             :   // Convert PMD Clusters 
    1456          16 :   AliCodeTimerAuto("",0);
    1457             :   Int_t jPmdClusters=0;
    1458             :   // Access to the AOD container of PMD clusters
    1459          16 :   TClonesArray &pmdClusters = *(AODEvent()->GetPmdClusters());
    1460         540 :   for (Int_t iPmd = 0; iPmd < esd.GetNumberOfPmdTracks(); ++iPmd) {
    1461             :     // file pmd clusters, to be revised!
    1462         172 :     AliESDPmdTrack *pmdTrack = esd.GetPmdTrack(iPmd);
    1463             :     Int_t nLabel = 0;
    1464             :     Int_t *label = 0x0;
    1465         172 :     Double_t posPmd[3] = { pmdTrack->GetClusterX(), pmdTrack->GetClusterY(), pmdTrack->GetClusterZ()};
    1466         172 :     Double_t pidPmd[13] = { 0.}; // to be revised!
    1467             :     // type not set!
    1468             :     // assoc cluster not set
    1469         516 :     new(pmdClusters[jPmdClusters++]) AliAODPmdCluster(iPmd, nLabel, label, pmdTrack->GetClusterADC(), posPmd, pidPmd);
    1470         172 :   }
    1471           8 : }
    1472             : 
    1473             : //______________________________________________________________________________
    1474             : void AliAnalysisTaskESDfilter::ConvertCaloClusters(const AliESDEvent& esd)
    1475             : {
    1476             :   // Convert Calorimeter Clusters
    1477          16 :   AliCodeTimerAuto("",0);
    1478             :   
    1479             :   // Access to the AOD container of clusters
    1480          16 :   TClonesArray &caloClusters = *(AODEvent()->GetCaloClusters());
    1481             :   Int_t jClusters(0);
    1482             :   
    1483         153 :   for (Int_t iClust=0; iClust<esd.GetNumberOfCaloClusters(); ++iClust) {
    1484          43 :     AliESDCaloCluster * cluster = esd.GetCaloCluster(iClust);
    1485             :     
    1486          43 :     Int_t  id        = cluster->GetID();
    1487          43 :     Int_t  nLabel    = cluster->GetNLabels();
    1488          43 :     Int_t *labels    = cluster->GetLabels();
    1489          43 :     if(labels){ 
    1490          90 :       for(int i = 0;i < nLabel;++i) {
    1491          46 :         if(fMChandler)fMChandler->SelectParticle(labels[i]);
    1492             :       }
    1493          22 :     }           
    1494             :     
    1495          86 :     Float_t energy = cluster->E();
    1496          43 :     Float_t posF[3] = { 0.};
    1497          43 :     cluster->GetPosition(posF);
    1498             :     
    1499         172 :     AliAODCaloCluster *caloCluster = new(caloClusters[jClusters++]) AliAODCaloCluster(id,
    1500             :                                                                                       nLabel,
    1501             :                                                                                       labels,
    1502             :                                                                                       energy,
    1503             :                                                                                       posF,
    1504             :                                                                                       NULL,
    1505          43 :                                                                                       cluster->GetType(),0);
    1506             :     
    1507          86 :     caloCluster->SetCaloCluster(cluster->GetDistanceToBadChannel(),
    1508          43 :                                 cluster->GetDispersion(),
    1509          86 :                                 cluster->GetM20(), cluster->GetM02(),
    1510          43 :                                 cluster->GetEmcCpvDistance(),  
    1511          86 :                                 cluster->GetNExMax(),cluster->GetTOF()) ;
    1512          86 :     caloCluster->SetPIDFromESD(cluster->GetPID());
    1513          86 :     caloCluster->SetNCells(cluster->GetNCells());
    1514          86 :     caloCluster->SetCellsAbsId(cluster->GetCellsAbsId());
    1515          86 :     caloCluster->SetCellsAmplitudeFraction(cluster->GetCellsAmplitudeFraction());
    1516         129 :     caloCluster->SetTrackDistance(cluster->GetTrackDx(), cluster->GetTrackDz());
    1517             :     
    1518          86 :     caloCluster->SetCellsMCEdepFractionMap(cluster->GetCellsMCEdepFractionMap());
    1519          86 :     caloCluster->SetClusterMCEdepFraction (cluster->GetClusterMCEdepFraction ());
    1520             :     
    1521             :     Int_t nMatchCount = 0;
    1522          43 :     TArrayI* matchedT = cluster->GetTracksMatched();
    1523         129 :     if (fNumberOfTracks>0 && matchedT && cluster->GetTrackMatchedIndex() >= 0) {       
    1524          80 :       for (Int_t im = 0; im < matchedT->GetSize(); im++) {
    1525          22 :         Int_t iESDtrack = matchedT->At(im);;
    1526          44 :         if (fAODTrackRefs->At(iESDtrack) != 0) {
    1527          44 :           caloCluster->AddTrackMatched((AliAODTrack*)fAODTrackRefs->At(iESDtrack));
    1528          22 :           nMatchCount++;
    1529          22 :         }
    1530             :       }
    1531          18 :     }
    1532          43 :     if(nMatchCount==0)
    1533          25 :       caloCluster->SetTrackDistance(-999,-999);
    1534             :     
    1535          43 :   } 
    1536           8 :   caloClusters.Expand(jClusters); // resize TObjArray to 'remove' slots for pseudo clusters      
    1537           8 : }
    1538             : 
    1539             : //______________________________________________________________________________
    1540             : void AliAnalysisTaskESDfilter::ConvertCaloTrigger(TString calo, const AliESDEvent& esd)
    1541             : {
    1542          32 :   AliCodeTimerAuto("",0);
    1543             :                 
    1544          32 :   if (calo == "PHOS") {
    1545          32 :     AliAODCaloTrigger &aodTrigger = *(AODEvent()->GetCaloTrigger(calo));
    1546          24 :     AliESDCaloTrigger &esdTrigger = *(esd.GetCaloTrigger(calo));
    1547             : 
    1548          16 :     aodTrigger.Allocate(esdTrigger.GetEntries());
    1549           8 :     esdTrigger.Reset();
    1550             : 
    1551           8 :     Float_t a;
    1552           8 :     Int_t tmod,tabsId;
    1553          24 :     while (esdTrigger.Next()) {
    1554           0 :       esdTrigger.GetPosition(tmod,tabsId);
    1555           0 :       esdTrigger.GetAmplitude(a);
    1556           0 :       aodTrigger.Add(tmod,tabsId,a,0.,(Int_t*)NULL,0,0,0);
    1557             :     }
    1558             :     return;
    1559           8 :   }
    1560             :                 
    1561             :   static Bool_t saveOnce = kFALSE;
    1562           8 :   if (!saveOnce) {
    1563           6 :     AliAODHandler *aodHandler = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()); 
    1564           2 :     if (aodHandler) {
    1565           2 :       TTree *aodTree = aodHandler->GetTree();
    1566           2 :       if (aodTree) {
    1567           2 :         Int_t *type = esd.GetCaloTriggerType();
    1568          64 :         for (Int_t i = 0; i < 15; i++) {
    1569         150 :           aodTree->GetUserInfo()->Add(new TParameter<int>(Form("EMCALCaloTrigger%d",i), type[i]));
    1570             :         }
    1571           2 :         saveOnce = kTRUE;
    1572           2 :       }
    1573           2 :     }
    1574           2 :   }
    1575             :                                                 
    1576          32 :   AliAODCaloTrigger &aodTrigger = *(AODEvent()->GetCaloTrigger(calo));
    1577          24 :   AliESDCaloTrigger &esdTrigger = *(esd.GetCaloTrigger(calo));
    1578          16 :   aodTrigger.Allocate(esdTrigger.GetEntries());
    1579             :                                                 
    1580           8 :   esdTrigger.Reset();
    1581         442 :   while (esdTrigger.Next()) {     
    1582         142 :     Int_t px, py, ts, nTimes, times[10], b; 
    1583         142 :     Float_t a, t;
    1584         142 :     esdTrigger.GetPosition(px, py);
    1585         142 :     esdTrigger.GetAmplitude(a);
    1586         142 :     esdTrigger.GetTime(t);
    1587         142 :     esdTrigger.GetL0Times(times);
    1588         142 :     esdTrigger.GetNL0Times(nTimes);
    1589         142 :     esdTrigger.GetL1TimeSum(ts);
    1590         142 :     esdTrigger.GetTriggerBits(b);
    1591         142 :     aodTrigger.Add(px, py, a, t, times, nTimes, ts, b);
    1592         142 :   }
    1593             :   
    1594         144 :   for (int i = 0; i < 4; i++) aodTrigger.SetL1Threshold(i, esdTrigger.GetL1Threshold(i));
    1595          24 :   Int_t v0[2] = {
    1596           8 :     esdTrigger.GetL1V0(0),
    1597           8 :     esdTrigger.GetL1V0(1)
    1598             :   };
    1599           8 :   aodTrigger.SetL1V0(v0);       
    1600          16 :   aodTrigger.SetL1FrameMask(esdTrigger.GetL1FrameMask());
    1601          24 : }
    1602             : 
    1603             : //______________________________________________________________________________
    1604             : void AliAnalysisTaskESDfilter::ConvertEMCALCells(const AliESDEvent& esd)
    1605             : {
    1606             :   // Convert EMCAL Cells
    1607          16 :   AliCodeTimerAuto("",0);
    1608             : 
    1609             :   // fill EMCAL cell info
    1610          16 :   if (esd.GetEMCALCells()) { // protection against missing ESD information
    1611           8 :     AliESDCaloCells &esdEMcells = *(esd.GetEMCALCells());
    1612          16 :     Int_t nEMcell = esdEMcells.GetNumberOfCells() ;
    1613          16 :     AliAODCaloCells &aodEMcells = *(AODEvent()->GetEMCALCells());
    1614           8 :     aodEMcells.CreateContainer(nEMcell);
    1615           8 :     aodEMcells.SetType(AliAODCaloCells::kEMCALCell);
    1616         242 :     for (Int_t iCell = 0; iCell < nEMcell; iCell++) {      
    1617         339 :       aodEMcells.SetCell(iCell,esdEMcells.GetCellNumber(iCell),esdEMcells.GetAmplitude(iCell),
    1618         339 :                          esdEMcells.GetTime(iCell), esdEMcells.GetMCLabel(iCell), esdEMcells.GetEFraction(iCell),
    1619         113 :                          esdEMcells.GetHighGain(iCell) );
    1620             :     }
    1621           8 :     aodEMcells.Sort();
    1622           8 :   }
    1623           8 : }
    1624             : 
    1625             : //______________________________________________________________________________
    1626             : void AliAnalysisTaskESDfilter::ConvertPHOSCells(const AliESDEvent& esd)
    1627             : {
    1628             :   // Convert PHOS Cells
    1629          16 :   AliCodeTimerAuto("",0);
    1630             : 
    1631             :   // fill PHOS cell info
    1632          16 :   if (esd.GetPHOSCells()) { // protection against missing ESD information
    1633           8 :     AliESDCaloCells &esdPHcells = *(esd.GetPHOSCells());
    1634          16 :     Int_t nPHcell = esdPHcells.GetNumberOfCells() ;
    1635             :     
    1636          16 :     AliAODCaloCells &aodPHcells = *(AODEvent()->GetPHOSCells());
    1637           8 :     aodPHcells.CreateContainer(nPHcell);
    1638           8 :     aodPHcells.SetType(AliAODCaloCells::kPHOSCell);
    1639         428 :     for (Int_t iCell = 0; iCell < nPHcell; iCell++) {      
    1640         618 :       aodPHcells.SetCell(iCell,esdPHcells.GetCellNumber(iCell),esdPHcells.GetAmplitude(iCell),
    1641         618 :                          esdPHcells.GetTime(iCell), esdPHcells.GetMCLabel(iCell), esdPHcells.GetEFraction(iCell),
    1642         206 :                          esdPHcells.GetHighGain(iCell) );
    1643             :     }
    1644           8 :     aodPHcells.Sort();
    1645           8 :   }
    1646           8 : }
    1647             : 
    1648             : //______________________________________________________________________________
    1649             : void AliAnalysisTaskESDfilter::ConvertTracklets(const AliESDEvent& esd)
    1650             : {
    1651             :   // tracklets    
    1652          16 :   AliCodeTimerAuto("",0);
    1653             : 
    1654          16 :   AliAODTracklets &SPDTracklets = *(AODEvent()->GetTracklets());
    1655           8 :   const AliMultiplicity *mult = esd.GetMultiplicity();
    1656           8 :   if (mult) {
    1657          16 :     if (mult->GetNumberOfTracklets()>0) {      
    1658          16 :       SPDTracklets.CreateContainer(mult->GetNumberOfTracklets());
    1659          16 :       SPDTracklets.SetScaleDThetaBySin2T(mult->GetScaleDThetaBySin2T());
    1660         168 :       for (Int_t n=0; n<mult->GetNumberOfTracklets(); n++) {
    1661          48 :         if(fMChandler){
    1662          48 :           fMChandler->SelectParticle(mult->GetLabel(n, 0));
    1663          48 :           fMChandler->SelectParticle(mult->GetLabel(n, 1));
    1664             :         }
    1665         288 :         SPDTracklets.SetTracklet(n, mult->GetTheta(n), mult->GetPhi(n), mult->GetDeltaPhi(n), mult->GetLabel(n, 0),mult->GetLabel(n, 1));
    1666             :       }
    1667           8 :     }
    1668          16 :     SPDTracklets.SetFiredChipMap(mult->GetFiredChipMap());
    1669          16 :     SPDTracklets.SetFastOrFiredChipMap(mult->GetFastOrFiredChipMap());
    1670          16 :     SPDTracklets.SetFiredChips(0,mult->GetNumberOfFiredChips(0));
    1671          16 :     SPDTracklets.SetFiredChips(1,mult->GetNumberOfFiredChips(1));
    1672             :     //
    1673         160 :     for (int i=6;i--;) SPDTracklets.SetITSClusters(i,mult->GetNumberOfITSClusters(i));
    1674           8 :   } else {
    1675             :     //Printf("ERROR: AliMultiplicity could not be retrieved from ESD");
    1676             :   }
    1677           8 : }
    1678             : 
    1679             : //______________________________________________________________________________
    1680             : void AliAnalysisTaskESDfilter::ConvertKinks(const AliESDEvent& esd)
    1681             : {
    1682          16 :   AliCodeTimerAuto("",0);
    1683             :   
    1684             :   // Kinks: it is a big mess the access to the information in the kinks
    1685             :   // The loop is on the tracks in order to find the mother and daugther of each kink
    1686             :   
    1687           8 :   Double_t covTr[21]={0.};
    1688             :   //  Double_t pid[10]={0.};
    1689             :   AliAODPid* detpid(0x0);
    1690           8 :   Int_t tofLabel[3] = {0};
    1691             :   
    1692          16 :   fNumberOfKinks = esd.GetNumberOfKinks();
    1693             : 
    1694           8 :   const AliESDVertex* vtx = esd.GetPrimaryVertex();
    1695             :   
    1696         450 :   for (Int_t iTrack=0; iTrack<esd.GetNumberOfTracks(); ++iTrack) 
    1697             :   {
    1698         142 :     AliESDtrack * esdTrack = esd.GetTrack(iTrack);
    1699             :     
    1700         142 :     Int_t ikink = esdTrack->GetKinkIndex(0);
    1701             :     
    1702         150 :     if (ikink && fNumberOfKinks) {
    1703             :       // Negative kink index: mother, positive: daughter
    1704             :       // Search for the second track of the kink
    1705             :             
    1706         144 :       for (Int_t jTrack = iTrack+1; jTrack<esd.GetNumberOfTracks(); ++jTrack) {
    1707          40 :         AliESDtrack * esdTrack1 = esd.GetTrack(jTrack);
    1708          40 :         Int_t jkink = esdTrack1->GetKinkIndex(0);
    1709             :         
    1710          40 :         if ( TMath::Abs(ikink)==TMath::Abs(jkink) ) {
    1711             :           // The two tracks are from the same kink
    1712           4 :           if (fUsedKink[TMath::Abs(ikink)-1]) continue; // skip used kinks
    1713             :           
    1714             :           Int_t imother = -1;
    1715             :           Int_t idaughter = -1;
    1716             :           
    1717           4 :           if (ikink<0 && jkink>0) {
    1718             :             imother = iTrack;
    1719             :             idaughter = jTrack;
    1720           4 :           } else if (ikink>0 && jkink<0) {
    1721             :             imother = jTrack;
    1722             :             idaughter = iTrack;
    1723             :           } else {
    1724             :             //cerr << "Error: Wrong combination of kink indexes: "
    1725             :             //     << ikink << " " << jkink << endl;
    1726           0 :             continue;
    1727             :           }
    1728             :           
    1729             :           // Add the mother track if it passed primary track selection cuts
    1730             :           AliAODTrack * mother = NULL;
    1731             :           
    1732             :           UInt_t selectInfo = 0;
    1733           4 :           if (fTrackFilter) {
    1734           8 :             selectInfo = fTrackFilter->IsSelected(esd.GetTrack(imother));
    1735           4 :             if (!selectInfo) continue;
    1736             :           }
    1737             :           
    1738           4 :           if (!fUsedTrack[imother]) {
    1739           2 :             fUsedTrack[imother] = kTRUE;
    1740           2 :             AliESDtrack *esdTrackM = esd.GetTrack(imother);
    1741           2 :             Double_t p[3] = { 0. };
    1742           2 :             Double_t pos[3] = { 0. };
    1743           2 :             esdTrackM->GetPxPyPz(p);
    1744           2 :             esdTrackM->GetXYZ(pos);
    1745           2 :             esdTrackM->GetCovarianceXYZPxPyPz(covTr);
    1746             :             //            esdTrackM->GetESDpid(pid);
    1747           2 :             esdTrackM->GetTOFLabel(tofLabel);
    1748           4 :             if(fMChandler)fMChandler->SelectParticle(esdTrackM->GetLabel());
    1749          12 :             mother = new(Tracks()[fNumberOfTracks++]) AliAODTrack(esdTrackM->GetID(),
    1750           2 :                                                                   esdTrackM->GetLabel(),
    1751             :                                                                   p,
    1752             :                                                                   kTRUE,
    1753             :                                                                   pos,
    1754             :                                                                   kFALSE,
    1755             :                                                                   covTr, 
    1756           4 :                                                                   (Short_t)esdTrackM->GetSign(),
    1757           2 :                                                                   esdTrackM->GetITSClusterMap(), 
    1758             :                                                                   // pid,
    1759           2 :                                                                   fPrimaryVertex,
    1760             :                                                                   kTRUE, // check if this is right
    1761           4 :                                                                   vtx->UsesTrack(esdTrack->GetID()),
    1762             :                                                                   AliAODTrack::kPrimary,
    1763             :                                                                   selectInfo);
    1764           2 :             mother->SetITSSharedMap(esdTrackM->GetITSSharedMap());
    1765           4 :             mother->SetITSchi2(esdTrackM->GetITSchi2());              
    1766           4 :             mother->SetPIDForTracking(esdTrackM->GetPIDForTracking());
    1767           6 :             mother->SetTPCFitMap(esdTrackM->GetTPCFitMap());
    1768           6 :             mother->SetTPCClusterMap(esdTrackM->GetTPCClusterMap());
    1769           6 :             mother->SetTPCSharedMap (esdTrackM->GetTPCSharedMap());
    1770           4 :             mother->SetChi2perNDF(Chi2perNDF(esdTrackM));
    1771           4 :             mother->SetTPCPointsF(esdTrackM->GetTPCNclsF());
    1772           4 :             mother->SetTPCNCrossedRows(UShort_t(esdTrackM->GetTPCCrossedRows()));
    1773           4 :             mother->SetIntegratedLength(esdTrackM->GetIntegratedLength());
    1774           2 :             mother->SetTOFLabel(tofLabel);
    1775           2 :             CopyCaloProps(esdTrackM,mother);
    1776           2 :             fAODTrackRefs->AddAt(mother, imother);
    1777           6 :             if (esdTrackM->GetSign() > 0) ++fNumberOfPositiveTracks;
    1778           4 :             mother->SetFlags(esdTrackM->GetStatus());
    1779           2 :             mother->ConvertAliPIDtoAODPID();
    1780           2 :             fPrimaryVertex->AddDaughter(mother);
    1781           2 :             mother->ConvertAliPIDtoAODPID();
    1782           2 :             SetAODPID(esdTrackM,mother,detpid);
    1783           2 :           }
    1784             :           else {
    1785             :             //cerr << "Error: event " << esd.GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
    1786             :             //     << " track " << imother << " has already been used!" << endl;
    1787             :           }
    1788             :           
    1789             :           // Add the kink vertex
    1790           4 :           AliESDkink * kink = esd.GetKink(TMath::Abs(ikink)-1);
    1791             :           
    1792          20 :           AliAODVertex * vkink = new(Vertices()[fNumberOfVertices++]) AliAODVertex(kink->GetPosition(),
    1793             :                                                                                    NULL,
    1794             :                                                                                    0.,
    1795           4 :                                                                                    mother,
    1796           8 :                                                                                    esdTrack->GetID(),  // ID of mother's track!
    1797             :                                                                                    AliAODVertex::kKink);
    1798             :           // Add the daughter track
    1799             :           AliAODTrack * daughter = NULL;
    1800           4 :           if (!fUsedTrack[idaughter]) {
    1801           2 :             fUsedTrack[idaughter] = kTRUE;
    1802           2 :             AliESDtrack *esdTrackD = esd.GetTrack(idaughter);
    1803           2 :             Double_t p[3] = { 0. };
    1804           2 :             Double_t pos[3] = { 0. };
    1805           2 :             esdTrackD->GetPxPyPz(p);
    1806           2 :             esdTrackD->GetXYZ(pos);
    1807           2 :             esdTrackD->GetCovarianceXYZPxPyPz(covTr);
    1808             :             //            esdTrackD->GetESDpid(pid);
    1809           2 :             esdTrackD->GetTOFLabel(tofLabel);
    1810             :             selectInfo = 0;
    1811           6 :             if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdTrackD);
    1812           4 :             if(fMChandler)fMChandler->SelectParticle(esdTrackD->GetLabel());
    1813          12 :             daughter = new(Tracks()[fNumberOfTracks++]) AliAODTrack(esdTrackD->GetID(),
    1814           2 :                                                                     esdTrackD->GetLabel(),
    1815             :                                                                     p,
    1816             :                                                                     kTRUE,
    1817             :                                                                     pos,
    1818             :                                                                     kFALSE,
    1819             :                                                                     covTr, 
    1820           4 :                                                                     (Short_t)esdTrackD->GetSign(),
    1821           2 :                                                                     esdTrackD->GetITSClusterMap(), 
    1822             :                                                                     // pid,
    1823             :                                                                     vkink,
    1824             :                                                                     kTRUE, // check if this is right
    1825           4 :                                                                     vtx->UsesTrack(esdTrack->GetID()),
    1826             :                                                                     AliAODTrack::kFromDecayVtx,
    1827             :                                                                     selectInfo);
    1828           2 :             daughter->SetITSSharedMap(esdTrackD->GetITSSharedMap());
    1829           4 :             daughter->SetITSchi2(esdTrackD->GetITSchi2());            
    1830           4 :             daughter->SetPIDForTracking(esdTrackD->GetPIDForTracking());
    1831           6 :             daughter->SetTPCFitMap(esdTrackD->GetTPCFitMap());
    1832           6 :             daughter->SetTPCClusterMap(esdTrackD->GetTPCClusterMap());
    1833           6 :             daughter->SetTPCSharedMap (esdTrackD->GetTPCSharedMap());
    1834           4 :             daughter->SetTPCPointsF(esdTrackD->GetTPCNclsF());
    1835           4 :             daughter->SetTPCNCrossedRows(UShort_t(esdTrackD->GetTPCCrossedRows()));
    1836           4 :             daughter->SetIntegratedLength(esdTrackD->GetIntegratedLength());
    1837           2 :             daughter->SetTOFLabel(tofLabel);
    1838           2 :             CopyCaloProps(esdTrackD,daughter);
    1839           2 :             fAODTrackRefs->AddAt(daughter, idaughter);
    1840           6 :             if (esdTrackD->GetSign() > 0) ++fNumberOfPositiveTracks;
    1841           4 :             daughter->SetFlags(esdTrackD->GetStatus());
    1842           2 :             daughter->ConvertAliPIDtoAODPID();
    1843           2 :             vkink->AddDaughter(daughter);
    1844           2 :             daughter->ConvertAliPIDtoAODPID();
    1845           2 :             SetAODPID(esdTrackD,daughter,detpid);
    1846           2 :           } else {
    1847             :             //cerr << "Error: event " << esd.GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
    1848             :             //     << " track " << idaughter << " has already been used!" << endl;
    1849             :           }
    1850           4 :         }
    1851          40 :       }
    1852           8 :     }      
    1853             :   }
    1854           8 : }
    1855             : 
    1856             : //______________________________________________________________________________
    1857             : void AliAnalysisTaskESDfilter::ConvertPrimaryVertices(const AliESDEvent& esd)
    1858             : {
    1859          16 :   AliCodeTimerAuto("",0);
    1860             :   
    1861             :   // Access to the AOD container of vertices
    1862           8 :   fNumberOfVertices = 0;
    1863             :   
    1864           8 :   Double_t pos[3] = { 0. };
    1865           8 :   Double_t covVtx[6] = { 0. };
    1866             : 
    1867             :   // Add primary vertex. The primary tracks will be defined
    1868             :   // after the loops on the composite objects (V0, cascades, kinks)
    1869           8 :   const AliESDVertex *vtx = esd.GetPrimaryVertex();
    1870             :   
    1871           8 :   vtx->GetXYZ(pos); // position
    1872           8 :   vtx->GetCovMatrix(covVtx); //covariance matrix
    1873             :   
    1874          40 :   fPrimaryVertex = new(Vertices()[fNumberOfVertices++])
    1875           8 :   AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, -1, AliAODVertex::kPrimary);
    1876          16 :   fPrimaryVertex->SetName(vtx->GetName());
    1877          16 :   fPrimaryVertex->SetTitle(vtx->GetTitle());
    1878          16 :   fPrimaryVertex->SetBC(vtx->GetBC());
    1879             :   
    1880          16 :   TString vtitle = vtx->GetTitle();
    1881          16 :   if (!vtitle.Contains("VertexerTracks")) 
    1882           0 :     fPrimaryVertex->SetNContributors(vtx->GetNContributors());
    1883             :   
    1884           8 :   if (fDebug > 0) fPrimaryVertex->Print();  
    1885             :   
    1886             :   // Add SPD "main" vertex 
    1887           8 :   const AliESDVertex *vtxS = esd.GetPrimaryVertexSPD();
    1888           8 :   vtxS->GetXYZ(pos); // position
    1889           8 :   vtxS->GetCovMatrix(covVtx); //covariance matrix
    1890          32 :   AliAODVertex * mVSPD = new(Vertices()[fNumberOfVertices++])
    1891           8 :   AliAODVertex(pos, covVtx, vtxS->GetChi2toNDF(), NULL, -1, AliAODVertex::kMainSPD);
    1892          16 :   mVSPD->SetName(vtxS->GetName());
    1893          16 :   mVSPD->SetTitle(vtxS->GetTitle());
    1894          16 :   mVSPD->SetNContributors(vtxS->GetNContributors()); 
    1895             :   
    1896             :   // Add SPD pileup vertices
    1897          24 :   for(Int_t iV=0; iV<esd.GetNumberOfPileupVerticesSPD(); ++iV) {
    1898           0 :     const AliESDVertex *vtxP = esd.GetPileupVertexSPD(iV);
    1899           0 :     vtxP->GetXYZ(pos); // position
    1900           0 :     vtxP->GetCovMatrix(covVtx); //covariance matrix
    1901           0 :     AliAODVertex * pVSPD =  new(Vertices()[fNumberOfVertices++])
    1902           0 :     AliAODVertex(pos, covVtx, vtxP->GetChi2toNDF(), NULL, -1, AliAODVertex::kPileupSPD);
    1903           0 :     pVSPD->SetName(vtxP->GetName());
    1904           0 :     pVSPD->SetTitle(vtxP->GetTitle());
    1905           0 :     pVSPD->SetNContributors(vtxP->GetNContributors()); 
    1906           0 :     pVSPD->SetBC(vtxP->GetBC());
    1907             :   }
    1908             :   
    1909             :   // Add TRK pileup vertices
    1910          24 :   for(Int_t iV=0; iV<esd.GetNumberOfPileupVerticesTracks(); ++iV) {
    1911           0 :     const AliESDVertex *vtxP = esd.GetPileupVertexTracks(iV);
    1912           0 :     vtxP->GetXYZ(pos); // position
    1913           0 :     vtxP->GetCovMatrix(covVtx); //covariance matrix
    1914           0 :     AliAODVertex * pVTRK = new(Vertices()[fNumberOfVertices++])
    1915           0 :     AliAODVertex(pos, covVtx, vtxP->GetChi2toNDF(), NULL, -1, AliAODVertex::kPileupTracks);
    1916           0 :     pVTRK->SetName(vtxP->GetName());
    1917           0 :     pVTRK->SetTitle(vtxP->GetTitle());
    1918           0 :     pVTRK->SetNContributors(vtxP->GetNContributors());
    1919           0 :     pVTRK->SetBC(vtxP->GetBC());
    1920             :   }
    1921             : 
    1922             :   // Add TPC "main" vertex 
    1923           8 :   const AliESDVertex *vtxT = esd.GetPrimaryVertexTPC();
    1924           8 :   vtxT->GetXYZ(pos); // position
    1925           8 :   vtxT->GetCovMatrix(covVtx); //covariance matrix
    1926          32 :   AliAODVertex * mVTPC = new(Vertices()[fNumberOfVertices++])
    1927           8 :   AliAODVertex(pos, covVtx, vtxT->GetChi2toNDF(), NULL, -1, AliAODVertex::kMainTPC);
    1928          16 :   mVTPC->SetName(vtxT->GetName());
    1929          16 :   mVTPC->SetTitle(vtxT->GetTitle());
    1930          16 :   mVTPC->SetNContributors(vtxT->GetNContributors()); 
    1931           8 : }
    1932             : 
    1933             : //______________________________________________________________________________
    1934             : void AliAnalysisTaskESDfilter::ConvertVZERO(const AliESDEvent& esd)
    1935             : {
    1936             :   // Convert VZERO data
    1937          16 :   AliAODVZERO* vzeroData = AODEvent()->GetVZEROData();
    1938           8 :   *vzeroData = *(esd.GetVZEROData());
    1939           8 : }
    1940             : 
    1941             : //______________________________________________________________________________
    1942             : void AliAnalysisTaskESDfilter::ConvertTZERO(const AliESDEvent& esd)
    1943             : {
    1944             :   // Convert TZERO data
    1945          16 :   const AliESDTZERO* esdTzero = esd.GetESDTZERO(); 
    1946           8 :   AliAODTZERO* aodTzero = AODEvent()->GetTZEROData();
    1947             : 
    1948          64 :   for (Int_t icase=0; icase<3; icase++){ 
    1949          24 :     aodTzero->SetT0TOF(    icase, esdTzero->GetT0TOF(icase));
    1950          24 :     aodTzero->SetT0TOFbest(icase, esdTzero->GetT0TOFbest(icase)); 
    1951             :   }
    1952           8 :   aodTzero->SetBackgroundFlag(esdTzero->GetBackgroundFlag());
    1953           8 :   aodTzero->SetPileupFlag(esdTzero->GetPileupFlag());
    1954           8 :   aodTzero->SetSatelliteFlag(esdTzero->GetSatellite()); 
    1955             : 
    1956           8 :   Float_t rawTime[24];
    1957         400 :   for(Int_t ipmt=0; ipmt<24; ipmt++)
    1958         192 :     rawTime[ipmt] = esdTzero->GetTimeFull(ipmt,0);
    1959             :    
    1960             :   Int_t idxOfFirstPmtA = -1,       idxOfFirstPmtC = -1;
    1961             :   Float_t timeOfFirstPmtA = 9999, timeOfFirstPmtC = 9999;
    1962         208 :   for(int ipmt=0;  ipmt<12; ipmt++){
    1963         192 :     if( rawTime[ipmt] > -2 && rawTime[ipmt] < timeOfFirstPmtC && rawTime[ipmt]!=0){
    1964             :       timeOfFirstPmtC = rawTime[ipmt];
    1965             :       idxOfFirstPmtC  = ipmt;
    1966           1 :     }
    1967             :   }
    1968         208 :   for(int ipmt=12; ipmt<24; ipmt++){
    1969         182 :     if( rawTime[ipmt] > -2 && rawTime[ipmt] < timeOfFirstPmtA && rawTime[ipmt]!=0 ){
    1970             :       timeOfFirstPmtA = rawTime[ipmt];
    1971             :       idxOfFirstPmtA  = ipmt;
    1972           3 :     }
    1973             :   }
    1974             : 
    1975           8 :   if(idxOfFirstPmtA != -1 && idxOfFirstPmtC != -1){
    1976             :     //speed of light in cm/ns   TMath::C()*1e-7 
    1977           1 :     Float_t vertexraw = TMath::C()*1e-7 * (rawTime[idxOfFirstPmtA] - rawTime[idxOfFirstPmtC])/2;
    1978           1 :     aodTzero->SetT0VertexRaw( vertexraw );
    1979           1 :   }else{
    1980           7 :     aodTzero->SetT0VertexRaw(99999);
    1981             :   }
    1982             : 
    1983           8 :   aodTzero->SetT0zVertex(esdTzero->GetT0zVertex());
    1984             :   //amplitude
    1985           8 :   const Double32_t *amp=esdTzero->GetT0amplitude();
    1986         400 :   for(int ipmt=0;  ipmt<24; ipmt++)
    1987         192 :     aodTzero->SetAmp(ipmt, amp[ipmt]);
    1988           8 :   aodTzero->SetAmp(24,esdTzero->GetMultC() );
    1989           8 :   aodTzero->SetAmp(25,esdTzero->GetMultA() );
    1990             :   //pile-up bits
    1991          16 :   aodTzero->SetPileupBits(esdTzero->GetT0PileupBits() );
    1992             : 
    1993           8 : }
    1994             : 
    1995             : //______________________________________________________________________________
    1996             : void AliAnalysisTaskESDfilter::ConvertZDC(const AliESDEvent& esd)
    1997             : {
    1998             :   // Convert ZDC data
    1999          16 :   AliESDZDC* esdZDC = esd.GetZDCData();
    2000             :   
    2001           8 :   const Double_t zem1Energy = esdZDC->GetZEM1Energy();
    2002           8 :   const Double_t zem2Energy = esdZDC->GetZEM2Energy();
    2003             :    
    2004           8 :   const Double_t *towZNC = esdZDC->GetZNCTowerEnergy();
    2005           8 :   const Double_t *towZPC = esdZDC->GetZPCTowerEnergy();
    2006           8 :   const Double_t *towZNA = esdZDC->GetZNATowerEnergy();
    2007           8 :   const Double_t *towZPA = esdZDC->GetZPATowerEnergy();
    2008           8 :   const Double_t *towZNCLG = esdZDC->GetZNCTowerEnergyLR();
    2009           8 :   const Double_t *towZNALG = esdZDC->GetZNATowerEnergyLR();
    2010           8 :   const Double_t *towZPCLG = esdZDC->GetZPCTowerEnergyLR();
    2011           8 :   const Double_t *towZPALG = esdZDC->GetZPATowerEnergyLR();
    2012             :   
    2013           8 :   AliAODZDC* zdcAOD = AODEvent()->GetZDCData();
    2014             : 
    2015           8 :   zdcAOD->SetZEM1Energy(zem1Energy);
    2016           8 :   zdcAOD->SetZEM2Energy(zem2Energy);
    2017           8 :   zdcAOD->SetZNCTowers(towZNC, towZNCLG);
    2018           8 :   zdcAOD->SetZNATowers(towZNA, towZNALG);
    2019           8 :   zdcAOD->SetZPCTowers(towZPC, towZPCLG);
    2020           8 :   zdcAOD->SetZPATowers(towZPA, towZPALG);
    2021             :   
    2022           8 :   zdcAOD->SetZDCParticipants(esdZDC->GetZDCParticipants(), esdZDC->GetZDCPartSideA(), esdZDC->GetZDCPartSideC());
    2023           8 :   zdcAOD->SetZDCImpactParameter(esdZDC->GetImpactParameter(), esdZDC->GetImpactParamSideA(), esdZDC->GetImpactParamSideC());
    2024             :   
    2025             :   // Setters dealing only with the 1st stored TDC hit
    2026           8 :   zdcAOD->SetZDCTDCSum(esdZDC->GetZNTDCSum(0));   
    2027           8 :   zdcAOD->SetZDCTDCDiff(esdZDC->GetZNTDCDiff(0)); 
    2028             : 
    2029             :   //Taking into account all the 4 hits
    2030           8 :   if(esdZDC->IsZNChit()){ 
    2031           0 :     zdcAOD->SetZNCfired();
    2032           0 :     int zncch = esdZDC->GetZNCTDCChannel();
    2033           0 :     if(zncch>0){
    2034           0 :       zdcAOD->SetZNCTDC(esdZDC->GetZDCTDCCorrected(zncch, 0));
    2035           0 :       for(int i=0; i<4; i++){
    2036           0 :          if(TMath::Abs(esdZDC->GetZDCTDCData(zncch, i))>1e-6) zdcAOD->SetZNCTDCm(i, esdZDC->GetZDCTDCCorrected(zncch, i));
    2037             :       }
    2038           0 :     }
    2039           0 :   }
    2040           8 :   if(esdZDC->IsZNAhit()){
    2041           0 :     zdcAOD->SetZNAfired();
    2042           0 :     int znach = esdZDC->GetZNATDCChannel();
    2043           0 :     if(znach>0){ 
    2044           0 :       zdcAOD->SetZNATDC(esdZDC->GetZDCTDCCorrected(znach, 0));
    2045           0 :       for(int i=0; i<4; i++){
    2046           0 :          if(TMath::Abs(esdZDC->GetZDCTDCData(znach, i))>1e-6) zdcAOD->SetZNATDCm(i, esdZDC->GetZDCTDCCorrected(znach, i));
    2047             :       }
    2048           0 :     }
    2049           0 :   }
    2050           8 :   if(esdZDC->IsZPChit()){
    2051           0 :     zdcAOD->SetZPCfired();
    2052           0 :     int zpcch = esdZDC->GetZPCTDCChannel();
    2053           0 :     if(zpcch>0){
    2054           0 :       zdcAOD->SetZPCTDC(esdZDC->GetZDCTDCCorrected(zpcch, 0));
    2055           0 :       for(int i=0; i<4; i++){
    2056           0 :          if(TMath::Abs(esdZDC->GetZDCTDCData(zpcch, i))>1e-6) zdcAOD->SetZPCTDCm(i, esdZDC->GetZDCTDCCorrected(zpcch, i));
    2057             :       }
    2058           0 :     }
    2059           0 :   }
    2060           8 :   if(esdZDC->IsZPAhit()){
    2061           0 :     zdcAOD->SetZPAfired();
    2062           0 :     int zpach = esdZDC->GetZPATDCChannel();
    2063           0 :     if(zpach>0){
    2064           0 :        zdcAOD->SetZPATDC(esdZDC->GetZDCTDCCorrected(zpach, 0));
    2065           0 :        for(int i=0; i<4; i++){
    2066           0 :          if(TMath::Abs(esdZDC->GetZDCTDCData(zpach, i))>1e-6) zdcAOD->SetZPATDCm(i, esdZDC->GetZDCTDCCorrected(zpach, i));
    2067             :        }
    2068           0 :     }
    2069           0 :   }
    2070           8 : }
    2071             : //______________________________________________________________________________
    2072             : void AliAnalysisTaskESDfilter::ConvertAD(const AliESDEvent& esd)
    2073             : {
    2074             :   // Convert AD data
    2075          16 :   AliAODAD* adData = AODEvent()->GetADData();
    2076          16 :   if (adData && esd.GetADData())
    2077           8 :     *adData = *(esd.GetADData());
    2078           8 : }
    2079             : //_____________________________________________________________________________
    2080             : Int_t AliAnalysisTaskESDfilter::ConvertHMPID(const AliESDEvent& esd) // clm
    2081             : {
    2082             :   //
    2083             :   // Convtert ESD HMPID info to AOD and return the number of good tracks with HMPID signal.
    2084             :   // We need to return an int since there is no signal counter in the ESD.
    2085             :   //
    2086             :   
    2087          16 :   AliCodeTimerAuto("",0);
    2088             :   
    2089             :   Int_t cntHmpidGoodTracks = 0;
    2090             :   
    2091           8 :   Float_t  xMip = 0;
    2092           8 :   Float_t  yMip = 0;
    2093           8 :   Int_t    qMip = 0;
    2094           8 :   Int_t    nphMip = 0;
    2095             :   
    2096           8 :   Float_t xTrk = 0;
    2097           8 :   Float_t yTrk = 0;
    2098           8 :   Float_t thetaTrk = 0;
    2099           8 :   Float_t phiTrk = 0;
    2100             :   
    2101           8 :   Double_t hmpPid[5]={0};
    2102           8 :   Double_t hmpMom[3]={0};
    2103             :   
    2104          16 :   TClonesArray &hmpidRings = *(AODEvent()->GetHMPIDrings());
    2105             :   
    2106         450 :   for (Int_t iTrack=0; iTrack<esd.GetNumberOfTracks(); ++iTrack) {
    2107         284 :     if(! esd.GetTrack(iTrack) ) continue;
    2108             :       
    2109         426 :     if(esd.GetTrack(iTrack)->GetHMPIDsignal() > -20 ) {                  // 
    2110          66 :       (esd.GetTrack(iTrack))->GetHMPIDmip(xMip, yMip, qMip, nphMip);     // Get MIP properties
    2111          66 :       (esd.GetTrack(iTrack))->GetHMPIDtrk(xTrk,yTrk,thetaTrk,phiTrk);
    2112          66 :       (esd.GetTrack(iTrack))->GetHMPIDpid(hmpPid);
    2113          82 :       if((esd.GetTrack(iTrack))->GetOuterHmpParam()) (esd.GetTrack(iTrack))->GetOuterHmpPxPyPz(hmpMom);
    2114             :       
    2115          99 :       if(esd.GetTrack(iTrack)->GetHMPIDsignal() == 0 && thetaTrk == 0 && qMip == 0 && nphMip ==0 ) continue;  //
    2116             :       
    2117          75 :       new(hmpidRings[cntHmpidGoodTracks++]) AliAODHMPIDrings((esd.GetTrack(iTrack))->GetID(),             // Unique track id to attach the ring to
    2118          15 :                                                              1000000*nphMip+qMip,                         // MIP charge and number of photons
    2119          30 :                                                              (esd.GetTrack(iTrack))->GetHMPIDcluIdx(),    // 1000000*chamber id + cluster idx of assigned MIP cluster  
    2120          15 :                                                              thetaTrk,                                    // track inclination angle theta
    2121          15 :                                                              phiTrk,                                      // track inclination angle phi
    2122          30 :                                                              (esd.GetTrack(iTrack))->GetHMPIDsignal(),    // Cherenkov angle
    2123          30 :                                                              (esd.GetTrack(iTrack))->GetHMPIDoccupancy(), // Occupancy claculated for the given chamber 
    2124          30 :                                                              (esd.GetTrack(iTrack))->GetHMPIDchi2(),      // Ring resolution squared
    2125          15 :                                                              xTrk,                                        // Track x coordinate (LORS)
    2126          15 :                                                              yTrk,                                        // Track y coordinate (LORS)
    2127          15 :                                                              xMip,                                        // MIP x coordinate (LORS)
    2128          15 :                                                              yMip,                                        // MIP y coordinate (LORS)
    2129             :                                                              hmpPid,                                      // PID probablities from ESD, remove once it is CombinedPid
    2130          15 :                                                              hmpMom                                       // Track momentum in HMPID at ring reconstruction
    2131             :                                                              );  
    2132             :     }
    2133             :   }
    2134             :   
    2135             :   return cntHmpidGoodTracks;
    2136           8 : }
    2137             : 
    2138             : void AliAnalysisTaskESDfilter::ConvertTRD(const AliESDEvent& esd)
    2139             : {
    2140             :   // fill TRD on-line tracks with assiocated tracklets
    2141             :   // as used for the TRD level-1 triggers
    2142             : 
    2143          16 :   const Int_t nTrdTracks = esd.GetNumberOfTrdTracks();
    2144             :   const Int_t nLayers = 6;
    2145             : 
    2146        4654 :   for (Int_t iTrdTrack = 0; iTrdTrack < nTrdTracks; ++iTrdTrack) {
    2147             :     // copy information from ESD track to AOD track
    2148        2319 :     const AliESDTrdTrack *esdTrdTrk = esd.GetTrdTrack(iTrdTrack);
    2149        2319 :     AliAODTrdTrack &aodTrdTrk = AODEvent()->AddTrdTrack(esdTrdTrk);
    2150             : 
    2151             :     // copy the contributing tracklets
    2152       32466 :     for (Int_t iTracklet = 0; iTracklet < nLayers; ++iTracklet) {
    2153       13914 :       if (const AliESDTrdTracklet *esdTrdTrkl = esdTrdTrk->GetTracklet(iTracklet))
    2154          73 :         aodTrdTrk.AddTracklet(*esdTrdTrkl, iTracklet);
    2155             :     }
    2156             : 
    2157             :     // add the reference to the matched global track
    2158             :     AliAODTrack *aodTrkMatch = 0x0;
    2159        2319 :     AliESDtrack *esdTrkMatch = (AliESDtrack*) esdTrdTrk->GetTrackMatch();
    2160        2319 :     if (esdTrkMatch) {
    2161          13 :       Int_t idx = esdTrkMatch->GetID();
    2162             : 
    2163          13 :       if (idx < 0)
    2164           0 :         AliError("track has a matched track that was not found");
    2165          13 :       else if (esdTrkMatch != esd.GetTrack(idx))
    2166           0 :         AliError("wrong track found for ESD track index");
    2167             :       else {
    2168          39 :         UInt_t selectInfo = fTrackFilter ? fTrackFilter->IsSelected(esdTrkMatch) : 0;
    2169             : 
    2170          13 :         if (fUsedTrack[idx]) {
    2171          12 :           aodTrkMatch = (AliAODTrack*) (*fAODTrackRefs)[idx];
    2172          36 :           AliDebug(2, Form("event %lld: existing track (idx %i, pt = %f) matched to TRD track (idx %i, pt = %f), cut flags: 0x%08x",
    2173             :                            Entry(), idx, esdTrkMatch->Pt(), iTrdTrack, esdTrdTrk->Pt(),
    2174             :                            selectInfo));
    2175             :         } else {
    2176           1 :           if (selectInfo & fUsedTrackCopy[idx]) {
    2177             :             // mask filter bits already used in track copies
    2178           0 :             selectInfo &= ~fUsedTrackCopy[idx];
    2179           0 :             AliWarning(Form("event %lld: copied track (idx %i, pt = %f) matched to TRD track (idx %i, pt = %f), cut flags: 0x%08x -> 0x%08x",
    2180             :                             Entry(), idx, esdTrkMatch->Pt(), iTrdTrack, esdTrdTrk->Pt(),
    2181             :                             fTrackFilter->IsSelected(esdTrkMatch), selectInfo));
    2182           0 :           }
    2183           3 :           AliDebug(2, Form("event %lld: unused track (idx %i, pt = %f) matched to TRD track (idx %i, pt = %f), cut flags: 0x%08x -> 0x%08x",
    2184             :                            Entry(), idx, esdTrkMatch->Pt(), iTrdTrack, esdTrdTrk->Pt(),
    2185             :                            fTrackFilter->IsSelected(esdTrkMatch), selectInfo));
    2186             : 
    2187           1 :           Double_t mom[3]={0.};
    2188           1 :           Double_t pos[3]={0.};
    2189           1 :           Double_t covTr[21]={0.};
    2190             :           //      Double_t pid[10]={0.};
    2191             : 
    2192           1 :           esdTrkMatch->GetPxPyPz(mom);
    2193           1 :           esdTrkMatch->GetXYZ(pos);
    2194           1 :           esdTrkMatch->GetCovarianceXYZPxPyPz(covTr);
    2195             :           // esdTrkMatch->GetESDpid(pid);
    2196           1 :           const AliESDVertex* vtx = esd.GetPrimaryVertex();
    2197             : 
    2198           1 :           fUsedTrack[idx] = kTRUE;
    2199           2 :           if(fMChandler) fMChandler->SelectParticle(esdTrkMatch->GetLabel());
    2200             : 
    2201           3 :           aodTrkMatch = new(Tracks()[fNumberOfTracks++]) AliAODTrack(esdTrkMatch->GetID(),
    2202           1 :                                                                      esdTrkMatch->GetLabel(),
    2203             :                                                                      mom,
    2204             :                                                                      kTRUE,
    2205             :                                                                      pos,
    2206             :                                                                      kFALSE,
    2207             :                                                                      covTr,
    2208           2 :                                                                      (Short_t)esdTrkMatch->GetSign(),
    2209           1 :                                                                      esdTrkMatch->GetITSClusterMap(),
    2210             :                                                                      // pid,
    2211           1 :                                                                      fPrimaryVertex,
    2212             :                                                                      kTRUE,
    2213           2 :                                                                      vtx->UsesTrack(esdTrkMatch->GetID()),
    2214             :                                                                      AliAODTrack::kUndef,
    2215             :                                                                      selectInfo);
    2216           1 :           aodTrkMatch->SetITSSharedMap(esdTrkMatch->GetITSSharedMap());
    2217           1 :           aodTrkMatch->SetITSchi2(esdTrkMatch->GetITSchi2());               
    2218           1 :           aodTrkMatch->SetPIDForTracking(esdTrkMatch->GetPIDForTracking());
    2219           2 :           aodTrkMatch->SetTPCFitMap(esdTrkMatch->GetTPCFitMap());
    2220           2 :           aodTrkMatch->SetTPCClusterMap(esdTrkMatch->GetTPCClusterMap());
    2221           2 :           aodTrkMatch->SetTPCSharedMap (esdTrkMatch->GetTPCSharedMap());
    2222           1 :           aodTrkMatch->SetChi2perNDF(Chi2perNDF(esdTrkMatch));
    2223           1 :           aodTrkMatch->SetTPCPointsF(esdTrkMatch->GetTPCNclsF());
    2224           1 :           aodTrkMatch->SetTPCNCrossedRows(UShort_t(esdTrkMatch->GetTPCCrossedRows()));
    2225           1 :           aodTrkMatch->SetIntegratedLength(esdTrkMatch->GetIntegratedLength());
    2226           1 :           CopyCaloProps(esdTrkMatch,aodTrkMatch);
    2227           1 :           fAODTrackRefs->AddAt(aodTrkMatch,idx);
    2228           2 :           if (esdTrkMatch->GetSign() > 0) ++fNumberOfPositiveTracks;
    2229           1 :           aodTrkMatch->ConvertAliPIDtoAODPID();
    2230           1 :           aodTrkMatch->SetFlags(esdTrkMatch->GetStatus());
    2231           1 :         }
    2232             :       }
    2233          13 :     }
    2234        2319 :     aodTrdTrk.SetTrackMatchReference(aodTrkMatch);
    2235             :   }
    2236           8 : }
    2237             : 
    2238             : //______________________________________________________________________________
    2239             : void AliAnalysisTaskESDfilter::ConvertESDtoAOD() 
    2240             : {
    2241             :   // ESD Filter analysis task executed for each event
    2242             :   
    2243          32 :   AliESDEvent* esd = dynamic_cast<AliESDEvent*>(InputEvent());
    2244             :   
    2245           8 :   if(!esd)return;
    2246             : 
    2247           8 :   AliCodeTimerAuto("",0);
    2248             : 
    2249           8 :   if (fRefitVertexTracks>=0) AliESDUtils::RefitESDVertexTracks(esd,fRefitVertexTracks,
    2250           0 :                                                                fRefitVertexTracksNCuts ? fRefitVertexTracksCuts:0);
    2251             :   
    2252           8 :   fOldESDformat = ( esd->GetAliESDOld() != 0x0 );
    2253             :  
    2254             :       // Reconstruct cascades and V0 here
    2255           8 :   if (fIsV0CascadeRecoEnabled) {
    2256           0 :     esd->ResetCascades();
    2257           0 :     esd->ResetV0s();
    2258             : 
    2259           0 :     AliV0vertexer lV0vtxer;
    2260           0 :     AliCascadeVertexer lCascVtxer;
    2261             : 
    2262           0 :     lV0vtxer.SetCuts(fV0Cuts);
    2263           0 :     lCascVtxer.SetCuts(fCascadeCuts);
    2264             : 
    2265             : 
    2266           0 :     lV0vtxer.Tracks2V0vertices(esd);
    2267           0 :     lCascVtxer.V0sTracks2CascadeVertices(esd);
    2268           0 :   }
    2269             : 
    2270             :   // Perform progagation of tracks if needed
    2271           8 :   if (fDoPropagateTrackToEMCal) {
    2272           8 :     const Int_t ntrack = esd->GetNumberOfTracks();
    2273         300 :     for (Int_t i=0;i<ntrack;++i) {
    2274         142 :       AliESDtrack *t = esd->GetTrack(i);
    2275         142 :       AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(t,fEMCalSurfaceDistance);
    2276             :     }
    2277           8 :   }
    2278             :  
    2279           8 :   fNumberOfTracks = 0;
    2280           8 :   fNumberOfPositiveTracks = 0;
    2281           8 :   fNumberOfV0s = 0;
    2282           8 :   fNumberOfVertices = 0;
    2283           8 :   fNumberOfCascades = 0;
    2284           8 :   fNumberOfKinks = 0;
    2285             :     
    2286           8 :   AliAODHeader* header = ConvertHeader(*esd);
    2287             : 
    2288          16 :   if ( fIsVZEROEnabled ) ConvertVZERO(*esd);
    2289          16 :   if ( fIsTZEROEnabled ) ConvertTZERO(*esd);
    2290             :   
    2291             :   // Fetch Stack for debuggging if available 
    2292           8 :   fMChandler=0x0;
    2293          16 :   if(MCEvent()) {
    2294           4 :     fMChandler = (AliMCEventHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetMCtruthEventHandler()); 
    2295           4 :   }
    2296             :   
    2297             :   // loop over events and fill them
    2298             :   // Multiplicity information needed by the header (to be revised!)
    2299           8 :   Int_t nTracks    = esd->GetNumberOfTracks();
    2300             : 
    2301             : // The line below should not be needed anymore (tracks already connected)
    2302             : //  for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) esd->GetTrack(iTrack)->SetESDEvent(esd);
    2303             : 
    2304             :   // Update the header
    2305           8 :   Int_t nV0s      = esd->GetNumberOfV0s();
    2306           8 :   Int_t nCascades = esd->GetNumberOfCascades();
    2307           8 :   Int_t nKinks    = esd->GetNumberOfKinks();
    2308           8 :   Int_t nVertices = nV0s + nCascades /*V0 wihtin cascade already counted*/+ nKinks + 1 /* = prim. vtx*/;
    2309          16 :   Int_t nPileSPDVertices=1+esd->GetNumberOfPileupVerticesSPD(); // also SPD main vertex
    2310           8 :   Int_t nPileTrkVertices=esd->GetNumberOfPileupVerticesTracks();
    2311           8 :   nVertices+=nPileSPDVertices;
    2312           8 :   nVertices+=nPileTrkVertices;
    2313             :   Int_t nJets     = 0;
    2314           8 :   Int_t nCaloClus = esd->GetNumberOfCaloClusters();
    2315             :   Int_t nFmdClus  = 0;
    2316           8 :   Int_t nPmdClus  = esd->GetNumberOfPmdTracks();
    2317             :   Int_t nHmpidRings = 0;  
    2318             :     
    2319          40 :   AliDebug(1,Form("   NV0=%d  NCASCADES=%d  NKINKS=%d", nV0s, nCascades, nKinks));
    2320             :        
    2321          16 :   AODEvent()->ResetStd(nTracks, nVertices, nV0s, nCascades, nJets, nCaloClus, nFmdClus, nPmdClus, nHmpidRings);
    2322             : 
    2323           8 :   if (nV0s > 0) {
    2324             :     // RefArray to store a mapping between esd V0 number and newly created AOD-Vertex V0
    2325          24 :     fAODV0VtxRefs = new TRefArray(nV0s);
    2326             :     // RefArray to store the mapping between esd V0 number and newly created AOD-V0
    2327          24 :     fAODV0Refs = new TRefArray(nV0s); 
    2328             :     // Array to take into account the V0s already added to the AOD (V0 within cascades)
    2329          16 :     fUsedV0 = new Bool_t[nV0s];
    2330          68 :     for (Int_t iV0=0; iV0<nV0s; ++iV0) fUsedV0[iV0]=kFALSE;
    2331           8 :   }
    2332             :   
    2333           8 :   if (nTracks>0) {
    2334             :     // RefArray to store the mapping between esd track number and newly created AOD-Track
    2335             :     
    2336          24 :     fAODTrackRefs = new TRefArray(nTracks);
    2337             : 
    2338             :     // Array to take into account the tracks already added to the AOD    
    2339          16 :     fUsedTrack = new Bool_t[nTracks];
    2340          16 :     fUsedTrackCopy = new UInt_t[nTracks];
    2341         300 :     for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) {
    2342         142 :       fUsedTrack[iTrack]=kFALSE;
    2343         142 :       fUsedTrackCopy[iTrack] = 0;
    2344             :     }
    2345           8 :   }
    2346             :   
    2347             :   // Array to take into account the kinks already added to the AOD
    2348           8 :   if (nKinks>0) {
    2349           8 :     fUsedKink = new Bool_t[nKinks];
    2350          16 :     for (Int_t iKink=0; iKink<nKinks; ++iKink) fUsedKink[iKink]=kFALSE;
    2351           4 :   }
    2352             :     
    2353           8 :   ConvertPrimaryVertices(*esd);
    2354             : 
    2355             :   //setting best TOF PID
    2356          24 :   AliESDInputHandler* esdH = dynamic_cast<AliESDInputHandler*>(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
    2357           8 :   if (esdH)
    2358           8 :     fESDpid = esdH->GetESDpid();
    2359             : 
    2360          14 :   if (fIsPidOwner && fESDpid) {
    2361           0 :     delete fESDpid;
    2362           0 :     fESDpid = 0;
    2363           0 :   }
    2364           8 :   if (!fESDpid) { //in case of no Tender attached 
    2365          24 :     fESDpid = new AliESDpid;
    2366           8 :     fIsPidOwner = kTRUE;
    2367           8 :   }
    2368             :   
    2369          16 :   if (!esd->GetTOFHeader()) { //protection in case the pass2 LHC10b,c,d have been processed without tender. 
    2370           0 :     Float_t t0spread[10];
    2371             :     Float_t intrinsicTOFres=100; //ps ok for LHC10b,c,d pass2!! 
    2372           0 :     for (Int_t i=0; i<10; i++) t0spread[i] = (TMath::Sqrt(esd->GetSigma2DiamondZ()))/0.03; //0.03 to convert from cm to ps
    2373           0 :     fESDpid->GetTOFResponse().SetT0resolution(t0spread);
    2374           0 :     fESDpid->GetTOFResponse().SetTimeResolution(intrinsicTOFres);
    2375             :     //    fESDpid->SetTOFResponse(esd, (AliESDpid::EStartTimeType_t)fTimeZeroType);    
    2376           0 :     AliTOFHeader tmpTOFHeader(0,t0spread[0],0,NULL,NULL,NULL,intrinsicTOFres,t0spread[0]);   
    2377           0 :     AODEvent()->SetTOFHeader(&tmpTOFHeader);         // write dummy TOF header in AOD
    2378           0 :   } else {
    2379          24 :     AODEvent()->SetTOFHeader(esd->GetTOFHeader());    // write TOF header in AOD
    2380             :   }
    2381             :   
    2382             :   // In case of AOD production strating form LHC10e without Tender. 
    2383             :   //if(esd->GetTOFHeader() && fIsPidOwner) fESDpid->SetTOFResponse(esd, (AliESDpid::EStartTimeType_t)fTimeZeroType); 
    2384             :   
    2385          16 :   if (fAreCascadesEnabled) ConvertCascades(*esd);
    2386          16 :   if (fAreV0sEnabled) ConvertV0s(*esd);
    2387          16 :   if (fAreKinksEnabled) ConvertKinks(*esd);
    2388          16 :   if (fAreTracksEnabled) ConvertTracks(*esd);
    2389             :   
    2390             :   // Update number of AOD tracks in header at the end of track loop (M.G.)
    2391           8 :   header->SetRefMultiplicity(fNumberOfTracks);
    2392           8 :   header->SetRefMultiplicityPos(fNumberOfPositiveTracks);
    2393           8 :   header->SetRefMultiplicityNeg(fNumberOfTracks - fNumberOfPositiveTracks);
    2394             : 
    2395           8 :   if (fTPCConstrainedFilterMask) ConvertTPCOnlyTracks(*esd);
    2396           8 :   if (fGlobalConstrainedFilterMask) ConvertGlobalConstrainedTracks(*esd);  
    2397          16 :   if (fArePmdClustersEnabled) ConvertPmdClusters(*esd);
    2398          16 :   if (fAreCaloClustersEnabled) ConvertCaloClusters(*esd);
    2399          16 :   if (fAreEMCALCellsEnabled) ConvertEMCALCells(*esd);
    2400          16 :   if (fArePHOSCellsEnabled) ConvertPHOSCells(*esd);
    2401          32 :   if (fAreEMCALTriggerEnabled) ConvertCaloTrigger(TString("EMCAL"), *esd);
    2402          32 :   if (fArePHOSTriggerEnabled) ConvertCaloTrigger(TString("PHOS"), *esd);
    2403          16 :   if (fAreTrackletsEnabled) ConvertTracklets(*esd);
    2404          16 :   if (fIsZDCEnabled) ConvertZDC(*esd);
    2405          16 :   if (fIsADEnabled) ConvertAD(*esd);
    2406          24 :   if (fIsHMPIDEnabled) nHmpidRings = ConvertHMPID(*esd); 
    2407          16 :   if (fIsTRDEnabled) ConvertTRD(*esd);
    2408             : 
    2409          24 :   delete fAODTrackRefs; fAODTrackRefs=0x0;
    2410          24 :   delete fAODV0VtxRefs; fAODV0VtxRefs=0x0;
    2411          24 :   delete fAODV0Refs; fAODV0Refs=0x0;
    2412          24 :   delete[] fUsedTrack; fUsedTrack=0x0;
    2413          24 :   delete[] fUsedTrackCopy; fUsedTrackCopy=0x0;
    2414          24 :   delete[] fUsedV0; fUsedV0=0x0;
    2415          20 :   delete[] fUsedKink; fUsedKink=0x0;
    2416             : 
    2417           8 :   if (fIsPidOwner) {
    2418          16 :     delete fESDpid;
    2419           8 :     fESDpid = 0x0;
    2420           8 :   }
    2421          16 :   AODEvent()->ConnectTracks();
    2422          16 : }
    2423             : 
    2424             : //______________________________________________________________________________
    2425             : void AliAnalysisTaskESDfilter::SetAODPID(AliESDtrack *esdtrack, AliAODTrack *aodtrack, AliAODPid *detpid)
    2426             : {
    2427             :   //
    2428             :   // Setter for the raw PID detector signals
    2429             :   //
    2430             : 
    2431             :   // Save PID object for candidate electrons
    2432             :   Bool_t pidSave = kFALSE;
    2433         240 :   if (fTrackFilter) {
    2434         120 :     Bool_t selectInfo = fTrackFilter->IsSelected((char*) "Electrons");
    2435         120 :     if (selectInfo)  pidSave = kTRUE;
    2436         120 :   }
    2437             : 
    2438             :   // Tracks passing pt cut 
    2439         120 :   if(esdtrack->Pt()>fHighPthreshold) {
    2440             :     pidSave = kTRUE;
    2441         120 :   } else {
    2442           0 :     if(fPtshape){
    2443           0 :       if(esdtrack->Pt()> fPtshape->GetXmin()){
    2444           0 :         Double_t y = fPtshape->Eval(esdtrack->Pt())/fPtshape->Eval(fHighPthreshold);
    2445           0 :         if(gRandom->Rndm(0)<1./y){
    2446             :           pidSave = kTRUE;
    2447           0 :         }//end rndm
    2448           0 :       }//end if p < pmin
    2449             :     }//end if p function
    2450             :   }// end else
    2451             : 
    2452         120 :   if (pidSave) {
    2453         120 :     if(!aodtrack->GetDetPid()){// prevent memory leak when calling SetAODPID twice for the same track
    2454         120 :       detpid = new AliAODPid();
    2455         120 :       SetDetectorRawSignals(detpid,esdtrack);
    2456         120 :       aodtrack->SetDetPID(detpid);
    2457         120 :     }
    2458             :   }
    2459         120 : }
    2460             : 
    2461             : //______________________________________________________________________________
    2462             : void AliAnalysisTaskESDfilter::SetDetectorRawSignals(AliAODPid *aodpid, AliESDtrack *track)
    2463             : {
    2464             :   // Assignment of the detector signals (AliXXXesdPID inspired)
    2465             : 
    2466         240 :   if(!track) {
    2467           0 :     AliInfo("no ESD track found. .....exiting");
    2468           0 :     return;
    2469             :   }
    2470             : 
    2471             :   // TPC momentum
    2472         120 :   aodpid->SetTPCmomentum(track->GetTPCmomentum());
    2473         120 :   aodpid->SetTPCTgl(track->GetTPCTgl());
    2474         120 :   aodpid->SetITSsignal(track->GetITSsignal());
    2475         120 :   Double_t itsdedx[4]; // dE/dx samples for individual ITS layers
    2476         120 :   track->GetITSdEdxSamples(itsdedx);
    2477         120 :   aodpid->SetITSdEdxSamples(itsdedx);
    2478             :   
    2479         120 :   aodpid->SetTPCsignal(track->GetTPCsignal());
    2480         120 :   aodpid->SetTPCsignalN(track->GetTPCsignalN());
    2481         224 :   if (track->GetTPCdEdxInfo()) aodpid->SetTPCdEdxInfo(track->GetTPCdEdxInfo());
    2482             : 
    2483             :   //n TRD planes = 6
    2484         120 :   Int_t nslices = track->GetNumberOfTRDslices()*6;
    2485         120 :   TArrayD trdslices(nslices);
    2486        2712 :   for(Int_t iSl =0; iSl < track->GetNumberOfTRDslices(); iSl++) {
    2487       25088 :     for(Int_t iPl =0; iPl<6; iPl++) trdslices[iPl*track->GetNumberOfTRDslices()+iSl] = track->GetTRDslice(iPl,iSl);
    2488             :   }
    2489             :  
    2490             :   //TRD momentum
    2491        1680 :   for(Int_t iPl=0;iPl<6;iPl++){
    2492         720 :     Double_t trdmom=track->GetTRDmomentum(iPl);
    2493         720 :     aodpid->SetTRDmomentum(iPl,trdmom);
    2494             :   }
    2495             : 
    2496         240 :   aodpid->SetTRDslices(track->GetNumberOfTRDslices()*6,trdslices.GetArray());
    2497         240 :   aodpid->SetTRDsignal(track->GetTRDsignal());
    2498             : 
    2499             :   //TRD clusters and tracklets
    2500         240 :   aodpid->SetTRDncls(track->GetTRDncls());
    2501         240 :   aodpid->SetTRDntrackletsPID(track->GetTRDntrackletsPID());
    2502             :   
    2503         240 :   aodpid->SetTRDChi2(track->GetTRDchi2());
    2504             : 
    2505             :   //TOF PID  
    2506         120 :   Double_t times[AliPID::kSPECIESC]; track->GetIntegratedTimes(times,AliPID::kSPECIESC);
    2507         120 :   aodpid->SetIntegratedTimes(times);
    2508             : 
    2509             :   //  Float_t tzeroTrack = fESDpid->GetTOFResponse().GetStartTime(track->P());
    2510             :   //  aodpid->SetTOFsignal(track->GetTOFsignal()-tzeroTrack);
    2511         240 :   aodpid->SetTOFsignal(track->GetTOFsignal());
    2512             :   
    2513         120 :   Double_t tofRes[5];
    2514        1440 :   for (Int_t iMass=0; iMass<5; iMass++){
    2515             :     //    tofRes[iMass]=(Double_t)fESDpid->GetTOFResponse().GetExpectedSigma(track->P(), times[iMass], AliPID::ParticleMass(iMass));
    2516         600 :     tofRes[iMass]=0; //backward compatibility
    2517             :   }
    2518         120 :   aodpid->SetTOFpidResolution(tofRes);
    2519             :   //aodpid->SetHMPIDsignal(0); // set to zero for compression but it will be removed later
    2520         240 : }
    2521             : 
    2522             : Double_t AliAnalysisTaskESDfilter::Chi2perNDF(AliESDtrack* track)
    2523             : {
    2524             :   // Calculate chi2 per ndf for track
    2525             : 
    2526         238 :   Int_t  nClustersTPC = track->GetTPCNcls();
    2527         119 :   if ( nClustersTPC > 5) {
    2528         103 :     return (track->GetTPCchi2()/Float_t(nClustersTPC - 5));
    2529             :   } else {
    2530          16 :     return (-1.);
    2531             :   }
    2532         119 : }
    2533             : 
    2534             : //______________________________________________________________________________
    2535             : void AliAnalysisTaskESDfilter::Terminate(Option_t */*option*/)
    2536             : {
    2537             :   // Terminate analysis
    2538             : 
    2539           4 :   if (fDebug > 1) printf("AnalysisESDfilter: Terminate() \n");
    2540           2 : }
    2541             : 
    2542             : //______________________________________________________________________________
    2543             : void  AliAnalysisTaskESDfilter::PrintMCInfo(AliStack *pStack,Int_t label)
    2544             : {
    2545             :   // Print MC info
    2546           0 :   if (!pStack) return;
    2547           0 :   label = TMath::Abs(label);
    2548           0 :   TParticle *part = pStack->Particle(label);
    2549           0 :   Printf("########################");
    2550           0 :   Printf("%s:%d %d UniqueID %d PDG %d P %3.3f",(char*)__FILE__,__LINE__,label,part->GetUniqueID(),part->GetPdgCode(),part->P());
    2551           0 :   part->Print();
    2552             :   TParticle* mother = part;
    2553           0 :   Int_t imo = part->GetFirstMother();
    2554           0 :   Int_t nprim = pStack->GetNprimary();
    2555             :   //  while((imo >= nprim) && (mother->GetUniqueID() == 4)) {
    2556           0 :   while((imo >= nprim)) {
    2557           0 :     mother =  pStack->Particle(imo);
    2558           0 :     Printf("Mother %s:%d Label %d UniqueID %d PDG %d P %3.3f",(char*)__FILE__,__LINE__,imo,mother->GetUniqueID(),mother->GetPdgCode(),mother->P());
    2559           0 :     mother->Print();
    2560           0 :     imo =  mother->GetFirstMother();
    2561             :   }
    2562           0 :   Printf("########################");
    2563           0 : }
    2564             : 
    2565             : //______________________________________________________________________________
    2566             : void  AliAnalysisTaskESDfilter::CopyCaloProps(AliESDtrack *tre, AliAODTrack *tra) 
    2567             : {
    2568             :   // Copy calo properties from ESD track to AOD track
    2569         242 :   tra->SetTrackPhiEtaPtOnEMCal(tre->GetTrackPhiOnEMCal(),tre->GetTrackEtaOnEMCal(),tre->GetTrackPtOnEMCal());
    2570         139 :   if (tre->IsEMCAL()) tra->SetEMCALcluster(tre->GetEMCALcluster());
    2571         125 :   if (tre->IsPHOS())  tra->SetPHOScluster(tre->GetPHOScluster());
    2572         121 : }
    2573             : 
    2574             : //______________________________________________________________________________
    2575             : void AliAnalysisTaskESDfilter::SetRefitVertexTracks(Int_t algo, Double_t* cuts)
    2576             : {
    2577             :   // request vertexTrack reprocessing from ESDtracks
    2578             :   // if algo>=0 and cuts==0 then algo is interpreted as the algorithm ID to be run with default cuts
    2579             :   // otherwise it is number of cuts to digest
    2580           0 :   fRefitVertexTracks = algo;
    2581           0 :   if (algo>0 && cuts) {
    2582           0 :     fRefitVertexTracksCuts = new Double_t[fRefitVertexTracks];
    2583           0 :     for (int i=fRefitVertexTracks;i--;) fRefitVertexTracksCuts[i] = cuts[i];
    2584           0 :     fRefitVertexTracksNCuts = fRefitVertexTracks;
    2585           0 :   }
    2586           0 : }
    2587             : 
    2588             : //______________________________________________________________________________
    2589             : void AliAnalysisTaskESDfilter::SetMuonCaloPass()
    2590             : {
    2591             :   /// For a MuonCalo pass, due to the absence of TPC, TRD, TOF and PMD
    2592             :   /// a bunch of things can be disabled for sure.
    2593             :   
    2594           0 :   fIsMuonCaloPass = kTRUE;
    2595             : 
    2596           0 :   DisableCascades();
    2597           0 :   DisableKinks();
    2598           0 :   DisableV0s();
    2599           0 :   DisablePmdClusters();
    2600           0 :   SetPropagateTrackToEMCal(kFALSE);
    2601           0 : }

Generated by: LCOV version 1.11