File indexing completed on 2026-05-23 08:12:16
0001 #pragma once
0002 #if ROOT_VERSION_CODE >= ROOT_VERSION(6,00,0)
0003
0004 #include <TTree.h>
0005 #include <TLegend.h>
0006 #include <TCanvas.h>
0007 #include <TH1.h>
0008 #include <TH2.h>
0009 #include <TExec.h>
0010
0011 #include "Special_colors.h"
0012
0013 #include "sPhenixStyle.h"
0014 #include "sPhenixStyle.C"
0015
0016
0017
0018
0019
0020
0021 #include <vector>
0022 #include <array>
0023 #include <math.h>
0024 #include <string>
0025 #include <numbers>
0026 #include <utility>
0027
0028 R__LOAD_LIBRARY(libVandyClasses.so);
0029
0030
0031 Skaydis_colors* stylepoints {nullptr};
0032
0033 TExec* les {nullptr};
0034 TExec* bi {nullptr};
0035 TExec* trans {nullptr};
0036 TExec* enby {nullptr};
0037 std::string tag{""};
0038 bool isData {false};
0039
0040 TH1F* wEECtruthtowers {nullptr};
0041 TH1F* wEECtruthparticles{nullptr};
0042 TH1F* wEECrecotowers {nullptr};
0043
0044 TH1F* pairtruthtowers {nullptr};
0045 TH1F* pairtruthparticles{nullptr};
0046 TH1F* pairrecotowers {nullptr};
0047
0048 const std::vector<double> new_dPhiBins = {
0049
0050 0.0000000, 0.14159265,
0051 0.34159265, 0.54159265, 0.74159265, 0.94159265,
0052 1.2415927, 1.5415927, 1.8415927, 2.1415927,
0053 2.3415927, 2.5415927, 2.7415927, 2.9415927,
0054 3.0415927, 3.1415927
0055 };
0056 std::vector<float> pairweights = {0.,5e-5};
0057 void makePairweightbins()
0058 {
0059 float upper = 2;
0060 float second_to_upper = 1;
0061 float loglower = std::log10(pairweights[1]);
0062 float logupper = std::log10(second_to_upper);
0063 int nlogbins = 17;
0064 float delta = (logupper-loglower)/((float) nlogbins-2);
0065 for(int i=1; i < nlogbins; i++){
0066 float binedge = std::pow(10, loglower + i*delta);
0067 if( binedge == pairweights[1] ) continue;
0068 else if (binedge >= second_to_upper) break;
0069 pairweights.push_back(binedge);
0070 }
0071 pairweights.push_back(second_to_upper);
0072 pairweights.push_back(upper);
0073 return;
0074 }
0075 void InitJetHistos(
0076 std::array<std::pair<std::vector<JetInfo>*, TH1F*>*, 5>* holding_array,
0077 std::vector<JetInfo>* jt,
0078 TH1F* pt,
0079 int type,
0080 std::string nametag,
0081 std::string tag
0082 )
0083 {
0084 pt=new TH1F(std::format("h_{0}_jet_r0{1}", nametag, type+2).c_str(),
0085 std::format("{} Jet R=0.{}; p_{{T}} [GeV]; #sigma", tag, type+2).c_str(),
0086 25, -0.5, 99.5 );
0087 std::pair<std::vector<JetInfo>*, TH1F*> ha = std::make_pair(jt, pt);
0088 holding_array->at(type)=&ha;
0089 return;
0090 }
0091 void InitTowerHistos(
0092 TH1F* h_tower,
0093 std::string nametag,
0094 std::string tag
0095 )
0096 {
0097 h_tower = new TH1F(std::format("h_{}_e", nametag).c_str(),
0098 std::format("{} Energy; E [GeV]; N_{{towers}}", tag).c_str(),
0099 1000, 1e-4, 10);
0100 return;
0101 }
0102
0103 void InitwEECHistos()
0104 {
0105
0106 wEECtruthtowers = new TH1F(
0107 "h_truth_wEEC",
0108 "Truth tower wEEC; #Delta #varphi; wEEC",
0109 32, new_dPhiBins.data() );
0110
0111 wEECtruthparticles = new TH1F(
0112 "h_part_wEEC",
0113 "Truth particle level wEEC; #Delta #varphi; wEEC",
0114 32, new_dPhiBins.data() );
0115
0116 wEECrecotowers = new TH1F(
0117 "h_reco_wEEC",
0118 "Reco tower wEEC; #Delta #varphi; wEEC",
0119 32, new_dPhiBins.data() );
0120 return;
0121 }
0122
0123 void InitPairHistos()
0124 {
0125 pairtruthtowers = new TH1F(
0126 "h_truth_pair",
0127 "Truth tower pair; #frac{E_{T,1}E_{T,2}}{p_{T, avg}^{2}}; N_{pair}",
0128 pairweights.size(), pairweights.data() );
0129
0130 pairtruthparticles = new TH1F(
0131 "h_part_pair",
0132 "Truth particle level pair; #frac{E_{T,1}E_{T,2}}{p_{T, avg}^{2}}; N_{pair}",
0133 pairweights.size(), pairweights.data() );
0134
0135 pairrecotowers = new TH1F(
0136 "h_reco_pair",
0137 "Reco tower pair; #frac{E_{T,1}E_{T,2}}{p_{T, avg}^{2}}; N_{pair}",
0138 pairweights.size(), pairweights.data() );
0139 return;
0140 }
0141
0142 void SetJetBranches(
0143 TTree* t,
0144 std::array<std::pair<std::vector<JetInfo>*, TH1F*>*, 5>* truthjets,
0145 std::array<std::pair<std::vector<JetInfo>*, TH1F*>*, 5>* towerjets,
0146 std::array<std::pair<std::vector<JetInfo>*, TH1F*>*, 5>* truthtowerjets
0147 )
0148 {
0149 if(!isData)
0150 {
0151 for(int i=0; i<(int)truthjets->size(); i++)
0152 {
0153 if(!truthjets->at(i)) continue;
0154 t->SetBranchAddress(std::format("TruthJetInfo_r0{}", i+2).c_str(), &(truthjets->at(i)->first));
0155 }
0156 for(int i=0; i<(int)truthtowerjets->size(); i++)
0157 {
0158 if(!t->FindBranch(std::format("TruthTowerJetInfo_r0{}", i+2).c_str())) break;
0159 if(!truthtowerjets->at(i) ) continue;
0160 t->SetBranchAddress(std::format("TruthTowerJetInfo_r0{}", i+2).c_str(), &(truthtowerjets->at(i)->first));
0161 }
0162 }
0163 for(int i=0; i<(int)towerjets->size(); i++)
0164 {
0165 if(!towerjets->at(i)) continue;
0166 t->SetBranchAddress(std::format("JetInfo_r0{}", i+2).c_str(), &(towerjets->at(i)->first));
0167 }
0168 return;
0169 }
0170
0171 void SetTowerBranches(
0172 TTree* t,
0173 std::vector<Tower>* particle,
0174 std::vector<Tower>* truth_tower,
0175 std::vector<Tower>* reco_tower
0176 )
0177 {
0178 if(isData)
0179 {
0180 if(particle) t->SetBranchAddress("TruthParticles", &particle);
0181 if(truth_tower) t->SetBranchAddress("TruthTowers", &truth_tower);
0182 }
0183
0184 if(reco_tower) t->SetBranchAddress("TowerInfo", &reco_tower);
0185 return;
0186 }
0187
0188 void getwEEC(std::vector<Tower>* towers, TH1F* output_hist, float Q2)
0189 {
0190 for(int i=0; i<(int)towers->size()-1; i++)
0191 {
0192 float pt1 = std::pow(towers->at(i).px(), 2) + std::pow(towers->at(i).py(), 2);
0193 float phi1 = std::atan2(towers->at(i).py(), towers->at(i).px());
0194 pt1 = std::sqrt(pt1);
0195 for(int j=i+1; j<(int)towers->size(); j++)
0196 {
0197 float pt2 = std::pow(towers->at(j).px(), 2) + std::pow(towers->at(j).py(), 2);
0198 pt2 = std::sqrt(pt2);
0199 float phi2 = std::atan2(towers->at(j).py(), towers->at(j).px());
0200 float pw = pt1 * pt2/Q2;
0201 float dphi = phi1 - phi2;
0202 if(dphi < M_PI ) dphi+=2*M_PI;
0203 if(dphi > M_PI ) dphi-=2*M_PI;
0204 output_hist->Fill(dphi, pw);
0205 }
0206 }
0207 return;
0208 }
0209
0210 void eventLoop(
0211 int event_n,
0212 TTree* t,
0213 std::array<std::pair<std::vector<JetInfo>*, TH1F*>*, 5>* truthjets,
0214 std::array<std::pair<std::vector<JetInfo>*, TH1F*>*, 5>* towerjets,
0215 std::array<std::pair<std::vector<JetInfo>*, TH1F*>*, 5>* truthtowerjets,
0216 std::pair<std::vector<Tower>*, TH1F*>* truthparticles,
0217 std::pair<std::vector<Tower>*, TH1F*>* truthtowers,
0218 std::pair<std::vector<Tower>*, TH1F*>* recotowers,
0219 EventInfo* event
0220 )
0221 {
0222 std::cout<<"Event " <<event_n <<" out of " <<t->GetEntries() <<std::endl;
0223 t->GetEntry(event_n);
0224 std::cout<<__LINE__<<std::endl;
0225 bool isDijet = true;
0226 float Q2 = 1.;
0227 for(int i=0; i< 5; i++)
0228 {
0229 if(!event->is_dijet_event(i)) isDijet=false;
0230 }
0231 if(!isDijet) return;
0232 std::cout<<__LINE__<<std::endl;
0233
0234 if(!isData)
0235 {
0236 bool isTruthDijet = true;
0237 for(int i=0; i< 5; i++)
0238 {
0239 if(!event->is_dijetTruth_event(i)) isTruthDijet=false;
0240 }
0241 if(!isTruthDijet) return;
0242 Q2 = std::pow(event->get_leadTruth_pT(2),2) +std::pow( event->get_subleadTruth_pT(2), 2);
0243 for(int i=0; i<(int)truthjets->size(); i++)
0244 {
0245 if(!truthjets->at(i) ||
0246 !truthjets->at(i)->second
0247 ) continue;
0248 for(int j=0; j<(int) truthjets->at(i)->first->size(); j++)
0249 truthjets->at(i)->second->Fill(truthjets->at(i)->first->at(j).pt());
0250 }
0251 getwEEC(truthparticles->first, wEECtruthparticles, Q2);
0252 std::cout<<__LINE__<<std::endl;
0253
0254 for(int i=0; i<(int)truthtowerjets->size(); i++)
0255 {
0256 if(!t->FindBranch(std::format("TruthTowerJetInfo_r0{}", i+2).c_str())) break;
0257 if(!truthtowerjets->at(i) ||
0258 !truthtowerjets->at(i)->second
0259 ) continue;
0260 for(int j=0; j<(int) truthtowerjets->at(i)->first->size(); j++)
0261 truthtowerjets->at(i)->second->Fill(truthtowerjets->at(i)->first->at(j).pt());
0262 }
0263 std::cout<<__LINE__<<std::endl;
0264
0265 for(int i=0; i<(int)truthtowers->first->size(); i++)
0266 {
0267 if(!truthtowers ||
0268 !truthtowers->first ||
0269 !truthtowers->second
0270 ) continue;
0271 truthtowers->second->Fill(truthtowers->first->at(i).e());
0272 }
0273 std::cout<<__LINE__<<std::endl;
0274
0275 getwEEC(truthtowers->first, wEECtruthtowers, Q2);
0276
0277 }
0278 Q2 = std::pow(event->get_lead_pT(2),2) + std::pow(event->get_sublead_pT(2),2);
0279 std::cout<<__LINE__<<std::endl;
0280
0281 for(int i=0; i<(int)towerjets->size(); i++)
0282 {
0283 if(!towerjets->at(i) ||
0284 !towerjets->at(i)->second
0285 ) continue;
0286 for(int j=0; j<(int) towerjets->at(i)->first->size(); j++)
0287 towerjets->at(i)->second->Fill(towerjets->at(i)->first->at(j).pt());
0288 }
0289 std::cout<<__LINE__<<std::endl;
0290 for(int i=0; i<(int)recotowers->first->size(); i++)
0291 {
0292 if(!recotowers ||
0293 !recotowers->first ||
0294 !recotowers->second
0295 ) continue;
0296 recotowers->second->Fill(recotowers->first->at(i).e());
0297
0298 getwEEC(recotowers->first, wEECrecotowers, Q2);
0299 }
0300 std::cout<<__LINE__<<std::endl;
0301 return;
0302 }
0303
0304 void DrawPlots(
0305 std::array<std::pair<std::vector<JetInfo>*, TH1F*>*, 5>* truthjets,
0306 std::array<std::pair<std::vector<JetInfo>*, TH1F*>*, 5>* towerjets,
0307 std::array<std::pair<std::vector<JetInfo>*, TH1F*>*, 5>* truthtowerjets,
0308 std::pair<std::vector<Tower>*, TH1F*>* truthparticles,
0309 std::pair<std::vector<Tower>*, TH1F*>* truthtowers,
0310 std::pair<std::vector<Tower>*, TH1F*>* recotowers,
0311 float weight,
0312 std::string output_file_name
0313 )
0314 {
0315 TFile* output = new TFile(output_file_name.c_str(), "RECREATE");
0316 return;
0317 }
0318
0319 int TruthSkimmerQA(std::string input_file_name, std::string outputQA_name, bool isD=false, std::string gen="Pythia")
0320 {
0321 tag = gen;
0322 stylepoints = new Skaydis_colors();
0323 isData = isD;
0324
0325 trans=new TExec("trans_pallet", "gStyle->SetPalette(100, style_points->Trans_gradient_PT);");
0326 bi=new TExec("bi_pallet", "gStyle->SetPalette(100, style_points->Trans_gradient_PT);");
0327 les=new TExec("les_pallet", "gStyle->SetPalette(100, style_points->Trans_gradient_PT);");
0328 enby=new TExec("enby_pallet", "gStyle->SetPalette(100, style_points->Trans_gradient_PT);");
0329 TFile* input_file = new TFile(input_file_name.c_str(), "READ");
0330 input_file->cd();
0331
0332
0333
0334 std::vector<JetInfo>* truthjet02 {nullptr};
0335 std::vector<JetInfo>* truthjet03 {nullptr};
0336 std::vector<JetInfo>* truthjet04 {nullptr};
0337 std::vector<JetInfo>* truthjet05 {nullptr};
0338 std::vector<JetInfo>* truthjet06 {nullptr};
0339
0340 TH1F* truthjet02pt {nullptr};
0341 TH1F* truthjet03pt {nullptr};
0342 TH1F* truthjet04pt {nullptr};
0343 TH1F* truthjet05pt {nullptr};
0344 TH1F* truthjet06pt {nullptr};
0345
0346
0347 std::vector<JetInfo>* towerjet02 {nullptr};
0348 std::vector<JetInfo>* towerjet03 {nullptr};
0349 std::vector<JetInfo>* towerjet04 {nullptr};
0350 std::vector<JetInfo>* towerjet05 {nullptr};
0351 std::vector<JetInfo>* towerjet06 {nullptr};
0352
0353 TH1F* towerjet02pt {nullptr};
0354 TH1F* towerjet03pt {nullptr};
0355 TH1F* towerjet04pt {nullptr};
0356 TH1F* towerjet05pt {nullptr};
0357 TH1F* towerjet06pt {nullptr};
0358
0359
0360 std::vector<JetInfo>* truthtowerjet02 {nullptr};
0361 std::vector<JetInfo>* truthtowerjet03 {nullptr};
0362 std::vector<JetInfo>* truthtowerjet04 {nullptr};
0363 std::vector<JetInfo>* truthtowerjet05 {nullptr};
0364 std::vector<JetInfo>* truthtowerjet06 {nullptr};
0365
0366 TH1F* truthtowerjet02pt {nullptr};
0367 TH1F* truthtowerjet03pt {nullptr};
0368 TH1F* truthtowerjet04pt {nullptr};
0369 TH1F* truthtowerjet05pt {nullptr};
0370 TH1F* truthtowerjet06pt {nullptr};
0371
0372
0373 std::array< std::pair<std::vector<JetInfo>*, TH1F*>*, 5>* truthjets = new std::array<std::pair<std::vector<JetInfo>*, TH1F*>*, 5> {};
0374 std::array< std::pair<std::vector<JetInfo>*, TH1F*>*, 5>* towerjets = new std::array<std::pair<std::vector<JetInfo>*, TH1F*>*, 5> {};
0375 std::array< std::pair<std::vector<JetInfo>*, TH1F*>*, 5>* truthtowerjets = new std::array<std::pair<std::vector<JetInfo>*, TH1F*>*, 5> {};
0376
0377 InitJetHistos(truthjets, truthjet02, truthjet02pt, 0, "truth", "Truth Jets");
0378 InitJetHistos(truthjets, truthjet03, truthjet03pt, 1, "truth", "Truth Jets");
0379 InitJetHistos(truthjets, truthjet04, truthjet04pt, 2, "truth", "Truth Jets");
0380 InitJetHistos(truthjets, truthjet05, truthjet05pt, 3, "truth", "Truth Jets");
0381 InitJetHistos(truthjets, truthjet06, truthjet06pt, 4, "truth", "Truth Jets");
0382
0383 InitJetHistos(towerjets, towerjet02, towerjet02pt, 0, "reco_tower", "Reco Tower Jets");
0384 InitJetHistos(towerjets, towerjet03, towerjet03pt, 1, "reco_tower", "Reco Tower Jets");
0385 InitJetHistos(towerjets, towerjet04, towerjet04pt, 2, "reco_tower", "Reco Tower Jets");
0386 InitJetHistos(towerjets, towerjet05, towerjet05pt, 3, "reco_tower", "Reco Tower Jets");
0387 InitJetHistos(towerjets, towerjet06, towerjet06pt, 4, "reco_tower", "Reco Tower Jets");
0388
0389 InitJetHistos(truthtowerjets, truthtowerjet02, truthtowerjet02pt, 0, "truth_tower", "Truth Tower Jets");
0390 InitJetHistos(truthtowerjets, truthtowerjet03, truthtowerjet03pt, 1, "truth_tower", "Truth Tower Jets");
0391 InitJetHistos(truthtowerjets, truthtowerjet04, truthtowerjet04pt, 2, "truth_tower", "Truth Tower Jets");
0392 InitJetHistos(truthtowerjets, truthtowerjet05, truthtowerjet05pt, 3, "truth_tower", "Truth Tower Jets");
0393 InitJetHistos(truthtowerjets, truthtowerjet06, truthtowerjet06pt, 4, "truth_tower", "Truth Tower Jets");
0394
0395 TTree* t = (TTree*) input_file->Get("T");
0396 SetJetBranches(t, truthjets, towerjets, truthtowerjets);
0397 std::vector<Tower>* truthparticles_V = new std::vector<Tower> {};
0398 std::vector<Tower>* truthtowers_V = new std::vector<Tower> {};
0399 std::vector<Tower>* recotowers_V = new std::vector<Tower> {};
0400
0401 SetTowerBranches(t, truthparticles_V, truthtowers_V, recotowers_V);
0402 TH1F* truthparticles_H {nullptr};
0403 TH1F* truthtowers_H {nullptr};
0404 TH1F* recotowers_H {nullptr};
0405
0406 InitTowerHistos(truthparticles_H, "t_p", "Truth Particles");
0407 InitTowerHistos(truthtowers_H, "t_t", "Truth Towers");
0408 InitTowerHistos(recotowers_H, "r_t", "Reco Towers");
0409 std::pair<std::vector<Tower>*, TH1F*>* truthparticles
0410 = new std::pair<std::vector<Tower>*, TH1F*> {truthparticles_V, truthparticles_H};
0411 std::pair<std::vector<Tower>*, TH1F*>* truthtowers
0412 = new std::pair<std::vector<Tower>*, TH1F*> {truthtowers_V, truthtowers_H};
0413 std::pair<std::vector<Tower>*, TH1F*>* recotowers
0414 = new std::pair<std::vector<Tower>*, TH1F*> {recotowers_V, recotowers_H};
0415 EventInfo* event = new EventInfo();
0416 t->SetBranchAddress("EventInfo", &event);
0417 int n = t->GetEntries();
0418 for(int i=1; i<n/1000; i++)
0419 eventLoop(i, t,
0420 truthjets, towerjets, truthtowerjets,
0421 truthparticles, truthtowers, recotowers,
0422 event);
0423 t->GetEntry(2);
0424 float sigma = event->get_cross_section();
0425 float weight = sigma /(float)n;
0426 DrawPlots(
0427 truthjets, towerjets, truthtowerjets,
0428 truthparticles, truthtowers, recotowers,
0429 weight, outputQA_name
0430 );
0431 input_file->Close();
0432 return 0;
0433 };
0434 #endif