ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/IPHCalignment2/analysis/main_old.cpp
Revision: 1.1
Committed: Fri Nov 25 16:33:02 2011 UTC (13 years, 5 months ago) by econte
Branch: MAIN
CVS Tags: TBD2011, HEAD
Log Message:
new IPHC alignment

File Contents

# User Rev Content
1 econte 1.1 #include <fstream>
2     #include <iostream>
3     #include <math.h>
4     #include <sstream>
5     #include <stdlib.h>
6     #include "TreeProducer.h"
7     #include "TwoBodyDecaySpy.h"
8     #include "histograms.h"
9     #include <TLorentzVector.h>
10    
11     #define FITMODE 0
12    
13    
14     double cos(double a1, double b1, double c1, double a2, double b2, double c2)
15     {
16     double n1 = sqrt(a1*a1+b1*b1+c1*c1);
17     double n2 = sqrt(a2*a2+b2*b2+c2*c2);
18     double product = a1*a2+b1*b2+c1*c2;
19     return product/(n1*n2);
20     }
21    
22    
23     double stringTodouble(const std::string& word)
24     {
25     std::stringstream str;
26     str<<word;
27     double a;
28     str >> a;
29     return a;
30     }
31    
32     double massInvariant(const double& px1, const double& py1, const double& pz1,
33     const double& px2, const double& py2, const double& pz2)
34     {
35     double p1=sqrt(px1*px1+py1*py1+pz1*pz1);
36     double p2=sqrt(px2*px2+py2*py2+pz2*pz2);
37    
38    
39     double m_muon=105.658e-3;
40    
41     double e1 = sqrt(pow(m_muon,2)+pow(p1,2));
42     double e2 = sqrt(pow(m_muon,2)+pow(p2,2));
43     double E2 = pow(e1+e2,2);
44     double P2 = pow(px1+px2,2)
45     + pow(py1+py2,2)
46     + pow(pz1+pz2,2);
47     return sqrt(E2-P2);
48     }
49    
50     double pT(const double& px1, const double& py1)
51     {
52     double PT = sqrt( pow(px1,2)
53     + pow(py1,2));
54     return PT;
55     }
56    
57     double p(const double& px1, const double& py1, const double& pz1,
58     const double& px2, const double& py2, const double& pz2)
59     {
60     double P = sqrt( pow(px1+px2,2)
61     + pow(py1+py2,2)
62     + pow(pz1+pz2,2));
63     return P;
64     }
65    
66    
67     //################################ Eric and Jeremy ############################################
68    
69     /*
70     void LoopRef(TreeProducer* treeRef, HistoCollection& histos)
71     {
72     Long64_t nentries = treeRef->GetEntriesFast();
73    
74     Long64_t nbytes1 = 0, nb1 = 0;
75     Long64_t nbytes2 = 0, nb2 = 0;
76     for (Long64_t jentry=0; jentry<nentries;jentry++)
77     {
78     Long64_t ientry1 = treeRef->LoadTree(jentry);
79     if (ientry1 < 0) break;
80    
81     nb1 = treeRef->GetEntry(jentry); nbytes1 += nb1;
82    
83     double m=massInvariant(treeRef->Track_px[0], treeRef->Track_py[0], treeRef->Track_pz[0], treeRef->Track_px[1], treeRef->Track_py[1], treeRef->Track_pz[1]);
84     double mgen=massInvariant(treeRef->TrackGen_px[0], treeRef->TrackGen_py[0], treeRef->TrackGen_pz[0],treeRef->TrackGen_px[1], treeRef->TrackGen_py[1], treeRef->TrackGen_pz[1]);
85     histos.DeltaM_None->Fill((m-mgen)/mgen);
86    
87     histos.mref_histo->Fill( massInvariant(treeRef->Track_px[0], treeRef->Track_py[0], treeRef->Track_pz[0], treeRef->Track_px[1], treeRef->Track_py[1], treeRef->Track_pz[1]) );
88    
89    
90     if (treeRef->Track_charge[0]==treeRef->Track_charge[1]) std::cout << "aie" << std::endl;
91     if (treeRef->Track_charge[0]<0)
92     {
93     histos.mVSphi_m->Fill(treeRef->Track_phi[0],massInvariant(treeRef->Track_px[0], treeRef->Track_py[0], treeRef->Track_pz[0], treeRef->Track_px[1], treeRef->Track_py[1], treeRef->Track_pz[1]) );
94     }else
95     {
96     histos.mVSphi_p->Fill(treeRef->Track_phi[0],massInvariant(treeRef->Track_px[0], treeRef->Track_py[0], treeRef->Track_pz[0], treeRef->Track_px[1], treeRef->Track_py[1], treeRef->Track_pz[1]) );
97     }
98    
99     if (treeRef->Track_charge[1]<0)
100     {
101     histos.mVSphi_m->Fill(treeRef->Track_phi[1],massInvariant(treeRef->Track_px[0], treeRef->Track_py[0], treeRef->Track_pz[0], treeRef->Track_px[1], treeRef->Track_py[1], treeRef->Track_pz[1]) );
102     }else
103     {
104     histos.mVSphi_p->Fill(treeRef->Track_phi[1],massInvariant(treeRef->Track_px[0], treeRef->Track_py[0], treeRef->Track_pz[0], treeRef->Track_px[1], treeRef->Track_py[1], treeRef->Track_pz[1]) );
105     }
106    
107    
108     histos.mgen_histo->Fill( massInvariant(treeRef->TrackGen_px[0], treeRef->TrackGen_py[0], treeRef->TrackGen_pz[0],treeRef->TrackGen_px[1], treeRef->TrackGen_py[1], treeRef->TrackGen_pz[1]) );
109    
110    
111     for (unsigned int i=0;i<2;i++)
112     {
113     unsigned int j=0;
114     double theMax1 = cos(treeRef->Track_px[i],treeRef->Track_py[i],treeRef->Track_pz[i],treeRef->TrackGen_px[0],treeRef->TrackGen_py[0],treeRef->TrackGen_pz[0]);
115     double theMax2 = cos(treeRef->Track_px[i],treeRef->Track_py[i],treeRef->Track_pz[i],treeRef->TrackGen_px[1],treeRef->TrackGen_py[1],treeRef->TrackGen_pz[1]);
116     if (theMax1>theMax2) j=0; else j=1;
117    
118     double pt = sqrt(pow(treeRef->Track_px[i],2)+ pow(treeRef->Track_py[i],2));
119     double ptgen = sqrt(pow(treeRef->TrackGen_px[j],2) +pow(treeRef->TrackGen_py[j],2));
120    
121     double p = sqrt(pow(treeRef->Track_px[i],2)+ pow(treeRef->Track_py[i],2) + pow(treeRef->Track_pz[i],2));
122     double pgen = sqrt(pow(treeRef->TrackGen_px[j],2) +pow(treeRef->TrackGen_py[j],2) +pow(treeRef->TrackGen_pz[j],2));
123    
124     histos.rptref_histo->Fill((ptgen-pt)/ptgen);
125     histos.rpref_histo->Fill((pgen-p)/pgen);
126     }
127    
128    
129     }
130     }
131    
132    
133    
134    
135     void Loop(TreeProducer* tree, HistoCollection& histos)
136     {
137     Long64_t nentries = tree->GetEntriesFast();
138    
139     Long64_t nbytes1 = 0, nb1 = 0;
140     Long64_t nbytes2 = 0, nb2 = 0;
141     for (Long64_t jentry=0; jentry<nentries;jentry++)
142     {
143     Long64_t ientry2 = tree->LoadTree(jentry);
144     if (ientry2 < 0) break;
145    
146     nb2 = tree->GetEntry(jentry); nbytes2 += nb2;
147    
148    
149    
150     double m=massInvariant(tree->Track_px[0], tree->Track_py[0], tree->Track_pz[0], tree->Track_px[1], tree->Track_py[1], tree->Track_pz[1]);
151     double mgen=massInvariant(tree->TrackGen_px[0], tree->TrackGen_py[0], tree->TrackGen_pz[0],tree->TrackGen_px[1], tree->TrackGen_py[1], tree->TrackGen_pz[1]);
152     histos.DeltaM_Refit->Fill((m-mgen)/mgen);
153    
154     histos.m_histo->Fill( massInvariant(tree->Track_px[0], tree->Track_py[0], tree->Track_pz[0],
155     tree->Track_px[1], tree->Track_py[1], tree->Track_pz[1]) );
156    
157    
158    
159     for (unsigned int i=0;i<2;i++)
160     {
161     unsigned int j=0;
162     double theMax1 = cos(tree->Track_px[i],tree->Track_py[i],tree->Track_pz[i],tree->TrackGen_px[0],tree->TrackGen_py[0],tree->TrackGen_pz[0]);
163     double theMax2 = cos(tree->Track_px[i],tree->Track_py[i],tree->Track_pz[i],tree->TrackGen_px[1],tree->TrackGen_py[1],tree->TrackGen_pz[1]);
164     if (theMax1>theMax2) j=0; else j=1;
165    
166     double pt = sqrt(pow(tree->Track_px[i],2)+ pow(tree->Track_py[i],2));
167     double ptgen = sqrt(pow(tree->TrackGen_px[j],2) +pow(tree->TrackGen_py[j],2));
168     double p = sqrt(pow(tree->Track_px[i],2)+ pow(tree->Track_py[i],2) + pow(tree->Track_pz[i],2));
169     double pgen = sqrt(pow(tree->TrackGen_px[j],2) +pow(tree->TrackGen_py[j],2) +pow(tree->TrackGen_pz[j],2));
170    
171     histos.rpt_histo->Fill((ptgen-pt)/ptgen);
172     histos.rp_histo->Fill((pgen-p)/pgen);
173     }
174    
175    
176     }
177    
178     }
179    
180    
181    
182    
183     void LoopTBD(TwoBodyDecaySpy* tree, HistoCollection& histos)
184     {
185     Long64_t nentries = tree->GetEntriesFast();
186    
187     Long64_t nbytes1 = 0, nb1 = 0;
188     Long64_t nbytes2 = 0, nb2 = 0;
189     for (Long64_t jentry=0; jentry<nentries;jentry++)
190     {
191     Long64_t ientry2 = tree->LoadTree(jentry);
192     if (ientry2 < 0) break;
193    
194     nb2 = tree->GetEntry(jentry); nbytes2 += nb2;
195    
196     histos.pp_histo->Fill(tree->NewTrack_Eric_p[0]);
197     histos.pm_histo->Fill(tree->NewTrack_Eric_p[1]);
198     histos.pall_histo->Fill(tree->NewTrack_Eric_p[0]);
199     histos.pall_histo->Fill(tree->NewTrack_Eric_p[1]);
200    
201     histos.ep_histo->Fill(tree->NewTrack_Eric_pErr[0]/tree->NewTrack_Eric_p[0]);
202     histos.em_histo->Fill(tree->NewTrack_Eric_pErr[1]/tree->NewTrack_Eric_p[1]);
203     histos.eall_histo->Fill(tree->NewTrack_Eric_pErr[0]/tree->NewTrack_Eric_p[0]);
204     histos.eall_histo->Fill(tree->NewTrack_Eric_pErr[1]/tree->NewTrack_Eric_p[1]);
205     histos.mass_histo->Fill(tree->Zmass);
206    
207     histos.massrec_histo->Fill(massInvariant(tree->NewTrack_px[0],tree->NewTrack_py[0],tree->NewTrack_pz[0],tree->NewTrack_px[1],tree->NewTrack_py[1],tree->NewTrack_pz[1]));
208     histos.mbefore_histo->Fill(massInvariant(tree->OldTrack_px[0],tree->OldTrack_py[0],tree->OldTrack_pz[0],tree->OldTrack_px[1],tree->OldTrack_py[1],tree->OldTrack_pz[1]));
209    
210     }
211    
212     }
213    
214    
215     void LoopCommon(TreeProducer* tree, TwoBodyDecaySpy * treeTBD, HistoCollection& histos)
216     {
217     Long64_t nentries = tree->GetEntriesFast();
218    
219     Long64_t nbytes1 = 0, nb1 = 0;
220     Long64_t nbytes2 = 0, nb2 = 0;
221     for (Long64_t jentry=0; jentry<nentries;jentry++)
222     {
223     Long64_t ientry1 = treeTBD->LoadTree(jentry);
224     Long64_t ientry2 = tree->LoadTree(jentry);
225     if (ientry2 < 0) break;
226     if (ientry1 < 0) break;
227    
228     nb1 = treeTBD->GetEntry(jentry); nbytes1 += nb1;
229     nb2 = tree->GetEntry(jentry); nbytes2 += nb2;
230    
231    
232     double m=massInvariant(treeTBD->NewTrack_px[0], treeTBD->NewTrack_py[0], treeTBD->NewTrack_pz[0], treeTBD->NewTrack_px[1], treeTBD->NewTrack_py[1], treeTBD->NewTrack_pz[1]);
233     double mgen=massInvariant(tree->TrackGen_px[0], tree->TrackGen_py[0], tree->TrackGen_pz[0],tree->TrackGen_px[1], tree->TrackGen_py[1], tree->TrackGen_pz[1]);
234     histos.DeltaM_TBD->Fill((m-mgen)/mgen);
235    
236    
237     std::vector<int> sign(2,0);
238     for (unsigned int i=0;i<2;i++)
239     {
240     double Max1 = cos(treeTBD->NewTrack_px[i],treeTBD->NewTrack_py[i],treeTBD->NewTrack_pz[i],tree->Track_px[0],tree->Track_py[0],tree->Track_pz[0]);
241     double Max2 = cos(treeTBD->NewTrack_px[i],treeTBD->NewTrack_py[i],treeTBD->NewTrack_pz[i],tree->Track_px[1],tree->Track_py[1],tree->Track_pz[1]);
242     if (Max1>Max2) sign[i]=tree->Track_charge[0]; else sign[i]=tree->Track_charge[1];
243     }
244    
245     TVector3 vec1(treeTBD->NewTrack_px[0], treeTBD->NewTrack_py[0], treeTBD->NewTrack_pz[0]);
246     TVector3 vec2(treeTBD->NewTrack_px[1], treeTBD->NewTrack_py[1], treeTBD->NewTrack_pz[1]);
247    
248     if (sign[0]<0)
249     {
250     histos.mVSphi_m_TBD->Fill(vec1.Phi(), massInvariant(treeTBD->NewTrack_px[0], treeTBD->NewTrack_py[0], treeTBD->NewTrack_pz[0], treeTBD->NewTrack_px[1], treeTBD->NewTrack_py[1], treeTBD->NewTrack_pz[1]) );
251     }
252     else
253     {
254     histos.mVSphi_p_TBD->Fill(vec1.Phi(), massInvariant(treeTBD->NewTrack_px[0], treeTBD->NewTrack_py[0], treeTBD->NewTrack_pz[0], treeTBD->NewTrack_px[1], treeTBD->NewTrack_py[1], treeTBD->NewTrack_pz[1]));
255     }
256    
257     if (sign[1]<0)
258     {
259     histos.mVSphi_m_TBD->Fill(vec2.Phi(),massInvariant(treeTBD->NewTrack_px[0], treeTBD->NewTrack_py[0], treeTBD->NewTrack_pz[0], treeTBD->NewTrack_px[1], treeTBD->NewTrack_py[1], treeTBD->NewTrack_pz[1]) );
260     }else
261     {
262     histos.mVSphi_p_TBD->Fill(vec2.Phi(), massInvariant(treeTBD->NewTrack_px[0], treeTBD->NewTrack_py[0], treeTBD->NewTrack_pz[0], treeTBD->NewTrack_px[1], treeTBD->NewTrack_py[1], treeTBD->NewTrack_pz[1]) );
263     }
264    
265     for (unsigned int i=0; i<2; i++)
266     {
267     unsigned int j=0;
268     double theMax1 = cos(treeTBD->NewTrack_px[i],treeTBD->NewTrack_py[i],treeTBD->NewTrack_pz[i],tree->TrackGen_px[0],tree->TrackGen_py[0],tree->TrackGen_pz[0]);
269     double theMax2 = cos(treeTBD->NewTrack_px[i],treeTBD->NewTrack_py[i],treeTBD->NewTrack_pz[i],tree->TrackGen_px[1],tree->TrackGen_py[1],tree->TrackGen_pz[1]);
270     if (theMax1>theMax2) j=0; else j=1;
271    
272     double pt = sqrt(pow(treeTBD->NewTrack_px[i],2)+ pow(treeTBD->NewTrack_py[i],2));
273     double ptgen = sqrt(pow(tree->TrackGen_px[j],2) +pow(tree->TrackGen_py[j],2));
274     double p = sqrt(pow(treeTBD->NewTrack_px[i],2)+ pow(treeTBD->NewTrack_py[i],2) + pow(treeTBD->NewTrack_pz[i],2));
275     double pgen = sqrt(pow(tree->TrackGen_px[j],2) +pow(tree->TrackGen_py[j],2) +pow(tree->TrackGen_pz[j],2));
276    
277     histos.rptTBD_histo->Fill((ptgen-pt)/ptgen);
278     histos.rpTBD_histo->Fill((pgen-p)/pgen);
279     }
280     }
281    
282     }
283     */
284    
285     //############################# Christophe #################################################
286    
287    
288     void LoopRef(TreeProducer* treeRef, HistoCollection& histos)
289     {
290     Long64_t nentries = treeRef->GetEntriesFast();
291    
292     Long64_t nbytes1 = 0, nb1 = 0;
293     Long64_t nbytes2 = 0, nb2 = 0;
294     for (Long64_t jentry=0; jentry<nentries;jentry++)
295     {
296     Long64_t ientry1 = treeRef->LoadTree(jentry);
297     if (ientry1 < 0) break;
298    
299     nb1 = treeRef->GetEntry(jentry); nbytes1 += nb1;
300    
301     histos.mRef_histo->Fill( massInvariant(treeRef->Track_px[0], treeRef->Track_py[0], treeRef->Track_pz[0], treeRef->Track_px[1], treeRef->Track_py[1], treeRef->Track_pz[1]) );
302    
303     histos.mGen_histo->Fill( massInvariant(treeRef->TrackGen_px[0], treeRef->TrackGen_py[0], treeRef->TrackGen_pz[0],treeRef->TrackGen_px[1], treeRef->TrackGen_py[1], treeRef->TrackGen_pz[1]) );
304    
305    
306     for (unsigned int i=0;i<2;i++)
307     {
308     unsigned int j=0;
309     double theMax1 = cos(treeRef->Track_px[i],treeRef->Track_py[i],treeRef->Track_pz[i],treeRef->TrackGen_px[0],treeRef->TrackGen_py[0],treeRef->TrackGen_pz[0]);
310     double theMax2 = cos(treeRef->Track_px[i],treeRef->Track_py[i],treeRef->Track_pz[i],treeRef->TrackGen_px[1],treeRef->TrackGen_py[1],treeRef->TrackGen_pz[1]);
311     if (theMax1>theMax2) j=0; else j=1;
312    
313     double pt = pT(treeRef->Track_px[i], treeRef->Track_py[i]);
314     double ptgen = pT(treeRef->TrackGen_px[j], treeRef->TrackGen_py[j]);
315    
316     double p = sqrt(pow(treeRef->Track_px[i],2)+ pow(treeRef->Track_py[i],2) + pow(treeRef->Track_pz[i],2));
317     double pgen = sqrt(pow(treeRef->TrackGen_px[j],2) +pow(treeRef->TrackGen_py[j],2) +pow(treeRef->TrackGen_pz[j],2));
318    
319     histos.rptRef_histo->Fill((ptgen-pt)/ptgen);
320     histos.rpRef_histo->Fill((pgen-p)/pgen);
321     }
322    
323    
324     }
325     }
326    
327    
328     void LoopVtx(TreeProducer* treeVtx, HistoCollection& histos)
329     {
330     Long64_t nentries = treeVtx->GetEntriesFast();
331    
332     Long64_t nbytes1 = 0, nb1 = 0;
333     Long64_t nbytes2 = 0, nb2 = 0;
334     for (Long64_t jentry=0; jentry<nentries;jentry++)
335     {
336     Long64_t ientry1 = treeVtx->LoadTree(jentry);
337     if (ientry1 < 0) break;
338    
339     nb1 = treeVtx->GetEntry(jentry); nbytes1 += nb1;
340    
341     histos.mVtx_histo->Fill( massInvariant(treeVtx->Track_px[0], treeVtx->Track_py[0], treeVtx->Track_pz[0], treeVtx->Track_px[1], treeVtx->Track_py[1], treeVtx->Track_pz[1]) );
342    
343     //histos.mGen_histo->Fill( massInvariant(treeVtx->TrackGen_px[0], treeVtx->TrackGen_py[0], treeVtx->TrackGen_pz[0],treeVtx->TrackGen_px[1], treeVtx->TrackGen_py[1], treeVtx->TrackGen_pz[1]) );
344    
345    
346     for (unsigned int i=0;i<2;i++)
347     {
348     unsigned int j=0;
349     double theMax1 = cos(treeVtx->Track_px[i],treeVtx->Track_py[i],treeVtx->Track_pz[i],treeVtx->TrackGen_px[0],treeVtx->TrackGen_py[0],treeVtx->TrackGen_pz[0]);
350     double theMax2 = cos(treeVtx->Track_px[i],treeVtx->Track_py[i],treeVtx->Track_pz[i],treeVtx->TrackGen_px[1],treeVtx->TrackGen_py[1],treeVtx->TrackGen_pz[1]);
351     if (theMax1>theMax2) j=0; else j=1;
352    
353     double pt = pT(treeVtx->Track_px[i], treeVtx->Track_py[i]);
354     double ptgen = pT(treeVtx->TrackGen_px[j], treeVtx->TrackGen_py[j]);
355    
356     double p = sqrt(pow(treeVtx->Track_px[i],2)+ pow(treeVtx->Track_py[i],2) + pow(treeVtx->Track_pz[i],2));
357     double pgen = sqrt(pow(treeVtx->TrackGen_px[j],2) +pow(treeVtx->TrackGen_py[j],2) +pow(treeVtx->TrackGen_pz[j],2));
358    
359     histos.rptVtx_histo->Fill((ptgen-pt)/ptgen);
360     histos.rpVtx_histo->Fill((pgen-p)/pgen);
361     }
362    
363    
364     }
365     }
366    
367    
368     void LoopMom(TreeProducer* treeMom, HistoCollection& histos)
369     {
370     Long64_t nentries = treeMom->GetEntriesFast();
371    
372     Long64_t nbytes1 = 0, nb1 = 0;
373     Long64_t nbytes2 = 0, nb2 = 0;
374     for (Long64_t jentry=0; jentry<nentries;jentry++)
375     {
376     Long64_t ientry1 = treeMom->LoadTree(jentry);
377     if (ientry1 < 0) break;
378    
379     nb1 = treeMom->GetEntry(jentry); nbytes1 += nb1;
380    
381     histos.mMom_histo->Fill( massInvariant(treeMom->Track_px[0], treeMom->Track_py[0], treeMom->Track_pz[0], treeMom->Track_px[1], treeMom->Track_py[1], treeMom->Track_pz[1]) );
382    
383     //histos.mGen_histo->Fill( massInvariant(treeMom->TrackGen_px[0], treeMom->TrackGen_py[0], treeMom->TrackGen_pz[0],treeMom->TrackGen_px[1], treeMom->TrackGen_py[1], treeMom->TrackGen_pz[1]) );
384    
385    
386     for (unsigned int i=0;i<2;i++)
387     {
388     unsigned int j=0;
389     double theMax1 = cos(treeMom->Track_px[i],treeMom->Track_py[i],treeMom->Track_pz[i],treeMom->TrackGen_px[0],treeMom->TrackGen_py[0],treeMom->TrackGen_pz[0]);
390     double theMax2 = cos(treeMom->Track_px[i],treeMom->Track_py[i],treeMom->Track_pz[i],treeMom->TrackGen_px[1],treeMom->TrackGen_py[1],treeMom->TrackGen_pz[1]);
391     if (theMax1>theMax2) j=0; else j=1;
392    
393     double pt = pT(treeMom->Track_px[i], treeMom->Track_py[i]);
394     double ptgen = pT(treeMom->TrackGen_px[j], treeMom->TrackGen_py[j]);
395    
396     double p = sqrt(pow(treeMom->Track_px[i],2)+ pow(treeMom->Track_py[i],2) + pow(treeMom->Track_pz[i],2));
397     double pgen = sqrt(pow(treeMom->TrackGen_px[j],2) +pow(treeMom->TrackGen_py[j],2) +pow(treeMom->TrackGen_pz[j],2));
398    
399     histos.rptMom_histo->Fill((ptgen-pt)/ptgen);
400     histos.rpMom_histo->Fill((pgen-p)/pgen);
401     }
402    
403    
404     }
405     }
406    
407    
408     void LoopFull(TreeProducer* treeFull, HistoCollection& histos)
409     {
410     Long64_t nentries = treeFull->GetEntriesFast();
411    
412     Long64_t nbytes1 = 0, nb1 = 0;
413     Long64_t nbytes2 = 0, nb2 = 0;
414     for (Long64_t jentry=0; jentry<nentries;jentry++)
415     {
416     Long64_t ientry1 = treeFull->LoadTree(jentry);
417     if (ientry1 < 0) break;
418    
419     nb1 = treeFull->GetEntry(jentry); nbytes1 += nb1;
420    
421     histos.mFull_histo->Fill( massInvariant(treeFull->Track_px[0], treeFull->Track_py[0], treeFull->Track_pz[0], treeFull->Track_px[1], treeFull->Track_py[1], treeFull->Track_pz[1]) );
422    
423     //histos.mGen_histo->Fill( massInvariant(treeFull->TrackGen_px[0], treeFull->TrackGen_py[0], treeFull->TrackGen_pz[0],treeFull->TrackGen_px[1], treeFull->TrackGen_py[1], treeFull->TrackGen_pz[1]) );
424    
425    
426     for (unsigned int i=0;i<2;i++)
427     {
428     unsigned int j=0;
429     double theMax1 = cos(treeFull->Track_px[i],treeFull->Track_py[i],treeFull->Track_pz[i],treeFull->TrackGen_px[0],treeFull->TrackGen_py[0],treeFull->TrackGen_pz[0]);
430     double theMax2 = cos(treeFull->Track_px[i],treeFull->Track_py[i],treeFull->Track_pz[i],treeFull->TrackGen_px[1],treeFull->TrackGen_py[1],treeFull->TrackGen_pz[1]);
431     if (theMax1>theMax2) j=0; else j=1;
432    
433     double pt = pT(treeFull->Track_px[i], treeFull->Track_py[i]);
434     double ptgen = pT(treeFull->TrackGen_px[j], treeFull->TrackGen_py[j]);
435    
436     double p = sqrt(pow(treeFull->Track_px[i],2)+ pow(treeFull->Track_py[i],2) + pow(treeFull->Track_pz[i],2));
437     double pgen = sqrt(pow(treeFull->TrackGen_px[j],2) +pow(treeFull->TrackGen_py[j],2) +pow(treeFull->TrackGen_pz[j],2));
438    
439     histos.rptFull_histo->Fill((ptgen-pt)/ptgen);
440     histos.rpFull_histo->Fill((pgen-p)/pgen);
441     }
442    
443    
444     }
445     }
446    
447    
448     void LoopKinFit(TreeProducer* treeKinFit, HistoCollection& histos)
449     {
450     Long64_t nentries = treeKinFit->GetEntriesFast();
451    
452     Long64_t nbytes1 = 0, nb1 = 0;
453     Long64_t nbytes2 = 0, nb2 = 0;
454     for (Long64_t jentry=0; jentry<nentries;jentry++)
455     {
456     Long64_t ientry1 = treeKinFit->LoadTree(jentry);
457     if (ientry1 < 0) break;
458    
459     nb1 = treeKinFit->GetEntry(jentry); nbytes1 += nb1;
460    
461     histos.mKinFit_histo->Fill( massInvariant(treeKinFit->Track_px[0], treeKinFit->Track_py[0], treeKinFit->Track_pz[0], treeKinFit->Track_px[1], treeKinFit->Track_py[1], treeKinFit->Track_pz[1]) );
462    
463     //histos.mGen_histo->Fill( massInvariant(treeKinFit->TrackGen_px[0], treeKinFit->TrackGen_py[0], treeKinFit->TrackGen_pz[0],treeKinFit->TrackGen_px[1], treeKinFit->TrackGen_py[1], treeKinFit->TrackGen_pz[1]) );
464    
465    
466     for (unsigned int i=0;i<2;i++)
467     {
468     unsigned int j=0;
469     double theMax1 = cos(treeKinFit->Track_px[i],treeKinFit->Track_py[i],treeKinFit->Track_pz[i],treeKinFit->TrackGen_px[0],treeKinFit->TrackGen_py[0],treeKinFit->TrackGen_pz[0]);
470     double theMax2 = cos(treeKinFit->Track_px[i],treeKinFit->Track_py[i],treeKinFit->Track_pz[i],treeKinFit->TrackGen_px[1],treeKinFit->TrackGen_py[1],treeKinFit->TrackGen_pz[1]);
471     if (theMax1>theMax2) j=0; else j=1;
472    
473     double pt = pT(treeKinFit->Track_px[i], treeKinFit->Track_py[i]);
474     double ptgen = pT(treeKinFit->TrackGen_px[j], treeKinFit->TrackGen_py[j]);
475    
476     double p = sqrt(pow(treeKinFit->Track_px[i],2)+ pow(treeKinFit->Track_py[i],2) + pow(treeKinFit->Track_pz[i],2));
477     double pgen = sqrt(pow(treeKinFit->TrackGen_px[j],2) +pow(treeKinFit->TrackGen_py[j],2) +pow(treeKinFit->TrackGen_pz[j],2));
478    
479     histos.rptKinFit_histo->Fill((ptgen-pt)/ptgen);
480     histos.rpKinFit_histo->Fill((pgen-p)/pgen);
481     }
482    
483    
484     }
485     }
486    
487    
488     int init()
489     {
490    
491     return 0;
492     }
493    
494    
495     int main(int argc, char *argv[])
496     {
497     std::cout << "Analysis begins ...." << std::endl;
498     std::cout << "Check argument ..." << std::endl;
499    
500    
501     if (argc!=2)
502     {
503     std::cout << "ERROR : wrong number of arguments" << std::endl;
504     std::cout << "CORRECT SYNTAX : ./analysis input.root" << std::endl;
505     return 1;
506     }
507    
508     std::string filename = argv[1];
509     std::cout << "Input file : " << filename << std::endl;
510    
511     /// First Fit (without constraint)
512     TreeProducer treeRef(filename,"treeproducer1/ttree_NoAlgo");
513     std::cout << "N_entries for treeRef :" << treeRef.GetEntriesFast() << std::endl;
514    
515    
516     /// For Momentum constraint
517     // TwoBodyDecaySpy treeTBDMom(filename,"TwoBodyDecayMomConstraint/TwoBodyDecaySpyMom");
518     // std::cout << "N_entries for treeTBDMom :" << treeTBDMom.GetEntriesFast() << std::endl;
519    
520     TreeProducer treeMom(filename,"treeproducer3/ttree_MomTBD");
521     std::cout << "N_entries for treeMom :" << treeMom.GetEntriesFast() << std::endl;
522    
523    
524    
525     /// For Vertex constraint
526    
527     // TwoBodyDecaySpy treeTBDVtx(filename,"TwoBodyDecayVertexConstraint/TwoBodyDecaySpyVtx");
528     // std::cout << "N_entries for treeTBDVtx :" << treeTBDVtx.GetEntriesFast() << std::endl;
529    
530     TreeProducer treeVtx(filename,"treeproducer5/ttree_VtxTBD");
531     std::cout << "N_entries for treeVtx :" << treeVtx.GetEntriesFast() << std::endl;
532    
533     /// For Full constraint
534     TreeProducer treeFull(filename,"treeproducer2/ttree_FullTBD");
535     std::cout << "N_entries for treeFull :" << treeFull.GetEntriesFast() << std::endl;
536    
537     /// For KinFitter (mass)constraint
538    
539     // TwoBodyDecaySpy treeKinFitSpy(filename,"doConstraintKinFit/KinFitterSpy");
540     // std::cout << "N_entries for treeKinFitSpy :" << treeTBDVtx.GetEntriesFast() << std::endl;
541    
542     TreeProducer treeKinFit(filename,"treeproducer4/ttree_KinFit");
543     std::cout << "N_entries for treeKinFit :" << treeKinFit.GetEntriesFast() << std::endl;
544    
545    
546     std::cout << "Initializing histogram" << std::endl;
547     HistoCollection histos;
548     histos.Initialize();
549    
550     std::cout << "Filling"<<std::endl;
551    
552     LoopRef(&treeRef,histos); // Fill histos related to measurements at First Fit and at Generator Level
553     LoopVtx(&treeVtx,histos);
554     LoopMom(&treeMom,histos);
555     LoopFull(&treeFull,histos);
556     LoopKinFit(&treeKinFit,histos);
557    
558     //LoopTBD(&treeTBD,histos);
559     //LoopCommon(&tree,&treeTBD,histos);
560     std::cout << std::endl;
561     std::cout << "Drawing plots ... "<< std::endl;
562     histos.DrawInit();
563     histos.Finalize();
564    
565     std::cout << "End"<<std::endl;
566     }
567