ROOT logo
#ifndef ALIAODNUCLEXREPLICATOR_H
#define ALIAODNUCLEXREPLICATOR_H

/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
* See cxx source for full Copyright notice                               */

#ifndef ALIDAODBRANCHREPLICATOR_H
#  include "AliAODBranchReplicator.h"
#endif
#ifndef ROOT_TExMap
#  include "TExMap.h"
#endif


//
// Implementation of a branch replicator 
// to produce aods with only few branches.
//
// Authors: S. Bufalino (stefania.bufalino@cern.ch)
//          R. Lea      (ramona.lea@cern.ch)
//         
// Based on AliAODMuonReplicator.h (L. Aphecetche (Subatech))

//class AliAnalysisCuts;
class TClonesArray;
class AliAODMCHeader;
class AliAODVZERO;
class AliAODTZERO;
class AliPIDResponse;
class AliESDv0;
class TArrayI;
class AliAODv0;  
class TRefArray;
class AliAODRecoDecay;
class AliAODRecoDecayLF;
class AliAODRecoDecayLF2Prong;
class AliVertexerTracks;
class AliAODHeader;

class AliESDVertex;
class AliESDtrack;
class AliVEvent;
class AliAODVertex;
class AliVertexerTracks;
class AliESDv0; 
class AliAODv0; 

class TH1F;

// TODO add new constructor for the 3 prong case (it will write an AliAODRecoDecayLF3Prong

class AliAODNuclExReplicator : public AliAODBranchReplicator
{
 public:
  
  AliAODNuclExReplicator(const char* name="AliAODNuclExReplicator", 
			 const char* title="Branch Replicator for muon related branches",
			 /* AliAnalysisCuts* trackCut=0x0, */
			 /* AliAnalysisCuts* vertexCut=0x0, */
			 Int_t mcMode=0,
			 Int_t nsigmaTrk1=3, Int_t partType1 = 2,
			 Int_t nsigmaTrk2=3, Int_t partType2 = 7
			 ); 
  //  Int_t partType; // 0 = e; 1 = mu; 2 = pi; 3 = K; 4= p; 5 = d; 6 =t ; 7 = 3He; 8=4He;

  virtual ~AliAODNuclExReplicator();
  
  virtual TList* GetList() const;
  
  virtual void ReplicateAndFilter(const AliAODEvent& source);	
  
  virtual void Terminate();

 private:

  // TO DO : Implemet MC
  // void FilterMC(const AliAODEvent& source);
  void SelectParticle(Int_t i);
  Bool_t IsParticleSelected(Int_t i);
  void CreateLabelMap(const AliAODEvent& source);
  Int_t GetNewLabel(Int_t i);
 

  Double_t fBzkG;     // z componenent of field in kG

  Double_t fCosMin       ;
  Double_t fDCAtracksMin ;
  Double_t fRmax         ;
  Double_t fRmin         ;
  Double_t fDNmin        ;
  Double_t fDPmin        ;

 private:
  
  mutable AliAODHeader* fHeader; //! internal header object
  
  //  AliAnalysisCuts* fVertexCut; // decides which vertices to keep
  mutable TClonesArray* fVertices; //! internal array of vertices
  
  mutable TClonesArray* fNuclei; //! internal array of nuclei tracks
  
  //  AliAnalysisCuts* fTrackCut; // decides which tracks to keep
  mutable TClonesArray* fSecondaryVerices; //! internal array of secondary vertices canditates
   
  mutable TClonesArray* fDaughterTracks; //! internal SV daughter tracks



  mutable TList* fList; //! internal list of managed objects (fVertices and fTracks)
  
  mutable TClonesArray* fMCParticles; //! internal array of MC particles
  mutable AliAODMCHeader* fMCHeader; //! internal array of MC header
  Int_t fMCMode; // MC filtering switch (0=none=no mc information,1=normal=simple copy,>=2=aggressive=filter out)

  TExMap fLabelMap; //! for MC label remapping (in case of aggressive filtering)
  TExMap fParticleSelected; //! List of selected MC particles

  Bool_t fReplicateHeader; //! whether or not the replicate the AOD Header

  Int_t fnSigmaTrk1;
  Int_t fnSigmaTrk2;
  Int_t fpartType1;
  Int_t fpartType2;

			

  Bool_t fSecVtxWithKF; // if kTRUE use KF vertexer, else AliVertexerTracks
  AliVertexerTracks* fVertexerTracks; // vertexer, to compute secondary vertices
  AliESDVertex *fV1;   // primary vertex
  
  Int_t fAODMapSize;  // size of fAODMap 
  Int_t *fAODMap;     //[fAODMapSize] map between index and ID for AOD tracks
  
  AliAODVertex* ReconstructSecondaryVertex(TObjArray *trkArray,Double_t &dispersion,Bool_t useTRefArray=kTRUE) const;
  
  AliAODRecoDecayLF2Prong* Make2Prong(TObjArray *twoTrackArray,const AliAODEvent &evento,
  				      AliAODVertex *secVert,Double_t dca);

  /* AliAODRecoDecayLF2Prong* Make2Prong(TObjArray *twoTrackArray,AliAODEvent *evento, */
  /* 				      AliAODVertex *secVert,Double_t dca); */
  

  void AddDaughterRefs(AliAODVertex *v, const AliAODEvent &event, const TObjArray *trkArray) const;
  /* void AddDaughterRefs(AliAODVertex *v, AliAODEvent *event, const TObjArray *trkArray) const; */
  void AddRefs(AliAODVertex *v,AliAODRecoDecayLF *rd, const AliAODEvent &event, const TObjArray *trkArray) const;
  /* void AddRefs(AliAODVertex *v,AliAODRecoDecayLF *rd, AliAODEvent *event, const TObjArray *trkArray) const; */

 private:

  //  AliPIDResponse  *fPIDResponse;                  //! PID response object
  
  AliAODNuclExReplicator(const AliAODNuclExReplicator&);
  AliAODNuclExReplicator& operator=(const AliAODNuclExReplicator&);
  
  ClassDef(AliAODNuclExReplicator,5) // Branch replicator for ESD to muon AOD.
    };

#endif
 AliAODNuclExReplicator.h:1
 AliAODNuclExReplicator.h:2
 AliAODNuclExReplicator.h:3
 AliAODNuclExReplicator.h:4
 AliAODNuclExReplicator.h:5
 AliAODNuclExReplicator.h:6
 AliAODNuclExReplicator.h:7
 AliAODNuclExReplicator.h:8
 AliAODNuclExReplicator.h:9
 AliAODNuclExReplicator.h:10
 AliAODNuclExReplicator.h:11
 AliAODNuclExReplicator.h:12
 AliAODNuclExReplicator.h:13
 AliAODNuclExReplicator.h:14
 AliAODNuclExReplicator.h:15
 AliAODNuclExReplicator.h:16
 AliAODNuclExReplicator.h:17
 AliAODNuclExReplicator.h:18
 AliAODNuclExReplicator.h:19
 AliAODNuclExReplicator.h:20
 AliAODNuclExReplicator.h:21
 AliAODNuclExReplicator.h:22
 AliAODNuclExReplicator.h:23
 AliAODNuclExReplicator.h:24
 AliAODNuclExReplicator.h:25
 AliAODNuclExReplicator.h:26
 AliAODNuclExReplicator.h:27
 AliAODNuclExReplicator.h:28
 AliAODNuclExReplicator.h:29
 AliAODNuclExReplicator.h:30
 AliAODNuclExReplicator.h:31
 AliAODNuclExReplicator.h:32
 AliAODNuclExReplicator.h:33
 AliAODNuclExReplicator.h:34
 AliAODNuclExReplicator.h:35
 AliAODNuclExReplicator.h:36
 AliAODNuclExReplicator.h:37
 AliAODNuclExReplicator.h:38
 AliAODNuclExReplicator.h:39
 AliAODNuclExReplicator.h:40
 AliAODNuclExReplicator.h:41
 AliAODNuclExReplicator.h:42
 AliAODNuclExReplicator.h:43
 AliAODNuclExReplicator.h:44
 AliAODNuclExReplicator.h:45
 AliAODNuclExReplicator.h:46
 AliAODNuclExReplicator.h:47
 AliAODNuclExReplicator.h:48
 AliAODNuclExReplicator.h:49
 AliAODNuclExReplicator.h:50
 AliAODNuclExReplicator.h:51
 AliAODNuclExReplicator.h:52
 AliAODNuclExReplicator.h:53
 AliAODNuclExReplicator.h:54
 AliAODNuclExReplicator.h:55
 AliAODNuclExReplicator.h:56
 AliAODNuclExReplicator.h:57
 AliAODNuclExReplicator.h:58
 AliAODNuclExReplicator.h:59
 AliAODNuclExReplicator.h:60
 AliAODNuclExReplicator.h:61
 AliAODNuclExReplicator.h:62
 AliAODNuclExReplicator.h:63
 AliAODNuclExReplicator.h:64
 AliAODNuclExReplicator.h:65
 AliAODNuclExReplicator.h:66
 AliAODNuclExReplicator.h:67
 AliAODNuclExReplicator.h:68
 AliAODNuclExReplicator.h:69
 AliAODNuclExReplicator.h:70
 AliAODNuclExReplicator.h:71
 AliAODNuclExReplicator.h:72
 AliAODNuclExReplicator.h:73
 AliAODNuclExReplicator.h:74
 AliAODNuclExReplicator.h:75
 AliAODNuclExReplicator.h:76
 AliAODNuclExReplicator.h:77
 AliAODNuclExReplicator.h:78
 AliAODNuclExReplicator.h:79
 AliAODNuclExReplicator.h:80
 AliAODNuclExReplicator.h:81
 AliAODNuclExReplicator.h:82
 AliAODNuclExReplicator.h:83
 AliAODNuclExReplicator.h:84
 AliAODNuclExReplicator.h:85
 AliAODNuclExReplicator.h:86
 AliAODNuclExReplicator.h:87
 AliAODNuclExReplicator.h:88
 AliAODNuclExReplicator.h:89
 AliAODNuclExReplicator.h:90
 AliAODNuclExReplicator.h:91
 AliAODNuclExReplicator.h:92
 AliAODNuclExReplicator.h:93
 AliAODNuclExReplicator.h:94
 AliAODNuclExReplicator.h:95
 AliAODNuclExReplicator.h:96
 AliAODNuclExReplicator.h:97
 AliAODNuclExReplicator.h:98
 AliAODNuclExReplicator.h:99
 AliAODNuclExReplicator.h:100
 AliAODNuclExReplicator.h:101
 AliAODNuclExReplicator.h:102
 AliAODNuclExReplicator.h:103
 AliAODNuclExReplicator.h:104
 AliAODNuclExReplicator.h:105
 AliAODNuclExReplicator.h:106
 AliAODNuclExReplicator.h:107
 AliAODNuclExReplicator.h:108
 AliAODNuclExReplicator.h:109
 AliAODNuclExReplicator.h:110
 AliAODNuclExReplicator.h:111
 AliAODNuclExReplicator.h:112
 AliAODNuclExReplicator.h:113
 AliAODNuclExReplicator.h:114
 AliAODNuclExReplicator.h:115
 AliAODNuclExReplicator.h:116
 AliAODNuclExReplicator.h:117
 AliAODNuclExReplicator.h:118
 AliAODNuclExReplicator.h:119
 AliAODNuclExReplicator.h:120
 AliAODNuclExReplicator.h:121
 AliAODNuclExReplicator.h:122
 AliAODNuclExReplicator.h:123
 AliAODNuclExReplicator.h:124
 AliAODNuclExReplicator.h:125
 AliAODNuclExReplicator.h:126
 AliAODNuclExReplicator.h:127
 AliAODNuclExReplicator.h:128
 AliAODNuclExReplicator.h:129
 AliAODNuclExReplicator.h:130
 AliAODNuclExReplicator.h:131
 AliAODNuclExReplicator.h:132
 AliAODNuclExReplicator.h:133
 AliAODNuclExReplicator.h:134
 AliAODNuclExReplicator.h:135
 AliAODNuclExReplicator.h:136
 AliAODNuclExReplicator.h:137
 AliAODNuclExReplicator.h:138
 AliAODNuclExReplicator.h:139
 AliAODNuclExReplicator.h:140
 AliAODNuclExReplicator.h:141
 AliAODNuclExReplicator.h:142
 AliAODNuclExReplicator.h:143
 AliAODNuclExReplicator.h:144
 AliAODNuclExReplicator.h:145
 AliAODNuclExReplicator.h:146
 AliAODNuclExReplicator.h:147
 AliAODNuclExReplicator.h:148
 AliAODNuclExReplicator.h:149
 AliAODNuclExReplicator.h:150
 AliAODNuclExReplicator.h:151
 AliAODNuclExReplicator.h:152
 AliAODNuclExReplicator.h:153
 AliAODNuclExReplicator.h:154
 AliAODNuclExReplicator.h:155
 AliAODNuclExReplicator.h:156
 AliAODNuclExReplicator.h:157
 AliAODNuclExReplicator.h:158