#ifndef ATLAS_AtlK0StarFinder
#include <AtlK0StarFinder.h>
#endif
#include <TH1F.h>
#include <AtlEvent.h>
#include <TTree.h>
#include <TString.h>
#include <iostream>
#include <TROOT.h>
#include <TFile.h>
#include <vector>
#include <iomanip>
using namespace std;
#ifndef __CINT__
ClassImp(AtlK0StarFinder);
#endif
AtlK0StarFinder::AtlK0StarFinder(const char* name, const char* title) :
AtlKinFitterTool(name, title) {
SetMode(kKinFit);
SetDebugOutput(kFALSE);
fBkgLambdaDecays = new TList;
}
AtlK0StarFinder::~AtlK0StarFinder() {
fBkgLambdaDecays->Delete(); delete fBkgLambdaDecays;
if (IsDebugRun() ) fDebugStream.close();
}
void AtlK0StarFinder::SetBranchStatus() {
fTree->SetBranchStatus("fN_IDTracks*", kTRUE);
fTree->SetBranchStatus("fIDTracks*", kTRUE);
fTree->SetBranchStatus("fN_Vertices*", kTRUE);
fTree->SetBranchStatus("fVertices*", kTRUE);
fTree->SetBranchStatus("fN_MCParticles*", kTRUE);
fTree->SetBranchStatus("fMCParticles*", kTRUE);
fTree->SetBranchStatus("fEventHeader*", kTRUE);
}
void AtlK0StarFinder::BookHistograms() {
if ( IsDebugRun() ) fDebugStream.open("DebugOutput.dat");
fN_Fits = 0;
fN_MCFail = 0;
fN_MCProbMiss = 0;
fN_SameOriginMiss = 0;
AtlKinFitterTool::BookHistograms();
SetTruthMatchBinning(30, 1, 30);
PrintCutValues();
gDirectory->mkdir("Signal", "Oppositely charged candidates");
gDirectory->cd("Signal");
gDirectory->mkdir("PPi", "Lambda -> proton+pion");
gDirectory->cd("PPi");
if ( fMode == kCutBased ) {
fHistLambdareco_m_PPi = new TH1F("h_Lambda_m_PPi", "Invariant Lambda mass (Lambda->PPi)", 100, 0.6, 1.6);
} else if ( fMode == kKinFit ) {
fHistLambdareco_m_PPi = new TH1F("h_Lambda_m_PPi", "Invariant Lambda mass (Lambda->PPi)", 1000, 0.6, 1.6);
fHistK0Starreco_m_kaon_pi = new TH1F("h_K0Star_m_kaon_pi", "Invariant mass (something->K pi", 1000, 0.5, 2.0);
}
fHistLambdareco_m_PPi->SetXTitle("m_{Lambda} (GeV)"); fHistLambdareco_m_PPi->SetYTitle("Number of Entries");
fHistK0Starreco_m_kaon_pi->SetXTitle("m_{Something} (GeV)"); fHistK0Starreco_m_kaon_pi->SetYTitle("Number of Entries");
fHistLambdareco_m_PiPi = new TH1F("h_Lambda_m_PiPi", "Invariant mass (* #rightarrow #pi#pi)", 480, 0.0, 1.2);
fHistLambdareco_m_PiPi->SetXTitle("m (Gev)"); fHistLambdareco_m_PiPi->SetYTitle("Number of Entries");
fHistLambdareco_m_ee = new TH1F("h_Lambda_m_ee", "Invariant mass (* #rightarrow e e)", 480, 0.0, 1.2);
fHistLambdareco_m_ee->SetXTitle("m (Gev)"); fHistLambdareco_m_ee->SetYTitle("Number of Entries");
fHistLambdareco_pt_PPi = new TH1F("h_Lambda_pt_PPi", "Lambda-p_{#perp} (Lambda->PPi)", 60, 0, 30);
fHistLambdareco_pt_PPi->SetXTitle("p_{#perp} (GeV)"); fHistLambdareco_pt_PPi->SetYTitle("Number of Entries");
fHistLambdareco_phi_PPi = new TH1F("h_Lambda_phi_PPi", "Lambda #phi distribution (Lambda->PPi)", 128, -3.2, 3.2);
fHistLambdareco_phi_PPi->SetXTitle("#phi (rad)"); fHistLambdareco_phi_PPi->SetYTitle("Number of Entries");
fHistLambdareco_eta_PPi = new TH1F("h_Lambda_eta_PPi", "Lambda #eta distribution (Lambda->PPi)", 100, -3, 3);
fHistLambdareco_eta_PPi->SetXTitle("#eta"); fHistLambdareco_eta_PPi->SetYTitle("Number of Entries");
fHistLambdareco_N_PPi = new TH1F("h_Lambda_N_PPi", "Reconstructed Lambdas per event (Lambda->PPi)", 10, 0, 10);
fHistLambdareco_N_PPi->SetXTitle("N_{Lambda}/evt"); fHistLambdareco_N_PPi->SetYTitle("Number of Entries");
fHistLambdareco_tau_PPi = new TH1F("h_Lambda_tau_PPi", "Reconstructed Lambda lifetime (Lambda->PPi)", 100, 0, 300);
fHistLambdareco_tau_PPi->SetXTitle("#tau (ps)"); fHistLambdareco_tau_PPi->SetYTitle("Number of Entries");
fHistLambdareco_truth_PPi = new TH2F("h_Lambda_truth_PPi", "Pdg Code of truth-matched, reconstructed particles", 6260, -3130, 3130, 50, 0.0, 1.0);
fHistLambdareco_truth_PPi->SetXTitle("Pdg Code"); fHistLambdareco_truth_PPi->SetYTitle("#Chi^{2} Probability");
fHistLambdareco_truth_PPi->SetZTitle("Number of Entries");
fHistLambdareco_R_vtx = new TH1F("h_Lambda_r_vtx", "Radial distance of secondary vertices", 400, 0.0, 100.0);
fHistLambdareco_R_vtx->SetXTitle("r_{#perp} (cm)"); fHistLambdareco_R_vtx->SetYTitle("Number of Entries");
fHistLambdareco_tdcy_len = new TH1F("h_Lambda_tdcy_len", "Transverse #Lambda decay length", 400, 0.0, 100.0);
fHistLambdareco_tdcy_len->SetXTitle("s_{#perp} (cm)");fHistLambdareco_tdcy_len->SetYTitle("Number of Entries");
fHistLambdareco_oangle = new TH1F("h_Lambda_oangle", "Opening angle of p/pi", 256, 0.0, 3.2);
fHistLambdareco_oangle->SetXTitle("#alpha (rad)"); fHistLambdareco_oangle->SetYTitle("Number of Entries");
fHistLambdareco_dangle = new TH1F("h_Lambda_dangle", "Decay angle of p/pi", 256, -1.0, 1.0);
fHistLambdareco_dangle->SetXTitle("cos(#alpha)"); fHistLambdareco_dangle->SetYTitle("Number of Entries");
gDirectory->mkdir("Pion", "Pi from Lambda -> PPi");
gDirectory->cd("Pion");
fHistLambdareco_Pion_pt = new TH1F("h_Lambda_Pion_pt", "#pi: p_{#perp} (Lambda->P#Pi)", 60, 0, 30);
fHistLambdareco_Pion_pt->SetXTitle("p_{#perp} (GeV)"); fHistLambdareco_Pion_pt->SetYTitle("Number of Entries");
fHistLambdareco_Pion_eta = new TH1F("h_Lambda_Pion_eta", "#pi: #eta distribution (Lambda->P#Pi)", 100, -3, 3);
fHistLambdareco_Pion_eta->SetXTitle("#eta"); fHistLambdareco_Pion_eta->SetYTitle("Number of Entries");
fHistLambdareco_Pion_phi = new TH1F("h_Lambda_Pion_phi", "#pi: #phi distribution (Lambda->P#Pi)", 50, -3.14, 3.14);
fHistLambdareco_Pion_phi->SetXTitle("#phi"); fHistLambdareco_Pion_phi->SetYTitle("Number of Entries");
gDirectory->mkdir("Pi_Plus", "Pion(+) from Lambda -> PPi");
gDirectory->cd("Pi_Plus");
fHistLambdareco_Piplus_pt = new TH1F("h_Lambda_Piplus_pt", "#pi^{+}: p_{#perp} (Lambda->P#Pi)", 60, 0, 30);
fHistLambdareco_Piplus_pt->SetXTitle("p_{#perp} (GeV)"); fHistLambdareco_Piplus_pt->SetYTitle("Number of Entries");
fHistLambdareco_Piplus_eta = new TH1F("h_Lambda_Piplus_eta", "#pi^{+}: #eta distribution (Lambda->P#Pi)",100, -3, 3);
fHistLambdareco_Piplus_eta->SetXTitle("#eta"); fHistLambdareco_Piplus_eta->SetYTitle("Number of Entries");
fHistLambdareco_Piplus_phi = new TH1F("h_Lambda_Piplus_phi", "#pi^{+}: #phi distribution (Lambda->P#Pi)",50, -3.14, 3.14);
fHistLambdareco_Piplus_phi->SetXTitle("#phi"); fHistLambdareco_Piplus_phi->SetYTitle("Number of Entries");
gDirectory->cd("../");
gDirectory->mkdir("Pi_Minus", "Pion(-) from Lambda -> PPi");
gDirectory->cd("Pi_Minus");
fHistLambdareco_Piminus_pt = new TH1F("h_Lambda_Piminus_pt", "#pi^{-}: p_{#perp} (Lambda->P#Pi)", 60, 0, 30);
fHistLambdareco_Piminus_pt->SetXTitle("p_{#perp} (GeV)"); fHistLambdareco_Piminus_pt->SetYTitle("Number of Entries");
fHistLambdareco_Piminus_eta = new TH1F("h_Lambda_Piminus_eta", "#pi^{-}: #eta distribution (Lambda->P#Pi)", 100, -3, 3);
fHistLambdareco_Piminus_eta->SetXTitle("#eta"); fHistLambdareco_Piminus_eta->SetYTitle("Number of Entries");
fHistLambdareco_Piminus_phi = new TH1F("h_Lambda_Piminus_phi", "#pi^{-}: #phi distribution (Lambda->P#Pi)", 50, -3.14, 3.14);
fHistLambdareco_Piminus_phi->SetXTitle("#phi"); fHistLambdareco_Piminus_phi->SetYTitle("Number of Entries");
gDirectory->cd("../../");
gDirectory->mkdir("Proton", "Proton from Lambda -> PPi");
gDirectory->cd("Proton");
fHistLambdareco_Proton_pt = new TH1F("h_Lambda_Proton_pt", "Proton: p_{#perp} (Lambda->P#Pi)", 60, 0, 30);
fHistLambdareco_Proton_pt->SetXTitle("p_{#perp} (GeV)"); fHistLambdareco_Proton_pt->SetYTitle("Number of Entries");
fHistLambdareco_Proton_eta = new TH1F("h_Lambda_Proton_eta", "Proton: #eta distribution (Lambda->P#Pi)", 100, -5, 5);
fHistLambdareco_Proton_eta->SetXTitle("#eta"); fHistLambdareco_Proton_eta->SetYTitle("Number of Entries");
fHistLambdareco_Proton_phi = new TH1F("h_Lambda_Proton_phi", "Proton: #phi distribution (Lambda->P#Pi)", 50, -3.14, 3.14);
fHistLambdareco_Proton_phi->SetXTitle("#phi"); fHistLambdareco_Proton_phi->SetYTitle("Number of Entries");
gDirectory->mkdir("Proton_Plus", "Proton(+) from Lambda -> PPi");
gDirectory->cd("Proton_Plus");
fHistLambdareco_Prplus_pt = new TH1F("h_Lambda_Prplus_pt", "Pr^{+} p_{#perp} (Lambda->P#Pi)", 60, 0, 30);
fHistLambdareco_Prplus_pt->SetXTitle("p_{#perp} (GeV)"); fHistLambdareco_Prplus_pt->SetYTitle("Number of Entries");
fHistLambdareco_Prplus_eta = new TH1F("h_Lambda_Prplus_eta", "Pr^{+}: #eta distribution (Lambda->P#Pi)", 100, -5, 5);
fHistLambdareco_Prplus_eta->SetXTitle("#eta"); fHistLambdareco_Prplus_eta->SetYTitle("Number of Entries");
fHistLambdareco_Prplus_phi = new TH1F("h_Lambda_Prplus_phi", "Pr^{+}: #phi distribution (Lambda->P#Pi)", 50, -3.14, 3.14);
fHistLambdareco_Prplus_phi->SetXTitle("#phi"); fHistLambdareco_Prplus_phi->SetYTitle("Number of Entries");
gDirectory->cd("../");
gDirectory->mkdir("Proton_Minus", "Antiproton from Lambda -> PPi");
gDirectory->cd("Proton_Minus");
fHistLambdareco_Prminus_pt = new TH1F("h_Lambda_Prminus_pt", "Pr^{-} p_{#perp} (Lambda->P#Pi)", 60, 0, 30);
fHistLambdareco_Prminus_pt->SetXTitle("p_{#perp} (GeV)"); fHistLambdareco_Prminus_pt->SetYTitle("Number of Entries");
fHistLambdareco_Prminus_eta = new TH1F("h_Lambda_Prminus_eta", "Pr^{-}: #eta distribution (Lambda->P#Pi)", 100, -5, 5);
fHistLambdareco_Prminus_eta->SetXTitle("#eta"); fHistLambdareco_Prminus_eta->SetYTitle("Number of Entries");
fHistLambdareco_Prminus_phi = new TH1F("h_Lambda_Prminus_phi", "Pr^{-}: #phi distribution (Lambda->P#Pi)", 50, -3.14, 3.14);
fHistLambdareco_Prminus_phi->SetXTitle("#phi"); fHistLambdareco_Prminus_phi->SetYTitle("Number of Entries");
gDirectory->cd("../../../../");
gDirectory->mkdir("Background", "Same charged candidates");
gDirectory->cd("Background");
gDirectory->mkdir("PPi", "Lambda' -> proton pion");
gDirectory->cd("PPi");
if ( fMode == kCutBased ) {
fHistLambdareco_m_PPi_bkg = new TH1F("h_Lambda_m_PPi_bkg", "Invariant Lambda' mass (Lambda->PPi)", 2400, 0.0, 1.2);
} else {
fHistLambdareco_m_PPi_bkg = new TH1F("h_Lambda_m_PPi_bkg", "Invariant Lambda' mass (Lambda->PPi)", 50, 1.1, 1.14);
}
fHistLambdareco_m_PPi_bkg->SetXTitle("m_{Lambda} (GeV)"); fHistLambdareco_m_PPi_bkg->SetYTitle("Number of Entries");
fHistLambdareco_pt_PPi_bkg = new TH1F("h_Lambda_pt_PPi_bkg", "Lambda'-p_{#perp} (Lambda->PPi)", 60, 0, 30);
fHistLambdareco_pt_PPi_bkg->SetXTitle("p_{#perp} (GeV)"); fHistLambdareco_pt_PPi_bkg->SetYTitle("Number of Entries");
fHistLambdareco_phi_PPi_bkg = new TH1F("h_Lambda_phi_PPi_bkg", "Lambda' #phi distribution (Lambda->PPi)", 128, -3.2, 3.2);
fHistLambdareco_phi_PPi_bkg->SetXTitle("#phi (rad)"); fHistLambdareco_phi_PPi_bkg->SetYTitle("Number of Entries");
fHistLambdareco_eta_PPi_bkg = new TH1F("h_Lambda_eta_PPi_bkg", "Lambda' #eta distribution (Lambda->PPi)", 100, -3, 3);
fHistLambdareco_eta_PPi_bkg->SetXTitle("#eta"); fHistLambdareco_eta_PPi_bkg->SetYTitle("Number of Entries");
fHistLambdareco_N_PPi_bkg = new TH1F("h_Lambda_N_PPi_bkg", "Reconstructed Lambda' per event (Lambda->PPi)", 10, 0, 10);
fHistLambdareco_N_PPi_bkg->SetXTitle("N_{Lambda}/evt"); fHistLambdareco_N_PPi_bkg->SetYTitle("Number of Entries");
fHistLambdareco_tau_PPi_bkg = new TH1F("h_Lambda_tau_PPi_bkg", "Reconstructed Lambda' lifetime (Lambda->PPi)", 100, 0, 300);
fHistLambdareco_tau_PPi_bkg->SetXTitle("#tau (ps)"); fHistLambdareco_tau_PPi_bkg->SetYTitle("Number of Entries");
fHistLambdareco_truth_PPi_bkg = new TH1F("h_Lambda_truth_PPi_bkg", "Pdg Code of truth-matched, reconstructed particles", 6260, -3130, 3130);
fHistLambdareco_truth_PPi_bkg->SetXTitle("Pdg Code"); fHistLambdareco_truth_PPi_bkg->SetYTitle("Number of Entries");
fHistLambdareco_R_vtx_bkg = new TH1F("h_Lambda_r_vtx_bkg", "Radial distance of secondary vertices", 400, 0.0, 100.0);
fHistLambdareco_R_vtx_bkg->SetXTitle("r_{#perp} (cm)"); fHistLambdareco_R_vtx_bkg->SetYTitle("Number of Entries");
fHistLambdareco_tdcy_len_bkg = new TH1F("h_Lambda_tdcy_len_bkg", "Transverse #Lambda decay length", 400, 0.0, 100.0);
fHistLambdareco_tdcy_len_bkg->SetXTitle("s_{#perp} (cm)");fHistLambdareco_tdcy_len_bkg->SetYTitle("Number of Entries");
fHistLambdareco_oangle_bkg = new TH1F("h_Lambda_oangle_bkg ", "Opening angle of p/pi", 256, 0.0, 3.2);
fHistLambdareco_oangle_bkg ->SetXTitle("#alpha (rad)"); fHistLambdareco_oangle_bkg ->SetYTitle("Number of Entries");
fHistLambdareco_dangle_bkg = new TH1F("h_Lambda_dangle_bkg ", "Decay angle of p/pi", 256, -1.0, 1.0);
fHistLambdareco_dangle_bkg ->SetXTitle("cos(#alpha)"); fHistLambdareco_dangle_bkg ->SetYTitle("Number of Entries");
gDirectory->mkdir("Pion", "Pion from Lambda' -> PPi");
gDirectory->cd("Pion");
fHistLambdareco_Pion_pt_bkg = new TH1F("h_Lambda_Pion_pt_bkg", "#pi: p_{#perp} (Lambda->P#Pi)", 60, 0, 30);
fHistLambdareco_Pion_pt_bkg->SetXTitle("p_{#perp} (GeV)"); fHistLambdareco_Pion_pt_bkg->SetYTitle("Number of Entries");
fHistLambdareco_Pion_eta_bkg = new TH1F("h_Lambda_Pion_eta_bkg", "#pi: #eta distribution (Lambda->P#Pi)", 100, -3, 3);
fHistLambdareco_Pion_eta_bkg->SetXTitle("#eta"); fHistLambdareco_Pion_eta_bkg->SetYTitle("Number of Entries");
fHistLambdareco_Pion_phi_bkg = new TH1F("h_Lambda_Pion_phi_bkg", "#pi: #phi distribution (Lambda->P#Pi)", 50, -3.14, 3.14);
fHistLambdareco_Pion_phi_bkg->SetXTitle("#phi"); fHistLambdareco_Pion_phi_bkg->SetYTitle("Number of Entries");
gDirectory->mkdir("Pi_Plus", "Pion(+) from Lambda' -> PPi");
gDirectory->cd("Pi_Plus");
fHistLambdareco_Piplus_pt_bkg = new TH1F("h_Lambda_Piplus_pt", "#pi^{+}: p_{#perp} (Lambda'->P#Pi)", 60, 0, 30);
fHistLambdareco_Piplus_pt_bkg->SetXTitle("p_{#perp} (GeV)"); fHistLambdareco_Piplus_pt_bkg->SetYTitle("Number of Entries");
fHistLambdareco_Piplus_eta_bkg = new TH1F("h_Lambda_Piplus_eta", "#pi^{+}: #eta distribution (Lambda'->P#Pi)", 100, -3, 3);
fHistLambdareco_Piplus_eta_bkg->SetXTitle("#eta"); fHistLambdareco_Piplus_eta_bkg->SetYTitle("Number of Entries");
fHistLambdareco_Piplus_phi_bkg = new TH1F("h_Lambda_Piplus_phi", "#pi^{+}: #phi distribution (Lambda'->P#Pi)", 50, -3.14, 3.14);
fHistLambdareco_Piplus_phi_bkg->SetXTitle("#phi"); fHistLambdareco_Piplus_phi_bkg->SetYTitle("Number of Entries");
gDirectory->cd("../");
gDirectory->mkdir("Pi_Minus", "Pion(-) from Lambda' -> PPi");
gDirectory->cd("Pi_Minus");
fHistLambdareco_Piminus_pt_bkg = new TH1F("h_Lambda_Piminus_pt", "#pi^{-}: p_{#perp} (Lambda'->P#Pi)", 60, 0, 30);
fHistLambdareco_Piminus_pt_bkg->SetXTitle("p_{#perp} (GeV)"); fHistLambdareco_Piminus_pt_bkg->SetYTitle("Number of Entries");
fHistLambdareco_Piminus_eta_bkg = new TH1F("h_Lambda_Piminus_eta", "#pi^{-}: #eta distribution (Lambda'->P#Pi)", 100, -3, 3);
fHistLambdareco_Piminus_eta_bkg->SetXTitle("#eta"); fHistLambdareco_Piminus_eta_bkg->SetYTitle("Number of Entries");
fHistLambdareco_Piminus_phi_bkg = new TH1F("h_Lambda_Piminus_phi", "#pi^{-}: #phi distribution (Lambda'->P#Pi)", 50, -3.14, 3.14);
fHistLambdareco_Piminus_phi_bkg->SetXTitle("#phi"); fHistLambdareco_Piminus_phi_bkg->SetYTitle("Number of Entries");
gDirectory->cd("../../");
gDirectory->mkdir("Proton", "Proton from Lambda' -> PPi");
gDirectory->cd("Proton");
fHistLambdareco_Proton_pt_bkg = new TH1F("h_Lambda_Proton_pt_bkg", "Proton: p_{#perp} (Lambda'->#Pi#Pi)", 60, 0, 30);
fHistLambdareco_Proton_pt_bkg->SetXTitle("p_{#perp} (GeV)"); fHistLambdareco_Proton_pt_bkg->SetYTitle("Number of Entries");
fHistLambdareco_Proton_eta_bkg = new TH1F("h_Lambda_Proton_eta_bkg", "Proton: #eta distribution (Lambda'->#Pi#Pi)", 100, -5, 5);
fHistLambdareco_Proton_eta_bkg->SetXTitle("#eta"); fHistLambdareco_Proton_eta_bkg->SetYTitle("Number of Entries");
fHistLambdareco_Proton_phi_bkg = new TH1F("h_Lambda_Proton_phi_bkg", "Proton: #phi distribution (Lambda'->#Pi#Pi)", 50, -3.14, 3.14);
fHistLambdareco_Proton_phi_bkg->SetXTitle("#phi"); fHistLambdareco_Proton_phi_bkg->SetYTitle("Number of Entries");
gDirectory->mkdir("Proton_Plus", "Proton(+) from Lambda' -> PPi");
gDirectory->cd("Proton_Plus");
fHistLambdareco_Prplus_pt_bkg = new TH1F("h_Lambda_Prplus_pt", "Pr^{+}: p_{#perp} (Lambda'->P#Pi)", 60, 0, 30);
fHistLambdareco_Prplus_pt_bkg->SetXTitle("p_{#perp} (GeV)"); fHistLambdareco_Prplus_pt->SetYTitle("Number of Entries");
fHistLambdareco_Prplus_eta_bkg = new TH1F("h_Lambda_Prplus_eta", "Pr^{+}: #eta distribution (Lambda'->P#Pi)", 100, -5, 5);
fHistLambdareco_Prplus_eta_bkg->SetXTitle("#eta"); fHistLambdareco_Prplus_eta->SetYTitle("Number of Entries");
fHistLambdareco_Prplus_phi_bkg = new TH1F("h_Lambda_Prplus_phi", "Pr^{+}: #phi distribution (Lambda'->P#Pi)", 50, -3.14, 3.14);
fHistLambdareco_Prplus_phi_bkg->SetXTitle("#phi"); fHistLambdareco_Prplus_phi_bkg->SetYTitle("Number of Entries");
gDirectory->cd("../");
gDirectory->mkdir("Proton_Minus", "Antiproton from Lambda' -> PPi");
gDirectory->cd("Proton_Minus");
fHistLambdareco_Prminus_pt_bkg = new TH1F("h_Lambda_Prminus_pt", "Pr^{-}: p_{#perp} (Lambda'->P#Pi)", 60, 0, 30);
fHistLambdareco_Prminus_pt_bkg->SetXTitle("p_{#perp} (GeV)"); fHistLambdareco_Prminus_pt_bkg->SetYTitle("Number of Entries");
fHistLambdareco_Prminus_eta_bkg = new TH1F("h_Lambda_Prminus_eta", "Pr^{-}: #eta distribution (Lambda'->P#Pi)", 100, -5, 5);
fHistLambdareco_Prminus_eta_bkg->SetXTitle("#eta"); fHistLambdareco_Prminus_eta_bkg->SetYTitle("Number of Entries");
fHistLambdareco_Prminus_phi_bkg = new TH1F("h_Lambda_Prminus_phi", "Pr^{-}: #phi distribution (Lambda'->P#Pi)", 50, -3.14, 3.14);
fHistLambdareco_Prminus_phi_bkg->SetXTitle("#phi"); fHistLambdareco_Prminus_phi_bkg->SetYTitle("Number of Entries");
gDirectory->cd("../../../..");
gDirectory->mkdir("MC_Signal");
gDirectory->cd("MC_Signal");
if ( fMode == kCutBased ) {
fHistLambdareco_MC_m = new TH1F("h_Lambda_MC_m", "Invariant #Lambda mass (MC signal)", 2400, 0.0, 1.2);
} else {
fHistLambdareco_MC_m = new TH1F("h_Lambda_MC_m", "Invariant #Lambda mass (MC signal)", 1000, 0.6, 1.6);
}
fHistLambdareco_MC_m->SetXTitle("m_{#Lambda} (GeV)"); fHistLambdareco_MC_m->SetYTitle("Number of Entries");
fHistLambdareco_MC_m_ppi = new TH1F("h_Lambda_MC_m_ppi", "Invariant mass w/ proton/pion hypothesis (MC signal)", 480, 0.0, 1.2);
fHistLambdareco_MC_m_ppi->SetXTitle("m_{#Lambda} (GeV)"); fHistLambdareco_MC_m_ppi->SetYTitle("Number of Entries");
fHistLambdareco_MC_m_pipi = new TH1F("h_Lambda_MC_m_pipi", "Invariant mass w/ pion/pion hypothesis (MC signal)", 480, 0.0, 1.2);
fHistLambdareco_MC_m_pipi->SetXTitle("m_{#Lambda} (GeV)"); fHistLambdareco_MC_m_pipi->SetYTitle("Number of Entries");
fHistLambdareco_MC_m_ee = new TH1F("h_Lambda_MC_m_ee", "Invariant mass w/ ee hypothesis (MC signal)", 480, 0.0, 1.2);
fHistLambdareco_MC_m_ee->SetXTitle("m_{#Lambda} (GeV)"); fHistLambdareco_MC_m_ee->SetYTitle("Number of Entries");
fHistLambdareco_MC_m_ppi_o = new TH1F("h_Lambda_MC_m_ppi_o", "Invariant mass w/ proton/pion hypothesis (MC signal)", 480, 0.0, 1.2);
fHistLambdareco_MC_m_ppi_o->SetXTitle("m_{#Lambda} (GeV)"); fHistLambdareco_MC_m_ppi_o->SetYTitle("Number of Entries");
fHistLambdareco_MC_m_pipi_o = new TH1F("h_Lambda_MC_m_pipi_o", "Invariant mass w/ pion/pion hypothesis (MC signal)", 480, 0.0, 1.2);
fHistLambdareco_MC_m_pipi_o->SetXTitle("m_{#Lambda} (GeV)"); fHistLambdareco_MC_m_pipi_o->SetYTitle("Number of Entries");
fHistLambdareco_MC_m_ee_o = new TH1F("h_Lambda_MC_m_ee_o", "Invariant mass w/ ee hypothesis (MC signal)", 480, 0.0, 1.2);
fHistLambdareco_MC_m_ee_o->SetXTitle("m_{#Lambda} (GeV)"); fHistLambdareco_MC_m_ee_o->SetYTitle("Number of Entries");
fHistLambdareco_MC_pt = new TH1F("h_Lambda_MC_pt", "Lambda-p_{#perp} (MC signal)", 60, 0, 30);
fHistLambdareco_MC_pt->SetXTitle("p_{#perp} (GeV)"); fHistLambdareco_MC_pt->SetYTitle("Number of Entries");
fHistLambdareco_MC_phi = new TH1F("h_Lambda_MC_phi", "Lambda #phi distribution (MC signal)", 128, -3.2, 3.2);
fHistLambdareco_MC_phi->SetXTitle("#phi (rad)"); fHistLambdareco_MC_phi->SetYTitle("Number of Entries");
fHistLambdareco_MC_eta = new TH1F("h_Lambda_MC_eta", "Lambda #eta distribution (MC signal)", 100, -3, 3);
fHistLambdareco_MC_eta->SetXTitle("#eta"); fHistLambdareco_MC_eta->SetYTitle("Number of Entries");
fHistLambdareco_MC_tau = new TH1F("h_Lambda_MC_tau", "Reconstructed Lambda lifetime (MC signal)", 100, 0, 300);
fHistLambdareco_MC_tau->SetXTitle("#tau (ps)"); fHistLambdareco_MC_tau->SetYTitle("Number of Entries");
fHistLambdareco_MC_src_div = new TH1F("h_Lambda_MC_src_div", "Angular distance of #Lambda origin and primary vertex", 300, 0.0, 3.2);
fHistLambdareco_MC_src_div->SetXTitle("#alpha (rad)"); fHistLambdareco_MC_src_div->SetYTitle("Number of Entries");
fHistLambdareco_MC_R_vtx = new TH1F("h_Lambda_MC_r_vtx", "Radial distance of secondary vertices", 400, 0.0, 100.0);
fHistLambdareco_MC_R_vtx->SetXTitle("r_{#perp} (cm)"); fHistLambdareco_MC_R_vtx->SetYTitle("Number of Entries");
fHistLambdareco_MC_tdcy_len = new TH1F("h_Lambda_MC_tdcy_len", "Transverse decay length (MC signal)", 400, 0.0, 100.0);
fHistLambdareco_MC_tdcy_len->SetXTitle("s_{#perp} (cm)"); fHistLambdareco_MC_tdcy_len->SetYTitle("Number of Entries");
fHistLambdareco_MC_oangle = new TH1F("h_Lambda_MC_oangle", "Opening angle of p/pi (MC signal)", 256, 0.0, 3.2);
fHistLambdareco_MC_oangle->SetXTitle("#alpha (rad)"); fHistLambdareco_MC_oangle->SetYTitle("Number of Entries");
fHistLambdareco_MC_dangle = new TH1F("h_Lambda_MC_dangle", "Decay angle of p/pi (MC signal)", 256, -1.0, 1.0);
fHistLambdareco_MC_dangle->SetXTitle("cos(#alpha)"); fHistLambdareco_MC_dangle->SetYTitle("Number of Entries");
fHistLambdareco_MC_m_dangle = new TH2F("h_lambda_m_dangle", "M vs. Decay Angle", 40, -1.0, 1.0, 480, 0.0, 1.2);
fHistLambdareco_MC_m_dangle->SetXTitle("cos #alpha"); fHistLambdareco_MC_m_dangle->SetYTitle("m (GeV)");
gDirectory->cd("..");
gDirectory->mkdir("MC_Background");
gDirectory->cd("MC_Background");
if ( fMode == kCutBased ) {
fHistLambdareco_MC_m_bkg = new TH1F("h_Lambda_MC_m_bkg", "Invariant #Lambda mass (MC background)", 2400, 0.0, 1.2);
} else {
fHistLambdareco_MC_m_bkg = new TH1F("h_Lambda_MC_m_bkg", "Invariant #Lambda mass (MC background)", 1000, 0.6, 1.6);
}
fHistLambdareco_MC_m_bkg->SetXTitle("m_{#Lambda} (GeV)"); fHistLambdareco_MC_m_bkg->SetYTitle("Number of Entries");
fHistLambdareco_MC_m_ppi_bkg = new TH1F("h_Lambda_MC_m_ppi_bkg", "Invariant mass w/ p#pi hypothesis (MC bkg)", 480, 0.0, 1.2);
fHistLambdareco_MC_m_ppi_bkg->SetXTitle("m_{#Lambda} (GeV)"); fHistLambdareco_MC_m_ppi_bkg->SetYTitle("Number of Entries");
fHistLambdareco_MC_m_pipi_bkg = new TH1F("h_Lambda_MC_m_pipi_bkg", "Invariant mass w/ #pi#pi hypothesis (MC bkg)", 480, 0.0, 1.2);
fHistLambdareco_MC_m_pipi_bkg->SetXTitle("m_{#Lambda} (GeV)"); fHistLambdareco_MC_m_pipi_bkg->SetYTitle("Number of Entries");
fHistLambdareco_MC_m_ee_bkg = new TH1F("h_Lambda_MC_m_ee_bkg", "Invariant mass w/ ee hypothesis (MC bkg)", 480, 0.0, 1.2);
fHistLambdareco_MC_m_ee_bkg->SetXTitle("m_{#Lambda} (GeV)"); fHistLambdareco_MC_m_ee_bkg->SetYTitle("Number of Entries");
fHistLambdareco_MC_m_ppi_o_bkg = new TH1F("h_Lambda_MC_m_ppi_o_bkg", "Invariant mass w/ p#pi hypothesis (MC bkg)", 480, 0.0, 1.2);
fHistLambdareco_MC_m_ppi_o_bkg->SetXTitle("m_{#Lambda} (GeV)"); fHistLambdareco_MC_m_ppi_o_bkg->SetYTitle("Number of Entries");
fHistLambdareco_MC_m_pipi_o_bkg = new TH1F("h_Lambda_MC_m_pipi_o_bkg", "Invariant mass w/ #pi#pi hypothesis (MC bkg)", 480, 0.0, 1.2);
fHistLambdareco_MC_m_pipi_o_bkg->SetXTitle("m_{#Lambda} (GeV)"); fHistLambdareco_MC_m_pipi_o_bkg->SetYTitle("Number of Entries");
fHistLambdareco_MC_m_ee_o_bkg = new TH1F("h_Lambda_MC_m_ee_o_bkg", "Invariant mass w/ ee hypothesis (MC bkg)", 480, 0.0, 1.2);
fHistLambdareco_MC_m_ee_o_bkg->SetXTitle("m_{#Lambda} (GeV)"); fHistLambdareco_MC_m_ee_o_bkg->SetYTitle("Number of Entries");
fHistLambdareco_MC_pt_bkg = new TH1F("h_Lambda_MC_pt_bkg", "Lambda-p_{#perp} (MC background)", 60, 0, 30);
fHistLambdareco_MC_pt_bkg->SetXTitle("p_{#perp} (GeV)"); fHistLambdareco_MC_pt_bkg->SetYTitle("Number of Entries");
fHistLambdareco_MC_phi_bkg = new TH1F("h_Lambda_MC_phi_bkg", "Lambda #phi distribution (MC background)", 128, -3.2, 3.2);
fHistLambdareco_MC_phi_bkg->SetXTitle("#phi (rad)"); fHistLambdareco_MC_phi_bkg->SetYTitle("Number of Entries");
fHistLambdareco_MC_eta_bkg = new TH1F("h_Lambda_MC_eta_bkg", "Lambda #eta distribution (MC background)", 100, -3, 3);
fHistLambdareco_MC_eta_bkg->SetXTitle("#eta"); fHistLambdareco_MC_eta_bkg->SetYTitle("Number of Entries");
fHistLambdareco_MC_tau_bkg = new TH1F("h_Lambda_MC_tau_bkg", "Reconstructed Lambda lifetime (MC background)", 100, 0, 300);
fHistLambdareco_MC_tau_bkg->SetXTitle("#tau (ps)"); fHistLambdareco_MC_tau_bkg->SetYTitle("Number of Entries");
fHistLambdareco_MC_src_div_bkg = new TH1F("h_Lambda_MC_src_div_bkg", "Angular distance of #Lambda origin and primary vertex", 300, 0.0, 3.2);
fHistLambdareco_MC_src_div_bkg->SetXTitle("#alpha (rad)"); fHistLambdareco_MC_src_div_bkg->SetYTitle("Number of Entries");
fHistLambdareco_MC_R_vtx_bkg = new TH1F("h_Lambda_MC_r_vtx_bkg", "Radial distance of secondary vertices", 400, 0.0, 100.0);
fHistLambdareco_MC_R_vtx_bkg->SetXTitle("r_{#perp} (cm)"); fHistLambdareco_MC_R_vtx_bkg->SetYTitle("Number of Entries");
fHistLambdareco_MC_tdcy_len_bkg = new TH1F("h_Lambda_MC_tdcy_len_bkg", "Transverse decay length (MC bkg)", 400, 0.0, 100.0);
fHistLambdareco_MC_tdcy_len_bkg->SetXTitle("s_{#perp} (cm)"); fHistLambdareco_MC_tdcy_len_bkg->SetYTitle("Number of Entries");
fHistLambdareco_MC_oangle_bkg = new TH1F("h_Lambda_MC_oangle_bkg", "Opening angle of p/pi (MC bkg)", 256, 0.0, 3.2);
fHistLambdareco_MC_oangle_bkg->SetXTitle("#alpha (rad)"); fHistLambdareco_MC_oangle_bkg->SetYTitle("Number of Entries");
fHistLambdareco_MC_dangle_bkg = new TH1F("h_Lambda_MC_dangle_bkg", "Decay angle of p/pi (MC bkg)", 256, -1.0, 1.0);
fHistLambdareco_MC_dangle_bkg->SetXTitle("cos(#alpha)"); fHistLambdareco_MC_dangle_bkg->SetYTitle("Number of Entries");
fHistLambdareco_MC_m_dangle_bkg = new TH2F("h_lambda_m_dangle_bkg", "M vs. Decay Angle", 40, -1.0, 1.0, 480, 0.0, 1.2);
fHistLambdareco_MC_m_dangle_bkg->SetXTitle("cos #alpha"); fHistLambdareco_MC_m_dangle_bkg->SetYTitle("m (GeV)");
gDirectory->cd("../Signal");
fHistLambdareco_chi2_vtx = new TH1F("h_Lambda_chi2_vtx", "Quality of vertex fits", 50, 0.0, 5.0);
fHistLambdareco_chi2_vtx->SetXTitle("Chi^{2} of vertex fits"); fHistLambdareco_chi2_vtx->SetYTitle("Number of Entries");
fHistLambdareco_chi2_vtx->GetXaxis()->SetLabelSize(0.03);
fHistLambdareco_chi2_trk = new TH1F("h_Lambda_chi2_trk", "Quality of track fits", 50, 0.0, 5.0);
fHistLambdareco_chi2_trk->SetXTitle("Chi^{2} of track fits"); fHistLambdareco_chi2_trk->SetYTitle("Number of Entries");
fHistLambdareco_chi2_trk->GetXaxis()->SetLabelSize(0.03);
fHistLambdareco_prob_mc = new TH1F("h_Lambda_prob_mc", "Quality of truth matching", 50, 0.0, 1.0);
fHistLambdareco_prob_mc->SetXTitle("Truth matching performance"); fHistLambdareco_prob_mc->SetYTitle("Number of Entries");
}
Bool_t AtlK0StarFinder::AnalyzeEvent() {
for (Int_t i = 0; i < fBkgLambdaDecays->GetEntries(); i++) {
AtlLambdaDecayPPi *obj = (AtlLambdaDecayPPi*)fBkgLambdaDecays->At(i);
delete obj;
}
fBkgLambdaDecays->GetEntries();
fBkgLambdaDecays->Clear("C");
if (fEvent->IsMC()) {
Int_t NKStarTrue = 0;
for (Int_t i = 0; i < fEvent->GetN_Vertices(); i++) {
HepVertex *vtx = (HepVertex*)fEvent->GetVertices()->At(i);
if ( !( (vtx->IsSecondary()) && (vtx->GetNDaughters()==2) )) continue;
AtlIDTrack *trk1 = (AtlIDTrack*)vtx->GetDaughters()->At(0);
AtlIDTrack *trk2 = (AtlIDTrack*)vtx->GetDaughters()->At(1);
if( trk1->HasValidTruthMatch(fMatchingProb_min)
&& trk2->HasValidTruthMatch(fMatchingProb_min) ) {
if( (trk1->GetMCParticle()->GetMother() == NULL) || (trk2->GetMCParticle()->GetMother() == NULL) ) {
continue;
}
if( (TMath::Abs(trk1->GetMCParticle()->GetMother()->GetPdgCode())== 313)
&& (trk1->GetMCParticle()->GetMother() == trk2->GetMCParticle()->GetMother()) ) {
NKStarTrue++;
}
}
}
AddAbundanceTrue(NKStarTrue);
}
if ( fMode == kCutBased ) {
ReconstructLambdaCutBased();
} else if ( fMode == kKinFit ) {
ReconstructLambdaKinFit();
} else {
Error("AnalyzeEvent", "Invalid mode given. Abort!");
gSystem->Abort(0);
}
return kTRUE;
}
void AtlK0StarFinder::ReconstructLambdaCutBased(){
AtlIDTrack *trk1 = 0;
AtlIDTrack *trk2 = 0;
HepVertex *Vtx;
HepVertex *PrimaryVtx;
Int_t i;
Int_t BkgCount = 0;
TLorentzVector p_trk1, p_trk2, p_Lambda;
Float_t m_Lambda = 0;
PrimaryVtx = fEvent->GetPrimaryVtx();
for (i = 0; i < fEvent->GetN_Vertices(); i++) {
Vtx = (HepVertex*)fEvent->GetVertices()->At(i);
if ( !( (Vtx->IsSecondary()) && (Vtx->GetNDaughters()==2) )) continue;
if ( Vtx->GetChi2overNDoF() > fVertexChi2ovNDoF_max ) continue;
trk1 = (AtlIDTrack*)Vtx->GetDaughters()->At(0);
trk2 = (AtlIDTrack*)Vtx->GetDaughters()->At(1);
if ( trk1->GetChi2_Vtx() / trk1->GetNDoF_Vtx() > fTrackChi2ovNDoF_max ) continue;
if ( trk2->GetChi2_Vtx() / trk2->GetNDoF_Vtx() > fTrackChi2ovNDoF_max ) continue;
p_trk1.SetVectM(trk1->P(), fm_proton);
p_trk2.SetVectM(trk2->P(), fm_pi);
p_Lambda = p_trk1 + p_trk2;
m_Lambda = p_Lambda.M();
if( (m_Lambda > fLambda_M_min) && (m_Lambda < fLambda_M_max) ) {
if (trk1->GetQovP() * trk2->QovP() < 0.) {
if ( (p_trk1.Pt() > fSignal_Pt_max) || (p_trk1.Pt() < fSignal_Pt_min) ) continue;
if ( (p_trk2.Pt() > fSignal_Pt_max) || (p_trk2.Pt() < fSignal_Pt_min) ) continue;
if ( (p_trk1.Eta() > fSignal_Eta_max) || (p_trk1.Eta() < fSignal_Eta_min) ) continue;
if ( (p_trk2.Eta() > fSignal_Eta_max) || (p_trk2.Eta() < fSignal_Eta_min) ) continue;
if ( p_trk1.P() > p_trk2.P() ) {
HepParticle Fit_Daughter1(1, p_trk1.Px(), p_trk1.Py(), p_trk1.Pz(), p_trk1.E(),
(trk1->GetQovP() < 0.) ? -2212 : 2212);
HepParticle Fit_Daughter2(2, p_trk2.Px(), p_trk2.Py(), p_trk2.Pz(), p_trk2.E(),
(trk2->GetQovP() < 0.) ? -211 : 211);
fEvent->AddLambdaDecayPiPi(p_Lambda.Px(), p_Lambda.Py(), p_Lambda.Pz(), p_Lambda.E(),
trk1, trk2, Vtx, PrimaryVtx, Fit_Daughter1, Fit_Daughter2);
} else {
HepParticle Fit_Daughter1(1, p_trk1.Px(), p_trk1.Py(), p_trk1.Pz(), p_trk1.E(),
(trk1->GetQovP() < 0.) ? -211 : 211);
HepParticle Fit_Daughter2(2, p_trk2.Px(), p_trk2.Py(), p_trk2.Pz(), p_trk2.E(),
(trk2->GetQovP() < 0.) ? -2212 : 2212);
fEvent->AddLambdaDecayPiPi(p_Lambda.Px(), p_Lambda.Py(), p_Lambda.Pz(), p_Lambda.E(),
trk2, trk1, Vtx, PrimaryVtx, Fit_Daughter1, Fit_Daughter2);
}
} else {
HepParticle Fit_Daughter1(1, p_trk1.Px(), p_trk1.Py(), p_trk1.Pz(), p_trk1.E(),
(trk1->GetQovP() < 0.) ? -2212 : 2212);
HepParticle Fit_Daughter2(2, p_trk2.Px(), p_trk2.Py(), p_trk2.Pz(), p_trk2.E(),
(trk2->GetQovP() < 0.) ? -211 : 211);
fBkgLambdaDecays->Add(new AtlLambdaDecayPPi(BkgCount++, p_Lambda.Px(), p_Lambda.Py(), p_Lambda.Pz(),
p_Lambda.E(), trk1, trk2, Vtx, PrimaryVtx,
Fit_Daughter1, Fit_Daughter2));
}
}
}
}
Bool_t AtlK0StarFinder::IsKaonVertex(HepVertex *vtx) {
TClonesArray *k0s = fEvent->GetK0sDecaysPiPi();
for (Int_t i = 0; i < fEvent->GetN_K0sDecaysPiPi(); i++) {
if (((AtlK0sDecayPiPi*)k0s->At(i))->GetVtx() == vtx)
return kTRUE;
}
TLorentzVector p1, p2, p;
p1.SetVectM(((AtlIDTrack*)vtx->GetDaughters()->At(0))->P(), fm_pi);
p2.SetVectM(((AtlIDTrack*)vtx->GetDaughters()->At(1))->P(), fm_pi);
p = p1 + p2;
if ((p.M() < 0.45) || ((p.M() > 0.492) && (p.M() < 0.503)))
return kTRUE;
return kFALSE;
}
Bool_t AtlK0StarFinder::IsLambdaVertex(HepVertex *vtx) {
if (fEvent->GetN_LambdaDecaysPiPi() < 1) {
return kFALSE;
}
TClonesArray *lambda = fEvent->GetLambdaDecaysPiPi();
for (Int_t i = 0; i < fEvent->GetN_LambdaDecaysPiPi(); i++) {
if (((AtlLambdaDecayPPi*)lambda->At(i))->GetVtx() == vtx)
return kTRUE;
}
return kFALSE;
}
Bool_t AtlK0StarFinder::IsConversionVertex(HepVertex *vtx) {
AtlIDTrack *trk1 = (AtlIDTrack*)vtx->GetDaughters()->At(0);
AtlIDTrack *trk2 = (AtlIDTrack*)vtx->GetDaughters()->At(1);
TLorentzVector p_e1, p_e2, p_g;
p_e1.SetVectM(trk1->P(), fm_e);
p_e2.SetVectM(trk2->P(), fm_e);
p_g = p_e1 + p_e2;
return (p_g.M() < fPhotonMass_max);
}
void AtlK0StarFinder::ReconstructLambdaKinFit() {
HepVertex *Vtx = 0;
HepVertex *PrimVtx = 0;
AtlIDTrack *trk1 = 0;
AtlIDTrack *trk2 = 0;
TLorentzVector p_Lambda;
TMatrixD cov_trk1(3,3);
TMatrixD cov_trk2(3,3);
Double_t fChi2;
Int_t fNDoF;
Int_t BkgCount = 1;
Float_t PvalueKinFit = 0.0;
PrimVtx = fEvent->GetPrimaryVtx();
for ( Int_t i = 0; i < fEvent->GetN_Vertices(); i++){
Vtx = (HepVertex*)fEvent->GetVertices()->At(i);
if ( !( (Vtx->IsSecondary()) && (Vtx->GetNDaughters() == 2) )) continue;
SetCutFlow("Sec. Vtx w/ 2 Dght.");
if ( Vtx->GetChi2overNDoF() > fVertexChi2ovNDoF_max ) continue;
SetCutFlow("Vtx #chi^{2}");
trk1 = (AtlIDTrack*)Vtx->GetDaughters()->At(0);
trk2 = (AtlIDTrack*)Vtx->GetDaughters()->At(1);
if ( (trk1->Chi2ovNDoF() > fTrackChi2ovNDoF_max) ||
(trk2->Chi2ovNDoF() > fTrackChi2ovNDoF_max) ) continue;
SetCutFlow("Trk #chi^{2}");
if( fEvent->IsMC() ) {
if( !( trk1->HasValidTruthMatch(0.0001) &&
trk2->HasValidTruthMatch(0.0001)) ) continue;
}
SetCutFlow("MC exists");
if (trk1->Pt() > trk2->Pt()) {
TLorentzVector p1, p2;
p1.SetVectM(trk1->P(), fm_kaon);
p2.SetVectM(trk2->P(), fm_pi);
Double_t p = p1*p2;
fHistK0Starreco_m_kaon_pi->Fill(p, GetPreTagEvtWeight());
}
else {
TLorentzVector p1, p2;
p1.SetVectM(trk2->P(), fm_kaon);
p2.SetVectM(trk1->P(), fm_pi);
Double_t p = p1*p2;
fHistK0Starreco_m_kaon_pi->Fill(p, GetPreTagEvtWeight());
}
trk1->GetCovMatrixPtEtaPhi(cov_trk1);
trk2->GetCovMatrixPtEtaPhi(cov_trk1);
TLorentzVector FitP_trk1pr;
TLorentzVector FitP_trk2pi;
TKinFitter fitterPPi = PerformFit(trk1, trk2, FitP_trk1pr, FitP_trk2pi, &cov_trk1, &cov_trk2);
TLorentzVector FitP_trk1pi;
TLorentzVector FitP_trk2pr;
TKinFitter fitterPiP = PerformFit(trk2, trk1, FitP_trk1pi, FitP_trk2pr, &cov_trk2, &cov_trk1);
if ( (fitterPPi.getS() < 0.) || (fitterPiP.getS() < 0.) ) {
Error("ReconstructLambdaKinFit", "fitter.getS()<0. Abort!");
continue;
}
Bool_t convPPi = (fitterPPi.getStatus() == 0);
Bool_t convPiP = (fitterPiP.getStatus() == 0);
if ( (!convPPi) && (!convPiP) ) continue;
SetCutFlow("#geq 1 Fit ok");
fN_Fits++;
Float_t Chi2overNDoF_PPi = fitterPPi.getS()/fitterPPi.getNDF();
Float_t Chi2overNDoF_PiP = fitterPiP.getS()/fitterPiP.getNDF();
HepParticle Fit_Daughter1;
HepParticle Fit_Daughter2;
if ( convPPi && ( (!convPiP) || ( Chi2overNDoF_PPi <= Chi2overNDoF_PiP ) ) ) {
p_Lambda = FitP_trk1pr + FitP_trk2pi;
fChi2 = fitterPPi.getS();
fNDoF = fitterPPi.getNDF();
HepParticle FitDaughter1(1, FitP_trk1pr.Px(), FitP_trk1pr.Py(), FitP_trk1pr.Pz(),
FitP_trk1pr.E(), (trk1->GetQovP() < 0.) ? -2212 : 2212);
HepParticle FitDaughter2(2, FitP_trk2pi.Px(), FitP_trk2pi.Py(), FitP_trk2pi.Pz(),
FitP_trk2pi.E(), (trk2->GetQovP() < 0.) ? -211 : 211);
Fit_Daughter1 = FitDaughter1;
Fit_Daughter2 = FitDaughter2;
} else {
p_Lambda = FitP_trk1pi + FitP_trk2pr;
fChi2 = fitterPiP.getS();
fNDoF = fitterPiP.getNDF();
HepParticle FitDaughter1(1,FitP_trk1pi.Px(), FitP_trk1pi.Py(), FitP_trk1pi.Pz(),
FitP_trk1pi.E(), (trk1->GetQovP() < 0.) ? -211 : 211);
HepParticle FitDaughter2(2, FitP_trk2pr.Px(), FitP_trk2pr.Py(), FitP_trk2pr.Pz(),
FitP_trk2pr.E(), (trk2->GetQovP() < 0.) ? -2212 : 2212);
Fit_Daughter1 = FitDaughter1;
Fit_Daughter2 = FitDaughter2;
AtlIDTrack *tmp = trk2;
trk2 = trk1;
trk1 = tmp;
}
SetChi2(fChi2);
SetNDoF(fNDoF);
PvalueKinFit = TMath::Prob(fChi2, fNDoF);
TLorentzVector p_Refit = Fit_Daughter1.P() + Fit_Daughter2.P();
if (p_Refit.Angle( Vtx->GetPos() - PrimVtx->GetPos() ) > 0.1)
continue;
SetCutFlow("Prim vtx origin");
if (IsKaonVertex(Vtx))
continue;
SetCutFlow("No K0s");
if (IsLambdaVertex(Vtx))
continue;
SetCutFlow("No Lambdas");
if (IsConversionVertex(Vtx))
continue;
SetCutFlow("No #gamma conv");
if (Vtx->GetPos().Perp() > 3.0) continue;
SetCutFlow("Vtx radius");
if (PvalueKinFit >= fKinFitPvalue_min) {
SetCutFlow("KinFit P-value");
AtlLambdaDecayPPi *decay;
if ( trk1->Charge()*trk2->Charge() < 0. ) {
SetCutFlow("Charge ok");
decay = fEvent->AddLambdaDecayPiPi(p_Lambda.Px(), p_Lambda.Py(), p_Lambda.Pz(), p_Lambda.E(),
trk1, trk2, Vtx, PrimVtx, Fit_Daughter1, Fit_Daughter2);
decay->SetChi2NDoF(fChi2, fNDoF);
if (decay->GetLifeTime() > 15) continue;
SetCutFlow("Lifetime");
if (decay->GetTransvDecayLength() > 3) continue;
SetCutFlow("TransvLength");
if (decay->GetAngleToPrimary() > 0.3 ) continue;
SetCutFlow("AnglePrimary");
if (fEvent->IsMC()) {
switch ( DoTruthMatch(trk1, trk2, Vtx) ){
case 1: fTrueReco = kTRUE; FillMCHistograms(decay, kTRUE); break;
case -1: fTrueReco = kFALSE; FillMCHistograms(decay, kFALSE); break;
case 0: continue;
}
}
if ( IsDebugRun() ) {
fDebugStream << endl << "=========================================="
<< endl << "Entry: " << fTree->GetReadEvent() << " Vtx: " << Vtx->GetId() << " Prob: " << PvalueKinFit;
if (trk1->GetMCParticle()->GetMother() != NULL)
fDebugStream << endl << "Mother1: " << trk1->GetMCParticle()->GetMother()->GetPdgName()
<< " (" << trk1->GetMCParticle()->GetMother()->GetPdgCode() << ")";
if (trk2->GetMCParticle()->GetMother() != NULL)
fDebugStream << endl << "Mother2: " << trk2->GetMCParticle()->GetMother()->GetPdgName()
<< " (" << trk2->GetMCParticle()->GetMother()->GetPdgCode() << ") ";
if ((trk1->GetMCParticle()->GetMother() != NULL) && (trk2->GetMCParticle()->GetMother() != NULL))
fDebugStream << ((trk1->GetMCParticle()->GetMother() == trk2->GetMCParticle()->GetMother()) ? "SAME" : "DIFF");
fDebugStream << endl << "Track1: " << trk1->GetMCParticle()->GetPdgName() << " (" << trk1->GetMCParticle()->GetPdgCode() << ")"
<< endl << "Track2: " << trk2->GetMCParticle()->GetPdgName() << " (" << trk2->GetMCParticle()->GetPdgCode() << ")";
}
AtlKinFitterTool::FillHistograms("Signal");
} else {
decay = new AtlLambdaDecayPPi(BkgCount++, p_Lambda.Px(), p_Lambda.Py(), p_Lambda.Pz(),
p_Lambda .E(),trk1, trk2,Vtx, PrimVtx,
Fit_Daughter1, Fit_Daughter2);
decay->SetChi2NDoF(fChi2, fNDoF);
fBkgLambdaDecays->Add(decay);
AtlKinFitterTool::FillHistograms("Bkg");
}
}
}
}
TKinFitter AtlK0StarFinder::PerformFit(AtlIDTrack *trk1, AtlIDTrack *trk2, TLorentzVector& FitP_trk1, TLorentzVector& FitP_trk2,
TMatrixD *cov_trk1, TMatrixD *cov_trk2) {
TVector3 dummy1 = trk1->P();
TFitParticlePtEtaPhi FitExec_trk1("FitExec_trk1", "FitExec_trk1 for LambdaFit", &dummy1, fm_proton, cov_trk1);
TVector3 dummy2 = trk2->P();
TFitParticlePtEtaPhi FitExec_trk2("FitExec_trk2", "FitExec_trk2 for LambdaFit", &dummy2, fm_pi, cov_trk2);
TFitConstraintMBW MLambdaCons("LambdaMassConstraint","LambdaMassConstraintGaus", 0, fm_lambda, 0.0462);
MLambdaCons.addParticles1(&FitExec_trk1, &FitExec_trk2);
TKinFitter fitter;
fitter.addMeasParticle(&FitExec_trk1);
fitter.addMeasParticle(&FitExec_trk2);
fitter.addConstraint(&MLambdaCons);
fitter.setMaxNbIter(50);
fitter.setMaxDeltaS(5e-5);
fitter.setMaxF(1e-4);
fitter.setVerbosity(0);
fitter.fit();
FitP_trk1 = *FitExec_trk1.getCurr4Vec();
FitP_trk2 = *FitExec_trk2.getCurr4Vec();
return fitter;
}
void AtlK0StarFinder::FillMCHistograms(AtlLambdaDecayPPi *decay, Bool_t signal) {
TLorentzVector p_trk1, p_trk2, p_ee, p_ppi, p_pipi, p_ee_o, p_ppi_o, p_pipi_o;
p_trk1.SetVectM(decay->GetReFitProton().P().Vect(), fm_e);
p_trk2.SetVectM(decay->GetReFitPion().P().Vect(), fm_e);
p_ee = p_trk1 + p_trk2;
p_trk1.SetVectM(decay->GetReFitProton().P().Vect(), fm_pi);
p_trk2.SetVectM(decay->GetReFitPion().P().Vect(), fm_pi);
p_pipi = p_trk1 + p_trk2;
p_trk1.SetVectM(decay->GetReFitProton().P().Vect(), fm_proton);
p_ppi = p_trk1 + p_trk2;
p_trk1.SetVectM(decay->GetProton()->P(), fm_e);
p_trk2.SetVectM(decay->GetPion()->P(), fm_e);
p_ee_o = p_trk1 + p_trk2;
p_trk1.SetVectM(decay->GetProton()->P(), fm_pi);
p_trk2.SetVectM(decay->GetPion()->P(), fm_pi);
p_pipi_o = p_trk1 + p_trk2;
p_trk1.SetVectM(decay->GetProton()->P(), fm_proton);
p_ppi_o = p_trk1 + p_trk2;
if (signal) {
fHistLambdareco_MC_m ->Fill(decay->M("Reco"), GetPreTagEvtWeight());
fHistLambdareco_MC_pt ->Fill(decay->Pt(), GetPreTagEvtWeight());
fHistLambdareco_MC_phi ->Fill(decay->Phi(), GetPreTagEvtWeight());
fHistLambdareco_MC_eta ->Fill(decay->Eta(), GetPreTagEvtWeight());
fHistLambdareco_MC_tau ->Fill(decay->GetLifeTime(), GetPreTagEvtWeight());
fHistLambdareco_MC_m_ee ->Fill(p_ee.M(), GetPreTagEvtWeight());
fHistLambdareco_MC_m_pipi ->Fill(p_pipi.M(), GetPreTagEvtWeight());
fHistLambdareco_MC_m_ppi ->Fill(p_ppi.M(), GetPreTagEvtWeight());
fHistLambdareco_MC_m_ee_o ->Fill(p_ee_o.M(), GetPreTagEvtWeight());
fHistLambdareco_MC_m_pipi_o->Fill(p_pipi_o.M(), GetPreTagEvtWeight());
fHistLambdareco_MC_m_ppi_o ->Fill(p_ppi_o.M(), GetPreTagEvtWeight());
fHistLambdareco_MC_R_vtx ->Fill(decay->GetVtx()->GetPos().Perp(), GetPreTagEvtWeight());
fHistLambdareco_MC_src_div ->Fill(decay->GetAngleToPrimary(), GetPreTagEvtWeight());
fHistLambdareco_MC_tdcy_len->Fill(decay->GetTransvDecayLength(), GetPreTagEvtWeight());
fHistLambdareco_MC_oangle ->Fill(decay->GetOpeningAngle(), GetPreTagEvtWeight());
fHistLambdareco_MC_dangle ->Fill(TMath::Cos(decay->GetDecayAngle()),GetPreTagEvtWeight());
fHistLambdareco_MC_m_dangle->Fill(TMath::Cos(decay->GetDecayAngle()), decay->M("Reco"), GetPreTagEvtWeight());
} else {
fHistLambdareco_MC_m_bkg ->Fill(decay->M("Reco"), GetPreTagEvtWeight());
fHistLambdareco_MC_pt_bkg ->Fill(decay->Pt(), GetPreTagEvtWeight());
fHistLambdareco_MC_phi_bkg ->Fill(decay->Phi(), GetPreTagEvtWeight());
fHistLambdareco_MC_eta_bkg ->Fill(decay->Eta(), GetPreTagEvtWeight());
fHistLambdareco_MC_tau_bkg ->Fill(decay->GetLifeTime(), GetPreTagEvtWeight());
fHistLambdareco_MC_m_ee_o_bkg ->Fill(p_ee_o.M(), GetPreTagEvtWeight());
fHistLambdareco_MC_m_pipi_o_bkg->Fill(p_pipi_o.M(), GetPreTagEvtWeight());
fHistLambdareco_MC_m_ppi_o_bkg ->Fill(p_ppi_o.M(), GetPreTagEvtWeight());
fHistLambdareco_MC_R_vtx_bkg ->Fill(decay->GetVtx()->GetPos().Perp(), GetPreTagEvtWeight());
fHistLambdareco_MC_src_div_bkg ->Fill(decay->GetAngleToPrimary(), GetPreTagEvtWeight());
fHistLambdareco_MC_tdcy_len_bkg->Fill(decay->GetTransvDecayLength(), GetPreTagEvtWeight());
fHistLambdareco_MC_oangle_bkg ->Fill(decay->GetOpeningAngle(), GetPreTagEvtWeight());
fHistLambdareco_MC_dangle_bkg ->Fill(TMath::Cos(decay->GetDecayAngle()),GetPreTagEvtWeight());
fHistLambdareco_MC_m_dangle_bkg->Fill(TMath::Cos(decay->GetDecayAngle()), decay->M("Reco"), GetPreTagEvtWeight());
}
}
void AtlK0StarFinder::FillHistograms() {
AtlLambdaDecayPPi *Lambda = 0;
AtlIDTrack *Proton =0;
AtlIDTrack *Pion =0;
TLorentzVector p_trk1, p_trk2, p_Lambda;
for ( Int_t i = 0; i < fEvent->GetN_LambdaDecaysPiPi(); i++ ) {
Lambda = (AtlLambdaDecayPPi*)fEvent->GetLambdaDecaysPiPi()->At(i);
fHistLambdareco_m_PPi ->Fill(Lambda->M("Reco"), GetPreTagEvtWeight());
fHistLambdareco_pt_PPi ->Fill(Lambda->Pt(), GetPreTagEvtWeight());
fHistLambdareco_phi_PPi ->Fill(Lambda->Phi(), GetPreTagEvtWeight());
fHistLambdareco_eta_PPi ->Fill(Lambda->Eta(), GetPreTagEvtWeight());
fHistLambdareco_tau_PPi ->Fill(Lambda->GetLifeTime(), GetPreTagEvtWeight());
fHistLambdareco_R_vtx ->Fill(Lambda->GetVtx()->GetPos().Perp(), GetPreTagEvtWeight());
fHistLambdareco_tdcy_len ->Fill(Lambda->GetTransvDecayLength(), GetPreTagEvtWeight());
fHistLambdareco_oangle ->Fill(Lambda->GetOpeningAngle(), GetPreTagEvtWeight());
fHistLambdareco_dangle ->Fill(Lambda->GetDecayAngle(), GetPreTagEvtWeight());
Proton = Lambda->GetProton();
Pion = Lambda->GetPion();
p_trk1.SetVectM(Proton->P(), fm_pi);
p_trk2.SetVectM(Pion->P(), fm_pi);
p_Lambda = p_trk1 + p_trk2;
fHistLambdareco_m_PiPi->Fill(p_Lambda.M(), GetPreTagEvtWeight());
p_trk1.SetVectM(Proton->P(), fm_e);
p_trk2.SetVectM(Pion->P(), fm_e);
p_Lambda = p_trk1 + p_trk2;
fHistLambdareco_m_ee->Fill(p_Lambda.M(), GetPreTagEvtWeight());
fHistLambdareco_chi2_vtx->Fill(Lambda->GetVtx()->GetChi2overNDoF(), GetPreTagEvtWeight());
fHistLambdareco_chi2_trk->Fill(Proton->Chi2ovNDoF(), GetPreTagEvtWeight());
fHistLambdareco_chi2_trk->Fill(Pion->Chi2ovNDoF(), GetPreTagEvtWeight());
fHistLambdareco_Pion_pt ->Fill(Proton->Pt(), GetPreTagEvtWeight());
fHistLambdareco_Proton_pt ->Fill(Pion->Pt(), GetPreTagEvtWeight());
fHistLambdareco_Pion_eta ->Fill(Proton->Eta(), GetPreTagEvtWeight());
fHistLambdareco_Proton_eta ->Fill(Pion->Eta(), GetPreTagEvtWeight());
fHistLambdareco_Pion_phi ->Fill(Proton->Phi(), GetPreTagEvtWeight());
fHistLambdareco_Proton_phi ->Fill(Pion->Phi(), GetPreTagEvtWeight());
if (Pion->QovP() < 0.) {
fHistLambdareco_Piminus_pt ->Fill(Pion->Pt(), GetPreTagEvtWeight());
fHistLambdareco_Piminus_eta ->Fill(Pion->Eta(), GetPreTagEvtWeight());
fHistLambdareco_Piminus_phi ->Fill(Pion->Phi(), GetPreTagEvtWeight());
fHistLambdareco_Prplus_pt ->Fill(Proton->Pt(), GetPreTagEvtWeight());
fHistLambdareco_Prplus_eta ->Fill(Proton->Eta(), GetPreTagEvtWeight());
fHistLambdareco_Prplus_phi ->Fill(Proton->Phi(), GetPreTagEvtWeight());
} else {
fHistLambdareco_Piplus_pt ->Fill(Pion->Pt(), GetPreTagEvtWeight());
fHistLambdareco_Piplus_eta ->Fill(Pion->Eta(), GetPreTagEvtWeight());
fHistLambdareco_Piplus_phi ->Fill(Pion->Phi(), GetPreTagEvtWeight());
fHistLambdareco_Prminus_pt ->Fill(Proton->Pt(), GetPreTagEvtWeight());
fHistLambdareco_Prminus_eta ->Fill(Proton->Eta(), GetPreTagEvtWeight());
fHistLambdareco_Prminus_phi ->Fill(Proton->Phi(), GetPreTagEvtWeight());
}
}
fHistLambdareco_N_PPi ->Fill(fEvent->GetN_LambdaDecaysPiPi(), GetPreTagEvtWeight());
TIter next_bkg(fBkgLambdaDecays);
while ( ( Lambda = (AtlLambdaDecayPPi*)next_bkg() ) ) {
fHistLambdareco_m_PPi_bkg ->Fill(Lambda->M("Reco"), GetPreTagEvtWeight());
fHistLambdareco_pt_PPi_bkg ->Fill(Lambda->Pt(), GetPreTagEvtWeight());
fHistLambdareco_phi_PPi_bkg ->Fill(Lambda->Phi(), GetPreTagEvtWeight());
fHistLambdareco_eta_PPi_bkg ->Fill(Lambda->Eta(), GetPreTagEvtWeight());
fHistLambdareco_tau_PPi_bkg ->Fill(Lambda->GetLifeTime(), GetPreTagEvtWeight());
fHistLambdareco_R_vtx_bkg ->Fill(Lambda->GetVtx()->GetPos().Perp(), GetPreTagEvtWeight());
fHistLambdareco_tdcy_len_bkg ->Fill(Lambda->GetTransvDecayLength(), GetPreTagEvtWeight());
fHistLambdareco_oangle_bkg ->Fill(Lambda->GetOpeningAngle(), GetPreTagEvtWeight());
fHistLambdareco_dangle_bkg ->Fill(Lambda->GetDecayAngle(), GetPreTagEvtWeight());
Proton = Lambda->GetProton();
Pion = Lambda->GetPion();
fHistLambdareco_Pion_pt_bkg ->Fill(Proton->Pt(), GetPreTagEvtWeight());
fHistLambdareco_Proton_pt_bkg ->Fill(Pion->Pt(), GetPreTagEvtWeight());
fHistLambdareco_Pion_eta_bkg ->Fill(Proton->Eta(), GetPreTagEvtWeight());
fHistLambdareco_Proton_eta_bkg ->Fill(Pion->Eta(), GetPreTagEvtWeight());
fHistLambdareco_Pion_phi_bkg ->Fill(Proton->Phi(), GetPreTagEvtWeight());
fHistLambdareco_Proton_phi_bkg ->Fill(Pion->Phi(), GetPreTagEvtWeight());
if (Pion->QovP() < 0.) {
fHistLambdareco_Piminus_pt_bkg ->Fill(Pion->Pt(), GetPreTagEvtWeight());
fHistLambdareco_Piminus_eta_bkg ->Fill(Pion->Eta(), GetPreTagEvtWeight());
fHistLambdareco_Piminus_phi_bkg ->Fill(Pion->Phi(), GetPreTagEvtWeight());
fHistLambdareco_Prminus_pt_bkg ->Fill(Proton->Pt(), GetPreTagEvtWeight());
fHistLambdareco_Prminus_eta_bkg ->Fill(Proton->Eta(), GetPreTagEvtWeight());
fHistLambdareco_Prminus_phi_bkg ->Fill(Proton->Phi(), GetPreTagEvtWeight());
} else {
fHistLambdareco_Piplus_pt_bkg ->Fill(Pion->Pt(), GetPreTagEvtWeight());
fHistLambdareco_Piplus_eta_bkg ->Fill(Pion->Eta(), GetPreTagEvtWeight());
fHistLambdareco_Piplus_phi_bkg ->Fill(Pion->Phi(), GetPreTagEvtWeight());
fHistLambdareco_Prplus_pt_bkg ->Fill(Proton->Pt(), GetPreTagEvtWeight());
fHistLambdareco_Prplus_eta_bkg ->Fill(Proton->Eta(), GetPreTagEvtWeight());
fHistLambdareco_Prplus_phi_bkg ->Fill(Proton->Phi(), GetPreTagEvtWeight());
}
}
fHistLambdareco_N_PPi_bkg ->Fill(fBkgLambdaDecays->GetEntries(), GetPreTagEvtWeight());
}
void AtlK0StarFinder::SetCutDefaults() {
fSignal_Pt_min = 0.5;
fSignal_Pt_max = 1.e10;
fSignal_Eta_min = -2.5;
fSignal_Eta_max = 2.5;
fm_lambda = 0.89166;
fm_pi = 0.13957;
fm_proton = 0.493667;
fm_e = 0.000510998910;
fm_kaon = 0.493667;
}
void AtlK0StarFinder::PrintCutValues() {
if ( fMode == kKinFit ){
cout << endl
<< " Used mode: kKinFit " << endl
<< " ----------------------" << endl;
cout << " Maximum inv. mass of e+/e- test: " << fPhotonMass_max << endl;
cout << " Minimum probability value of kinematic fit: " << fKinFitPvalue_min << endl;
cout << " Minimum truth matching probability: " << fMatchingProb_min << endl;
cout << scientific << " maximum Chi2/NDoF of Vertex Fit: " << endl
<< " Chi2/NDoF_Vtx = " << fVertexChi2ovNDoF_max << endl;
cout << scientific << " maximum Chi2/NDoF of Track Fit: " << endl
<< " Chi2/NDoF_Trk =" << fTrackChi2ovNDoF_max << endl;
cout << " ----------------------" << endl << endl;
} else if (fMode == kCutBased) {
cout << endl
<< " Used mode: kCutBased " << endl;
cout << " ----------------------------------------------" << endl;
cout << " Used CutDefaults:" <<endl;
cout << " ----------------------------------------------" << endl;
cout << scientific << setprecision(3) << " " << fSignal_Pt_min << " < Pt < " << fSignal_Pt_max << endl;
cout << scientific << fSignal_Eta_min << " < Eta < " << fSignal_Eta_max << endl;
cout << scientific << " " << fLambda_M_min << " < M(Lbd) < " << fLambda_M_max << endl;
cout << scientific << " Pion mass hypothesis: " << endl
<< " M_Pi = " << fm_pi << endl;
cout << scientific << " Proton mass hypothesis: " << endl
<< " M_Proton = " << fm_proton << endl;
cout << scientific << " maximum Chi2/NDoF of Vertex Fit: " << endl
<< " Chi2/NDoF_Vtx = " << fVertexChi2ovNDoF_max << endl;
cout << "----------------------------------------------" << endl;
}
}
void AtlK0StarFinder::Terminate() {
AtlKinFitterTool::Terminate();
fHistLambdareco_truth_PPi->LabelsDeflate("X");
fHistLambdareco_truth_PPi->SetStats(kFALSE);
fHistLambdareco_truth_PPi->GetXaxis()->SetLabelSize(0.03);
fHistLambdareco_truth_PPi->GetXaxis()->LabelsOption("v");
cout << endl << " ----------------------------------------" << endl;
for (int i = 1; i < fHistLambdareco_truth_PPi->GetNbinsX(); i++) {
Double_t binContent = 0;
for (int j = 1; j < fHistLambdareco_truth_PPi->GetNbinsY(); j++)
binContent += fHistLambdareco_truth_PPi->GetBinContent(i, j);
if ((binContent > 0) && (fHistLambdareco_truth_PPi->GetXaxis()->GetBinLabel(i) != "")) {
cout.width(15);
cout << fHistLambdareco_truth_PPi->GetXaxis()->GetBinLabel(i);
cout << ": " << TMath::Nint(binContent) << endl;
}
}
cout << endl << "INFO: Terminating AtlK0StarFinder!";
cout << endl << " # Successful fits: " << fN_Fits;
cout << endl << " # Truth match bad: " << fN_MCProbMiss;
cout << endl << " # TM with diff. origin: " << fN_SameOriginMiss;
cout << endl << " # TM => wrong tracks: " << fN_MCFail;
cout << endl << " # Possible Lambdas found: " << TMath::Nint(fHistLambdareco_m_PPi->GetEntries());
}
Int_t AtlK0StarFinder::DoTruthMatch(AtlIDTrack *trk1, AtlIDTrack *trk2, HepVertex *Vtx) {
fHistLambdareco_prob_mc->Fill(trk1->GetMCParticleProb(), GetPreTagEvtWeight());
fHistLambdareco_prob_mc->Fill(trk2->GetMCParticleProb(), GetPreTagEvtWeight());
if ( trk1->HasValidTruthMatch(fMatchingProb_min) && trk2->HasValidTruthMatch(fMatchingProb_min)) {
HepMCParticle *MC1 = trk1->GetMCParticle();
HepMCParticle *MC2 = trk2->GetMCParticle();
if ((MC1->GetMother() == NULL) || (MC2->GetMother() == NULL)) {
return 0;
}
const char* fullPdgName = MC1->GetMother()->GetPdgName();
char pdgName[strlen(fullPdgName)];
if (strstr(fullPdgName, "_bar") == NULL) {
strcpy(pdgName, fullPdgName);
} else {
strncpy(pdgName, fullPdgName, strlen(fullPdgName)-4);
pdgName[strlen(fullPdgName)-4] = '\0';
}
Float_t prob = ((AtlLambdaDecayPPi*)fEvent->GetLambdaDecaysPiPi()->Last())->GetProb();
if ( (TMath::Abs(MC1->GetMother()->GetPdgCode()) == 313) &&
(MC1->GetMother() == MC2->GetMother()) &&
(TMath::Abs(MC1->GetPdgCode()) == 321) &&
(TMath::Abs(MC2->GetPdgCode()) == 211) ) {
fHistLambdareco_truth_PPi->Fill(pdgName, prob, GetPreTagEvtWeight());
return 1;
} else {
if (MC1->GetMother() != MC2->GetMother()) {
fHistLambdareco_truth_PPi->Fill("Comb", prob, GetPreTagEvtWeight());
fN_SameOriginMiss++;
} else {
fHistLambdareco_truth_PPi->Fill(pdgName, prob, GetPreTagEvtWeight());
fN_MCFail++;
}
return -1;
}
} else {
return 0;
}
}
Double_t AtlK0StarFinder::GetModifiedEventWeight() {
Int_t run[] = {107680, 107681, 107682, 107683, 107684, 107685, 107690, 107691, 107692, 107693, 107694, 107695, 107700, 107701, 107702, 107703, 107704, 107705, 106280, 106281, 106283, 107650, 107651, 107652, 107653, 107654, 107655, 107660, 107661, 107662, 107663, 107664, 107665, 107670, 107671, 107672, 107673, 107674, 107675, 109300, 109301, 109302, 109303, 109305, 109306, 109307, 109308, 109310, 109311, 109312, 109313, 105860, 107941, 108340, 108341, 108342, 108343, 108344, 108345, 108346, 107100, 107101, 107102, 107103, 107104, 107105, 107106, 107107, 107108, 107109, 107110, 107111, 108320, 108319, 113159, 113160, 113161, 113162, 113163, 113164, 113165, 113166, 113167, 113168, 113169, 113170, 113171, 113172, 113173, 113174, 113175, 113176, 113177, 113178, 113179, 113180, 113181, 113182, 113183};
Double_t mod[] = {0.00505753, 0.00500372, 0.00199634, 0.00199893, 0.0019475, 0.00200058, 0.00502187, 0.00500647, 0.00199776, 0.00198675, 0.00197829, 0.00200114, 0.00500611, 0.00501191, 0.00199845, 0.00199715, 0.00197753, 0.00175088, 0.000492383, 0.000472727, 0.0004, 0.00221211, 0.0021012, 0.00206698, 0.00203673, 0.0018012, 0.0016, 0.00216386, 0.00210807, 0.00208498, 0.00201928, 0.00186791, 0.00160321, 0.00216707, 0.00209512, 0.00207265, 0.00200109, 0.00193462, 0.00140281, 4.20697e-05, 2.43636e-05, 2.11408e-05, 3.83355e-05, 4.23016e-05, 2.45061e-05, 2.11413e-05, 3.77813e-05, 4.25241e-05, 2.42642e-05, 2.16372e-05, 3.81252e-05, 0.000395824, 0.000444825, 0.000715701, 0.000717815, 0.0007128, 4.70854e-05, 4.68587e-05, 4.70188e-05, 0.000972391, 4.11099e-05, 3.94879e-05, 2.94078e-05, 1.78053e-05, 4.42696e-05, 3.9916e-05, 4.42442e-05, 1.86112e-05, 4.94148e-05, 5e-05, 1.76247e-05, 1.1209e-05, 0.00122778, 0.00127425, 170.341, 5.9222, 0.214886, 0.00483829, 0.000488728, 30.7848, 20.7877, 1.33516, 0.0397393, 0.00346116, 6.53177, 7.77513, 1.35395, 0.0715945, 0.00846341, 0.987771, 2.3384, 0.750828, 0.0564942, 0.00962421, 0.139078, 0.680058, 0.400836, 0.0575774, 0.0267182};
Int_t nRuns = 21 + 78;
for (Int_t i = 0; i < nRuns; i++) {
if (run[i] == fEvent->RunNr()) {
return mod[i];
}
}
return 1.0;
}