2024-02-27 15:43:32 +01:00
# include <string>
# include <iostream>
# include <cmath>
# include <algorithm>
# include <filesystem>
# include <string_view>
# include "TH1D.h"
# include "TH2D.h"
# include "THStack.h"
# include "TGraph.h"
# include "TTree.h"
# include "TChain.h"
# include "TFile.h"
# include "TCanvas.h"
# include "TROOT.h"
# include "TStyle.h"
# include "TColor.h"
# include "TLorentzVector.h"
# include "TRandom3.h"
# include "TLegend.h"
# include "RooDataHist.h"
# include "RooRealVar.h"
# include "RooPlot.h"
# include "RooGaussian.h"
# include "RooExponential.h"
# include "RooRealConstant.h"
# include "RooAddPdf.h"
# include "RooFitResult.h"
# include "RooProduct.h"
# include "RooCrystalBall.h"
# include "RooBreitWigner.h"
# include "RooArgSet.h"
# include "RooFFTConvPdf.h"
# include "RooNovosibirsk.h"
# include "constants.h"
# include "basic_analysis.h"
# include "hlt1_decision_analysis.h"
# include "bdt_classification.h"
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Inclusive :: B0 To Hp Hm Mu Mu %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
int new_analysis_b02hphmmumu ( )
{
const char * analysis_name = " B0ToHpHmMuMu " ;
const char * data_tree_name = " B0ToHpHmMuMu " ;
const char * sim_tree_name = " B0ToHpHmMuMu_noPID " ;
2024-02-29 15:54:28 +01:00
const char * end_state_mass_literal = " m(#pi^{+}#pi^{-}_{(#rightarrow K^{-})}#mu^{+}#mu^{-} & #pi^{+}_{(#rightarrow K^{+})}#pi^{-}#mu^{+}#mu^{-}) " ;
const bool retrain_bdt = false ;
2024-02-27 15:43:32 +01:00
TChain * data_chain = new TChain ( TString : : Format ( " %s/DecayTree " , data_tree_name ) ) ;
// data_chain->Add("/auto/data/pfeiffer/inclusive_detached_dilepton/data_samples/spruce_magdown_2023_v0_tuple_90000000_v0r0p6288631.root");
data_chain - > Add ( " /auto/data/pfeiffer/inclusive_detached_dilepton/data_samples/spruce_magdown_2023_v0r1_tuple_90000000_2023_v0r0p6288631.root " ) ;
Double_t Hp_PID_K , Hm_PID_K ;
data_chain - > SetBranchAddress ( " Hp_PID_K " , & Hp_PID_K ) ;
data_chain - > SetBranchAddress ( " Hm_PID_K " , & Hm_PID_K ) ;
FourVect * l14v_data = FourVect : : Init ( data_chain , " L1 " ) ;
FourVect * l24v_data = FourVect : : Init ( data_chain , " L2 " ) ;
FourVect * hp4v_data = FourVect : : Init ( data_chain , " Hp " ) ;
FourVect * hm4v_data = FourVect : : Init ( data_chain , " Hm " ) ;
TChain * sim_chain = new TChain ( TString : : Format ( " %s/DecayTree " , sim_tree_name ) ) ;
sim_chain - > Add ( " /auto/data/pfeiffer/inclusive_detached_dilepton/MC/rd_btoxll_simulation_fullstream_v0r0p6671378_B0ToKpPimMuMu_11144002_magdown.root " ) ;
FourVect * l14v_sim = FourVect : : Init ( sim_chain , " L1 " ) ;
FourVect * l24v_sim = FourVect : : Init ( sim_chain , " L2 " ) ;
FourVect * hp4v_sim = FourVect : : Init ( sim_chain , " Hp " ) ;
FourVect * hm4v_sim = FourVect : : Init ( sim_chain , " Hm " ) ;
Int_t B_BKGCAT , L1_TRUEID , L2_TRUEID , Hp_TRUEID , Hm_TRUEID ;
sim_chain - > SetBranchAddress ( " L1_TRUEID " , & L1_TRUEID ) ;
sim_chain - > SetBranchAddress ( " L2_TRUEID " , & L2_TRUEID ) ;
sim_chain - > SetBranchAddress ( " Hp_TRUEID " , & Hp_TRUEID ) ;
sim_chain - > SetBranchAddress ( " Hm_TRUEID " , & Hm_TRUEID ) ;
sim_chain - > SetBranchAddress ( " B0_BKGCAT " , & B_BKGCAT ) ;
2024-03-06 16:17:59 +01:00
Double_t B_Mass_jpsi_var , B_Mass_psi2s_var , B_Mass_sim_var ;
TString B_Mass_jpsi_var_name = " B_Mass_jpsi_var " ;
TString B_Mass_psi2s_var_name = " B_Mass_psi2s_var " ;
TString B_Mass_sim_var_name = " B_Mass_sim_var " ;
TTree * tree_B_Mass_jpsi = new TTree ( " tree_B_Mass_jpsi " , TString : : Format ( " B Mass, J/#psi Mode (%s) " , analysis_name ) ) ;
TTree * tree_B_Mass_psi2s = new TTree ( " tree_B_Mass_psi2s " , TString : : Format ( " B Mass, #psi(2S) Mode (%s) " , analysis_name ) ) ;
TTree * tree_B_Mass_sim = new TTree ( " tree_B_Mass_sim " , TString : : Format ( " B Mass, Simualted (%s_noPID) " , analysis_name ) ) ;
tree_B_Mass_jpsi - > Branch ( B_Mass_jpsi_var_name , & B_Mass_jpsi_var ) ;
tree_B_Mass_psi2s - > Branch ( B_Mass_psi2s_var_name , & B_Mass_psi2s_var ) ;
tree_B_Mass_sim - > Branch ( B_Mass_sim_var_name , & B_Mass_sim_var ) ;
TH1D * h1_B_Mass_unf = new TH1D ( " h1_B_Mass_unf " , TString : : Format ( " B Mass (%s), Unfiltered " , data_tree_name ) , B_MASS_HIST_BINS , B_MASS_VAR_MIN , B_MASS_VAR_MAX ) ;
TH1D * h1_B_Mass_bdtf = new TH1D ( " h1_B_Mass_bdtf " , TString : : Format ( " B Mass (%s), BDT Filter " , data_tree_name ) , B_MASS_HIST_BINS , B_MASS_VAR_MIN , B_MASS_VAR_MAX ) ;
TH1D * h1_B_Mass_sim_unf = new TH1D ( " h1_B_Mass_sim_unf " , TString : : Format ( " B Mass, Simualted (%s), Unfiltered " , sim_tree_name ) , B_MASS_HIST_BINS , B_MASS_VAR_MIN , B_MASS_VAR_MAX ) ;
2024-02-27 15:43:32 +01:00
TH2D * h2_Hlt1_flags_B_Mass = new TH2D ( " h2_Hlt1_flags_B_Mass " , " Hlt1 Decision vs B Mass " , 50 , 5100 , 5400 , 13 , 1. , 14. ) ;
TH2D * h2_Hlt1_flags_excl_B_Mass = new TH2D ( " h2_Hlt1_flags_excl_B_Mass " , " Excl Hlt1 Decision vs B Mass " , 50 , 5100 , 5400 , 13 , 1. , 14. ) ;
TH1D * h1_bdt_probs = new TH1D ( " h1_bdt_probs " , " BDT Probabilities " , 100 , - 1 , 1 ) ;
2024-03-06 16:17:59 +01:00
h1_B_Mass_unf - > GetXaxis ( ) - > SetTitle ( end_state_mass_literal ) ;
h1_B_Mass_sim_unf - > GetXaxis ( ) - > SetTitle ( end_state_mass_literal ) ;
h1_B_Mass_bdtf - > GetXaxis ( ) - > SetTitle ( end_state_mass_literal ) ;
2024-02-27 15:43:32 +01:00
h2_Hlt1_flags_B_Mass - > GetXaxis ( ) - > SetTitle ( end_state_mass_literal ) ;
h2_Hlt1_flags_excl_B_Mass - > GetXaxis ( ) - > SetTitle ( end_state_mass_literal ) ;
ConnectHlt1Decisions ( data_chain , h2_Hlt1_flags_B_Mass , h2_Hlt1_flags_excl_B_Mass ) ;
auto hlt1_decision_histos = CreateHlt1DecisionHistos ( analysis_name ) ;
std : : map < std : : string , int > exclusive_hits { } ;
std : : vector < TV * > vars {
TV : : Float ( " B0_PT " , " B0_PT " ) ,
TV : : Float ( " B0_BPVFDCHI2 " , " B0_BPVFDCHI2 " ) ,
TV : : Float ( " B0_BPVDIRA " , " B0_BPVDIRA " ) ,
TV : : Float ( " Jpsi_BPVIPCHI2 " , " Jpsi_BPVIPCHI2 " ) ,
// TV::Float("Jpsi_BPVDIRA", "Jpsi_BPVDIRA"),
TV : : Float ( " Jpsi_PT " , " Jpsi_PT " ) ,
TV : : Float ( " Hp_BPVIPCHI2 " , " Hp_BPVIPCHI2 " ) ,
TV : : Float ( " Hp_PT " , " Hp_PT " ) ,
TV : : Float ( " Hm_BPVIPCHI2 " , " Hm_BPVIPCHI2 " ) ,
TV : : Float ( " Hm_PT " , " Hm_PT " ) ,
// TV::Double("Kplus_PID_K", "K_PID_K"),
TV : : Double ( " Hp_PROBNN_K " , " Hp_PROBNN_K " ) ,
TV : : Double ( " Hm_PROBNN_K " , " Hm_PROBNN_K " ) ,
TV : : Float ( " L1_BPVIPCHI2 " , " L1_BPVIPCHI2 " ) ,
TV : : Float ( " L2_BPVIPCHI2 " , " L2_BPVIPCHI2 " ) ,
} ;
TTree * sig_tree = new TTree ( " TreeS " , " tree containing signal data " ) ;
TTree * bkg_tree = new TTree ( " TreeB " , " tree containing background data " ) ;
ConnectVarsToData ( vars , data_chain , sim_chain , sig_tree , bkg_tree ) ;
unsigned int data_entries = data_chain - > GetEntries ( ) ;
2024-02-29 15:54:28 +01:00
unsigned int sim_entries = sim_chain - > GetEntries ( ) ;
2024-02-27 15:43:32 +01:00
unsigned int bkg_events = 0 ;
2024-02-29 15:54:28 +01:00
unsigned int sig_events = 0 ;
2024-02-27 15:43:32 +01:00
if ( retrain_bdt )
{
std : : cout < < " # Starting with BDT retrain. " < < std : : endl ;
for ( unsigned int i = 0 ; i < data_entries ; i + + )
{
data_chain - > GetEntry ( i ) ;
TLorentzVector reconstructed_Kstar { } ;
bool found_k_star = false ;
if ( Hp_PID_K > 0 & & Hm_PID_K < 0 )
{
reconstructed_Kstar = hp4v_data - > LorentzVector ( K_MASS ) + hm4v_data - > LorentzVector ( ) ;
found_k_star = true ;
}
else if ( Hm_PID_K > 0 & & Hp_PID_K < 0 )
{
reconstructed_Kstar = hp4v_data - > LorentzVector ( ) + hm4v_data - > LorentzVector ( K_MASS ) ;
found_k_star = true ;
}
if ( found_k_star )
{
Double_t reconstructed_B_Mass = ( reconstructed_Kstar + l14v_data - > LorentzVector ( ) + l24v_data - > LorentzVector ( ) ) . M ( ) ;
if ( std : : all_of ( vars . begin ( ) , vars . end ( ) , [ ] ( TV * v )
{ return v - > IsDataFinite ( ) ; } ) )
{
if ( reconstructed_B_Mass > 5500. )
{
bkg_tree - > Fill ( ) ;
bkg_events + + ;
}
}
}
PrintProgress ( TString : : Format ( " %s BKG Collection " , analysis_name ) , data_entries , 10000 , i ) ;
}
2024-02-29 15:54:28 +01:00
std : : cout < < " # Added " < < bkg_events < < " background events. " < < std : : endl ;
2024-02-27 15:43:32 +01:00
}
else
{
std : : cout < < " # Starting without BDT retrain. " < < std : : endl ;
2024-02-29 15:54:28 +01:00
bkg_events = data_entries ;
2024-02-27 15:43:32 +01:00
}
for ( unsigned int i = 0 ; i < sim_entries ; i + + )
{
sim_chain - > GetEntry ( i ) ;
2024-03-06 16:17:59 +01:00
Double_t reco_mass_pipkp = ( hp4v_sim - > LorentzVector ( K_MASS ) + hm4v_sim - > LorentzVector ( ) + l14v_sim - > LorentzVector ( ) + l24v_sim - > LorentzVector ( ) ) . M ( ) ;
Double_t reco_mass_pimkm = ( hp4v_sim - > LorentzVector ( ) + hm4v_sim - > LorentzVector ( K_MASS ) + l14v_sim - > LorentzVector ( ) + l24v_sim - > LorentzVector ( ) ) . M ( ) ;
h1_B_Mass_sim_unf - > Fill ( reco_mass_pipkp ) ;
h1_B_Mass_sim_unf - > Fill ( reco_mass_pimkm ) ;
2024-02-27 15:43:32 +01:00
if ( B_BKGCAT = = 30 & & TMath : : Abs ( L1_TRUEID ) = = PID_MUON & & L2_TRUEID = = - L1_TRUEID )
{
TLorentzVector reconstructed_Kstar { } ;
bool found_k_star = false ;
if ( TMath : : Abs ( Hp_TRUEID ) = = PID_KAON & & TMath : : Abs ( Hm_TRUEID ) = = PID_PION )
{
reconstructed_Kstar = hp4v_sim - > LorentzVector ( K_MASS ) + hm4v_sim - > LorentzVector ( ) ;
found_k_star = true ;
}
else if ( TMath : : Abs ( Hp_TRUEID ) = = PID_PION & & TMath : : Abs ( Hm_TRUEID ) = = PID_KAON )
{
reconstructed_Kstar = hp4v_sim - > LorentzVector ( ) + hm4v_sim - > LorentzVector ( K_MASS ) ;
found_k_star = true ;
}
if ( found_k_star )
{
Double_t reconstructed_B_Mass = ( reconstructed_Kstar + l14v_sim - > LorentzVector ( ) + l24v_sim - > LorentzVector ( ) ) . M ( ) ;
2024-02-29 15:54:28 +01:00
if ( sig_events < bkg_events )
2024-02-27 15:43:32 +01:00
{
2024-02-29 15:54:28 +01:00
if ( retrain_bdt & & std : : all_of ( vars . begin ( ) , vars . end ( ) , [ ] ( TV * v )
{ return v - > IsMCFinite ( ) ; } ) )
2024-02-27 15:43:32 +01:00
{
sig_tree - > Fill ( ) ;
2024-02-29 15:54:28 +01:00
sig_events + + ;
2024-02-27 15:43:32 +01:00
}
}
2024-02-29 15:54:28 +01:00
2024-03-06 16:17:59 +01:00
B_Mass_sim_var = reconstructed_B_Mass ;
tree_B_Mass_sim - > Fill ( ) ;
2024-02-27 15:43:32 +01:00
}
}
PrintProgress ( TString : : Format ( " %s SIG Collection " , analysis_name ) , sim_entries , 10000 , i ) ;
}
if ( retrain_bdt )
{
TrainBDT ( vars , analysis_name , sig_tree , bkg_tree ) ;
std : : cout < < " # Finished BDT retrain. " < < std : : endl ;
}
std : : cout < < " # Starting evaluation of data. " < < std : : endl ;
Float_t * train_vars = new Float_t [ vars . size ( ) ] ;
auto reader = SetupReader ( vars , train_vars , analysis_name ) ;
2024-02-29 15:54:28 +01:00
const double mva_cut_value = - 0.0508 ;
2024-02-27 15:43:32 +01:00
for ( unsigned int i = 0 ; i < data_entries ; i + + )
{
data_chain - > GetEntry ( i ) ;
TLorentzVector dimuon = l14v_data - > LorentzVector ( ) + l24v_data - > LorentzVector ( ) ;
TLorentzVector reconstructed_Kstar { } ;
bool found_k_star = false ;
if ( Hp_PID_K > 0 & & Hm_PID_K < 0 )
{
reconstructed_Kstar = hp4v_data - > LorentzVector ( K_MASS ) + hm4v_data - > LorentzVector ( ) ;
found_k_star = true ;
}
else if ( Hm_PID_K > 0 & & Hp_PID_K < 0 )
{
reconstructed_Kstar = hp4v_data - > LorentzVector ( ) + hm4v_data - > LorentzVector ( K_MASS ) ;
found_k_star = true ;
}
if ( found_k_star )
{
Double_t reconstructed_B_Mass = ( reconstructed_Kstar + dimuon ) . M ( ) ;
if ( std : : all_of ( vars . begin ( ) , vars . end ( ) , [ ] ( TV * v )
{ return v - > IsDataFinite ( ) ; } ) )
{
for ( size_t j = 0 ; j < vars . size ( ) ; j + + )
{
if ( vars [ j ] - > IsDouble ( ) )
{
train_vars [ j ] = vars [ j ] - > GetDataDouble ( ) ;
}
else if ( vars [ j ] - > IsFloat ( ) )
{
train_vars [ j ] = vars [ j ] - > GetDataFloat ( ) ;
}
}
}
if ( TMath : : Abs ( dimuon . M ( ) - JPSI_MASS ) < 100. )
{
CheckHlt1Decisioins ( h2_Hlt1_flags_B_Mass , h2_Hlt1_flags_excl_B_Mass , exclusive_hits , reconstructed_B_Mass ) ;
FillHlt1DecisionHistos ( hlt1_decision_histos , reconstructed_B_Mass ) ;
}
double mva_response = reader - > EvaluateMVA ( " BDT " ) ;
h1_bdt_probs - > Fill ( mva_response ) ;
2024-03-06 16:17:59 +01:00
h1_B_Mass_unf - > Fill ( reconstructed_B_Mass ) ;
2024-02-27 15:43:32 +01:00
if ( mva_response > mva_cut_value )
{
2024-03-06 16:17:59 +01:00
h1_B_Mass_bdtf - > Fill ( reconstructed_B_Mass ) ;
if ( TMath : : Abs ( reconstructed_Kstar . M ( ) - KSTAR_MASS ) < 100. )
2024-02-29 15:54:28 +01:00
{
2024-02-27 15:43:32 +01:00
if ( TMath : : Abs ( dimuon . M ( ) - JPSI_MASS ) < 100. )
{
2024-03-06 16:17:59 +01:00
B_Mass_jpsi_var = reconstructed_B_Mass ;
tree_B_Mass_jpsi - > Fill ( ) ;
2024-02-27 15:43:32 +01:00
}
else if ( TMath : : Abs ( dimuon . M ( ) - PSI2S_MASS ) < 100. )
{
2024-03-06 16:17:59 +01:00
B_Mass_psi2s_var = reconstructed_B_Mass ;
tree_B_Mass_psi2s - > Fill ( ) ;
2024-02-27 15:43:32 +01:00
}
2024-02-29 15:54:28 +01:00
}
2024-02-27 15:43:32 +01:00
}
}
PrintProgress ( TString : : Format ( " %s BDT Evaluation " , analysis_name ) , data_entries , 10000 , i ) ;
}
std : : cout < < " # Exclusive Hits " < < std : : endl ;
for ( const auto & [ line , hits ] : exclusive_hits )
{
std : : cout < < line < < " : " < < hits < < std : : endl ;
}
2024-03-06 16:17:59 +01:00
DrawInDefaultCanvas ( h2_Hlt1_flags_B_Mass , analysis_name , 0.16 , " COLZ " ) ;
DrawInDefaultCanvas ( h2_Hlt1_flags_excl_B_Mass , analysis_name , 0.16 , " COLZ " ) ;
DrawInDefaultCanvas ( h1_B_Mass_unf , analysis_name , 0.1 ) ;
DrawInDefaultCanvas ( h1_B_Mass_sim_unf , analysis_name , 0.1 ) ;
DrawInDefaultCanvas ( h1_B_Mass_bdtf , analysis_name , 0.1 ) ;
DrawInDefaultCanvasStacked ( { h1_B_Mass_unf , h1_B_Mass_bdtf } , { kRed , kBlue } , { 0 , 3003 } , analysis_name ) ;
2024-02-27 15:43:32 +01:00
2024-03-06 16:17:59 +01:00
auto roofit_hist_sim = CreateRooDataSetAndFitCB ( tree_B_Mass_sim , B_Mass_sim_var_name , end_state_mass_literal , false , false , ShapeParamters { } ) ;
auto roofit_hist_jpsi_fitsum = CreateRooDataSetAndFitCB ( tree_B_Mass_jpsi , B_Mass_jpsi_var_name , end_state_mass_literal , true , true , roofit_hist_sim . shape_parameters ) ;
auto roofit_hist_psi2s_fitsum = CreateRooDataSetAndFitCB ( tree_B_Mass_psi2s , B_Mass_psi2s_var_name , end_state_mass_literal , true , true , roofit_hist_sim . shape_parameters ) ;
2024-02-27 15:43:32 +01:00
DrawInDefaultCanvas ( roofit_hist_jpsi_fitsum , analysis_name ) ;
DrawInDefaultCanvas ( roofit_hist_psi2s_fitsum , analysis_name ) ;
DrawInDefaultCanvas ( roofit_hist_sim , analysis_name ) ;
// DrawHlt1DecisionHistos(analysis_name, hlt1_decision_histos);
DrawBDTProbs ( h1_bdt_probs , mva_cut_value , analysis_name ) ;
return 0 ;
}