Angular analysis of B+->K*+(K+pi0)mumu
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

697 lines
24 KiB

//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;
}