ROOT logo
#ifndef ALIAODMCNUCLEXREPLICATOR_H
#define ALIAODMCNUCLEXREPLICATOR_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 AliAODMCNuclExReplicator : public AliAODBranchReplicator
{
 public:
  
  AliAODMCNuclExReplicator(const char* name="AliAODMCNuclExReplicator", 
			 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 ~AliAODMCNuclExReplicator();
  
  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
  
  AliAODMCNuclExReplicator(const AliAODMCNuclExReplicator&);
  AliAODMCNuclExReplicator& operator=(const AliAODMCNuclExReplicator&);
  
  ClassDef(AliAODMCNuclExReplicator,5) // Branch replicator for ESD to muon AOD.
    };

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