698 lines
24 KiB
C++
698 lines
24 KiB
C++
//Tools to add kinematic and TRUE kinematic variables to tuples
|
|
//Renata Kopecna
|
|
|
|
#include "../GlobalFunctions.hh"
|
|
#include "../Paths.hpp"
|
|
#include "../Utils.hpp"
|
|
|
|
bool bkgSample = false;
|
|
std::string tmpAdress(string year, string magnet){
|
|
//return "/home/lhcb/kopecna/B2KstarMuMu/data/data/MC/BackgroundSamples/B0toKstJpsi/"+year+magnet+"/"+year+magnet+"_pi0Resolved.root"; //uncomment for B0->KstJpsi sample
|
|
|
|
//return "/home/lhcb/kopecna/B2KstarMuMu/data/data/MC/BackgroundSamples/B0toKstMuMu/"+year+magnet+"/"+year+magnet+"_pi0Resolved.root"; //uncomment for B0->KstMuMu sample
|
|
//return "/home/lhcb/kopecna/B2KstarMuMu/data/data/MC/BackgroundSamples/BtoK1Jpsi/"+year+magnet+"/"+year+magnet+"_pi0Resolved.root"; //uncomment for B->K1Jpsi sample
|
|
|
|
return "/home/lhcb/kopecna/B2KstarMuMu/data/data/MC/BackgroundSamples/BtoXJpsi/"+year+magnet+"/"+year+magnet+"_pi0Resolved.root";
|
|
//return "/home/lhcb/kopecna/B2KstarMuMu/data/data/MC/BackgroundSamples/BtoK1MuMu/"+year+magnet+"/"+year+magnet+"_pi0Resolved.root"; //uncomment for B->K1Jpsi sample
|
|
}
|
|
|
|
int addPi0TRUEVariables(string year, int Run, string magnet, bool BDTed, bool ReferenceChannel, bool PHSP, bool KshortDecayInVelo){
|
|
//sanity checks
|
|
if (magnet == "Down") magnet = "down";
|
|
if (magnet == "Up") magnet = "up";
|
|
if (magnet == "Both" || magnet == "") magnet = "both";
|
|
|
|
if (magnet != "both" && magnet != "up" && magnet != "down"){
|
|
coutWarning("Wrong magnet polarity used! Setting magnet to both!");
|
|
magnet = "both";
|
|
}
|
|
if (magnet != "both" && BDTed){
|
|
coutWarning("BDT is applied only per yer, not per polarity! Setting magnet to both!");
|
|
magnet = "both";
|
|
}
|
|
if (!Kst2Kspiplus && KshortDecayInVelo){
|
|
coutERROR("No LL/DD tracks in KplusPizero channel! Setting KshortDecaysInVelo to false!");
|
|
KshortDecayInVelo = false;
|
|
}
|
|
|
|
gROOT->SetBatch(kTRUE);
|
|
LHCbStyle();
|
|
|
|
string treeAddress = returnFileAddress(year,Run,magnet,true,BDTed,true,ReferenceChannel,PHSP,KshortDecayInVelo);
|
|
if (bkgSample) treeAddress = tmpAdress(year,magnet);
|
|
if (BDTed) replace(treeAddress, "BDToutputSelection", "BDToutput");
|
|
TFile *file = TFile::Open(treeAddress.c_str());
|
|
if(file == 0){
|
|
coutERROR("No file called " + treeAddress+ ". Exit program!");
|
|
return 0;
|
|
}
|
|
coutInfo("Reading data from "+treeAddress);
|
|
|
|
TTree *tree = (TTree*)file->Get("DecayTreeTruthMatched");
|
|
|
|
int nOldEvts = tree->GetEntries();
|
|
|
|
if(nOldEvts == 0){
|
|
coutERROR("No entries found in TTree. Exit program!");
|
|
return 0;
|
|
}
|
|
|
|
coutDebug("Old Tree entries:\t" + to_string(nOldEvts));
|
|
|
|
//Save //NOW in a new file
|
|
replace(treeAddress,".root","_test.root");
|
|
coutDebug("Creating new file " + treeAddress);
|
|
|
|
TFile *output = new TFile(treeAddress.c_str(),"RECREATE");
|
|
TTree * newTree = tree->CloneTree();
|
|
|
|
//Create new branches
|
|
string particle = "pi_zero_resolved";
|
|
|
|
TBranch *trueMomentum;
|
|
double trueP = 0.0;
|
|
string branchName = particle + "_TRUEP_NEW";
|
|
string branchNameType =branchName+ "/D";
|
|
trueMomentum = newTree->Branch(branchName.c_str(), &trueP, branchNameType.c_str() );
|
|
|
|
TBranch *trueMomentumX;
|
|
double truePX = 0.0;
|
|
branchName = particle + "_TRUEP_X_NEW";
|
|
branchNameType =branchName+ "/D";
|
|
trueMomentumX = newTree->Branch(branchName.c_str(), &truePX, branchNameType.c_str() );
|
|
|
|
TBranch *trueMomentumY;
|
|
double truePY = 0.0;
|
|
branchName = particle + "_TRUEP_Y_NEW";
|
|
branchNameType =branchName+ "/D";
|
|
trueMomentumY = newTree->Branch(branchName.c_str(), &truePY, branchNameType.c_str() );
|
|
|
|
TBranch *trueMomentumZ;
|
|
double truePZ = 0.0;
|
|
branchName = particle + "_TRUEP_Z_NEW";
|
|
branchNameType =branchName+ "/D";
|
|
trueMomentumZ = newTree->Branch(branchName.c_str(), &truePZ, branchNameType.c_str() );
|
|
|
|
TBranch *trueMomentumT;
|
|
double truePT = 0.0;
|
|
branchName = particle + "_TRUEPT_NEW";
|
|
branchNameType =branchName+ "/D";
|
|
trueMomentumT = newTree->Branch(branchName.c_str(), &truePT, branchNameType.c_str() );
|
|
|
|
TBranch *trueMomentumE;
|
|
double truePE = 0.0;
|
|
branchName = particle + "_TRUEP_E_NEW";
|
|
branchNameType =branchName+ "/D";
|
|
trueMomentumE = newTree->Branch(branchName.c_str(), &truePE, branchNameType.c_str() );
|
|
|
|
TBranch *trueEta;
|
|
double trueETA = 0.0;
|
|
branchName = particle + "_TRUEETA_NEW";
|
|
branchNameType =branchName+ "/D";
|
|
trueEta= newTree->Branch(branchName.c_str(), &trueETA, branchNameType.c_str() );
|
|
|
|
TBranch *truePhi ;
|
|
double truePHI = 0.0;
|
|
branchName = particle + "_TRUEPHI_NEW";
|
|
branchNameType =branchName+ "/D";
|
|
truePhi = newTree->Branch(branchName.c_str(), &truePHI, branchNameType.c_str() );
|
|
|
|
TBranch *trueMass;
|
|
double trueM = 0.0;
|
|
branchName = particle + "_TRUEM_NEW";
|
|
branchNameType =branchName+ "/D";
|
|
trueMass = newTree->Branch(branchName.c_str(), &trueM, branchNameType.c_str() );
|
|
|
|
//Create a lorentz vector and load some branches form the old tree
|
|
TLorentzVector LorVec[5];
|
|
TLorentzVector LorVecTrue;
|
|
TLorentzVector LorTmp,LorVecDiMuon;
|
|
|
|
Double_t PX[5];
|
|
Double_t PY[5];
|
|
Double_t PZ[5];
|
|
Double_t PT[5];
|
|
Double_t PE[5];
|
|
|
|
string particles[5] = {"B_plus","K_star_plus","K_plus","mu_plus","mu_minus"};
|
|
|
|
for (int i = 0; i < 5; i++){
|
|
newTree->SetBranchAddress( Form("%s_TRUEP_X",particles[i].c_str()), &PX[i]);
|
|
newTree->SetBranchAddress( Form("%s_TRUEP_Y",particles[i].c_str()), &PY[i]);
|
|
newTree->SetBranchAddress( Form("%s_TRUEP_Z",particles[i].c_str()), &PZ[i]);
|
|
newTree->SetBranchAddress( Form("%s_TRUEPT",particles[i].c_str()), &PT[i]);
|
|
newTree->SetBranchAddress( Form("%s_TRUEP_E",particles[i].c_str()), &PE[i]);
|
|
}
|
|
|
|
//Loop over the old tree
|
|
coutInfo("Starting the loop!");
|
|
for (int i = 0; i < nOldEvts; i++){
|
|
newTree->GetEntry(i);
|
|
if (0ul == (i % 10000ul) || nOldEvts == i + 1) coutDebug("Read event " + to_string(i) + "/" + to_string(nOldEvts));
|
|
|
|
//Get LorVec
|
|
for (int i = 0; i < 5; i++){
|
|
LorVec[i].SetPxPyPzE(PX[i],PY[i],PZ[i],PE[i]);
|
|
}
|
|
LorVecDiMuon = LorVec[3]+LorVec[4];
|
|
LorTmp = LorVec[0] - LorVecDiMuon;
|
|
LorVecTrue = LorTmp - LorVec[2];
|
|
|
|
//Calculate the momenta and eta and phi
|
|
trueP = LorVecTrue.P();
|
|
truePX = LorVecTrue.Px();
|
|
truePY = LorVecTrue.Py();
|
|
truePZ = LorVecTrue.Pz();
|
|
truePT = LorVecTrue.Pt();
|
|
truePE = LorVecTrue.E();
|
|
trueM = LorVecTrue.M();
|
|
truePHI = LorVecTrue.Phi();
|
|
trueETA = LorVecTrue.Eta();
|
|
//Fill
|
|
trueMomentum->Fill();
|
|
trueMomentumX->Fill();
|
|
trueMomentumY->Fill();
|
|
trueMomentumZ->Fill();
|
|
trueMomentumT->Fill();
|
|
trueMomentumE->Fill();
|
|
trueEta->Fill();
|
|
truePhi->Fill();
|
|
trueMass->Fill();
|
|
}
|
|
|
|
if (nOldEvts != newTree->GetEntries()){
|
|
coutERROR("Something went wrong with filling the tree! Exit without saving the new tree.");
|
|
return 0;
|
|
}
|
|
|
|
if(!output->IsOpen()){
|
|
coutERROR("Could not create output file. Abort!");
|
|
return 0;
|
|
}
|
|
|
|
output->cd();
|
|
coutDebug("Writting into the new file " + treeAddress );
|
|
newTree->Write("",TObject::kWriteDelete);
|
|
|
|
//tree->Clear();
|
|
output->Close();
|
|
file->Close();
|
|
|
|
string command = "mv " + treeAddress + " ";
|
|
replace(treeAddress,"_test.root",".root");
|
|
|
|
command = "rm " + treeAddress + "; " + command + treeAddress;
|
|
coutDebug("Running: " + command);
|
|
system(command.c_str());
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
int addPi0TRUEVariablesAllYearMC(string year, bool ReferenceChannel, bool PHSP){
|
|
|
|
if (addPi0TRUEVariables(year,getRunID(year),"down",false,ReferenceChannel,PHSP,false)==0) return 0;
|
|
if (addPi0TRUEVariables(year,getRunID(year),"up", false,ReferenceChannel,PHSP,false)==0) return 0;
|
|
// if (addPi0TRUEVariables(year,getRunID(year),"both", false,ReferenceChannel,PHSP,false)==0) return 0;
|
|
// if (addPi0TRUEVariables(year,getRunID(year),"both", true, ReferenceChannel,PHSP,false)==0) return 0;
|
|
return 1;
|
|
}
|
|
|
|
int addPi0TRUEVariablesAllMC(int Run, bool ReferenceChannel, bool PHSP){
|
|
|
|
for (auto &year: yearsData(Run)){
|
|
addPi0TRUEVariablesAllYearMC(year,ReferenceChannel,PHSP);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
int addPi0TRUEVariablesAllMC(int Run){
|
|
|
|
if (addPi0TRUEVariablesAllMC(Run,false,false)==0) return 0;
|
|
if (addPi0TRUEVariablesAllMC(Run,true, false)==0) return 0;
|
|
if (addPi0TRUEVariablesAllMC(Run,false,true )==0) return 0;
|
|
return 1;
|
|
}
|
|
|
|
int addVariable(string year, int Run, string magnet, bool Preselected, bool BDTed, bool TM, bool ReferenceChannel, bool PHSP, bool KshortDecayInVelo,
|
|
string particle){
|
|
//sanity checks
|
|
if (magnet == "Down") magnet = "down";
|
|
if (magnet == "Up") magnet = "up";
|
|
if (magnet == "Both" || magnet == "") magnet = "both";
|
|
|
|
if (magnet != "both" && magnet != "up" && magnet != "down"){
|
|
coutWarning("Wrong magnet polarity used! Setting magnet to both!");
|
|
magnet = "both";
|
|
}
|
|
if (magnet != "both" && BDTed){
|
|
coutWarning("BDT is applied only per yer, not per polarity! Setting magnet to both!");
|
|
magnet = "both";
|
|
}
|
|
if (TM && !Preselected){
|
|
coutWarning("Stripped MC is not TruthMatched! Setting TM to false!");
|
|
TM = false;
|
|
}
|
|
if (!Kst2Kspiplus && KshortDecayInVelo){
|
|
coutERROR("No LL/DD tracks in KplusPizero channel! Setting KshortDecaysInVelo to false!");
|
|
KshortDecayInVelo = false;
|
|
}
|
|
if (!BDTed && !Preselected){ //if TMVAcut == -1, no TMVA cut is applied
|
|
coutWarning("TMVA cut can be only aplied on preselected data! Setting Preselected to true!");
|
|
Preselected = true; //Cannot do BDT cut on stripped data
|
|
}
|
|
|
|
string treeAddress = returnFileAddress(year,Run,magnet,Preselected,BDTed,true,ReferenceChannel,PHSP,KshortDecayInVelo);
|
|
if (bkgSample) treeAddress = tmpAdress(year,magnet);
|
|
if (BDTed) replace(treeAddress, "BDToutputSelection", "BDToutput");
|
|
TFile *file = TFile::Open(treeAddress.c_str());
|
|
if(file == 0){
|
|
coutERROR("No file called " + treeAddress+ ". Exit program!");
|
|
return 0;
|
|
}
|
|
coutInfo("Reading data from TTree... "+treeAddress);
|
|
|
|
TTree *tree;
|
|
if (Preselected) tree = (TTree*)file->Get("DecayTreeTruthMatched");
|
|
else tree = (TTree*)file->Get("DecayTree");
|
|
|
|
|
|
int nOldEvts = tree->GetEntries();
|
|
|
|
if(nOldEvts == 0){
|
|
coutERROR("No entries found in TTree. Exit program!");
|
|
return 0;
|
|
}
|
|
|
|
coutDebug("Old Tree entries:\t" + to_string(nOldEvts));
|
|
|
|
//Save //NOW in a new file
|
|
replace(treeAddress,".root","_test.root");
|
|
coutDebug("Creating new file " + treeAddress);
|
|
|
|
TFile *output = new TFile(treeAddress.c_str(),"RECREATE");
|
|
TTree * newTree = tree->CloneTree();
|
|
|
|
|
|
//Create new branches
|
|
string branchName = "";
|
|
string branchNameType = "";
|
|
|
|
//Create new branches for MC
|
|
TBranch *trueMass;
|
|
TBranch *trueMomentum;
|
|
TBranch *trueEta;
|
|
TBranch *truePhi ;
|
|
|
|
double trueM = 0.0;
|
|
double trueP = 0.0;
|
|
double trueETA = 0.0;
|
|
double truePHI = 0.0;
|
|
|
|
branchName = particle + "_TRUEM";
|
|
branchNameType =branchName+ "/D";
|
|
trueMass = newTree->Branch(branchName.c_str(), &trueM, branchNameType.c_str() );
|
|
|
|
branchName = particle + "_TRUEP";
|
|
branchNameType =branchName+ "/D";
|
|
trueMomentum = newTree->Branch(branchName.c_str(), &trueP, branchNameType.c_str() );
|
|
|
|
branchName = particle + "_TRUEETA";
|
|
branchNameType =branchName+ "/D";
|
|
trueEta= newTree->Branch(branchName.c_str(), &trueETA, branchNameType.c_str() );
|
|
|
|
branchName = particle + "_TRUEPHI";
|
|
branchNameType =branchName+ "/D";
|
|
truePhi = newTree->Branch(branchName.c_str(), &truePHI, branchNameType.c_str() );
|
|
|
|
//Create a lorentz vector and load some branches form the old tree
|
|
TLorentzVector LorVecTrue;
|
|
|
|
Double_t TRUEP_X;
|
|
Double_t TRUEP_Y;
|
|
Double_t TRUEP_Z;
|
|
Double_t TRUEP_E;
|
|
|
|
newTree->SetBranchAddress( Form("%s_TRUEP_X",particle.c_str()), &TRUEP_X );
|
|
newTree->SetBranchAddress( Form("%s_TRUEP_Y",particle.c_str()), &TRUEP_Y );
|
|
newTree->SetBranchAddress( Form("%s_TRUEP_Z",particle.c_str()), &TRUEP_Z );
|
|
newTree->SetBranchAddress( Form("%s_TRUEP_E",particle.c_str()), &TRUEP_E );
|
|
|
|
|
|
//Loop over the old tree
|
|
coutInfo("Starting the loop!");
|
|
for (int i = 0; i < nOldEvts; i++){
|
|
newTree->GetEntry(i);
|
|
if (0ul == (i % 10000ul) || nOldEvts == i + 1) coutDebug("Read event " + to_string(i) + "/" + to_string(nOldEvts));
|
|
|
|
//Get TRUE LorVec
|
|
LorVecTrue.SetPxPyPzE(TRUEP_X,TRUEP_Y,TRUEP_Z,TRUEP_E);
|
|
|
|
//Calculate the momenta and eta and phi
|
|
trueM = LorVecTrue.M();
|
|
trueP = LorVecTrue.P();
|
|
trueETA = LorVecTrue.Eta();
|
|
truePHI = LorVecTrue.Phi();
|
|
|
|
|
|
//Fill
|
|
trueMass->Fill();
|
|
trueMomentum->Fill();
|
|
trueEta->Fill();
|
|
truePhi->Fill();
|
|
|
|
}
|
|
|
|
if (nOldEvts != newTree->GetEntries()){
|
|
coutERROR("Something went wrong with filling the tree! Exit without saving the new tree.");
|
|
return 0;
|
|
}
|
|
|
|
if(!output->IsOpen()){
|
|
coutERROR("Could not create output file. Abort!");
|
|
return 0;
|
|
}
|
|
|
|
output->cd();
|
|
coutDebug("Writting into the new file " + treeAddress );
|
|
newTree->Write("",TObject::kWriteDelete);
|
|
|
|
output->Close();
|
|
file->Close();
|
|
|
|
string command = "mv " + treeAddress + " ";
|
|
replace(treeAddress,"_test.root",".root");
|
|
|
|
command = "rm " + treeAddress + "; " + command + treeAddress;
|
|
coutDebug("Running: " + command);
|
|
system(command.c_str());
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
int addAllVariables(string year, int Run, string magnet, bool Preselected, bool BDTed, bool TM, bool ReferenceChannel, bool PHSP, bool KshortDecayInVelo){
|
|
|
|
vector <string> particles = {"B_plus", "K_star_plus","pi_zero_resolved","K_plus", "gamma1","gamma2","mu_minus","mu_plus"} ;//TODO
|
|
|
|
for (auto& particle: particles){
|
|
coutInfo("Running particle " + particle);
|
|
if (addVariable(year,Run,magnet,Preselected,BDTed,TM,ReferenceChannel,PHSP,KshortDecayInVelo,particle)==0) return 0;
|
|
}
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
int addAllVariablesAllYearMC(string year, bool ReferenceChannel, bool PHSP){
|
|
//if (addAllVariables(year,getRunID(year),"down",true,false,false,ReferenceChannel,PHSP,false)==0) return 0;
|
|
//if (addAllVariables(year,getRunID(year),"up", true,false,false,ReferenceChannel,PHSP,false)==0) return 0;
|
|
//if (addAllVariables(year,getRunID(year),"both",true,false,true,true,ReferenceChannel,PHSP,false)==0) return 0;
|
|
if (addAllVariables(year,getRunID(year),"both",true,true,true,ReferenceChannel,PHSP,false)==0) return 0;
|
|
if (Kst2Kspiplus){
|
|
if (addAllVariables(year,getRunID(year),"down",true,false,false,ReferenceChannel,PHSP,true)==0) return 0;
|
|
if (addAllVariables(year,getRunID(year),"up", true,false,false,ReferenceChannel,PHSP,true)==0) return 0;
|
|
// if (addAllVariables(year,getRunID(year),"both",true,false,true,true,ReferenceChannel,PHSP,true)==0) return 0;
|
|
if (addAllVariables(year,getRunID(year),"both",true,true,true,ReferenceChannel,PHSP,true)==0) return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
int addAllVariablesAllMC(int Run,bool ReferenceChannel, bool PHSP){
|
|
for (auto &year: yearsMC(ReferenceChannel,PHSP,Run)){
|
|
addAllVariablesAllYearMC(year,ReferenceChannel,PHSP);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
int addAllVariablesAllMCSamples(int Run){
|
|
if (addAllVariablesAllMC(Run,false,false)==0) return 0;
|
|
if (addAllVariablesAllMC(Run,true, false)==0) return 0;
|
|
if (addAllVariablesAllMC(Run,false,true )==0) return 0;
|
|
return 1;
|
|
}
|
|
|
|
int testFunction(){
|
|
setVerboseLevel(0);
|
|
return 1;
|
|
|
|
}
|
|
|
|
int addXMuMuMass(bool Kplus, bool DTF, string year, string magnet, int Run, bool MC, bool ReferenceChannel, bool PHSP, bool KshortDecayInVelo){
|
|
//sanity checks
|
|
|
|
if (!Kst2Kspiplus && KshortDecayInVelo){
|
|
coutERROR("No LL/DD tracks in KplusPizero channel! Setting KshortDecaysInVelo to false!");
|
|
KshortDecayInVelo = false;
|
|
}
|
|
|
|
gROOT->SetBatch(kTRUE);
|
|
LHCbStyle();
|
|
|
|
|
|
string treeAddress = returnFileAddress(year,Run,magnet,true,false, MC,ReferenceChannel,PHSP,KshortDecayInVelo);
|
|
if (bkgSample) treeAddress = tmpAdress(year,magnet);
|
|
TFile *file = TFile::Open(treeAddress.c_str());
|
|
if(file == 0){
|
|
coutERROR("No file called " + treeAddress+ ". Exit program!");
|
|
return 0;
|
|
}
|
|
coutInfo("Reading data from "+treeAddress);
|
|
|
|
TTree *tree = (TTree*)file->Get(treeName(MC,true).c_str());
|
|
int nOldEvts = tree->GetEntries();
|
|
|
|
if(nOldEvts == 0){
|
|
coutERROR("No entries found in TTree. Exit program!");
|
|
return 0;
|
|
}
|
|
|
|
coutDebug("Old Tree entries:\t" + to_string(nOldEvts));
|
|
|
|
//Save //NOW in a new file
|
|
replace(treeAddress,".root","_test.root");
|
|
coutDebug("Creating new file " + treeAddress);
|
|
|
|
TFile *output = new TFile(treeAddress.c_str(),"RECREATE");
|
|
TTree * newTree = tree->CloneTree();
|
|
|
|
//Create new branches
|
|
|
|
TBranch *M_XMuMu;
|
|
double new_M = 0.0;
|
|
string branchName = Kplus ? ("M_KplusMuMu") : (DTF ? "M_PizMuMu" : "M_PizMuMu_noDTF");
|
|
string branchNameType =branchName+ "/D";
|
|
M_XMuMu = newTree->Branch(branchName.c_str(), &new_M, branchNameType.c_str() );
|
|
|
|
|
|
//Create a lorentz vector and load some branches form the old tree
|
|
const int nParticles = 3;
|
|
|
|
TLorentzVector LorVec[nParticles];
|
|
TLorentzVector LorTmp,LorVecDiMuon;
|
|
|
|
Double_t PX[nParticles];
|
|
Double_t PY[nParticles];
|
|
Double_t PZ[nParticles];
|
|
Double_t PE[nParticles];
|
|
|
|
|
|
string particles[nParticles] = {Kplus ? "K_plus" : "pi_zero_resolved","mu_plus","mu_minus"};
|
|
|
|
string s_DTF = DTF ? "_DTF" : "";
|
|
for (int i = 0; i < nParticles; i++){
|
|
newTree->SetBranchAddress( Form("%s_PX%s",particles[i].c_str(),s_DTF.c_str()), &PX[i]);
|
|
newTree->SetBranchAddress( Form("%s_PY%s",particles[i].c_str(),s_DTF.c_str()), &PY[i]);
|
|
newTree->SetBranchAddress( Form("%s_PZ%s",particles[i].c_str(),s_DTF.c_str()), &PZ[i]);
|
|
newTree->SetBranchAddress( Form("%s_PE%s",particles[i].c_str(),s_DTF.c_str()), &PE[i]);
|
|
}
|
|
|
|
//Loop over the old tree
|
|
coutInfo("Starting the loop!");
|
|
for (int i = 0; i < nOldEvts; i++){
|
|
newTree->GetEntry(i);
|
|
if (0ul == (i % 10000ul) || nOldEvts == i + 1) coutDebug("Read event " + to_string(i) + "/" + to_string(nOldEvts));
|
|
|
|
//Get LorVec
|
|
for (int i = 0; i < nParticles; i++){
|
|
LorVec[i].SetPxPyPzE(PX[i],PY[i],PZ[i],PE[i]);
|
|
}
|
|
LorVecDiMuon = LorVec[1]+LorVec[2];
|
|
LorTmp = LorVec[0] + LorVecDiMuon;
|
|
new_M = LorTmp.M();
|
|
|
|
//Fill
|
|
M_XMuMu->Fill();
|
|
}
|
|
|
|
if (nOldEvts != newTree->GetEntries()){
|
|
coutERROR("Something went wrong with filling the tree! Exit without saving the new tree.");
|
|
return 0;
|
|
}
|
|
|
|
if(!output->IsOpen()){
|
|
coutERROR("Could not create output file. Abort!");
|
|
return 0;
|
|
}
|
|
|
|
output->cd();
|
|
coutDebug("Writting into the new file " + treeAddress );
|
|
newTree->Write("",TObject::kWriteDelete);
|
|
|
|
//tree->Clear();
|
|
output->Close();
|
|
file->Close();
|
|
|
|
string command = "mv " + treeAddress + " ";
|
|
replace(treeAddress,"_test.root",".root");
|
|
|
|
command = "rm " + treeAddress + "; " + command + treeAddress;
|
|
coutDebug("Running: " + command);
|
|
system(command.c_str());
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
int addAllXMuMuMass(bool Kplus, bool DTF, int Run, bool MC, bool ReferenceChannel, bool PHSP){
|
|
for (auto &year: yearsMC(ReferenceChannel,PHSP,Run)){
|
|
addXMuMuMass(Kplus, DTF,year, "up",getRunID(year), MC, ReferenceChannel,PHSP,false);
|
|
addXMuMuMass(Kplus, DTF,year, "down",getRunID(year), MC, ReferenceChannel,PHSP,false);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
int addAllXMuMuMass(bool Kplus, bool DTF,int Run){
|
|
addAllXMuMuMass(Kplus, DTF, Run, false, false, false);
|
|
addAllXMuMuMass(Kplus, DTF, Run, true, false, false);
|
|
addAllXMuMuMass(Kplus, DTF, Run, true, true, false);
|
|
addAllXMuMuMass(Kplus, DTF, Run, true, false, true);
|
|
return 1;
|
|
}
|
|
|
|
|
|
int applyVetoKplusMuMuMass(string year, string magnet, int Run, bool MC, bool ReferenceChannel, bool PHSP, bool KshortDecayInVelo){
|
|
//sanity checks
|
|
|
|
if (!Kst2Kspiplus && KshortDecayInVelo){
|
|
coutERROR("No LL/DD tracks in KplusPizero channel! Setting KshortDecaysInVelo to false!");
|
|
KshortDecayInVelo = false;
|
|
}
|
|
gROOT->SetBatch(kTRUE);
|
|
LHCbStyle();
|
|
|
|
string treeAddress = returnFileAddress(year,Run,magnet,true,false, MC,ReferenceChannel,PHSP,KshortDecayInVelo);
|
|
if (bkgSample) treeAddress = tmpAdress(year,magnet);
|
|
|
|
TFile *file = TFile::Open(treeAddress.c_str());
|
|
if(file == 0){
|
|
coutERROR("No file called " + treeAddress+ ". Exit program!");
|
|
return 0;
|
|
}
|
|
|
|
coutInfo("Reading data from "+treeAddress);
|
|
|
|
TTree *tree = (TTree*)file->Get(treeName(MC,true).c_str());
|
|
|
|
//Save //NOW in a new file
|
|
replace(treeAddress,".root","_test.root");
|
|
coutDebug("Creating new file " + treeAddress);
|
|
|
|
TFile *output = new TFile(treeAddress.c_str(),"RECREATE");
|
|
TTree * newTree = tree->CopyTree("M_KplusMuMu<5179 || M_KplusMuMu>5379","", tree->GetEntries());
|
|
output->cd();
|
|
coutDebug("Writting into the new file " + treeAddress );
|
|
newTree->Write("",TObject::kWriteDelete);
|
|
|
|
//tree->Clear();
|
|
output->Close();
|
|
file->Close();
|
|
|
|
string command = "mv " + treeAddress + " ";
|
|
replace(treeAddress,"_test.root",".root");
|
|
|
|
command = "rm " + treeAddress + "; " + command + treeAddress;
|
|
coutDebug("Running: " + command);
|
|
system(command.c_str());
|
|
|
|
return 1;
|
|
}
|
|
|
|
int applyAllVetoKplusMuMuMass(int Run, bool MC, bool ReferenceChannel, bool PHSP){
|
|
for (auto &year: yearsMC(ReferenceChannel,PHSP,Run)){
|
|
applyVetoKplusMuMuMass(year, "up",getRunID(year), MC, ReferenceChannel,PHSP,false);
|
|
applyVetoKplusMuMuMass(year, "down",getRunID(year), MC, ReferenceChannel,PHSP,false);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
int applyAllVetoKplusMuMuMass(int Run){
|
|
applyAllVetoKplusMuMuMass(Run, false, false, false);
|
|
applyAllVetoKplusMuMuMass(Run, true, false, false);
|
|
applyAllVetoKplusMuMuMass(Run, true, true, false);
|
|
applyAllVetoKplusMuMuMass(Run, true, false, true);
|
|
return 1;
|
|
}
|
|
|
|
int applyVetoPizMuMuMass(string year, string magnet, int Run, bool MC){
|
|
//sanity checks
|
|
|
|
gROOT->SetBatch(kTRUE);
|
|
LHCbStyle();
|
|
|
|
//MC only do Jpsi region
|
|
string treeAddress = returnFileAddress(year,Run,magnet,true,false,MC,MC,false,false);
|
|
|
|
TFile *file = TFile::Open(treeAddress.c_str());
|
|
if(file == 0){
|
|
coutERROR("No file called " + treeAddress+ ". Exit program!");
|
|
return 0;
|
|
}
|
|
|
|
coutInfo("Reading data from "+treeAddress);
|
|
|
|
TTree *tree = (TTree*)file->Get(treeName(MC,true).c_str());
|
|
|
|
//Save //NOW in a new file
|
|
replace(treeAddress,".root","_test.root");
|
|
coutDebug("Creating new file " + treeAddress);
|
|
|
|
TFile *output = new TFile(treeAddress.c_str(),"RECREATE");
|
|
|
|
coutDebug("Writting into the new file " + treeAddress );
|
|
if (MC){
|
|
TTree * newTree = tree->CopyTree("M_PizMuMu>3700","", tree->GetEntries());
|
|
newTree->Write("",TObject::kWriteDelete);
|
|
}
|
|
else{
|
|
string cut = "!(" + getJpsicut() + ") || ( M_PizMuMu>3700)";
|
|
TTree *newTree = tree->CopyTree(cut.c_str(),"", tree->GetEntries());
|
|
newTree->Write("",TObject::kWriteDelete);
|
|
}
|
|
|
|
//tree->Clear();
|
|
output->Close();
|
|
file->Close();
|
|
|
|
string command = "mv " + treeAddress + " ";
|
|
replace(treeAddress,"_test.root",".root");
|
|
|
|
command = "rm " + treeAddress + "; " + command + treeAddress;
|
|
coutDebug("Running: " + command);
|
|
system(command.c_str());
|
|
|
|
return 1;
|
|
}
|
|
|
|
int applyVetoPizMuMuMass(int Run){
|
|
for (auto &year: yearsData(Run)){
|
|
applyVetoPizMuMuMass(year, "up",getRunID(year), true);
|
|
applyVetoPizMuMuMass(year, "up",getRunID(year), false);
|
|
applyVetoPizMuMuMass(year, "down",getRunID(year), true);
|
|
applyVetoPizMuMuMass(year, "down",getRunID(year), false);
|
|
}
|
|
return 1;
|
|
}
|
|
|