8 #include <TEfficiency.h>
31 m_cl_file =
new TFile(fn_clean);
32 m_cl_tree = (TTree*)m_cl_file->Get(
"tree");
39 m_cl_tree->SetBranchAddress(
"evt" , &m_cl_evt);
40 m_cl_tree->SetBranchAddress(
"occ" , &m_cl_occ);
41 m_cl_tree->SetBranchAddress(
"trk_true", &m_cl_trk_true);
42 m_cl_tree->SetBranchAddress(
"trk_reco", &m_cl_trk_reco);
43 m_cl_tree->SetBranchAddress(
"dim_true", &m_cl_dim_true);
44 m_cl_tree->SetBranchAddress(
"dim_reco", &m_cl_dim_reco);
46 m_me_file =
new TFile(fn_messy);
47 m_me_tree = (TTree*)m_me_file->Get(
"tree");
54 m_me_tree->SetBranchAddress(
"evt" , &m_me_evt);
55 m_me_tree->SetBranchAddress(
"occ" , &m_me_occ);
56 m_me_tree->SetBranchAddress(
"trk_true", &m_me_trk_true);
57 m_me_tree->SetBranchAddress(
"trk_reco", &m_me_trk_reco);
58 m_me_tree->SetBranchAddress(
"dim_true", &m_me_dim_true);
59 m_me_tree->SetBranchAddress(
"dim_reco", &m_me_dim_reco);
61 gSystem->mkdir(
"result",
true);
62 m_out_file =
new TFile(
"result/output.root",
"RECREATE");
63 m_h1_rfp00 =
new TH1D(
"h1_rfp00",
";RF+00;", 100, 0, 1000);
64 m_h1_D1 =
new TH1D(
"h1_D1" ,
";D1;" , 100, 0, 800);
65 m_h1_D2 =
new TH1D(
"h1_D2" ,
";D2;" , 100, 0, 500);
66 m_h1_D3p =
new TH1D(
"h1_D3p" ,
";D3p;", 100, 0, 500);
67 m_h1_D3m =
new TH1D(
"h1_D3m" ,
";D3m;", 100, 0, 500);
68 m_h1_trk_pos_cl =
new TH1D(
"h1_trk_pos_cl",
";D1;", 40, 0, 400);
69 m_h1_trk_pos_me =
new TH1D(
"h1_trk_pos_me",
";D1;", 40, 0, 400);
70 m_h1_trk_neg_cl =
new TH1D(
"h1_trk_neg_cl",
";D1;", 40, 0, 400);
71 m_h1_trk_neg_me =
new TH1D(
"h1_trk_neg_me",
";D1;", 40, 0, 400);
72 m_h1_dim_cl =
new TH1D(
"h1_dim_cl" ,
";D1;", 40, 0, 400);
73 m_h1_dim_me =
new TH1D(
"h1_dim_me" ,
";D1;", 40, 0, 400);
75 m_h2_ndim =
new TH2D(
"h2_ndim",
";N of clean dimuons; N of messy dimuons", 5, -0.5, 4.5, 5, -0.5, 4.5);
77 m_h1_mass_cl =
new TH1D(
"h1_mass_cl" ,
";Dimuon mass (GeV);Yield", 120, 1, 7);
78 m_h1_mass_me =
new TH1D(
"h1_mass_me" ,
";Dimuon mass (GeV);Yield", 120, 1, 7);
79 m_h1_mass_diff =
new TH1D(
"h1_mass_diff",
";Messy - Clean of dimuon mass (GeV);Yield", 100, -0.25, 0.25);
94 int n_cl_evt = m_cl_tree->GetEntries();
95 int n_me_evt = m_me_tree->GetEntries();
99 bool no_event =
false;
101 if (i_cl_evt >= n_cl_evt || i_me_evt >= n_me_evt)
return;
102 m_cl_tree->GetEntry(i_cl_evt);
103 m_me_tree->GetEntry(i_me_evt);
107 while (job_evt_cl != job_evt_me) {
108 if (job_evt_cl < job_evt_me) {
110 if (i_cl_evt >= n_cl_evt)
return;
111 m_cl_tree->GetEntry(i_cl_evt);
112 job_evt_cl = pair<int, int>(m_cl_evt->
job_id, m_cl_evt->
event_id);
115 if (i_me_evt >= n_me_evt)
return;
116 m_me_tree->GetEntry(i_me_evt);
117 job_evt_me = pair<int, int>(m_me_evt->
job_id, m_me_evt->
event_id);
122 cout <<
"AnaCleanAndMessyData::Analyze(): Job ID " << m_cl_evt->
job_id <<
", Event ID " << m_cl_evt->
event_id <<
": Clean " << i_cl_evt <<
"/" << n_cl_evt <<
", Messy " << i_me_evt <<
"/" << n_me_evt << endl;
132 if (m_cl_file) m_cl_file->Close();
133 if (m_me_file) m_me_file->Close();
134 if (m_out_file) DrawAndWriteOutput();
141 void AnaCleanAndMessyData::AnalyzeEvent()
143 double ww = m_cl_evt->
weight;
144 int rfp01 = m_me_evt->
rfp01;
145 int rfp00 = m_me_evt->
rfp00;
146 int rfm01 = m_me_evt->
rfm01;
147 int n_h1x = m_me_evt->
n_h1x;
148 int n_h2x = m_me_evt->
n_h2x;
149 int n_h3x = m_me_evt->
n_h3x;
150 int n_h4x = m_me_evt->
n_h4x;
151 int D1 = m_me_occ->
D1;
152 int D2 = m_me_occ->
D2;
153 int D3p = m_me_occ->
D3p;
154 int D3m = m_me_occ->
D3m;
156 int n_trk_pos_cl = 0;
157 int n_trk_neg_cl = 0;
158 for (
int ii = 0; ii < m_cl_trk_reco->size(); ii++) {
160 if (td->
charge > 0) n_trk_pos_cl++;
164 int n_trk_pos_me = 0;
165 int n_trk_neg_me = 0;
166 for (
int ii = 0; ii < m_me_trk_reco->size(); ii++) {
168 if (td->
charge > 0) n_trk_pos_me++;
172 m_h1_rfp00->Fill(rfp00, ww);
173 m_h1_D1 ->Fill(D1, ww);
174 m_h1_D2 ->Fill(D2, ww);
175 m_h1_D3p ->Fill(D3p, ww);
176 m_h1_D3m ->Fill(D3m, ww);
183 int n_dim_cl = m_cl_dim_reco->size();
184 int n_dim_me = m_me_dim_reco->size();
185 m_h2_ndim ->Fill(n_dim_cl, n_dim_me);
187 for (
int i_cl = 0; i_cl < n_dim_cl; i_cl++) {
190 double mass_cl = dd_cl->
mom.M();
191 if (m_req_fpga1 && !fpga1_cl)
continue;
194 double mass_me_match = -1;
195 for (
int i_me = 0; i_me < n_dim_me; i_me++) {
198 if (m_req_fpga1 && !fpga1_me)
continue;
200 double mass_me = dd_me->
mom.M();
201 if (i_me_match < 0 ||
202 fabs(mass_me - mass_cl) < fabs(mass_me_match - mass_cl)) {
204 mass_me_match = mass_me;
207 if (i_me_match >= 0) {
208 DimuonData* dd_me = &m_me_dim_reco->at(i_me_match);
209 double mass_me = dd_me->
mom.M();
212 m_h1_mass_cl ->Fill(mass_cl, ww);
213 m_h1_mass_me ->Fill(mass_me, ww);
214 m_h1_mass_diff->Fill(mass_me - mass_cl, ww);
215 if (fabs(mass_me - mass_cl) < 0.05) m_h1_dim_me->Fill(D1);
217 m_h1_dim_cl->Fill(D1);
222 void AnaCleanAndMessyData::DrawAndWriteOutput()
227 TCanvas* c1 =
new TCanvas(
"c1",
"");
241 TEfficiency* teff_dim =
new TEfficiency(*m_h1_dim_me, *m_h1_dim_cl);
242 teff_dim->SetName(
"teff_dim");
243 teff_dim->SetTitle(
";D1;Messy / Clean of dimuon");
245 c1->SaveAs(
"result/teff_dim.png");
247 m_h2_ndim->Draw(
"colz"); c1->SaveAs(
"result/h2_ndim.png");
249 m_h1_rfp00->Draw(
"E1"); c1->SaveAs(
"result/h1_rfp00.png");
250 m_h1_D1 ->Draw(
"E1"); c1->SaveAs(
"result/h1_D1.png");
251 m_h1_D2 ->Draw(
"E1"); c1->SaveAs(
"result/h1_D2.png");
252 m_h1_D3p ->Draw(
"E1"); c1->SaveAs(
"result/h1_D3p.png");
253 m_h1_D3m ->Draw(
"E1"); c1->SaveAs(
"result/h1_D3m.png");
256 m_h1_mass_cl->SetLineColor(kRed);
257 m_h1_mass_cl->Draw(
"E1");
258 m_h1_mass_me->Draw(
"E1same");
259 c1->SaveAs(
"result/h1_mass.png");
261 m_h1_mass_diff->Draw(
"E1");
262 c1->SaveAs(
"result/h1_mass_diff.png");
std::vector< DimuonData > DimuonList
std::vector< TrackData > TrackList
virtual ~AnaCleanAndMessyData()
void Init(const char *fn_clean, const char *fn_messy)
void Analyze()
Function to analyze a pair of non-embedded and embedded (i.e. clean and messy) data.