Class Reference for E1039 Core & Analysis Software
AnaCleanAndMessyData.cc
Go to the documentation of this file.
1 #include <iostream>
2 #include <iomanip>
3 #include <TFile.h>
4 #include <TTree.h>
5 #include <TSystem.h>
6 #include <TH1D.h>
7 #include <TH2D.h>
8 #include <TEfficiency.h>
9 #include <TCanvas.h>
10 #include "AnaCleanAndMessyData.h"
11 using namespace std;
12 
14  : m_req_fpga1(false)
15  , m_verb(0)
16  , m_cl_file(0)
17  , m_cl_tree(0)
18  , m_me_file(0)
19  , m_me_tree(0)
20 {
21  ;
22 }
23 
25 {
26  ;
27 }
28 
29 void AnaCleanAndMessyData::Init(const char* fn_clean, const char* fn_messy)
30 {
31  m_cl_file = new TFile(fn_clean);
32  m_cl_tree = (TTree*)m_cl_file->Get("tree");
33  m_cl_evt = new EventData ();
34  m_cl_occ = new OccData ();
35  m_cl_trk_true = new TrackList ();
36  m_cl_trk_reco = new TrackList ();
37  m_cl_dim_true = new DimuonList();
38  m_cl_dim_reco = new DimuonList();
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);
45 
46  m_me_file = new TFile(fn_messy);
47  m_me_tree = (TTree*)m_me_file->Get("tree");
48  m_me_evt = new EventData ();
49  m_me_occ = new OccData ();
50  m_me_trk_true = new TrackList ();
51  m_me_trk_reco = new TrackList ();
52  m_me_dim_true = new DimuonList();
53  m_me_dim_reco = new DimuonList();
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);
60 
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);
74 
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);
76 
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);
80  //m_h1_pz_cl;
81  //m_h1_pz_me;
82  //m_h1_pz_diff;
83  //m_h1_xF_cl;
84  //m_h1_xF_me;
85  //m_h1_xF_diff;
86 }
87 
89 
93 {
94  int n_cl_evt = m_cl_tree->GetEntries();
95  int n_me_evt = m_me_tree->GetEntries();
96  int i_cl_evt = 0;
97  int i_me_evt = 0;
98 
99  bool no_event = false;
100  while (! no_event) {
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);
104  pair<int, int> job_evt_cl(m_cl_evt->job_id, m_cl_evt->event_id);
105  pair<int, int> job_evt_me(m_me_evt->job_id, m_me_evt->event_id);
106 
107  while (job_evt_cl != job_evt_me) { // job+event IDs are different
108  if (job_evt_cl < job_evt_me) {
109  i_cl_evt++;
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);
113  } else { // >
114  i_me_evt++;
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);
118  }
119  }
120 
121  if (Verbosity() > 9) {
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;
123  }
124  AnalyzeEvent();
125  i_cl_evt++;
126  i_me_evt++;
127  }
128 }
129 
131 {
132  if (m_cl_file) m_cl_file->Close();
133  if (m_me_file) m_me_file->Close();
134  if (m_out_file) DrawAndWriteOutput();
135 }
136 
138 
141 void AnaCleanAndMessyData::AnalyzeEvent()
142 {
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;
155 
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++) {
159  TrackData* td = &m_cl_trk_reco->at(ii);
160  if (td->charge > 0) n_trk_pos_cl++;
161  else n_trk_neg_cl++;
162  }
163 
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++) {
167  TrackData* td = &m_me_trk_reco->at(ii);
168  if (td->charge > 0) n_trk_pos_me++;
169  else n_trk_neg_me++;
170  }
171 
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);
177 
178  //m_h1_trk_pos_cl->Fill(D1, n_trk_pos_cl);
179  //m_h1_trk_pos_me->Fill(D1, n_trk_pos_me);
180  //m_h1_trk_neg_cl->Fill(D1, n_trk_neg_cl);
181  //m_h1_trk_neg_me->Fill(D1, n_trk_neg_me);
182 
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);
186 
187  for (int i_cl = 0; i_cl < n_dim_cl; i_cl++) {
188  DimuonData* dd_cl = &m_cl_dim_reco->at(i_cl);
189  bool fpga1_cl = dd_cl->pos_top && dd_cl->neg_bot || dd_cl->pos_bot && dd_cl->neg_top;
190  double mass_cl = dd_cl->mom.M();
191  if (m_req_fpga1 && !fpga1_cl) continue;
192 
193  int i_me_match = -1;
194  double mass_me_match = -1;
195  for (int i_me = 0; i_me < n_dim_me; i_me++) {
196  DimuonData* dd_me = &m_me_dim_reco->at(i_me);
197  bool fpga1_me = dd_me->pos_top && dd_me->neg_bot || dd_me->pos_bot && dd_me->neg_top;
198  if (m_req_fpga1 && !fpga1_me) continue;
199 
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)) {
203  i_me_match = i_me;
204  mass_me_match = mass_me;
205  }
206  }
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();
210  //double pz_me = dd_me->mom.Z();
211  //double xF_me = dd_me->xF;
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);
216  }
217  m_h1_dim_cl->Fill(D1);
218  }
219 }
220 
222 void AnaCleanAndMessyData::DrawAndWriteOutput()
223 {
224  m_out_file->cd();
225  m_out_file->Write();
226 
227  TCanvas* c1 = new TCanvas("c1", "");
228  c1->SetGrid();
229 
230  //TEfficiency* teff_trk_pos = new TEfficiency(*m_h1_trk_pos_me, *m_h1_trk_pos_cl);
231  //TEfficiency* teff_trk_neg = new TEfficiency(*m_h1_trk_neg_me, *m_h1_trk_neg_cl);
232  //teff_trk_pos->SetName("teff_trk_pos");
233  //teff_trk_neg->SetName("teff_trk_neg");
234  //teff_trk_pos->SetTitle(";RF+00;Reco. efficiency of #mu^{#plus}");
235  //teff_trk_neg->SetTitle(";RF+00;Reco. efficiency of #mu^{#minus}");
236  //teff_trk_pos->Draw();
237  //c1->SaveAs("result/teff_trk_pos.png");
238  //teff_trk_neg->Draw();
239  //c1->SaveAs("result/teff_trk_neg.png");
240 
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");
244  teff_dim->Draw();
245  c1->SaveAs("result/teff_dim.png");
246 
247  m_h2_ndim->Draw("colz"); c1->SaveAs("result/h2_ndim.png");
248 
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");
254 
255 
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");
260 
261  m_h1_mass_diff->Draw("E1");
262  c1->SaveAs("result/h1_mass_diff.png");
263 
264  delete c1;
265  //teff_trk_pos->Write();
266  //teff_trk_neg->Write();
267  teff_dim ->Write();
268  m_out_file->Close();
269 }
std::vector< DimuonData > DimuonList
Definition: TreeData.h:54
std::vector< TrackData > TrackList
Definition: TreeData.h:53
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.
TLorentzVector mom
Definition: TreeData.h:36
bool neg_bot
Definition: TreeData.h:60
bool pos_top
Definition: TreeData.h:57
bool pos_bot
Definition: TreeData.h:58
bool neg_top
Definition: TreeData.h:59
double weight
Definition: TreeData.h:10
int n_h3x
Definition: TreeData.h:16
int event_id
Definition: TreeData.h:10
int n_h2x
Definition: TreeData.h:15
int rfp00
Definition: TreeData.h:10
int n_h1x
Definition: TreeData.h:14
int n_h4x
Definition: TreeData.h:17
int rfp01
Definition: TreeData.h:9
int rfm01
Definition: TreeData.h:11
int job_id
Definition: TreeData.h:6
int D2
Definition: TreeData.h:30
int D3m
Definition: TreeData.h:32
int D1
Definition: TreeData.h:29
int D3p
Definition: TreeData.h:31
int charge
Definition: TreeData.h:23