#ifndef ATLAS_AtlKinFitterTool
#define ATLAS_AtlKinFitterTool
#ifndef ATLAS_AtlAnalysisTool
#include <AtlAnalysisTool.h>
#endif
#ifndef ROOT_TMatrixD
#include <TMatrixD.h>
#endif
#ifndef ROOT_TRandom3
#include <TRandom3.h>
#endif
#ifndef TFITPARTICLEPXPYPZ_H
#include <TFitParticlePxPyPz.h>
#endif
#ifndef TFITPARTICLERELPXPYPZ_H
#include <TFitParticleRelPxPyPz.h>
#endif
#ifndef TFITPARTICLEPTETAPHI_H
#include <TFitParticlePtEtaPhi.h>
#endif
#ifndef TFITPARTICLEPTHETAPHI_H
#include <TFitParticlePThetaPhi.h>
#endif
#ifndef TFITPARTICLEPTTHETAPHI_H
#include <TFitParticlePtThetaPhi.h>
#endif
#ifndef TFITPARTICLEPINVTHETAPHI_H
#include <TFitParticlePInvThetaPhi.h>
#endif
#ifndef TFITPARTICLERELPTETAPHI_H
#include <TFitParticleRelPtEtaPhi.h>
#endif
#ifndef TFITPARTICLEPTETAPHIE_H
#include <TFitParticlePtEtaPhiE.h>
#endif
#ifndef TFITPARTICLERELPTETAPHIE_H
#include <TFitParticleRelPtEtaPhiE.h>
#endif
#ifndef TFITCONSTRAINTM_H
#include <TFitConstraintM.h>
#endif
#ifndef TKINFITTER_H
#include <TKinFitter.h>
#endif
#ifndef TABSFITCONSTRAINT_H
#include <TAbsFitConstraint.h>
#endif
#ifndef TFITCONSTRAINTPT_H
#include <TFitConstraintPt.h>
#endif
#ifndef TFITCONSTRAINTMGAUS_H
#include <TFitConstraintMGaus.h>
#endif
#ifndef TFITCONSTRAINTMBW_H
#include <TFitConstraintMBW.h>
#endif
#ifndef TFITCONSTRAINTMBW2_H
#include <TFitConstraintMBW2.h>
#endif
#ifndef TFITCONSTRAINTEPGAUS_H
#include <TFitConstraintEpGaus.h>
#endif
#ifndef TFITCONSTRAINTEP_H
#include <TFitConstraintEp.h>
#endif
#ifndef ROOT_TH1I
#include <TH1I.h>
#endif
class TFile;
class TH1F;
class TH2F;
class TLorentzVector;
class TGraph;
class TGraphAsymmErrors;
class AtlKinFitterTool : public AtlAnalysisTool {
public:
enum EMode {
kCutBased = BIT(0),
kKinFit = BIT(1),
kAll = (kCutBased | kKinFit)
};
enum EModeMass { kGauss, kBW };
protected:
TKinFitter *fKinFitter;
Float_t fChi2;
Int_t fNDoF;
Int_t fNbIter;
Double_t fConsValue;
Int_t fAbundanceTrue;
TRandom3 *randnr;
static const char* fgStatusNames[];
TH1F *fhist_CovMatrix_el_11;
TH1F *fhist_CovMatrix_el_12;
TH1F *fhist_CovMatrix_el_21;
TH1F *fhist_CovMatrix_el_13;
TH1F *fhist_CovMatrix_el_31;
TH1F *fhist_CovMatrix_el_22;
TH1F *fhist_CovMatrix_el_23;
TH1F *fhist_CovMatrix_el_32;
TH1F *fhist_CovMatrix_el_33;
TH1F *fhist_CovMatrix_mu_11;
TH1F *fhist_CovMatrix_mu_12;
TH1F *fhist_CovMatrix_mu_21;
TH1F *fhist_CovMatrix_mu_13;
TH1F *fhist_CovMatrix_mu_31;
TH1F *fhist_CovMatrix_mu_22;
TH1F *fhist_CovMatrix_mu_23;
TH1F *fhist_CovMatrix_mu_32;
TH1F *fhist_CovMatrix_mu_33;
TH1F *fHist_KinFit_chi2;
TH1F *fHist_KinFitBkg_chi2;
TH1F *fHist_KinFit_prob;
TH1F *fHist_KinFitBkg_prob;
TH1F *fHist_KinFit_NbIterCand;
TH1F *fHist_KinFit_NbIterAll;
TH1F *fHist_KinFit_ConsValue;
TH1F *fHist_KinFit_NbFitsConverged;
TH1F *fHist_KinFit_NbFitsNotConverged;
TH1F *fHist_KinFit_NbFitsFailedNumerically;
TH1F *fHist_KinFit_KinFitterStatus;
TH1F *fHist_KinFit_Reco;
TH1F *fHist_KinFit_True;
TH1F *fHist_KinFit_NTrueProb;
TH1F *fHist_KinFit_TrueReco;
TH1F *fHist_KinFit_TrueRecoProb;
TH1F *fHist_KinFit_TrueRecoProbGreaterP;
TH1F *fHist_KinFit_RecoProbGreaterP;
TH1F *fHist_KinFit_Efficiency;
TH1F *fHist_KinFit_Purity;
TH1F *fHist_KinFit_PurityProb;
Bool_t fTrueReco;
TH1F *fHistCutFlowWeighted;
TH1F *fHistCutFlowUnweighted;
TH1F *fHistCutFlow2Weighted;
TH1F *fHistCutFlow2Unweighted;
TGraphAsymmErrors *fGraph_KinFit_Efficiency;
TGraphAsymmErrors *fGraph_KinFit_Purity;
TGraphAsymmErrors *fGraph_KinFit_PurityProb;
TGraphAsymmErrors *fGraph_KinFit_EfficiencyProb;
TGraphAsymmErrors *fGraph_KinFit_PurityProbGreaterP;
TGraphAsymmErrors *fGraph_KinFit_EfficiencyProbGreaterP;
Double_t fX_TruthHistograms;
Bool_t fHasLoadedCovMatrices;
TFile *fFileCovMatrices;
TH2F *fHistCovMatJets_EtaEta;
TH2F *fHistCovMatJets_PtPt;
TH2F *fHistCovMatJets_PhiPhi;
TH2F *fHistCovMatJets_PtEta;
TH2F *fHistCovMatJets_PtPhi;
TH2F *fHistCovMatJets_EtaPhi;
TH2F *fHistCovMatEtmiss_EtEt;
TH2F *fHistCovMatEtmiss_PhiPhi;
TH2F *fHistCovMatEtmiss_EtPhi;
public:
EMode fMode;
EModeMass fModeMass;
Bool_t fUseLeptonCovRand;
Double_t fW_Mass;
Double_t fW_Width;
Double_t fB_Mass;
Double_t fTop_Mass;
Double_t fTop_Width;
public:
AtlKinFitterTool(const char* name, const char* title);
virtual ~AtlKinFitterTool();
virtual void SetCutDefaults();
virtual void BookHistograms();
virtual void FillHistograms(Option_t *HistMode);
virtual void FillLeptonCovMatrixHistograms(HepParticle* lepton,TMatrixD& CovLepton);
virtual void Terminate();
void SetCovMatrix(TMatrixD& cov, HepJet *jet,
Double_t sigma_pt, Double_t sigma_eta,Double_t sigma_phi,
Double_t cov_pt_eta, Double_t cov_pt_phi, Double_t cov_eta_phi);
void SetCovMatrix(TMatrixD& cov, HepJet *jet);
void SetCovMatrix(TMatrixD& cov, HepParticle *nu,
Double_t SigmaPt_MET, Double_t SigmaPhi_MET, Double_t Cov_Pt_Phi_MET);
void SetCovMatrix(TMatrixD& cov, HepParticle *nu);
void GetLeptonCovMatRand(HepParticle* lepton,TMatrixD& CovLepton);
void LoadCovMatrices();
void GuessTopDecayNeutrinoEtaE(Double_t& EtaStart, Double_t& EStart, TVector2 Et_Miss,
HepParticle *Lepton, AtlJet *BJet);
inline Float_t GetChi2() const { return fChi2; }
inline Int_t GetNDoF() const { return fNDoF; }
inline Float_t GetChi2overNDoF() const { return fChi2/fNDoF; }
inline Float_t GetNbIter() const { return fNbIter; }
inline Float_t GetConsValue() const { return fConsValue; }
inline Double_t GetBinContent_WeightedCutFlow(Int_t i_bin) {
return fHistCutFlowWeighted->GetBinContent(i_bin);
}
inline Double_t GetBinContent_UnweightedCutFlow(Int_t i_bin) {
return fHistCutFlowUnweighted->GetBinContent(i_bin);
}
inline Double_t GetBinContent_WeightedCutFlow2(Int_t i_bin) {
return fHistCutFlow2Weighted->GetBinContent(i_bin);
}
inline Double_t GetBinContent_UnweightedCutFlow2(Int_t i_bin) {
return fHistCutFlow2Unweighted->GetBinContent(i_bin);
}
inline void SetChi2(Double_t chi2) { fChi2 = chi2; }
inline void SetNDoF(Int_t ndf) { fNDoF = ndf; }
inline void SetNbIter(Int_t nbIter) { fNbIter = nbIter; }
inline void SetConsValue(Double_t cons) { fConsValue = cons; }
inline void SetMode(EMode mode = kKinFit) { fMode = mode; }
inline void SetX_TruthHistograms(Double_t X) { fX_TruthHistograms = X; }
inline void SetTrueReco(Bool_t TrueReco) { fTrueReco = TrueReco; }
inline void SetCutFlow(const char* cut) {
fHistCutFlowWeighted->Fill( cut, GetPreTagEvtWeight() );
fHistCutFlowUnweighted->Fill( cut, 1. );
}
inline void SetCutFlow2(const char* cut) {
fHistCutFlow2Weighted->Fill( cut, GetPreTagEvtWeight() );
fHistCutFlow2Unweighted->Fill( cut, 1.);
}
inline void SetTruthMatchXTitle(const char* XTitle) {
fHist_KinFit_True->GetXaxis()->SetTitle(XTitle);
fHist_KinFit_Reco->GetXaxis()->SetTitle(XTitle);
fHist_KinFit_TrueReco->GetXaxis()->SetTitle(XTitle);
fHist_KinFit_Efficiency->GetXaxis()->SetTitle(XTitle);
fHist_KinFit_Purity->GetXaxis()->SetTitle(XTitle);
}
inline void SetTruthMatchBinning (Int_t Nbins, Double_t xlow, Double_t xup) {
fHist_KinFit_True->SetBins(Nbins, xlow, xup);
fHist_KinFit_Reco->SetBins(Nbins, xlow, xup);
fHist_KinFit_TrueReco->SetBins(Nbins, xlow, xup);
fHist_KinFit_Efficiency->SetBins(Nbins, xlow, xup);
fHist_KinFit_Purity->SetBins(Nbins, xlow, xup);
}
inline void AddAbundanceTrue(Int_t abundance) {
for( Int_t j = 1; j <= 30; j++){
Float_t xBin = fHist_KinFit_NTrueProb->GetBinCenter(j);
for( Int_t i = 1; i <= abundance; i++)
fHist_KinFit_NTrueProb->Fill(xBin,GetPreTagEvtWeight());
}
fAbundanceTrue += abundance;
}
inline Int_t GetAbundanceTrue() {return fAbundanceTrue;}
ClassDef(AtlKinFitterTool,0)
};
#endif