//  
// Author: Thomas Kintscher <mailto: kintscher@physik.hu-berlin.de>
// Update: $Id: AtlK0StarFinder.h,v 1.4 2015/08/25 11:36:08 mergelm Exp $
// Copyright: 2010 (C) Thomas Kintscher
//
#ifndef ATLAS_AtlK0StarFinder
#define ATLAS_AtlK0StarFinder
#ifndef ATLAS_AtlKinFitterTool
#include <AtlKinFitterTool.h>
#include <TH1F.h>
#include <TH2F.h>
#endif
#include <fstream>

class TH1F;
class TH2F;
class AtlEvent;
class TTree;
class TString;
class TROOT;
class TFile;

class AtlK0StarFinder : public AtlKinFitterTool {

  public:
    enum EMode { kCutBased, kKinFit };
    EMode fMode;                       // Indicate the analysis mode (cut-based or using the kinematic fitter)
    Bool_t fDebug;                     // Toggle debug output (prints failed truth matching results)

  private:
    ofstream fDebugStream;             // Debug output

    // Lambda -> p pi(signal)
    TH1F *fHistK0Starreco_m_kaon_pi;
    TH1F *fHistLambdareco_m_PPi;       // Reconstructed invariant mass of the Lambda decaying into proton+pion
    TH1F *fHistLambdareco_m_PiPi;      // Reconstructed invariant mass with pion+pion hypothesis
    TH1F *fHistLambdareco_m_ee;        // Reconstructed invariant mass with ee hypothesis
    TH1F *fHistLambdareco_pt_PPi;      // Reconstructed azimuth angle of the Lambda decaying into proton+pion
    TH1F *fHistLambdareco_phi_PPi;     // Reconstructed Pt of the Lambda decaying into proton+pion
    TH1F *fHistLambdareco_eta_PPi;     // Reconstructed Eta of the Lambda decaying into proton+pion
    TH1F *fHistLambdareco_N_PPi;       // Multilplicity of reconstructed Lambda decaying into proton+pion-r
    TH1F *fHistLambdareco_tau_PPi;     // Lifetime of reconstructed lambdas
    TH2F *fHistLambdareco_truth_PPi;   // Pdg codes of truth-matched particles
    TH1F *fHistLambdareco_R_vtx;       // radial distance from vertex to beam pipe
    TH1F *fHistLambdareco_src_div;     // Angular divergence of lambda source and primary vertex
    TH1F *fHistLambdareco_tdcy_len;    // Transverse decay length of lambda
    TH1F *fHistLambdareco_oangle;      // Opening angle between proton/pion
    TH1F *fHistLambdareco_dangle;      // Decay angle between proton/pion (in lambda frame)

    TH1F *fHistLambdareco_Proton_pt;   // reconstructed pt  of proton
    TH1F *fHistLambdareco_Pion_pt;     // reconstructed pt  of pion
    TH1F *fHistLambdareco_Proton_eta;  // reconstructed eta of proton 
    TH1F *fHistLambdareco_Pion_eta;    // reconstructed eta of pion
    TH1F *fHistLambdareco_Proton_phi;  // reconstructed phi of proton  
    TH1F *fHistLambdareco_Pion_phi;    // reconstructed phi of pion

    TH1F *fHistLambdareco_Piplus_pt;   // reconstructed pt  of pion+
    TH1F *fHistLambdareco_Piplus_eta;  // reconstructed eta of pion+
    TH1F *fHistLambdareco_Piplus_phi;  // reconstructed phi of pion+
    TH1F *fHistLambdareco_Piminus_pt;  // reconstructed pt  of pion-
    TH1F *fHistLambdareco_Piminus_eta; // reconstructed eta of pion-
    TH1F *fHistLambdareco_Piminus_phi; // reconstructed phi of pion-

    TH1F *fHistLambdareco_Prplus_pt;   // reconstructed pt  of proton
    TH1F *fHistLambdareco_Prplus_eta;  // reconstructed eta of proton
    TH1F *fHistLambdareco_Prplus_phi;  // reconstructed phi of proton
    TH1F *fHistLambdareco_Prminus_pt;  // reconstructed pt  of antiproton
    TH1F *fHistLambdareco_Prminus_eta; // reconstructed eta of antiproton
    TH1F *fHistLambdareco_Prminus_phi; // reconstructed phi of antiproton
    
    // combinatorial background (same charged particles)
    TList *fBkgLambdaDecays;           // List of combinatorial bkg.

    // Lambda -> pipi(Bkg)
    TH1F *fHistLambdareco_m_PPi_bkg;       // Reconstructed invariant mass of the Lambda decaying into proton+pion
    TH1F *fHistLambdareco_pt_PPi_bkg;      // Reconstructed azimuth angle of the Lambda decaying into proton+pion
    TH1F *fHistLambdareco_phi_PPi_bkg;     // Reconstructed Pt of the Lambda decaying into proton+pion
    TH1F *fHistLambdareco_eta_PPi_bkg;     // Reconstructed Eta of the Lambda decaying into proton+pion
    TH1F *fHistLambdareco_N_PPi_bkg;       // Multiplicity of reconstructed Lambda decaying into proton+pion-r
    TH1F *fHistLambdareco_tau_PPi_bkg;     // Lifetime of reconstructed lambda background
    TH1F *fHistLambdareco_truth_PPi_bkg;   // Pdg codes of truth-matched particles
    TH1F *fHistLambdareco_R_vtx_bkg;       // radial distance from vertex to beam pipe (bkg)
    TH1F *fHistLambdareco_src_div_bkg;     // Angular divergence of lambda source and primary vertex
    TH1F *fHistLambdareco_tdcy_len_bkg;    // Transverse decay length of lambda
    TH1F *fHistLambdareco_oangle_bkg;      // Opening angle between proton/pion
    TH1F *fHistLambdareco_dangle_bkg;      // Decay angle between proton/pion (in lambda frame)

    TH1F *fHistLambdareco_Proton_pt_bkg;   // reconstructed pt  of proton 
    TH1F *fHistLambdareco_Pion_pt_bkg;     // reconstructed pt  of pion  
    TH1F *fHistLambdareco_Proton_eta_bkg;  // reconstructed eta of proton  
    TH1F *fHistLambdareco_Pion_eta_bkg;    // reconstructed eta of pion   
    TH1F *fHistLambdareco_Proton_phi_bkg;  // reconstructed phi of proton   
    TH1F *fHistLambdareco_Pion_phi_bkg;    // reconstructed phi of pion   

    TH1F *fHistLambdareco_Piplus_pt_bkg;   // reconstructed pt  of pion+
    TH1F *fHistLambdareco_Piplus_eta_bkg;  // reconstructed eta of pion+
    TH1F *fHistLambdareco_Piplus_phi_bkg;  // reconstructed phi of pion+
    TH1F *fHistLambdareco_Piminus_pt_bkg;  // reconstructed pt  of pion-
    TH1F *fHistLambdareco_Piminus_eta_bkg; // reconstructed eta of pion-
    TH1F *fHistLambdareco_Piminus_phi_bkg; // reconstructed phi of pion-

    TH1F *fHistLambdareco_Prplus_pt_bkg;   // reconstructed pt  of proton
    TH1F *fHistLambdareco_Prplus_eta_bkg;  // reconstructed eta of proton
    TH1F *fHistLambdareco_Prplus_phi_bkg;  // reconstructed phi of proton
    TH1F *fHistLambdareco_Prminus_pt_bkg;  // reconstructed pt  of antiproton
    TH1F *fHistLambdareco_Prminus_eta_bkg; // reconstructed eta of antiproton
    TH1F *fHistLambdareco_Prminus_phi_bkg; // reconstructed phi of antiproton

    // MC signal and background histos
    TH1F *fHistLambdareco_MC_m;            // reconstructed lambda mass
    TH1F *fHistLambdareco_MC_m_bkg;        // reconstructed lambda mass (bkg)
    TH1F *fHistLambdareco_MC_m_pipi;       // reconstructed lambda mass (pi/pi hypothesis)
    TH1F *fHistLambdareco_MC_m_pipi_bkg;   // reconstructed lambda mass (pi/pi hyp.) (bkg)
    TH1F *fHistLambdareco_MC_m_ppi;        // reconstructed lambda mass (p/pi hypothesis)
    TH1F *fHistLambdareco_MC_m_ppi_bkg;    // reconstructed lambda mass (p/pi hyp.) (bkg)
    TH1F *fHistLambdareco_MC_m_ee;         // reconstructed lambda mass (ee hypothesis)
    TH1F *fHistLambdareco_MC_m_ee_bkg;     // reconstructed lambda mass (ee hyp.) (bkg)
    TH1F *fHistLambdareco_MC_m_pipi_o;     // reconstructed lambda mass (pi/pi hypothesis) (orig. momenta)
    TH1F *fHistLambdareco_MC_m_pipi_o_bkg; // reconstructed lambda mass (pi/pi hyp.) (bkg) (o.m.)
    TH1F *fHistLambdareco_MC_m_ppi_o;      // reconstructed lambda mass (p/pi hypothesis) (o.m.)
    TH1F *fHistLambdareco_MC_m_ppi_o_bkg;  // reconstructed lambda mass (p/pi hyp.) (bkg) (o.m.)
    TH1F *fHistLambdareco_MC_m_ee_o;       // reconstructed lambda mass (ee hypothesis) (o.m.)
    TH1F *fHistLambdareco_MC_m_ee_o_bkg;   // reconstructed lambda mass (ee hyp.) (bkg) (o.m.)
    TH1F *fHistLambdareco_MC_pt;           // reconstructed lambda pt
    TH1F *fHistLambdareco_MC_pt_bkg;       // reconstructed lambda pt (bkg)
    TH1F *fHistLambdareco_MC_phi;          // reconstructed lambda phi
    TH1F *fHistLambdareco_MC_phi_bkg;      // reconstructed lambda phi (bkg)
    TH1F *fHistLambdareco_MC_eta;          // reconstructed lambda eta
    TH1F *fHistLambdareco_MC_eta_bkg;      // reconstructed lambda eta (bkg)
    TH1F *fHistLambdareco_MC_R_vtx;        // reconstructed lambda radius
    TH1F *fHistLambdareco_MC_R_vtx_bkg;    // reconstructed lambda radius (bkg);
    TH1F *fHistLambdareco_MC_tdcy_len;     // reconstructed lambda transverse decay length
    TH1F *fHistLambdareco_MC_tdcy_len_bkg; // reconstructed lambda transverse decay length (bkg)
    TH1F *fHistLambdareco_MC_tau;          // reconstructed lambda lifetime
    TH1F *fHistLambdareco_MC_tau_bkg;      // reconstructed lambda lifetime (bkg)
    TH1F *fHistLambdareco_MC_src_div;      // reconstructed lambda angle to primary vtx
    TH1F *fHistLambdareco_MC_src_div_bkg;  // reconstructed lambda angle to primary vtx (bkg)
    TH1F *fHistLambdareco_MC_dangle;       // reconstructed lambda decay angle
    TH1F *fHistLambdareco_MC_dangle_bkg;   // reconstructed lambda decay angle (bkg)
    TH1F *fHistLambdareco_MC_oangle;       // reconstructed lambda opening angle
    TH1F *fHistLambdareco_MC_oangle_bkg;   // reconstructed lambda opening angle (bkg)

    TH2F *fHistLambdareco_MC_m_dangle;
    TH2F *fHistLambdareco_MC_m_dangle_bkg;

    // Misc. stuff
    TH1F *fHistLambdareco_chi2_vtx;        // Chi2/NDoF of vertex fits
    TH1F *fHistLambdareco_chi2_trk;        // Chi2/NDoF of track fits
    TH1F *fHistLambdareco_prob_mc;         // Truth matching probabilities
    TH1F *fHistLambdareco_eff;             // Efficiency histogram

    Int_t fN_MCFail;                       // how often did the truth matching fail
    Int_t fN_Fits;                         // count of successful fits
    Int_t fN_MCProbMiss;                   // how often was truth matching prob below threshold
    Int_t fN_SameOriginMiss;               // count of truth matched tracks with different mother

public:
    // selection cuts
    Float_t              fSignal_Pt_min;          // Min. Pt of signal pion/proton
    Float_t              fSignal_Pt_max;          // Max. Pt of signal pion/proton
    Float_t              fSignal_Eta_min;         // Min. eta of signal pion/proton
    Float_t              fSignal_Eta_max;         // Max. eta of signal pion/proton

    Float_t              fLambda_M_min;               // Lower boundary for allowed Lambda mass range
    Float_t              fLambda_M_max;               // Upper boundary for allowed Lambda mass range
    Float_t              fm_e;                        // Electron mass hypothesis
    Float_t              fm_lambda;                   // Lambda mass hypothesis
    Float_t              fm_pi;                       // Pion mass hypothesis
    Float_t              fm_proton;                   // Proton mass hypothesis
    Float_t              fm_kaon;

    Float_t              fAngleToPrimary_max;         // Maximum angle divergence to primary vertex
    Float_t              fVertexChi2ovNDoF_max;       // Quality of vertex fit
    Float_t              fTrackChi2ovNDoF_max;        // Quality of track fit
    Float_t              fKinFitPvalue_min;           // Quality of kinematic fit
    Float_t              fMatchingProb_min;           // Quality of truth matching
    Float_t              fPhotonMass_max;             // Maximum invariant mass of e+/e- test

    TKinFitter PerformFit(AtlIDTrack *trk1, AtlIDTrack *trk2, TLorentzVector &FitP_trk1, TLorentzVector &FitP_trk2, 
              TMatrixD *cov_trk1, TMatrixD *cov_trk2);
    Int_t DoTruthMatch(AtlIDTrack *trk1, AtlIDTrack *trk2, HepVertex *Vtx);
    void FillMCHistograms(AtlLambdaDecayPPi *decay, Bool_t signal);
    Bool_t IsConversionVertex(HepVertex *vtx);
    Bool_t IsKaonVertex(HepVertex *vtx);
    Bool_t IsLambdaVertex(HepVertex *vtx);
    
public:
    AtlK0StarFinder(const char* name, const char* title);
    virtual ~AtlK0StarFinder();
    virtual void SetBranchStatus();
    virtual void BookHistograms();
    virtual void FillHistograms();
    virtual void SetCutDefaults();
    virtual Bool_t AnalyzeEvent();
    void ReconstructLambdaCutBased(void);
    void ReconstructLambdaKinFit(void);
    void PrintCutValues(void);
    void Terminate();
    Double_t GetModifiedEventWeight();

    inline void SetMode(EMode mode = kKinFit) { fMode = mode; }
    void SetDebugOutput(Bool_t mode = kFALSE) { fDebug = mode; }
    inline Bool_t IsDebugRun() { return fDebug; }

    ClassDef(AtlK0StarFinder,0) // Lambda decay finder class
};
#endif

 AtlK0StarFinder.h:1
 AtlK0StarFinder.h:2
 AtlK0StarFinder.h:3
 AtlK0StarFinder.h:4
 AtlK0StarFinder.h:5
 AtlK0StarFinder.h:6
 AtlK0StarFinder.h:7
 AtlK0StarFinder.h:8
 AtlK0StarFinder.h:9
 AtlK0StarFinder.h:10
 AtlK0StarFinder.h:11
 AtlK0StarFinder.h:12
 AtlK0StarFinder.h:13
 AtlK0StarFinder.h:14
 AtlK0StarFinder.h:15
 AtlK0StarFinder.h:16
 AtlK0StarFinder.h:17
 AtlK0StarFinder.h:18
 AtlK0StarFinder.h:19
 AtlK0StarFinder.h:20
 AtlK0StarFinder.h:21
 AtlK0StarFinder.h:22
 AtlK0StarFinder.h:23
 AtlK0StarFinder.h:24
 AtlK0StarFinder.h:25
 AtlK0StarFinder.h:26
 AtlK0StarFinder.h:27
 AtlK0StarFinder.h:28
 AtlK0StarFinder.h:29
 AtlK0StarFinder.h:30
 AtlK0StarFinder.h:31
 AtlK0StarFinder.h:32
 AtlK0StarFinder.h:33
 AtlK0StarFinder.h:34
 AtlK0StarFinder.h:35
 AtlK0StarFinder.h:36
 AtlK0StarFinder.h:37
 AtlK0StarFinder.h:38
 AtlK0StarFinder.h:39
 AtlK0StarFinder.h:40
 AtlK0StarFinder.h:41
 AtlK0StarFinder.h:42
 AtlK0StarFinder.h:43
 AtlK0StarFinder.h:44
 AtlK0StarFinder.h:45
 AtlK0StarFinder.h:46
 AtlK0StarFinder.h:47
 AtlK0StarFinder.h:48
 AtlK0StarFinder.h:49
 AtlK0StarFinder.h:50
 AtlK0StarFinder.h:51
 AtlK0StarFinder.h:52
 AtlK0StarFinder.h:53
 AtlK0StarFinder.h:54
 AtlK0StarFinder.h:55
 AtlK0StarFinder.h:56
 AtlK0StarFinder.h:57
 AtlK0StarFinder.h:58
 AtlK0StarFinder.h:59
 AtlK0StarFinder.h:60
 AtlK0StarFinder.h:61
 AtlK0StarFinder.h:62
 AtlK0StarFinder.h:63
 AtlK0StarFinder.h:64
 AtlK0StarFinder.h:65
 AtlK0StarFinder.h:66
 AtlK0StarFinder.h:67
 AtlK0StarFinder.h:68
 AtlK0StarFinder.h:69
 AtlK0StarFinder.h:70
 AtlK0StarFinder.h:71
 AtlK0StarFinder.h:72
 AtlK0StarFinder.h:73
 AtlK0StarFinder.h:74
 AtlK0StarFinder.h:75
 AtlK0StarFinder.h:76
 AtlK0StarFinder.h:77
 AtlK0StarFinder.h:78
 AtlK0StarFinder.h:79
 AtlK0StarFinder.h:80
 AtlK0StarFinder.h:81
 AtlK0StarFinder.h:82
 AtlK0StarFinder.h:83
 AtlK0StarFinder.h:84
 AtlK0StarFinder.h:85
 AtlK0StarFinder.h:86
 AtlK0StarFinder.h:87
 AtlK0StarFinder.h:88
 AtlK0StarFinder.h:89
 AtlK0StarFinder.h:90
 AtlK0StarFinder.h:91
 AtlK0StarFinder.h:92
 AtlK0StarFinder.h:93
 AtlK0StarFinder.h:94
 AtlK0StarFinder.h:95
 AtlK0StarFinder.h:96
 AtlK0StarFinder.h:97
 AtlK0StarFinder.h:98
 AtlK0StarFinder.h:99
 AtlK0StarFinder.h:100
 AtlK0StarFinder.h:101
 AtlK0StarFinder.h:102
 AtlK0StarFinder.h:103
 AtlK0StarFinder.h:104
 AtlK0StarFinder.h:105
 AtlK0StarFinder.h:106
 AtlK0StarFinder.h:107
 AtlK0StarFinder.h:108
 AtlK0StarFinder.h:109
 AtlK0StarFinder.h:110
 AtlK0StarFinder.h:111
 AtlK0StarFinder.h:112
 AtlK0StarFinder.h:113
 AtlK0StarFinder.h:114
 AtlK0StarFinder.h:115
 AtlK0StarFinder.h:116
 AtlK0StarFinder.h:117
 AtlK0StarFinder.h:118
 AtlK0StarFinder.h:119
 AtlK0StarFinder.h:120
 AtlK0StarFinder.h:121
 AtlK0StarFinder.h:122
 AtlK0StarFinder.h:123
 AtlK0StarFinder.h:124
 AtlK0StarFinder.h:125
 AtlK0StarFinder.h:126
 AtlK0StarFinder.h:127
 AtlK0StarFinder.h:128
 AtlK0StarFinder.h:129
 AtlK0StarFinder.h:130
 AtlK0StarFinder.h:131
 AtlK0StarFinder.h:132
 AtlK0StarFinder.h:133
 AtlK0StarFinder.h:134
 AtlK0StarFinder.h:135
 AtlK0StarFinder.h:136
 AtlK0StarFinder.h:137
 AtlK0StarFinder.h:138
 AtlK0StarFinder.h:139
 AtlK0StarFinder.h:140
 AtlK0StarFinder.h:141
 AtlK0StarFinder.h:142
 AtlK0StarFinder.h:143
 AtlK0StarFinder.h:144
 AtlK0StarFinder.h:145
 AtlK0StarFinder.h:146
 AtlK0StarFinder.h:147
 AtlK0StarFinder.h:148
 AtlK0StarFinder.h:149
 AtlK0StarFinder.h:150
 AtlK0StarFinder.h:151
 AtlK0StarFinder.h:152
 AtlK0StarFinder.h:153
 AtlK0StarFinder.h:154
 AtlK0StarFinder.h:155
 AtlK0StarFinder.h:156
 AtlK0StarFinder.h:157
 AtlK0StarFinder.h:158
 AtlK0StarFinder.h:159
 AtlK0StarFinder.h:160
 AtlK0StarFinder.h:161
 AtlK0StarFinder.h:162
 AtlK0StarFinder.h:163
 AtlK0StarFinder.h:164
 AtlK0StarFinder.h:165
 AtlK0StarFinder.h:166
 AtlK0StarFinder.h:167
 AtlK0StarFinder.h:168
 AtlK0StarFinder.h:169
 AtlK0StarFinder.h:170
 AtlK0StarFinder.h:171
 AtlK0StarFinder.h:172
 AtlK0StarFinder.h:173
 AtlK0StarFinder.h:174
 AtlK0StarFinder.h:175
 AtlK0StarFinder.h:176
 AtlK0StarFinder.h:177
 AtlK0StarFinder.h:178
 AtlK0StarFinder.h:179
 AtlK0StarFinder.h:180
 AtlK0StarFinder.h:181
 AtlK0StarFinder.h:182
 AtlK0StarFinder.h:183
 AtlK0StarFinder.h:184
 AtlK0StarFinder.h:185
 AtlK0StarFinder.h:186
 AtlK0StarFinder.h:187
 AtlK0StarFinder.h:188
 AtlK0StarFinder.h:189
 AtlK0StarFinder.h:190
 AtlK0StarFinder.h:191
 AtlK0StarFinder.h:192
 AtlK0StarFinder.h:193
 AtlK0StarFinder.h:194
 AtlK0StarFinder.h:195
 AtlK0StarFinder.h:196
 AtlK0StarFinder.h:197
 AtlK0StarFinder.h:198
 AtlK0StarFinder.h:199
 AtlK0StarFinder.h:200
 AtlK0StarFinder.h:201
 AtlK0StarFinder.h:202
 AtlK0StarFinder.h:203
 AtlK0StarFinder.h:204
 AtlK0StarFinder.h:205
 AtlK0StarFinder.h:206
 AtlK0StarFinder.h:207
 AtlK0StarFinder.h:208