@ -4,6 +4,8 @@
# include <algorithm>
# include <filesystem>
# include <string_view>
# include <ctime>
# include <fstream>
# include "TH1D.h"
# include "TH2D.h"
@ -45,39 +47,26 @@
int new_analysis_b02hphmmumu ( )
{
const char * analysis_name = " B0ToHpHmMuMu " ;
const char * data_tree_name = " B0ToHpHmMuMu " ;
const char * sim_tree_name = " B0ToHpHmMuMu_noPID " ;
const char * data_tree_name = " SpruceRD_ B0ToHpHmMuMu" ;
const char * sim_tree_name = " B0ToHpHmMuMu_noPID_mapped " ;
const char * end_state_mass_literal = " m(#pi^{+}#pi^{-}_{(#rightarrow K^{-})}#mu^{+}#mu^{-} & #pi^{+}_{(#rightarrow K^{+})}#pi^{-}#mu^{+}#mu^{-}) " ;
const bool retrain_bdt = false ;
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 " ) ;
data_chain - > Add ( " /auto/data/pfeiffer/inclusive_detached_dilepton/data_samples/Collision23_Beam6800GeV-VeloClosed-MagDown-Excl-UT_RealData_Sprucing23r1_90000000_RD.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 " ) ;
FourVect * l14v_data = FourVect : : Init ( data_chain , " muminus " ) ;
FourVect * l24v_data = FourVect : : Init ( data_chain , " muplus " ) ;
FourVect * hp4v_data = FourVect : : Init ( data_chain , " Kplus " ) ;
FourVect * hm4v_data = FourVect : : Init ( data_chain , " piminus " ) ;
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 - > Add ( " /auto/data/pfeiffer/inclusive_detached_dilepton/MC/B0ToHpHmMuMu_mapped_mc.root " ) ;
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 ) ;
FourVect * l14v_sim = FourVect : : Init ( sim_chain , " muminus " ) ;
FourVect * l24v_sim = FourVect : : Init ( sim_chain , " muplus " ) ;
FourVect * hp4v_sim = FourVect : : Init ( sim_chain , " Kplus " ) ;
FourVect * hm4v_sim = FourVect : : Init ( sim_chain , " piminus " ) ;
Double_t B_Mass_jpsi_var , B_Mass_psi2s_var , B_Mass_sim_var ;
TString B_Mass_jpsi_var_name = " B_Mass_jpsi_var " ;
@ -94,14 +83,12 @@ int new_analysis_b02hphmmumu()
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 ) ;
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 ) ;
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 ) ;
h2_Hlt1_flags_B_Mass - > GetXaxis ( ) - > SetTitle ( end_state_mass_literal ) ;
h2_Hlt1_flags_excl_B_Mass - > GetXaxis ( ) - > SetTitle ( end_state_mass_literal ) ;
@ -115,17 +102,14 @@ int new_analysis_b02hphmmumu()
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 " ) ,
TV : : Float ( " Kplus_BPVIPCHI2 " , " Kplus_BPVIPCHI2 " ) ,
TV : : Float ( " Kplus_PT " , " Kplus_PT " ) ,
TV : : Float ( " piminus_BPVIPCHI2 " , " piminus_BPVIPCHI2 " ) ,
TV : : Float ( " piminus_PT " , " piminus_PT " ) ,
TV : : Double ( " Kplus_PROBNN_K " , " Kplus_PROBNN_K " ) ,
TV : : Float ( " muminus_BPVIPCHI2 " , " muminus_BPVIPCHI2 " ) ,
TV : : Float ( " muplus_BPVIPCHI2 " , " muplus_BPVIPCHI2 " ) ,
} ;
TTree * sig_tree = new TTree ( " TreeS " , " tree containing signal data " ) ;
@ -145,33 +129,19 @@ int new_analysis_b02hphmmumu()
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 ( ) ;
TLorentzVector reconstructed_Kstar = hp4v_data - > LorentzVector ( ) + hm4v_data - > LorentzVector ( ) ;
TLorentzVector dimuon = l14v_data - > LorentzVector ( ) + l24v_data - > LorentzVector ( ) ;
Double_t reconstructed_B_Mass = ( reconstructed_Kstar + dimuon ) . M ( ) ;
if ( std : : all_of ( vars . begin ( ) , vars . end ( ) , [ ] ( TV * v )
{ return v - > IsDataFinite ( ) ; } ) )
{
if ( reconstructed_B_Mass > 5500. )
if ( reconstructed_B_Mass > 5500. & & ( ( TMath : : Abs ( dimuon . M ( ) - JPSI_MASS ) < 100. ) | | ( TMath : : Abs ( dimuon . M ( ) - PSI2S_MASS ) < 100. ) ) )
{
bkg_tree - > Fill ( ) ;
bkg_events + + ;
}
}
}
PrintProgress ( TString : : Format ( " %s BKG Collection " , analysis_name ) , data_entries , 10000 , i ) ;
}
@ -187,28 +157,7 @@ int new_analysis_b02hphmmumu()
{
sim_chain - > GetEntry ( i ) ;
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 ) ;
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 )
{
TLorentzVector reconstructed_Kstar = hp4v_sim - > LorentzVector ( ) + hm4v_sim - > LorentzVector ( ) ;
Double_t reconstructed_B_Mass = ( reconstructed_Kstar + l14v_sim - > LorentzVector ( ) + l24v_sim - > LorentzVector ( ) ) . M ( ) ;
if ( sig_events < bkg_events )
@ -223,14 +172,13 @@ int new_analysis_b02hphmmumu()
B_Mass_sim_var = reconstructed_B_Mass ;
tree_B_Mass_sim - > Fill ( ) ;
}
}
PrintProgress ( TString : : Format ( " %s SIG Collection " , analysis_name ) , sim_entries , 10000 , i ) ;
}
if ( retrain_bdt )
{
std : : cout < < " # Added " < < sig_events < < " signal events. " < < std : : endl ;
TrainBDT ( vars , analysis_name , sig_tree , bkg_tree ) ;
std : : cout < < " # Finished BDT retrain. " < < std : : endl ;
}
@ -240,28 +188,14 @@ int new_analysis_b02hphmmumu()
Float_t * train_vars = new Float_t [ vars . size ( ) ] ;
auto reader = SetupReader ( vars , train_vars , analysis_name ) ;
const double mva_cut_value = - 0.0508 ;
const double mva_cut_value = 0 ;
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 )
{
TLorentzVector reconstructed_Kstar = hp4v_data - > LorentzVector ( ) + hm4v_data - > LorentzVector ( ) ;
Double_t reconstructed_B_Mass = ( reconstructed_Kstar + dimuon ) . M ( ) ;
if ( std : : all_of ( vars . begin ( ) , vars . end ( ) , [ ] ( TV * v )
@ -308,7 +242,6 @@ int new_analysis_b02hphmmumu()
}
}
}
}
PrintProgress ( TString : : Format ( " %s BDT Evaluation " , analysis_name ) , data_entries , 10000 , i ) ;
}
@ -323,14 +256,13 @@ int new_analysis_b02hphmmumu()
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 ) ;
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 ) ;
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 , true ) ;
DrawInDefaultCanvas ( roofit_hist_jpsi_fitsum , analysis_name ) ;
DrawInDefaultCanvas ( roofit_hist_psi2s_fitsum , analysis_name ) ;
@ -340,5 +272,22 @@ int new_analysis_b02hphmmumu()
DrawBDTProbs ( h1_bdt_probs , mva_cut_value , analysis_name ) ;
auto signal_ratio = DivWithErr ( roofit_hist_psi2s_fitsum . signal_yield . first , roofit_hist_psi2s_fitsum . signal_yield . second , roofit_hist_jpsi_fitsum . signal_yield . first , roofit_hist_jpsi_fitsum . signal_yield . second ) ;
std : : time_t t = std : : time ( nullptr ) ;
std : : tm tm = * std : : localtime ( & t ) ;
ofstream res_file ;
res_file . open ( TString : : Format ( " %s_results.txt " , analysis_name ) . Data ( ) , ios : : out | ios : : trunc ) ;
res_file < < " #### " < < std : : put_time ( & tm , " %c " ) < < " #### " < < std : : endl ;
res_file < < " J/Psi Mode: " < < roofit_hist_jpsi_fitsum . signal_yield . first < < " +- " < < roofit_hist_jpsi_fitsum . signal_yield . second < < std : : endl ;
res_file < < " Psi(2S) Mode: " < < roofit_hist_psi2s_fitsum . signal_yield . first < < " +- " < < roofit_hist_psi2s_fitsum . signal_yield . second < < std : : endl ;
res_file < < " Mode Yield Ratio: " < < signal_ratio . first < < " +- " < < signal_ratio . second < < std : : endl ;
res_file < < " Rel Br Frac MuMu: " < < ( BRF_JPSI_MUMU_VAL / BRF_PSI2S_MUMU_VAL ) < < std : : endl ;
res_file < < " Rel Br Frac: " < < signal_ratio . first * ( BRF_JPSI_MUMU_VAL / BRF_PSI2S_MUMU_VAL ) < < std : : endl ;
res_file . close ( ) ;
return 0 ;
}