//
// author: Oliver Maria Kind <mailto: kind@mail.desy.de>
// Update: $Id: AtlEvent.h,v 1.178 2017/05/31 11:12:00 kind Exp $
// Copyright: 2008 (C) Oliver Maria Kind
//
#ifndef ATLAS_AtlEvent
#define ATLAS_AtlEvent
#ifndef HEP_HepEvent
#include <HepEvent.h>
#endif
#ifndef HEP_HepVertex
#include <HepVertex.h>
#endif
#ifndef ATLAS_AtlEventHeader
#include <AtlEventHeader.h>
#endif
#ifndef ATLAS_AtlJet
#include <AtlJet.h>
#endif
#ifndef ATLAS_AtlMCJet
#include <AtlMCJet.h>
#endif
#ifndef ATLAS_AtlIDTrack
#include <AtlIDTrack.h>
#endif
#ifndef ATLAS_AtlTrigger
#include <AtlTrigger.h>
#endif
#ifndef ATLAS_AtlTriggerMatch
#include <AtlTriggerMatch.h>
#endif
#ifndef ATLAS_AtlEnergySum
#include <AtlEnergySum.h>
#endif
#ifndef HEP_HepMCParticle
#include <HepMCParticle.h>
#endif
#ifndef HEP_HepMCVertex
#include <HepMCVertex.h>
#endif
#ifndef ATLAS_AtlPixelHit
#include "AtlPixelHit.h"
#endif
#ifndef ATLAS_AtlSCT3DHit
#include "AtlSCT3DHit.h"
#endif
#ifndef ATLAS_AtlElectron
#include <AtlElectron.h>
#endif
#ifndef ATLAS_AtlMuon
#include <AtlMuon.h>
#endif
#ifndef ATLAS_AtlTau
#include <AtlTau.h>
#endif
#ifndef ATLAS_AtlPhoton
#include <AtlPhoton.h>
#endif
#ifndef ATLAS_AtlFastElectron
#include <AtlFastElectron.h>
#endif
#ifndef ATLAS_AtlFastMuon
#include <AtlFastMuon.h>
#endif
#ifndef ATLAS_AtlFastTau
#include <AtlFastTau.h>
#endif
#ifndef ATLAS_AtlFastPhoton
#include <AtlFastPhoton.h>
#endif
#ifndef ATLAS_AtlFastJet
#include <AtlFastJet.h>
#endif
#ifndef ATLAS_AtlTopPair
#include <AtlTopPair.h>
#endif
#ifndef HEP_HepTopDecay
#include <HepTopDecay.h>
#endif
#ifndef ATLAS_AtlWDecayLNu
#include <AtlWDecayLNu.h>
#endif
#ifndef ATLAS_AtlWDecayJJ
#include <AtlWDecayJJ.h>
#endif
#ifndef ATLAS_AtlZ0DecayEE
#include <AtlZ0DecayEE.h>
#endif
#ifndef ATLAS_AtlZ0DecayMuMu
#include <AtlZ0DecayMuMu.h>
#endif
#ifndef ATLAS_AtlZ0DecayTauTau
#include <AtlZ0DecayTauTau.h>
#endif
#ifndef ATLAS_AtlZ0DecayJJ
#include <AtlZ0DecayJJ.h>
#endif
#ifndef ATLAS_AtlK0sDecayPiPi
#include <AtlK0sDecayPiPi.h>
#endif
#ifndef ATLAS_AtlPhotonConv
#include <AtlPhotonConv.h>
#endif
#ifndef ATLAS_AtlLambdaDecayPPi
#include <AtlLambdaDecayPPi.h>
#endif
#ifndef ATLAS_AtlD0DecayKPi
#include <AtlD0DecayKPi.h>
#endif
#ifndef ATLAS_AtlDstarDecayDPi
#include <AtlDstarDecayDPi.h>
#endif
#ifndef ATLAS_AtlPhiDecayKK
#include <AtlPhiDecayKK.h>
#endif
#ifndef ATLAS_AtlTriggerItem
#include <AtlTriggerItem.h>
#endif
#ifndef HEP_HepDriftChamberDigit
#include <HepDriftChamberDigit.h>
#endif
#ifndef ROOT_TClonesArray
#include <TClonesArray.h>
#endif
#ifndef ROOT_TList
#include <TList.h>
#endif
#ifndef ROOT_TTree
#include <TTree.h>
#endif
#include <TMatrixDSym.h>
#include <TMatrixDSymEigen.h>

class HepDatabasePDG;
class TSystem;
class TArrayF;
class TArrayI;
class TDirectory;

class AtlEvent : public HepEvent {

private:
    AtlEventHeader  fEventHeader;         // Event header
    AtlTrigger     *fTrigger;             // Trigger decisions
    AtlEnergySum    fEnergySum;           // Energy sums (SumEt, missing Et)
    Int_t           fN_Cone4H1TowerJets;  // No. of cone4-H1-tower jets
    Int_t           fN_Cone7H1TowerJets;  // No. of cone7-H1-tower jets
    Int_t           fN_Cone4H1TopoJets;   // No. of cone4-H1-topo jets
    Int_t           fN_Cone7H1TopoJets;   // No. of cone7-H1-topo jets
    Int_t           fN_MCCone4HadronJets; // No. of cone4 hadron level jets
    Int_t           fN_MCCone7HadronJets; // No. of cone7 hadron level jets
    Int_t           fN_MCAntiKt4HadronJets;// No. of antikt4 hadron level jets
    Int_t           fN_MCAntiKt6HadronJets;// No. of antikt6 hadron level jets
    Int_t           fN_MCAntiKt4HadronPileupJets;// No. of antikt4 hadron level jets
    Int_t           fN_AntiKt4H1TopoJets; // No. of antikt4-H1-topo jets
    Int_t           fN_AntiKt4H1TowerJets;// No. of antikt4-H1-tower jets
    Int_t           fN_AntiKt6H1TowerJets;// No. of antikt6-H1-tower jets
    Int_t           fN_AntiKt4TopoEMJets;
    Int_t           fN_AntiKt4TopoEMJESJets;
    Int_t           fN_AntiKt4LCTopoJets;
    Int_t           fN_AntiKt4TowerJets;
    Int_t           fN_AntiKt6TopoEMJets;
    Int_t           fN_AntiKt4TopoJets;
    Int_t           fN_AntiKt6TowerJets;
    Int_t           fN_AntiKt6LCTopoJets;
    Int_t           fN_AntiKt6TopoJets;
    Int_t           fN_AtlFastJets;       // No. of AtlFast jets
    Int_t           fN_MCParticles;       // No. of MC truth particles
    Int_t           fN_MCVertices;        // No. of MC truth vertices
    Int_t           fN_IDTracks;          // No. of inner detector tracks (including clones!)
    Int_t           fN_TRTHits;           // No. of TRT digitisations
    Int_t           fN_SCTHits;           // No. of SCT digitisations
    Int_t           fN_PixelHits;         // No. of Pixel digitisations
    Int_t           fN_Electrons;         // No. of electrons
    Int_t           fN_Muons;             // No. of muons (staco)
    Int_t           fN_Taus;              // No. of taus
    Int_t           fN_Photons;           // No. of photons
    Int_t           fN_AtlFastElectrons;  // No. of AtlFast electrons
    Int_t           fN_AtlFastMuons;      // No. of AtlFast muons
    Int_t           fN_AtlFastTaus;       // No. of AtlFast taus
    Int_t           fN_AtlFastPhotons;    // No. of AtlFast photons
    Int_t           fN_TopPairs;          // No. of reconstructed top pairs
    Int_t           fN_TopDecays;         // No. of reconstructed top decays
    Int_t           fN_WDecaysLNu;        // No. of reconstructed leptonic W decays
    Int_t           fN_WDecaysJJ;         // No. of reconstructed hadronic W decays
    Int_t           fN_Neutrinos;         // No. of reconstructed neutrinos
    Int_t           fN_Z0Decays;          // No. of reconstructed Z0 decays
    Int_t           fN_PhiDecaysKK;       // No. of reconstructed Phi decays
    Int_t           fN_K0sDecaysPiPi;     // No. of reconstructed K0s decays
    Int_t           fN_PhotonConv;         // No. of reconstructed photo conversions
    Int_t           fN_LambdaDecaysPiPi;  // No. of reconstructed Lambda decays
    Int_t           fN_D0DecaysKPi;       // No. of reconstructed D0 decays
    Int_t           fN_DstarDecaysDPi;    // No. of reconstructed Dstar decays
    Int_t           fN_Vertices;          // No. of vertices
    Int_t           fN_vpx;               // No. of primary vertices (stored in SgTopD3PDs)
    TClonesArray *fCone4H1TowerJets;   //-> Cone4-H1-tower jets @detector level
    TClonesArray *fCone7H1TowerJets;   //-> Cone7-H1-tower jets @detector level
    TClonesArray *fCone4H1TopoJets;    //-> Cone4-H1-topo jets @detector level
    TClonesArray *fCone7H1TopoJets;    //-> Cone7-H1-topo jets @detector level
    TClonesArray *fMCCone4HadronJets;  //-> Cone4 hadron level jets
    TClonesArray *fMCCone7HadronJets;  //-> Cone7 hadron level jets
    TClonesArray *fMCAntiKt4HadronJets;//-> AntiKt4 hadron level jets
    TClonesArray *fMCAntiKt6HadronJets;//-> AntiKt6 hadron level jets
    TClonesArray *fMCAntiKt4HadronPileupJets;//-> AntiKt4 hadron level jets
    TClonesArray *fAntiKt4H1TopoJets;  //-> AntiKt4-H1-topo jets @detector level
    TClonesArray *fAntiKt4H1TowerJets; //-> AntiKt4-H1-tower jets @detector level
    TClonesArray *fAntiKt6H1TowerJets; //-> AntiKt6-H1-tower jets @detector level
    TClonesArray *fAntiKt4TopoEMJets;
    TClonesArray *fAntiKt4TopoEMJESJets;
    TClonesArray *fAntiKt4LCTopoJets;
    TClonesArray *fAntiKt4TowerJets;
    TClonesArray *fAntiKt6TopoEMJets;
    TClonesArray *fAntiKt4TopoJets;
    TClonesArray *fAntiKt6TowerJets;
    TClonesArray *fAntiKt6LCTopoJets;
    TClonesArray *fAntiKt6TopoJets;
    TClonesArray *fAtlFastJets;       //-> AtlFast jets
    TClonesArray *fMCParticles;       //-> Array of MC truth particles
    TClonesArray *fMCVertices;        //-> Array of MC truth vertices
    TClonesArray *fIDTracks;          //-> Array of inner detector tracks
    TClonesArray *fTRTHits;           //-> Array of TRT digitisations
    TClonesArray *fSCTHits;           //-> Array of SCT hits
    TClonesArray *fPixelHits;         //-> Array of Pixel hits
    TClonesArray *fElectrons;         //-> Array of electrons
    TClonesArray *fMuons;             //-> Array of muons (staco)
    TClonesArray *fTaus;              //-> Array of taus
    TClonesArray *fPhotons;           //-> Array of photons
    TClonesArray *fAtlFastElectrons;  //-> Array of AtlFast electrons
    TClonesArray *fAtlFastMuons;      //-> Array of AtlFast muons
    TClonesArray *fAtlFastTaus;       //-> Array of AtlFast taus
    TClonesArray *fAtlFastPhotons;    //-> Array of AtlFast photons
    TClonesArray *fTopPairs;          //-> Array of reconstructed top pairs
    TClonesArray *fTopDecays;         //-> Array of reconstructed top decays
    TClonesArray *fWDecaysLNu;        //-> Array of reconstructed leptonic W decays
    TClonesArray *fWDecaysJJ;         //-> Array of reconstructed hadronic W decays
    TClonesArray *fNeutrinos;         //-> Array of reconstructed neutrinos (eg from W decays)
    TClonesArray *fZ0Decays;          //-> Array of reconstructed Z0 decays
    TClonesArray *fPhiDecaysKK;       //-> Array of reconstructed Phi decays
    TClonesArray *fK0sDecaysPiPi;     //-> Array of reconstructed K0s decays
    TClonesArray *fPhotonConv;        //-> Array of reconstructed photo conversions
    TClonesArray *fLambdaDecaysPiPi;  //-> Array of reconstructed Lambda decays
    TClonesArray *fD0DecaysKPi;       //-> Array of reconstructed D0 decays
    TClonesArray *fDstarDecaysDPi;    //-> Array of reconstructed Dstar decays
    TClonesArray *fVertices;          //-> Array of reconstructed vertices

    // SgTop D3PD variables
    Bool_t fIsEleMuOverlap;
    
public:
    AtlEvent();
    virtual ~AtlEvent();
    virtual void Clear(Option_t *option = "");
    virtual void Print(Option_t *option = "all") const;
    void Init();

    //
    // Event building functions
    //

    // Truth objects
    HepMCParticle* AddMCParticle(Int_t PdgCode, Float_t Px, Float_t Py,
				 Float_t Pz, Float_t E, Int_t MCStatus,
				 Bool_t IsGenerator, Bool_t IsGenNonInteracting,
				 Bool_t IsGenStable, Bool_t IsGenSimulStable,
				 Bool_t IsGenInteracting, Bool_t IsConversion,
				 Bool_t IsBremsstrahlung);
    HepMCVertex* AddMCVertex(Float_t x, Float_t y, Float_t z);

    // Reconstructed objects
    AtlTriggerItem* AddL1Match(AtlTriggerMatch *RecoObject, const char* L1ItemName);
    AtlTriggerItem* AddHLTMatch(AtlTriggerMatch *RecoObject, const char* HLTItemName);
    HepVertex* AddVertex(Float_t X, Float_t Y, Float_t Z, Float_t Chi2, Int_t NDoF, 
			 Float_t errX, Float_t errY, Float_t errZ, Int_t n_tracks, Int_t type);
    AtlIDTrack* AddIDTrack(Float_t Chi2, Int_t NDoF, Float_t Xref,
			   Float_t Yref, Float_t Zref, Float_t Phi0,
			   Float_t QovP, Float_t D0, Float_t Z0, Float_t Theta,
			   const Float_t CovMat[15] = 0);
    AtlIDTrack* AddIDTrack(AtlIDTrack *trk);
    AtlTRTDigit* AddTRTHit(Float_t DriftTime, Float_t DriftRadius, UInt_t Digit,
			   Int_t EndCapOrBarrel=-20, Int_t PhiSector=-1,
			   Int_t ModuleOrWheel=-1, Int_t StrawLayer=-1, Int_t Straw=-1);
    AtlPixelHit* AddPixelHit(Float_t X, Float_t Y, Float_t Z);
    AtlSCT3DHit* AddSCTHit(Float_t X, Float_t Y, Float_t Z);
    AtlElectron* AddElectron(Float_t Px, Float_t Py, Float_t Pz, Float_t E,
			     Bool_t IsPositron, Float_t EMWeight,
			     Float_t BkgWeight, UInt_t OQFlag,
			     UInt_t IsEMBitField,
			     AtlEMShower::EIsEM IsEM,
			     AtlEMShower::EAuthor Author,
			     TLorentzVector PCluster);
    AtlMuon* AddMuon(Float_t Px, Float_t Py, Float_t Pz, Float_t E, Bool_t IsMuPlus, 
		     Float_t EtCone10, Float_t EtCone20, Float_t EtCone30, Float_t EtCone40,
		     Int_t NtrkCone10, Int_t NtrkCone20, Int_t NtrkCone30, Int_t NtrkCone40,
		     Float_t PtCone10, Float_t PtCone20, Float_t PtCone30,
		     Float_t PtCone40, AtlMuon::EAuthor Author, AtlMuon::EQuality Quality,
		     Float_t MatchingChi2, Int_t MatchingNDoF,
		     Bool_t IsCombinedMuon,
		     TLorentzVector PMuonSpecExtrapol, 
		     Int_t MuonSpecExtrapolCharge);
    AtlTau* AddTau(Float_t Px, Float_t Py, Float_t Pz, Float_t E, Bool_t IsTauPlus, 
		   AtlTau::EAuthor Author, AtlTau::ETauFlag TauFlag);
    AtlPhoton* AddPhoton(Float_t Px, Float_t Py, Float_t Pz,
			 Float_t E, Float_t EMWeight,
			 Float_t BkgWeight, UInt_t OQFlag, 
			 UInt_t IsEMBitField,
			 AtlEMShower::EIsEM IsEM, AtlEMShower::EAuthor Author,
			 TLorentzVector PCluster);
    AtlJet* AddJet(AtlJet::EType type, Float_t E, Float_t Px, Float_t Py, Float_t Pz,
		   AtlJet::EJetQuality JetQuality,
		   TLorentzVector P_EMSCALE, TLorentzVector P_JESCorrSCALE,
		   Double_t EMJES_EtaCorr,
		   Double_t BCH_CORR_CELL, Double_t BCH_CORR_JET,
		   Float_t eta_offsetJES = 0.); 
    
    // ATLFAST objects
    AtlFastElectron* AddAtlFastElectron(Float_t Px, Float_t Py, Float_t Pz, Float_t E, Bool_t IsPositron);
    AtlFastMuon* AddAtlFastMuon(Float_t Px, Float_t Py, Float_t Pz, Float_t E, Bool_t IsMuPlus);
    AtlFastTau* AddAtlFastTau(Float_t Px, Float_t Py, Float_t Pz, Float_t E, Bool_t IsTauPlus);
    AtlFastPhoton* AddAtlFastPhoton(Float_t Px, Float_t Py, Float_t Pz, Float_t E);
    
    // Objects reconstructed by finders
    AtlTopPair*  AddTopPair(HepTopDecay* top1, HepTopDecay* top2, Double_t chi2, Int_t ndof, AtlTopPair::EType type);
    HepTopDecay* AddTopDecay(Float_t Px_T, Float_t Py_T, Float_t Pz_T, Float_t E_T,
			     HepWDecay *WDecay, HepJet *BJetOrig,
			     Float_t Px_j, Float_t Py_j, Float_t Pz_j, Float_t E_j,
			     HepTopDecay::ProductionMode mode);
    AtlWDecayLNu* AddWDecayLNu(Float_t Px_W, Float_t Py_W, Float_t Pz_W, Float_t E_W,
			       HepParticle *lepton_orig, Float_t Px_lep,
			       Float_t Py_lep, Float_t Pz_lep, Float_t E_lep,
			       HepParticle* neutrino, HepWDecay::ProductionMode mode);
    AtlWDecayJJ* AddWDecayJJ(Float_t Px_W, Float_t Py_W, Float_t Pz_W,
			     Float_t E_W, AtlJet *jet1_orig, AtlJet *jet2_orig,
			     Float_t Px_j1, Float_t Py_j1, Float_t Pz_j1, Float_t E_j1,
			     Float_t Px_j2, Float_t Py_j2, Float_t Pz_j2, Float_t E_j2,
			     HepWDecay::ProductionMode mode);
    HepParticle* AddNeutrino(Float_t Px, Float_t Py, Float_t Pz, Float_t E, Int_t PdgCode);
    HepZ0Decay* AddZ0Decay(Float_t Px, Float_t Py, Float_t Pz, Float_t E,
			   TObject* Daughter1, TObject* Daughter2,
	                   HepParticle Fit_Daughter1, HepParticle Fit_Daughter2);
    HepZ0Decay* AddZ0Decay(Float_t Px, Float_t Py, Float_t Pz, Float_t E,
			   TObject* Daughter1, TObject* Daughter2);
    AtlPhiDecayKK* AddPhiDecayKK(Float_t Px, Float_t Py, Float_t Pz, Float_t E,
				 AtlIDTrack* Daughter1, AtlIDTrack* Daughter2,
				 HepVertex* Vtx,
				 HepParticle Fit_Daughter1, HepParticle Fit_Daughter2);
    AtlK0sDecayPiPi* AddK0sDecayPiPi(Float_t Px, Float_t Py, Float_t Pz, Float_t E,
				     AtlIDTrack* Daughter1, AtlIDTrack* Daughter2,
				     HepVertex* Vtx,
				     HepParticle Fit_Daughter1, HepParticle Fit_Daughter2);
    AtlPhotonConv* AddPhotonConv(Float_t Px, Float_t Py, Float_t Pz, Float_t E,
			       AtlIDTrack* Daughter1, AtlIDTrack* Daughter2,
			       HepVertex* Vtx,
			       HepParticle Fit_Daughter1, HepParticle Fit_Daughter2);
    AtlLambdaDecayPPi* AddLambdaDecayPiPi(Float_t Px, Float_t Py, Float_t Pz, Float_t E,
				      AtlIDTrack* Proton, AtlIDTrack* Pion, 
				      HepVertex* Vertex, HepVertex* PrimaryVtx,
				      HepParticle Fit_Daughter1, HepParticle Fit_Daughter2);

    AtlD0DecayKPi* AddD0DecayKPi(Float_t Px, Float_t Py, Float_t Pz, Float_t E,
				 AtlIDTrack* Kaon, AtlIDTrack* Pion, 
				 HepVertex* Vertex, HepVertex* PrimaryVtx,
				 HepParticle Fit_Daughter1, HepParticle Fit_Daughter2);
    AtlDstarDecayDPi* AddDstarDecayDPi(Float_t Px, Float_t Py, Float_t Pz, Float_t E,
				       AtlD0DecayKPi* D0, AtlIDTrack* Pion, 
				       HepVertex* Vertex, HepVertex* PrimaryVtx,
				       HepParticle Fit_Daughter1, HepParticle Fit_Daughter2);
    //
    // Matching functions
    //
    TList* FindOverlaps_Particle_Jets(HepParticle *prt,
				      TCollection *search_list,
				      Float_t DeltaR = 0.1);
    TList* FindOverlaps_ElectronCluster_Jets(AtlElectron *el,
					     TCollection *search_list,
					     Float_t DeltaR = 0.1);
    TList* FindOverlaps_ElectronTrack_EMScaleJets(AtlElectron *el,
						  TCollection *search_list,
						  Float_t DeltaR = 0.1,
						  const char* option = "trkem");
    TList* FindOverlaps_MuonTrack_EMScaleJets(AtlMuon *mu,
					      TCollection *search_list,
					      Float_t DeltaR = 0.1);
    TList* FindMatchedParticles(HepParticle *prt,
				TCollection *search_list,
				Float_t DeltaR = 0.1,
				Float_t DeltaPtFrac = 0.1);
    TList* FindMatchedParticles(HepJet *jet,
				TCollection *search_list,
				Float_t DeltaR = 0.2,
				Float_t DeltaPtFrac = 0.2);
    HepMCParticle* FindMatchedMCParticle(HepParticle *prt,
					 Bool_t RemoveUnstable = kTRUE,
					 Float_t DeltaR = 0.1,
					 Float_t DeltaPtFrac = 0.1);
    HepMCParticle* FindMatchedMCParticle(HepJet *jet,
					 Bool_t RemoveUnstable = kTRUE,
					 Float_t DeltaR = 0.2,
					 Float_t DeltaPtFrac = 0.2);
    TList* FindTruthMatchedJets(AtlJet::EType type);
    TList* FindTruthMatchedJets(TCollection *search_list, AtlJet::EType type);
    TList* FindMatchedJets(HepParticle *prt,
			   TCollection *search_list,
			   Float_t DeltaR = 0.1,
			   Float_t DeltaPtFrac = 0.1,
			   Bool_t UseDeltaRonly = kFALSE);
    TList* FindMatchedJets(HepJet *jet,
			   TCollection *search_list,
			   Float_t DeltaR = 0.2,
			   Float_t DeltaEtFrac = 0.2);
    HepJet* FindMatchedMCJet(HepParticle *prt,
			     Float_t DeltaR = 0.2,
			     Float_t DeltaPtFrac = 0.2);
    HepJet* FindMatchedMCJet(HepJet *jet,
			     Float_t DeltaR = 0.2,
			     Float_t DeltaEtFrac = 0.2);
    
    AtlIDTrack* GetAssociatedIDTrack(HepMCParticle *prt) const;

    //
    // Print functions for truth information
    //
    void PrintMCParticles(const char* PrtType) const;
    void PrintMCDaughters(HepMCParticle *prt) const;
    void PrintMCMothers(HepMCParticle *prt) const;
    void PrintMCGenealogy(HepMCParticle *prt) const;
    void PrintMCGenealogyTree(Int_t First = 1, Int_t Last = 10000) const;
    inline void PrintMCDaughters(Int_t Id) const
	    { PrintMCDaughters(GetMCParticle_ById(Id)); }
    inline void PrintMCMothers(Int_t Id) const
	    { PrintMCMothers(GetMCParticle_ById(Id)); }
    inline void PrintMCGenealogy(Int_t Id) const
	    { PrintMCGenealogy(GetMCParticle_ById(Id)); }


    //
    // Generic event information
    //
    inline Bool_t    IsMC() const { return fEventHeader.IsMC(); }
    inline Bool_t    IsDATA() const { return fEventHeader.IsDATA(); }
    inline Float_t   BeamEnergy() const { return fEventHeader.BeamEnergy(); }
    inline Int_t     LumiBlock() const { return fEventHeader.LumiBlock(); }
    inline UInt_t    RunNr() const { return fEventHeader.RunNr(); }
    inline ULong64_t EventNr() const { return fEventHeader.EventNr(); }
    inline UInt_t    GetChannelNumber() const { return fEventHeader.GetChannelNumber(); }
    inline Float_t   GetHFORType() const { return fEventHeader.GetHFORType(); }
    inline Bool_t    IsRun1() const { return fEventHeader.IsRun1(); }
    inline Bool_t    IsRun2() const { return fEventHeader.IsRun2(); }
    
    //
    // Event shape
    //
    Float_t Sphericity(TList *Vectors);
    
    //
    // Event reconstruction
    //
    Float_t W_Mperp2(HepParticle *lepton, TVector2 MissingEt) const;
    void ComputePtRel(HepParticle *prt, TCollection *search_list,
		      Float_t DeltaRmax, Double_t &PtRel, Double_t &DeltaR);
    
    inline Float_t W_Mperp(HepParticle *lepton, TVector2 MissingEt) const {
	//
	// W boson transverse mass reconstruction for given
	// lepton and missing Et
	//
	return TMath::Sqrt(W_Mperp2(lepton, MissingEt));
    }
    inline Float_t W_Mperp(HepParticle *lepton) const {
	//
	// W boson transverse mass reconstruction for given
	// lepton and (commonly) reconstructed missing Et
	//
	return W_Mperp(lepton, fEnergySum.GetMissingEt());
    }
    inline Float_t W_Mperp2(HepParticle *lepton) const {
	//
	// W boson transverse mass reconstruction for given
	// lepton and (commonly) reconstructed missing Et
	//
	return W_Mperp2(lepton, fEnergySum.GetMissingEt());
    }

    
    //
    // Getter functions
    //
    inline Float_t GetPreTagEvtWeight() const { return fEventHeader.GetPreTagEvtWeight(); }
    inline Float_t GetTagEvtWeight() const { return fEventHeader.GetTagEvtWeight(); }
    inline Float_t GetMCWeight() const { return fEventHeader.GetMCWeight(); }
    inline Float_t GetPileupWeight() const { return fEventHeader.GetPileupWeight(); }
    inline Float_t GetZVtxWeight() const { return fEventHeader.GetZVtxWeight(); }
    inline Float_t GetMMWeightNominal() const { return fEventHeader.GetMMWeightNominal(); }
    inline const AtlEventHeader* GetEventHeader() const { return &fEventHeader; }
    AtlEventHeader * GetEventHeader() { return &fEventHeader; }
    inline const AtlEnergySum* GetEnergySum() const { return &fEnergySum; }
    AtlEnergySum * GetEnergySum() { return &fEnergySum; }

    // Truth information
    TList*         GetMCParticles(const char* PrtType) const;
    HepMCParticle* GetMCParticle_ById(Int_t Id) const;
    TList*         GetMCGenealogy(HepMCParticle *prt) const;
    TLorentzVector GetMCSumEnergy_NonInt() const;
    Float_t        GetMCSumEnergy_NonInt_Eta() const;
    Float_t        GetMCSumEnergy_NonInt_Phi() const;
    TList*         GetMCNeutrinos(Bool_t sort = kTRUE) const;
    HepMCParticle* GetLeadingMCNeutrino() const;
    TList*	   GetMCTops(Bool_t good = kTRUE) const;
    HepMCParticle* GetGoodMother(HepMCParticle* particle); // ***working?
    TList*         GetStableMCParticles() const;
    TList*         FindMCParticlesByName(const char* PdgName, Bool_t RemoveDouble = kFALSE);
    inline TClonesArray* GetMCParticles() const { return fMCParticles; }
    inline TClonesArray* GetMCVertices() const  { return fMCVertices; }
    inline Int_t GetN_MCParticles() const { return fN_MCParticles; }
    inline Int_t GetN_MCVertices() const { return fN_MCVertices; }
    
    inline Int_t GetN_MCCone4HadronJets() const { return fN_MCCone4HadronJets; }
    inline Int_t GetN_MCCone7HadronJets() const { return fN_MCCone7HadronJets; }
    inline Int_t GetN_MCAntiKt4HadronJets() const { return fN_MCAntiKt4HadronJets; }
    inline Int_t GetN_MCAntiKt6HadronJets() const { return fN_MCAntiKt6HadronJets; }
    inline Int_t GetN_MCAntiKt4HadronPileupJets() const { return fN_MCAntiKt4HadronPileupJets; }
    inline TClonesArray* GetMCCone4HadronJets() const { return fMCCone4HadronJets; }
    inline TClonesArray* GetMCCone7HadronJets() const { return fMCCone7HadronJets; }
    inline TClonesArray* GetMCAntiKt4HadronJets() const { return fMCAntiKt4HadronJets; }
    inline TClonesArray* GetMCAntiKt6HadronJets() const { return fMCAntiKt6HadronJets; }
    inline TClonesArray* GetMCAntiKt4HadronPileupJets() const { return fMCAntiKt4HadronPileupJets; }
    inline AtlJet* GetLeadingMCCone4HadronJet() const
    { return GetLeadingJet(AtlJet::kMCCone4Hadron); }

    // Reconstruction information
    AtlElectron*   GetElectron_ById(Int_t Id) const;
    AtlMuon*       GetMuon_ById(Int_t Id) const;
    AtlJet*        GetLeadingJet(AtlJet::EType type) const;
    Int_t          GetN_Jets(AtlJet::EType type) const;
    TClonesArray*  GetJets(AtlJet::EType type) const;
    TList* GetJets(AtlJet::EType type, Float_t Et_min,
		   Float_t Et_max = 10e10, Float_t Eta_min = -10e10,
		   Float_t Eta_max = 10e10, Bool_t is_good = kFALSE,
		   Bool_t sort = kTRUE, Bool_t remove_faked = kTRUE);

    TList* GetElectrons(AtlEMShower::EAuthor author, AtlEMShower::EIsEM IsEM,
			Float_t Pt_min = 0., Float_t Pt_max = 10e10,
			Float_t Eta_min = -10e10, Float_t Eta_max = 10e10,
			Float_t EtCone20_max = 10e10, Bool_t sort = kTRUE,
			Bool_t exclude_crack = kTRUE, Float_t EtCone20_IsoFactor = 0.,
			Bool_t use_cluster_eta = kFALSE,
			AtlEMShower::ECaloIsoCorrection CaloIsoCorrection = AtlEMShower::kUncorrected);

    TList* GetVtxTracks(Float_t Chi2ovNDoF_max = 1000,
			Float_t Pt_min = 0., Float_t Pt_max = 10e10,
			Float_t Eta_min = -10e10, Float_t Eta_max = 10e10, Bool_t sort=kTRUE);
    
    TList* GetSecVtxTracks(Float_t Chi2ovDoF_max = 1000,
			   Float_t Pt_min = 0., Float_t Pt_max = 10e10,
			   Float_t Eta_min = -10e10, Float_t Eta_max = 10e10, Bool_t sort=kTRUE);
    
    TList* GetPrimVtxTracks(Float_t Chi2ovDoF_max = 10e10,
			   Float_t Pt_min = 0., Float_t Pt_max = 10e10,
			   Float_t Eta_min = -10e10, Float_t Eta_max = 10e10, Bool_t sort=kTRUE);

    TList* GetPhotons(AtlEMShower::EAuthor author, AtlEMShower::EIsEM IsEM,
		      Float_t Pt_min = 0., Float_t Pt_max = 10e10,
		      Float_t Eta_min = -10e10, Float_t Eta_max = 10e10,
		      Float_t EtCone20_max = 10e10, Bool_t sort = kTRUE,
		      Bool_t exclude_crack = kTRUE,
		      AtlEMShower::ECaloIsoCorrection CaloIsoCorrection = AtlEMShower::kUncorrected);
    TList* GetMuons(AtlMuon::EAuthor author, Float_t Pt_min = 0.,
		    Float_t Pt_max = 10e10,	Float_t Eta_min = -10e10,
		    Float_t Eta_max = 10e10, Float_t Chi2_max = 10e10,
		    Float_t EtCone20_max = 10e10, Bool_t staco_combined = kFALSE,
		    Bool_t sort = kTRUE, AtlMuon::EQuality quality = AtlMuon::EQuality( AtlMuon::kLoose | AtlMuon::kMedium | AtlMuon::kTight ));
    TList* GetTaus(AtlTau::EAuthor author, AtlTau::ETauFlag flag,
		   Float_t Pt_min = 0., Float_t Pt_max = 10e10,
		   Float_t Eta_min = -10e10, Float_t Eta_max = 10e10,
		   Bool_t sort = kTRUE);
    TList* GetVertices(HepVertex::EType type) const;
    Int_t GetN_PrimaryVertices() const;
    HepVertex* GetPrimaryVtx() const;
    


    inline Int_t GetN_Cone4H1TowerJets()  const { return fN_Cone4H1TowerJets;  }
    inline Int_t GetN_Cone7H1TowerJets()  const { return fN_Cone7H1TowerJets;  }
    inline Int_t GetN_Cone4H1TopoJets()   const { return fN_Cone4H1TopoJets;   }
    inline Int_t GetN_Cone7H1TopoJets()   const { return fN_Cone7H1TopoJets;   }  
    inline Int_t GetN_AntiKt4H1TopoJets() const { return fN_AntiKt4H1TopoJets; }
    inline Int_t GetN_AntiKt4H1TowerJets() const { return fN_AntiKt4H1TowerJets; }
    inline Int_t GetN_AntiKt6H1TowerJet() const { return fN_AntiKt6H1TowerJets; }
    inline Int_t GetN_AntiKt4TopoEMJets() const { return fN_AntiKt4TopoEMJets; }
    inline Int_t GetN_AntiKt4TopoEMJESJets() const { return fN_AntiKt4TopoEMJESJets; }
    inline Int_t GetN_AntiKt4LCTopoJets() const { return fN_AntiKt4LCTopoJets; }
    inline Int_t GetN_AntiKt4TowerJets() const { return fN_AntiKt4TowerJets; }
    inline Int_t GetN_AntiKt6TopoEMJets() const { return fN_AntiKt6TopoEMJets; }
    inline Int_t GetN_AntiKt4TopoJets() const { return fN_AntiKt6TowerJets; }
    inline Int_t GetN_AntiKt6TowerJets() const { return fN_AntiKt6TowerJets; }
    inline Int_t GetN_AntiKt6LCTopoJets() const { return fN_AntiKt6LCTopoJets; }
    inline Int_t GetN_AntiKt6TopoJets() const { return fN_AntiKt6TopoJets; }
    inline Int_t GetN_AtlFastJets()       const { return fN_AtlFastJets;       }
    inline Int_t GetN_IDTracks() const { return fN_IDTracks; }
    inline Int_t GetN_TRTHits() const { return fN_TRTHits; }
    inline Int_t GetN_PixelHits() const { return fN_PixelHits; }
    inline Int_t GetN_SCTHits() const { return fN_SCTHits; }
    inline Int_t GetN_SiliconHits() const {return (fN_PixelHits + fN_SCTHits); }
    inline Int_t GetN_Electrons() const { return fN_Electrons; }
    inline Int_t GetN_Muons() const { return fN_Muons; }
    inline Int_t GetN_Taus() const { return fN_Taus; }
    inline Int_t GetN_Photons() const { return fN_Photons; }
    inline Int_t GetN_AtlFastElectrons() const { return fN_AtlFastElectrons; }
    inline Int_t GetN_AtlFastMuons() const { return fN_AtlFastMuons; }
    inline Int_t GetN_AtlFastTaus() const { return fN_AtlFastTaus; }
    inline Int_t GetN_AtlFastPhotons() const { return fN_AtlFastPhotons; }
    inline Int_t GetN_TopPairs() const { return fN_TopPairs; }
    inline Int_t GetN_TopDecays() const { return fN_TopDecays; }
    inline Int_t GetN_WDecaysLNu() const { return fN_WDecaysLNu; }
    inline Int_t GetN_WDecaysJJ() const { return fN_WDecaysJJ; }
    inline Int_t GetN_Neutrinos() const { return fN_Neutrinos; }
    inline Int_t GetN_Z0Decays() const { return fN_Z0Decays; }
    inline Int_t GetN_PhiDecaysKK() const { return fN_PhiDecaysKK; }
    inline Int_t GetN_K0sDecaysPiPi() const { return fN_K0sDecaysPiPi; }
    inline Int_t GetN_PhotonConv() const { return fN_PhotonConv; }
    inline Int_t GetN_LambdaDecaysPiPi() const { return fN_LambdaDecaysPiPi; }
    inline Int_t GetN_D0DecaysKPi() const { return fN_D0DecaysKPi; }
    inline Int_t GetN_DstarDecaysDPi() const { return fN_DstarDecaysDPi; }
    inline Int_t GetN_Vertices() const { return fN_Vertices; }
    inline TClonesArray* GetCone4H1TowerJets()  const { return fCone4H1TowerJets;  }
    inline TClonesArray* GetCone7H1TowerJets()  const { return fCone7H1TowerJets;  }
    inline TClonesArray* GetCone4H1TopoJets()   const { return fCone4H1TopoJets;   }
    inline TClonesArray* GetCone7H1TopoJets()   const { return fCone7H1TopoJets;   }
    inline TClonesArray* GetAntiKt4H1TopoJets() const { return fAntiKt4H1TopoJets; }
    inline TClonesArray* GetAntiKt4H1TowerJets() const { return fAntiKt4H1TowerJets; }
    inline TClonesArray* GetAntiKt6H1TowerJets() const { return fAntiKt6H1TowerJets; }
    inline TClonesArray* GetAntiKt4TopoEMJets() const { return fAntiKt4TopoEMJets; }
    inline TClonesArray* GetAntiKt4TopoEMJESJets() const { return fAntiKt4TopoEMJESJets; }
    inline TClonesArray* GetAntiKt4LCTopoJets() const { return fAntiKt4LCTopoJets; }
    inline TClonesArray* GetAntiKt4TowerJets() const { return fAntiKt4TowerJets; }
    inline TClonesArray* GetAntiKt6TopoEMJets() const { return fAntiKt6TopoEMJets; }
    inline TClonesArray* GetAntiKt4TopoJets() const { return fAntiKt4TopoJets; }
    inline TClonesArray* GetAntiKt6TowerJets() const { return fAntiKt6TowerJets; }
    inline TClonesArray* GetAntiKt6LCTopoJets() const { return fAntiKt6LCTopoJets; }
    inline TClonesArray* GetAntiKt6TopoJets() const { return fAntiKt6TopoJets; }
    inline TClonesArray* GetAtlFastJets()       const { return fAtlFastJets;       }
    inline TClonesArray* GetIDTracks() const { return fIDTracks; }
    inline TClonesArray* GetTRTHits() const { return fTRTHits; }
    inline TClonesArray* GetElectrons() const { return fElectrons; }
    inline TClonesArray* GetMuons() const { return fMuons; }
    inline TClonesArray* GetTaus() const { return fTaus; }
    inline TClonesArray* GetPhotons() const { return fPhotons; }
    inline TClonesArray* GetAtlFastElectrons() const { return fAtlFastElectrons; }
    inline TClonesArray* GetAtlFastMuons() const { return fAtlFastMuons; }
    inline TClonesArray* GetAtlFastTaus() const { return fAtlFastTaus; }
    inline TClonesArray* GetAtlFastPhotons() const { return fAtlFastPhotons; }
    inline TClonesArray* GetTopPairs() const {return fTopPairs; }
    inline TClonesArray* GetTopDecays() const {return fTopDecays; }
    inline TClonesArray* GetWDecaysLNu() const {return fWDecaysLNu; }
    inline TClonesArray* GetWDecaysJJ() const {return fWDecaysJJ; }
    inline TClonesArray* GetNeutrinos() const {return fNeutrinos; }
    inline TClonesArray* GetZ0Decays() const {return fZ0Decays; }
    inline TClonesArray* GetPhiDecaysKK() const {return fPhiDecaysKK; }
    inline TClonesArray* GetK0sDecaysPiPi() const {return fK0sDecaysPiPi; }
    inline TClonesArray* GetPhotonConv() const {return fPhotonConv; }
    inline TClonesArray* GetLambdaDecaysPiPi() const { return fLambdaDecaysPiPi; }
    inline TClonesArray* GetD0DecaysKPi() const { return fD0DecaysKPi; }
    inline TClonesArray* GetDstarDecaysDPi() const { return fDstarDecaysDPi; }
    inline TClonesArray* GetVertices() const { return fVertices; }

    //
    // Setter functions
    //
    inline void SetN_PrimaryVertices( Int_t vpx_n ) { fN_vpx = vpx_n; }
    void SetN_Jets(AtlJet::EType type, Int_t NJets);
    inline void SetN_TRTHits(Int_t N_TRTHits) { fN_TRTHits = N_TRTHits; }
    inline void SetN_PixelHits(Int_t N_PixelHits) { fN_PixelHits = N_PixelHits; }
    inline void SetN_SCTHits(Int_t N_SCTHits) { fN_SCTHits = N_SCTHits; }
    inline void SetEventHeader(UInt_t RunNr, ULong64_t EventNr,
			       UInt_t LumiBlock, Float_t BeamEnergy,
			       Bool_t IsMC,
			       AtlEventHeader::EType EventType,
			       Float_t MCWeight, 
			       Float_t PileupWeight,
			       Float_t ZVertexWeight,
			       Float_t MMWeight_nominal,
			       Float_t MMWeight_fake_mc_up,
			       Float_t MMWeight_fake_mc_down,
			       Float_t MMWeight_fake_alternate,
			       Float_t MMWeight_real_alternate,
			       Double_t TruthWeightCorrection) {
	fEventHeader.SetRunNr(RunNr);
	fEventHeader.SetEventNr(EventNr);
	fEventHeader.SetLumiBlock(LumiBlock);
	fEventHeader.SetBeamEnergy(BeamEnergy);
	fEventHeader.SetMC(IsMC);
	fEventHeader.SetEventType(EventType);
	fEventHeader.SetPreTagEvtWeight(MCWeight*PileupWeight*ZVertexWeight*TruthWeightCorrection);
	fEventHeader.SetTagEvtWeight(MCWeight*PileupWeight*ZVertexWeight*TruthWeightCorrection);
	fEventHeader.SetMCWeight(MCWeight);
	fEventHeader.SetPileupWeight(PileupWeight);
	fEventHeader.SetZVtxWeight(ZVertexWeight);
	fEventHeader.SetMMWeightNominal(MMWeight_nominal);
	fEventHeader.SetMMWeightFakeMCup(MMWeight_fake_mc_up);
	fEventHeader.SetMMWeightFakeMCdown(MMWeight_fake_mc_down);
	fEventHeader.SetMMWeightFakeAlternate(MMWeight_fake_alternate);
	fEventHeader.SetMMWeightRealAlternate(MMWeight_real_alternate);
	fEventHeader.SetTruthWeightCorrection(TruthWeightCorrection);
    }
    inline void SetL1TriggerItem(Int_t Bit, Bool_t Passed,
				 Float_t Prescale, Float_t PassThrough) {
	// Set level 1 trigger item for given bit number
	fTrigger->SetL1Item(Bit, Passed, Prescale, PassThrough);
    }
    inline void SetHLTTriggerItem(Int_t Bit, Bool_t Passed,
				  Float_t Prescale, Float_t PassThrough) {
	// Set higher level trigger item for given bit number
	fTrigger->SetHLTItem(Bit, Passed, Prescale, PassThrough);
    }
    inline void SetPreTagEvtWeight(Float_t Weight)
    { fEventHeader.SetPreTagEvtWeight(Weight); }
    inline void SetTagEvtWeight(Float_t Weight)
    { fEventHeader.SetTagEvtWeight(Weight); }
    
    //
    // Trigger information
    //
    void PrintTriggerMatches(Option_t *option = "ALL") const;
    void PrintTriggerMatches(AtlJet::EType type) const;
    inline AtlTrigger* GetTrigger() const { return fTrigger; }
    inline Bool_t HasPassedL1(const char* L1ItemName) {
	// Has passed given 1st level trigger ?
	return GetTrigger()->HasPassedL1(L1ItemName, RunNr(), kTRUE);
    }
    inline Bool_t HasPassedHLT(const char* HLTItemName) {
	// Has passed given higher level trigger ?
	return GetTrigger()->HasPassedHLT(HLTItemName, RunNr(), kTRUE);
    }
    inline Bool_t HasMatchedL1(AtlTriggerMatch *RecoObject, const char* L1ItemName) {
	//
	// Test trigger matching of reconstructed object and given L1
	// trigger item.
	//
	// Allowed reconstructed objects are of type AtlElectron,
	// AtlPhoton, AtlMuon, AtlTau and AtlJet.
	//
	return RecoObject->HasMatchedL1(L1ItemName,
					RunNr(),
					GetTrigger());
    }
    inline Bool_t HasMatchedHLT(AtlTriggerMatch *RecoObject, const char* HLTItemName) {
	//
	// Test trigger matching of reconstructed object and given HLT
	// trigger item.
	//
	// Allowed reconstructed objects are of type AtlElectron,
	// AtlPhoton, AtlMuon, AtlTau and AtlJet.
	//
	return RecoObject->HasMatchedHLT(HLTItemName,
					 RunNr(),
					 GetTrigger());
    }

    // SgTop D3PD variables
    inline void SetIsEleMuOverlap(Bool_t isEleMuOverlap) {
	fIsEleMuOverlap = isEleMuOverlap;
    }

    inline Bool_t IsEleMuOverlap() const { return fIsEleMuOverlap; }
    
  private:
    
    void PrintMCGenealogyTree(HepMCParticle *prt, TString *padding,
                              TList *CheckList = 0) const;
    void PrintTriggerMatches(AtlTriggerMatch *obj) const;
    
    ClassDef(AtlEvent,67) // ATLAS event class
};

#endif
 
 AtlEvent.h:1
 AtlEvent.h:2
 AtlEvent.h:3
 AtlEvent.h:4
 AtlEvent.h:5
 AtlEvent.h:6
 AtlEvent.h:7
 AtlEvent.h:8
 AtlEvent.h:9
 AtlEvent.h:10
 AtlEvent.h:11
 AtlEvent.h:12
 AtlEvent.h:13
 AtlEvent.h:14
 AtlEvent.h:15
 AtlEvent.h:16
 AtlEvent.h:17
 AtlEvent.h:18
 AtlEvent.h:19
 AtlEvent.h:20
 AtlEvent.h:21
 AtlEvent.h:22
 AtlEvent.h:23
 AtlEvent.h:24
 AtlEvent.h:25
 AtlEvent.h:26
 AtlEvent.h:27
 AtlEvent.h:28
 AtlEvent.h:29
 AtlEvent.h:30
 AtlEvent.h:31
 AtlEvent.h:32
 AtlEvent.h:33
 AtlEvent.h:34
 AtlEvent.h:35
 AtlEvent.h:36
 AtlEvent.h:37
 AtlEvent.h:38
 AtlEvent.h:39
 AtlEvent.h:40
 AtlEvent.h:41
 AtlEvent.h:42
 AtlEvent.h:43
 AtlEvent.h:44
 AtlEvent.h:45
 AtlEvent.h:46
 AtlEvent.h:47
 AtlEvent.h:48
 AtlEvent.h:49
 AtlEvent.h:50
 AtlEvent.h:51
 AtlEvent.h:52
 AtlEvent.h:53
 AtlEvent.h:54
 AtlEvent.h:55
 AtlEvent.h:56
 AtlEvent.h:57
 AtlEvent.h:58
 AtlEvent.h:59
 AtlEvent.h:60
 AtlEvent.h:61
 AtlEvent.h:62
 AtlEvent.h:63
 AtlEvent.h:64
 AtlEvent.h:65
 AtlEvent.h:66
 AtlEvent.h:67
 AtlEvent.h:68
 AtlEvent.h:69
 AtlEvent.h:70
 AtlEvent.h:71
 AtlEvent.h:72
 AtlEvent.h:73
 AtlEvent.h:74
 AtlEvent.h:75
 AtlEvent.h:76
 AtlEvent.h:77
 AtlEvent.h:78
 AtlEvent.h:79
 AtlEvent.h:80
 AtlEvent.h:81
 AtlEvent.h:82
 AtlEvent.h:83
 AtlEvent.h:84
 AtlEvent.h:85
 AtlEvent.h:86
 AtlEvent.h:87
 AtlEvent.h:88
 AtlEvent.h:89
 AtlEvent.h:90
 AtlEvent.h:91
 AtlEvent.h:92
 AtlEvent.h:93
 AtlEvent.h:94
 AtlEvent.h:95
 AtlEvent.h:96
 AtlEvent.h:97
 AtlEvent.h:98
 AtlEvent.h:99
 AtlEvent.h:100
 AtlEvent.h:101
 AtlEvent.h:102
 AtlEvent.h:103
 AtlEvent.h:104
 AtlEvent.h:105
 AtlEvent.h:106
 AtlEvent.h:107
 AtlEvent.h:108
 AtlEvent.h:109
 AtlEvent.h:110
 AtlEvent.h:111
 AtlEvent.h:112
 AtlEvent.h:113
 AtlEvent.h:114
 AtlEvent.h:115
 AtlEvent.h:116
 AtlEvent.h:117
 AtlEvent.h:118
 AtlEvent.h:119
 AtlEvent.h:120
 AtlEvent.h:121
 AtlEvent.h:122
 AtlEvent.h:123
 AtlEvent.h:124
 AtlEvent.h:125
 AtlEvent.h:126
 AtlEvent.h:127
 AtlEvent.h:128
 AtlEvent.h:129
 AtlEvent.h:130
 AtlEvent.h:131
 AtlEvent.h:132
 AtlEvent.h:133
 AtlEvent.h:134
 AtlEvent.h:135
 AtlEvent.h:136
 AtlEvent.h:137
 AtlEvent.h:138
 AtlEvent.h:139
 AtlEvent.h:140
 AtlEvent.h:141
 AtlEvent.h:142
 AtlEvent.h:143
 AtlEvent.h:144
 AtlEvent.h:145
 AtlEvent.h:146
 AtlEvent.h:147
 AtlEvent.h:148
 AtlEvent.h:149
 AtlEvent.h:150
 AtlEvent.h:151
 AtlEvent.h:152
 AtlEvent.h:153
 AtlEvent.h:154
 AtlEvent.h:155
 AtlEvent.h:156
 AtlEvent.h:157
 AtlEvent.h:158
 AtlEvent.h:159
 AtlEvent.h:160
 AtlEvent.h:161
 AtlEvent.h:162
 AtlEvent.h:163
 AtlEvent.h:164
 AtlEvent.h:165
 AtlEvent.h:166
 AtlEvent.h:167
 AtlEvent.h:168
 AtlEvent.h:169
 AtlEvent.h:170
 AtlEvent.h:171
 AtlEvent.h:172
 AtlEvent.h:173
 AtlEvent.h:174
 AtlEvent.h:175
 AtlEvent.h:176
 AtlEvent.h:177
 AtlEvent.h:178
 AtlEvent.h:179
 AtlEvent.h:180
 AtlEvent.h:181
 AtlEvent.h:182
 AtlEvent.h:183
 AtlEvent.h:184
 AtlEvent.h:185
 AtlEvent.h:186
 AtlEvent.h:187
 AtlEvent.h:188
 AtlEvent.h:189
 AtlEvent.h:190
 AtlEvent.h:191
 AtlEvent.h:192
 AtlEvent.h:193
 AtlEvent.h:194
 AtlEvent.h:195
 AtlEvent.h:196
 AtlEvent.h:197
 AtlEvent.h:198
 AtlEvent.h:199
 AtlEvent.h:200
 AtlEvent.h:201
 AtlEvent.h:202
 AtlEvent.h:203
 AtlEvent.h:204
 AtlEvent.h:205
 AtlEvent.h:206
 AtlEvent.h:207
 AtlEvent.h:208
 AtlEvent.h:209
 AtlEvent.h:210
 AtlEvent.h:211
 AtlEvent.h:212
 AtlEvent.h:213
 AtlEvent.h:214
 AtlEvent.h:215
 AtlEvent.h:216
 AtlEvent.h:217
 AtlEvent.h:218
 AtlEvent.h:219
 AtlEvent.h:220
 AtlEvent.h:221
 AtlEvent.h:222
 AtlEvent.h:223
 AtlEvent.h:224
 AtlEvent.h:225
 AtlEvent.h:226
 AtlEvent.h:227
 AtlEvent.h:228
 AtlEvent.h:229
 AtlEvent.h:230
 AtlEvent.h:231
 AtlEvent.h:232
 AtlEvent.h:233
 AtlEvent.h:234
 AtlEvent.h:235
 AtlEvent.h:236
 AtlEvent.h:237
 AtlEvent.h:238
 AtlEvent.h:239
 AtlEvent.h:240
 AtlEvent.h:241
 AtlEvent.h:242
 AtlEvent.h:243
 AtlEvent.h:244
 AtlEvent.h:245
 AtlEvent.h:246
 AtlEvent.h:247
 AtlEvent.h:248
 AtlEvent.h:249
 AtlEvent.h:250
 AtlEvent.h:251
 AtlEvent.h:252
 AtlEvent.h:253
 AtlEvent.h:254
 AtlEvent.h:255
 AtlEvent.h:256
 AtlEvent.h:257
 AtlEvent.h:258
 AtlEvent.h:259
 AtlEvent.h:260
 AtlEvent.h:261
 AtlEvent.h:262
 AtlEvent.h:263
 AtlEvent.h:264
 AtlEvent.h:265
 AtlEvent.h:266
 AtlEvent.h:267
 AtlEvent.h:268
 AtlEvent.h:269
 AtlEvent.h:270
 AtlEvent.h:271
 AtlEvent.h:272
 AtlEvent.h:273
 AtlEvent.h:274
 AtlEvent.h:275
 AtlEvent.h:276
 AtlEvent.h:277
 AtlEvent.h:278
 AtlEvent.h:279
 AtlEvent.h:280
 AtlEvent.h:281
 AtlEvent.h:282
 AtlEvent.h:283
 AtlEvent.h:284
 AtlEvent.h:285
 AtlEvent.h:286
 AtlEvent.h:287
 AtlEvent.h:288
 AtlEvent.h:289
 AtlEvent.h:290
 AtlEvent.h:291
 AtlEvent.h:292
 AtlEvent.h:293
 AtlEvent.h:294
 AtlEvent.h:295
 AtlEvent.h:296
 AtlEvent.h:297
 AtlEvent.h:298
 AtlEvent.h:299
 AtlEvent.h:300
 AtlEvent.h:301
 AtlEvent.h:302
 AtlEvent.h:303
 AtlEvent.h:304
 AtlEvent.h:305
 AtlEvent.h:306
 AtlEvent.h:307
 AtlEvent.h:308
 AtlEvent.h:309
 AtlEvent.h:310
 AtlEvent.h:311
 AtlEvent.h:312
 AtlEvent.h:313
 AtlEvent.h:314
 AtlEvent.h:315
 AtlEvent.h:316
 AtlEvent.h:317
 AtlEvent.h:318
 AtlEvent.h:319
 AtlEvent.h:320
 AtlEvent.h:321
 AtlEvent.h:322
 AtlEvent.h:323
 AtlEvent.h:324
 AtlEvent.h:325
 AtlEvent.h:326
 AtlEvent.h:327
 AtlEvent.h:328
 AtlEvent.h:329
 AtlEvent.h:330
 AtlEvent.h:331
 AtlEvent.h:332
 AtlEvent.h:333
 AtlEvent.h:334
 AtlEvent.h:335
 AtlEvent.h:336
 AtlEvent.h:337
 AtlEvent.h:338
 AtlEvent.h:339
 AtlEvent.h:340
 AtlEvent.h:341
 AtlEvent.h:342
 AtlEvent.h:343
 AtlEvent.h:344
 AtlEvent.h:345
 AtlEvent.h:346
 AtlEvent.h:347
 AtlEvent.h:348
 AtlEvent.h:349
 AtlEvent.h:350
 AtlEvent.h:351
 AtlEvent.h:352
 AtlEvent.h:353
 AtlEvent.h:354
 AtlEvent.h:355
 AtlEvent.h:356
 AtlEvent.h:357
 AtlEvent.h:358
 AtlEvent.h:359
 AtlEvent.h:360
 AtlEvent.h:361
 AtlEvent.h:362
 AtlEvent.h:363
 AtlEvent.h:364
 AtlEvent.h:365
 AtlEvent.h:366
 AtlEvent.h:367
 AtlEvent.h:368
 AtlEvent.h:369
 AtlEvent.h:370
 AtlEvent.h:371
 AtlEvent.h:372
 AtlEvent.h:373
 AtlEvent.h:374
 AtlEvent.h:375
 AtlEvent.h:376
 AtlEvent.h:377
 AtlEvent.h:378
 AtlEvent.h:379
 AtlEvent.h:380
 AtlEvent.h:381
 AtlEvent.h:382
 AtlEvent.h:383
 AtlEvent.h:384
 AtlEvent.h:385
 AtlEvent.h:386
 AtlEvent.h:387
 AtlEvent.h:388
 AtlEvent.h:389
 AtlEvent.h:390
 AtlEvent.h:391
 AtlEvent.h:392
 AtlEvent.h:393
 AtlEvent.h:394
 AtlEvent.h:395
 AtlEvent.h:396
 AtlEvent.h:397
 AtlEvent.h:398
 AtlEvent.h:399
 AtlEvent.h:400
 AtlEvent.h:401
 AtlEvent.h:402
 AtlEvent.h:403
 AtlEvent.h:404
 AtlEvent.h:405
 AtlEvent.h:406
 AtlEvent.h:407
 AtlEvent.h:408
 AtlEvent.h:409
 AtlEvent.h:410
 AtlEvent.h:411
 AtlEvent.h:412
 AtlEvent.h:413
 AtlEvent.h:414
 AtlEvent.h:415
 AtlEvent.h:416
 AtlEvent.h:417
 AtlEvent.h:418
 AtlEvent.h:419
 AtlEvent.h:420
 AtlEvent.h:421
 AtlEvent.h:422
 AtlEvent.h:423
 AtlEvent.h:424
 AtlEvent.h:425
 AtlEvent.h:426
 AtlEvent.h:427
 AtlEvent.h:428
 AtlEvent.h:429
 AtlEvent.h:430
 AtlEvent.h:431
 AtlEvent.h:432
 AtlEvent.h:433
 AtlEvent.h:434
 AtlEvent.h:435
 AtlEvent.h:436
 AtlEvent.h:437
 AtlEvent.h:438
 AtlEvent.h:439
 AtlEvent.h:440
 AtlEvent.h:441
 AtlEvent.h:442
 AtlEvent.h:443
 AtlEvent.h:444
 AtlEvent.h:445
 AtlEvent.h:446
 AtlEvent.h:447
 AtlEvent.h:448
 AtlEvent.h:449
 AtlEvent.h:450
 AtlEvent.h:451
 AtlEvent.h:452
 AtlEvent.h:453
 AtlEvent.h:454
 AtlEvent.h:455
 AtlEvent.h:456
 AtlEvent.h:457
 AtlEvent.h:458
 AtlEvent.h:459
 AtlEvent.h:460
 AtlEvent.h:461
 AtlEvent.h:462
 AtlEvent.h:463
 AtlEvent.h:464
 AtlEvent.h:465
 AtlEvent.h:466
 AtlEvent.h:467
 AtlEvent.h:468
 AtlEvent.h:469
 AtlEvent.h:470
 AtlEvent.h:471
 AtlEvent.h:472
 AtlEvent.h:473
 AtlEvent.h:474
 AtlEvent.h:475
 AtlEvent.h:476
 AtlEvent.h:477
 AtlEvent.h:478
 AtlEvent.h:479
 AtlEvent.h:480
 AtlEvent.h:481
 AtlEvent.h:482
 AtlEvent.h:483
 AtlEvent.h:484
 AtlEvent.h:485
 AtlEvent.h:486
 AtlEvent.h:487
 AtlEvent.h:488
 AtlEvent.h:489
 AtlEvent.h:490
 AtlEvent.h:491
 AtlEvent.h:492
 AtlEvent.h:493
 AtlEvent.h:494
 AtlEvent.h:495
 AtlEvent.h:496
 AtlEvent.h:497
 AtlEvent.h:498
 AtlEvent.h:499
 AtlEvent.h:500
 AtlEvent.h:501
 AtlEvent.h:502
 AtlEvent.h:503
 AtlEvent.h:504
 AtlEvent.h:505
 AtlEvent.h:506
 AtlEvent.h:507
 AtlEvent.h:508
 AtlEvent.h:509
 AtlEvent.h:510
 AtlEvent.h:511
 AtlEvent.h:512
 AtlEvent.h:513
 AtlEvent.h:514
 AtlEvent.h:515
 AtlEvent.h:516
 AtlEvent.h:517
 AtlEvent.h:518
 AtlEvent.h:519
 AtlEvent.h:520
 AtlEvent.h:521
 AtlEvent.h:522
 AtlEvent.h:523
 AtlEvent.h:524
 AtlEvent.h:525
 AtlEvent.h:526
 AtlEvent.h:527
 AtlEvent.h:528
 AtlEvent.h:529
 AtlEvent.h:530
 AtlEvent.h:531
 AtlEvent.h:532
 AtlEvent.h:533
 AtlEvent.h:534
 AtlEvent.h:535
 AtlEvent.h:536
 AtlEvent.h:537
 AtlEvent.h:538
 AtlEvent.h:539
 AtlEvent.h:540
 AtlEvent.h:541
 AtlEvent.h:542
 AtlEvent.h:543
 AtlEvent.h:544
 AtlEvent.h:545
 AtlEvent.h:546
 AtlEvent.h:547
 AtlEvent.h:548
 AtlEvent.h:549
 AtlEvent.h:550
 AtlEvent.h:551
 AtlEvent.h:552
 AtlEvent.h:553
 AtlEvent.h:554
 AtlEvent.h:555
 AtlEvent.h:556
 AtlEvent.h:557
 AtlEvent.h:558
 AtlEvent.h:559
 AtlEvent.h:560
 AtlEvent.h:561
 AtlEvent.h:562
 AtlEvent.h:563
 AtlEvent.h:564
 AtlEvent.h:565
 AtlEvent.h:566
 AtlEvent.h:567
 AtlEvent.h:568
 AtlEvent.h:569
 AtlEvent.h:570
 AtlEvent.h:571
 AtlEvent.h:572
 AtlEvent.h:573
 AtlEvent.h:574
 AtlEvent.h:575
 AtlEvent.h:576
 AtlEvent.h:577
 AtlEvent.h:578
 AtlEvent.h:579
 AtlEvent.h:580
 AtlEvent.h:581
 AtlEvent.h:582
 AtlEvent.h:583
 AtlEvent.h:584
 AtlEvent.h:585
 AtlEvent.h:586
 AtlEvent.h:587
 AtlEvent.h:588
 AtlEvent.h:589
 AtlEvent.h:590
 AtlEvent.h:591
 AtlEvent.h:592
 AtlEvent.h:593
 AtlEvent.h:594
 AtlEvent.h:595
 AtlEvent.h:596
 AtlEvent.h:597
 AtlEvent.h:598
 AtlEvent.h:599
 AtlEvent.h:600
 AtlEvent.h:601
 AtlEvent.h:602
 AtlEvent.h:603
 AtlEvent.h:604
 AtlEvent.h:605
 AtlEvent.h:606
 AtlEvent.h:607
 AtlEvent.h:608
 AtlEvent.h:609
 AtlEvent.h:610
 AtlEvent.h:611
 AtlEvent.h:612
 AtlEvent.h:613
 AtlEvent.h:614
 AtlEvent.h:615
 AtlEvent.h:616
 AtlEvent.h:617
 AtlEvent.h:618
 AtlEvent.h:619
 AtlEvent.h:620
 AtlEvent.h:621
 AtlEvent.h:622
 AtlEvent.h:623
 AtlEvent.h:624
 AtlEvent.h:625
 AtlEvent.h:626
 AtlEvent.h:627
 AtlEvent.h:628
 AtlEvent.h:629
 AtlEvent.h:630
 AtlEvent.h:631
 AtlEvent.h:632
 AtlEvent.h:633
 AtlEvent.h:634
 AtlEvent.h:635
 AtlEvent.h:636
 AtlEvent.h:637
 AtlEvent.h:638
 AtlEvent.h:639
 AtlEvent.h:640
 AtlEvent.h:641
 AtlEvent.h:642
 AtlEvent.h:643
 AtlEvent.h:644
 AtlEvent.h:645
 AtlEvent.h:646
 AtlEvent.h:647
 AtlEvent.h:648
 AtlEvent.h:649
 AtlEvent.h:650
 AtlEvent.h:651
 AtlEvent.h:652
 AtlEvent.h:653
 AtlEvent.h:654
 AtlEvent.h:655
 AtlEvent.h:656
 AtlEvent.h:657
 AtlEvent.h:658
 AtlEvent.h:659
 AtlEvent.h:660
 AtlEvent.h:661
 AtlEvent.h:662
 AtlEvent.h:663
 AtlEvent.h:664
 AtlEvent.h:665
 AtlEvent.h:666
 AtlEvent.h:667
 AtlEvent.h:668
 AtlEvent.h:669
 AtlEvent.h:670
 AtlEvent.h:671
 AtlEvent.h:672
 AtlEvent.h:673
 AtlEvent.h:674
 AtlEvent.h:675
 AtlEvent.h:676
 AtlEvent.h:677
 AtlEvent.h:678
 AtlEvent.h:679
 AtlEvent.h:680
 AtlEvent.h:681
 AtlEvent.h:682
 AtlEvent.h:683
 AtlEvent.h:684
 AtlEvent.h:685
 AtlEvent.h:686
 AtlEvent.h:687
 AtlEvent.h:688
 AtlEvent.h:689
 AtlEvent.h:690
 AtlEvent.h:691
 AtlEvent.h:692
 AtlEvent.h:693
 AtlEvent.h:694
 AtlEvent.h:695
 AtlEvent.h:696
 AtlEvent.h:697
 AtlEvent.h:698
 AtlEvent.h:699
 AtlEvent.h:700
 AtlEvent.h:701
 AtlEvent.h:702
 AtlEvent.h:703
 AtlEvent.h:704
 AtlEvent.h:705
 AtlEvent.h:706
 AtlEvent.h:707
 AtlEvent.h:708
 AtlEvent.h:709
 AtlEvent.h:710
 AtlEvent.h:711
 AtlEvent.h:712
 AtlEvent.h:713
 AtlEvent.h:714
 AtlEvent.h:715
 AtlEvent.h:716
 AtlEvent.h:717
 AtlEvent.h:718
 AtlEvent.h:719
 AtlEvent.h:720
 AtlEvent.h:721
 AtlEvent.h:722
 AtlEvent.h:723
 AtlEvent.h:724
 AtlEvent.h:725
 AtlEvent.h:726
 AtlEvent.h:727
 AtlEvent.h:728
 AtlEvent.h:729
 AtlEvent.h:730
 AtlEvent.h:731
 AtlEvent.h:732
 AtlEvent.h:733
 AtlEvent.h:734
 AtlEvent.h:735
 AtlEvent.h:736
 AtlEvent.h:737
 AtlEvent.h:738
 AtlEvent.h:739
 AtlEvent.h:740
 AtlEvent.h:741
 AtlEvent.h:742
 AtlEvent.h:743
 AtlEvent.h:744
 AtlEvent.h:745
 AtlEvent.h:746
 AtlEvent.h:747
 AtlEvent.h:748
 AtlEvent.h:749
 AtlEvent.h:750
 AtlEvent.h:751
 AtlEvent.h:752
 AtlEvent.h:753
 AtlEvent.h:754
 AtlEvent.h:755
 AtlEvent.h:756
 AtlEvent.h:757
 AtlEvent.h:758
 AtlEvent.h:759
 AtlEvent.h:760
 AtlEvent.h:761
 AtlEvent.h:762
 AtlEvent.h:763
 AtlEvent.h:764
 AtlEvent.h:765
 AtlEvent.h:766
 AtlEvent.h:767
 AtlEvent.h:768
 AtlEvent.h:769
 AtlEvent.h:770
 AtlEvent.h:771
 AtlEvent.h:772
 AtlEvent.h:773
 AtlEvent.h:774
 AtlEvent.h:775