ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/csander/HEPTutorial/MyAnalysis.C
Revision: 1.22
Committed: Mon Jun 25 14:39:49 2012 UTC (12 years, 10 months ago) by csander
Content type: text/plain
Branch: MAIN
Changes since 1.21: +129 -71 lines
Log Message:
automated plotting

File Contents

# User Rev Content
1 csander 1.1 #define MyAnalysis_cxx
2     // The class definition in MyAnalysis.h has been generated automatically
3     // by the ROOT utility TTree::MakeSelector(). This class is derived
4     // from the ROOT class TSelector. For more information on the TSelector
5     // framework see $ROOTSYS/README/README.SELECTOR or the ROOT User Manual.
6    
7     // The following methods are defined in this file:
8     // Begin(): called every time a loop on the tree starts,
9     // a convenient place to create your histograms.
10     // SlaveBegin(): called after Begin(), when on PROOF called only on the
11     // slave servers.
12     // Process(): called for each event, in this function you decide what
13     // to read and fill your histograms.
14     // SlaveTerminate: called at the end of the loop on the tree, when on PROOF
15     // called only on the slave servers.
16     // Terminate(): called at the end of the loop on the tree,
17     // a convenient place to draw/fit your histograms.
18     //
19     // To use this file, try the following session on your Tree T:
20     //
21     // Root > T->Process("MyAnalysis.C")
22     // Root > T->Process("MyAnalysis.C","some options")
23     // Root > T->Process("MyAnalysis.C+")
24     //
25    
26     #include "MyAnalysis.h"
27 csander 1.3 #include <iostream>
28 csander 1.2 #include <TH1F.h>
29 csander 1.9 #include <TLatex.h>
30 csander 1.1
31 csander 1.3 using namespace std;
32    
33     void MyAnalysis::BuildEvent() {
34 csander 1.21
35 csander 1.19 Jets.clear();
36     for (int i = 0; i < NJet; ++i) {
37     MyJet jet(Jet_Px[i], Jet_Py[i], Jet_Pz[i], Jet_E[i]);
38     jet.SetBTagDiscriminator(Jet_btag[i]);
39     jet.SetJetID(Jet_ID[i]);
40 csander 1.20 jet.SetMatchedGenJet(Jet_Px_gen[i], Jet_Py_gen[i], Jet_Pz_gen[i], Jet_E_gen[i]);
41 csander 1.19 jet.SetFlavor(Jet_Flavor_gen[i]);
42     Jets.push_back(jet);
43     }
44     Muons.clear();
45     for (int i = 0; i < NMuon; ++i) {
46     MyMuon muon(Muon_Px[i], Muon_Py[i], Muon_Pz[i], Muon_E[i]);
47     muon.SetIsolation(Muon_Iso[i]);
48     muon.SetCharge(Muon_Charge[i]);
49     muon.SetChargeGen(Muon_Charge_gen[i]);
50 csander 1.20 muon.SetMatchedGenMuon(Muon_Px_gen[i], Muon_Py_gen[i], Muon_Pz_gen[i], Muon_E_gen[i]);
51 csander 1.19 Muons.push_back(muon);
52     }
53     Electrons.clear();
54     for (int i = 0; i < NElectron; ++i) {
55 csander 1.20 MyElectron electron(Electron_Px[i], Electron_Py[i], Electron_Pz[i], Electron_E[i]);
56 csander 1.19 electron.SetIsolation(Electron_Iso[i]);
57     electron.SetCharge(Electron_Charge[i]);
58     electron.SetChargeGen(Electron_Charge_gen[i]);
59 csander 1.20 electron.SetMatchedGenElectron(Electron_Px_gen[i], Electron_Py_gen[i], Electron_Pz_gen[i], Electron_E_gen[i]);
60 csander 1.19 Electrons.push_back(electron);
61     }
62     Photons.clear();
63     for (int i = 0; i < NPhoton; ++i) {
64     MyPhoton photon(Photon_Px[i], Photon_Py[i], Photon_Pz[i], Photon_E[i]);
65     photon.SetIsolation(Photon_Iso[i]);
66 csander 1.20 photon.SetMatchedGenPhoton(Photon_Px_gen[i], Photon_Py_gen[i], Photon_Pz_gen[i], Photon_E_gen[i]);
67 csander 1.19 Photons.push_back(photon);
68     }
69     Taus.clear();
70     for (int i = 0; i < NTau; ++i) {
71     MyTau tau(Tau_Px[i], Tau_Py[i], Tau_Pz[i], Tau_E[i]);
72 csander 1.21 tau.SetTauID(Tau_ID[i]);
73 csander 1.20 tau.SetMatchedGenJet(Tau_Px_gen[i], Tau_Py_gen[i], Tau_Pz_gen[i], Tau_E_gen[i]);
74 csander 1.19 Taus.push_back(tau);
75     }
76 csander 1.22 Partons.clear();
77     for (int i = 0; i < NParton; ++i) {
78     MyParton parton(Parton_Px[i], Parton_Py[i], Parton_Pz[i], Parton_E[i]);
79     parton.SetPid(Parton_Pid[i]);
80     parton.SetNo(Parton_No[i]);
81     Partons.push_back(parton);
82     }
83 csander 1.19 met.SetXYZM(MET_px, MET_py, 0., 0.);
84     genmet.SetXYZM(MET_px_gen, MET_py_gen, 0., 0.);
85    
86     EventWeight *= weight_factor;
87 csander 1.9
88 csander 1.3 }
89    
90 csander 1.2 void MyAnalysis::Begin(TTree * /*tree*/) {
91 csander 1.19 // The Begin() function is called at the start of the query.
92     // When running with PROOF Begin() is only called on the client.
93     // The tree argument is deprecated (on PROOF 0 is passed).
94 csander 1.1
95 csander 1.19 TString option = GetOption();
96 csander 1.1
97     }
98    
99 csander 1.2 void MyAnalysis::SlaveBegin(TTree * /*tree*/) {
100 csander 1.19 // The SlaveBegin() function is called after the Begin() function.
101     // When running with PROOF SlaveBegin() is called on each slave server.
102     // The tree argument is deprecated (on PROOF 0 is passed).
103    
104     TString option = GetOption();
105    
106     h_Mmumu = new TH1F("Mmumu", "Invariant di-muon mass", 100, 0, 1000);
107 csander 1.22 h_Mmumu->SetXTitle("m_{#mu#mu} [GeV]");
108 csander 1.19 h_Mmumu->Sumw2();
109 csander 1.22 histograms.push_back(h_Mmumu);
110 csander 1.19
111     h_NJet = new TH1F("NJet", "Number of jets", 20, 0, 20);
112 csander 1.22 h_NJet->SetXTitle("N_{Jets}");
113 csander 1.19 h_NJet->Sumw2();
114 csander 1.22 histograms.push_back(h_NJet);
115 csander 1.19
116     h_NBJet = new TH1F("NBJet", "Number of b-jets", 5, 0, 5);
117 csander 1.22 h_NBJet->SetXTitle("N_{b-Jets}");
118 csander 1.19 h_NBJet->Sumw2();
119 csander 1.22 histograms.push_back(h_NBJet);
120 csander 1.19
121 csander 1.20 h_Jet1_Pt = new TH1F("Jet1Pt", "Pt of jet1", 50, 0, 1000);
122 csander 1.22 h_Jet1_Pt->SetXTitle("p_{T,jet1} [GeV]");
123 csander 1.19 h_Jet1_Pt->Sumw2();
124 csander 1.22 histograms.push_back(h_Jet1_Pt);
125 csander 1.19
126 csander 1.20 h_Jet2_Pt = new TH1F("Jet2Pt", "Pt of jet2", 50, 0, 1000);
127 csander 1.22 h_Jet2_Pt->SetXTitle("p_{T,jet2} [GeV]");
128 csander 1.19 h_Jet2_Pt->Sumw2();
129 csander 1.22 histograms.push_back(h_Jet2_Pt);
130 csander 1.19
131 csander 1.20 h_Jet3_Pt = new TH1F("Jet3Pt", "Pt of jet3", 50, 0, 1000);
132 csander 1.22 h_Jet3_Pt->SetXTitle("p_{T,jet3} [GeV]");
133 csander 1.19 h_Jet3_Pt->Sumw2();
134 csander 1.22 histograms.push_back(h_Jet3_Pt);
135 csander 1.19
136     h_Jet1_Eta = new TH1F("Jet1Eta", "#eta of jet1", 50, -5, 5);
137 csander 1.22 h_Jet1_Eta->SetXTitle("#eta_{jet1}");
138 csander 1.19 h_Jet1_Eta->Sumw2();
139 csander 1.22 histograms.push_back(h_Jet1_Eta);
140 csander 1.19
141     h_Jet2_Eta = new TH1F("Jet2Eta", "#eta of jet2", 50, -5, 5);
142 csander 1.22 h_Jet2_Eta->SetXTitle("#eta_{jet2}");
143 csander 1.19 h_Jet2_Eta->Sumw2();
144 csander 1.22 histograms.push_back(h_Jet2_Eta);
145 csander 1.19
146     h_Jet3_Eta = new TH1F("Jet3Eta", "#eta of jet3", 50, -5, 5);
147 csander 1.22 h_Jet3_Eta->SetXTitle("#eta_{jet3}");
148 csander 1.19 h_Jet3_Eta->Sumw2();
149 csander 1.22 histograms.push_back(h_Jet3_Eta);
150 csander 1.19
151 csander 1.20 h_BJet1_Pt = new TH1F("BJet1Pt", "Pt of b-jet1", 50, 0, 1000);
152 csander 1.22 h_BJet1_Pt->SetXTitle("p_{T,b-jet1} [GeV]");
153 csander 1.19 h_BJet1_Pt->Sumw2();
154 csander 1.22 histograms.push_back(h_BJet1_Pt);
155 csander 1.19
156 csander 1.20 h_BJet2_Pt = new TH1F("BJet2Pt", "Pt of b-jet2", 50, 0, 1000);
157 csander 1.22 h_BJet2_Pt->SetXTitle("p_{T,b-jet2} [GeV]");
158 csander 1.19 h_BJet2_Pt->Sumw2();
159 csander 1.22 histograms.push_back(h_BJet2_Pt);
160 csander 1.19
161 csander 1.20 h_BJet1_Eta = new TH1F("BJet1Eta", "#eta of b-jet1", 50, -5, 5);
162 csander 1.22 h_BJet1_Eta->SetXTitle("#eta_{b-jet1}");
163 csander 1.19 h_BJet1_Eta->Sumw2();
164 csander 1.22 histograms.push_back(h_BJet1_Eta);
165 csander 1.19
166 csander 1.20 h_BJet2_Eta = new TH1F("BJet2Eta", "#eta of b-jet2", 50, -5, 5);
167 csander 1.22 h_BJet2_Eta->SetXTitle("#eta_{b-jet2}");
168 csander 1.19 h_BJet2_Eta->Sumw2();
169 csander 1.22 histograms.push_back(h_BJet2_Eta);
170 csander 1.19
171 csander 1.20 h_MET = new TH1F("MET", "MET", 50, 0, 2000);
172 csander 1.22 h_MET->SetXTitle("MET [GeV]");
173 csander 1.19 h_MET->Sumw2();
174 csander 1.22 histograms.push_back(h_MET);
175 csander 1.19
176 csander 1.20 h_MHT = new TH1F("MHT", "MHT", 50, 0, 2000);
177 csander 1.22 h_MHT->SetXTitle("MHT [GeV]");
178 csander 1.19 h_MHT->Sumw2();
179 csander 1.22 histograms.push_back(h_MHT);
180 csander 1.19
181 csander 1.20 h_HT = new TH1F("HT", "HT", 50, 0, 5000);
182 csander 1.22 h_HT->SetXTitle("HT [GeV]");
183 csander 1.19 h_HT->Sumw2();
184 csander 1.22 histograms.push_back(h_HT);
185 csander 1.20
186 csander 1.22 h_DeltaPhiJet1Jet2 = new TH1F("DeltaPhiJet1Jet2", "DeltaPhiJet1Jet2", 50, -TMath::Pi(), TMath::Pi());
187 csander 1.20 h_DeltaPhiJet1Jet2->SetXTitle("DeltaPhiJet1Jet2");
188     h_DeltaPhiJet1Jet2->Sumw2();
189 csander 1.22 histograms.push_back(h_DeltaPhiJet1Jet2);
190    
191     h_DeltaPhiJet1MHT = new TH1F("DeltaPhiJet1MHT", "DeltaPhiJet1MHT", 50, -TMath::Pi(), TMath::Pi());
192     h_DeltaPhiJet1MHT->SetXTitle("DeltaPhiJet1MHT");
193     h_DeltaPhiJet1MHT->Sumw2();
194     histograms.push_back(h_DeltaPhiJet1MHT);
195    
196     h_DeltaPhiJet2MHT = new TH1F("DeltaPhiJet2MHT", "DeltaPhiJet2MHT", 50, -TMath::Pi(), TMath::Pi());
197     h_DeltaPhiJet2MHT->SetXTitle("DeltaPhiJet2MHT");
198     h_DeltaPhiJet2MHT->Sumw2();
199     histograms.push_back(h_DeltaPhiJet2MHT);
200    
201     h_DeltaPhiJet3MHT = new TH1F("DeltaPhiJet3MHT", "DeltaPhiJet3MHT", 50, -TMath::Pi(), TMath::Pi());
202     h_DeltaPhiJet3MHT->SetXTitle("DeltaPhiJet3MHT");
203     h_DeltaPhiJet3MHT->Sumw2();
204     histograms.push_back(h_DeltaPhiJet3MHT);
205 csander 1.20
206     h_Jet1OverHT = new TH1F("h_Jet1OverHT", "h_Jet1OverHT", 50, 0, 1.0);
207 csander 1.22 h_Jet1OverHT->SetXTitle("p_{T,jet1}/HT");
208 csander 1.20 h_Jet1OverHT->Sumw2();
209 csander 1.22 histograms.push_back(h_Jet1OverHT);
210 csander 1.20
211     h_Jet2OverHT = new TH1F("h_Jet2OverHT", "h_Jet2OverHT", 50, 0, 1.0);
212 csander 1.22 h_Jet2OverHT->SetXTitle("p_{T,jet2}/HT");
213 csander 1.20 h_Jet2OverHT->Sumw2();
214 csander 1.22 histograms.push_back(h_Jet2OverHT);
215 csander 1.20
216     h_Jet12OverHT = new TH1F("h_Jet12OverHT", "h_Jet12OverHT", 50, 0, 1.0);
217 csander 1.22 h_Jet12OverHT->SetXTitle("(p_{T,jet1}+p_{T,jet2})/HT");
218 csander 1.20 h_Jet12OverHT->Sumw2();
219 csander 1.22 histograms.push_back(h_Jet12OverHT);
220 csander 1.20
221     h_MHTOverHT = new TH1F("h_MHTOverHT", "h_MHTOverHT", 50, 0, 1.0);
222 csander 1.22 h_MHTOverHT->SetXTitle("MHT/HT");
223 csander 1.20 h_MHTOverHT->Sumw2();
224 csander 1.22 histograms.push_back(h_MHTOverHT);
225 csander 1.20
226     h_Muon1_Pt = new TH1F("Muon1Pt", "Pt of muon1", 50, 0, 1000);
227 csander 1.22 h_Muon1_Pt->SetXTitle("p_{T,muon1} [GeV]");
228 csander 1.20 h_Muon1_Pt->Sumw2();
229 csander 1.22 histograms.push_back(h_Muon1_Pt);
230 csander 1.20
231     h_Electron1_Pt = new TH1F("Electron1Pt", "Pt of electron1", 50, 0, 1000);
232 csander 1.22 h_Electron1_Pt->SetXTitle("p_{T,electron1} [GeV]");
233 csander 1.20 h_Electron1_Pt->Sumw2();
234 csander 1.22 histograms.push_back(h_Electron1_Pt);
235 csander 1.1 }
236    
237 csander 1.2 Bool_t MyAnalysis::Process(Long64_t entry) {
238 csander 1.19 // The Process() function is called for each entry in the tree (or possibly
239     // keyed object in the case of PROOF) to be processed. The entry argument
240     // specifies which entry in the currently loaded tree is to be processed.
241     // It can be passed to either MyAnalysis::GetEntry() or TBranch::GetEntry()
242     // to read either all or the required parts of the data. When processing
243     // keyed objects with PROOF, the object is already loaded and is available
244     // via the fObject pointer.
245     //
246     // This function should contain the "body" of the analysis. It can contain
247     // simple or elaborate selection criteria, run algorithms on the data
248     // of the event and typically fill histograms.
249     //
250     // The processing can be stopped by calling Abort().
251     //
252     // Use fStatus to set the return value of TTree::Process().
253     //
254     // The return value is currently not used.
255    
256     ++TotalEvents;
257    
258     GetEntry(entry);
259    
260     Event event(EventNumber, LumiNumber, RunNumber);
261    
262     if (TotalEvents % 10000 == 0)
263     cout << "Next event -----> " << TotalEvents << endl;
264    
265     if (EventList != 0) {
266     if (!EventList->IsInList(event))
267     return 0;
268     }
269    
270     BuildEvent();
271    
272 csander 1.21 // cout << "Jets: " << endl;
273     // for (vector<MyJet>::iterator it = Jets.begin(); it != Jets.end(); ++it) {
274     // cout << "pt, eta, phi, btag: " << it->Pt() << ", " << it->Eta() << ", " << it->Phi() << ", " << it->IsBTagged() << endl;
275     // }
276     // cout << "Muons: " << endl;
277     // for (vector<MyMuon>::iterator it = Muons.begin(); it != Muons.end(); ++it) {
278     // cout << "pt, eta, phi, iso, charge: " << it->Pt() << ", " << it->Eta() << ", " << it->Phi() << ", " << it->GetIsolation() << ", " << it->GetCharge()
279     // << endl;
280     // }
281     // cout << "Electrons: " << endl;
282     // for (vector<MyElectron>::iterator it = Electrons.begin(); it != Electrons.end(); ++it) {
283     // cout << "pt, eta, phi, iso, charge: " << it->Pt() << ", " << it->Eta() << ", " << it->Phi() << ", " << it->GetIsolation() << ", " << it->GetCharge()
284     // << endl;
285     // }
286     // cout << "Photons: " << endl;
287     // for (vector<MyPhoton>::iterator it = Photons.begin(); it != Photons.end(); ++it) {
288     // cout << "pt, eta, phi, iso: " << it->Pt() << ", " << it->Eta() << ", " << it->Phi() << ", " << it->GetIsolation() << endl;
289     // }
290     // cout << "Taus: " << endl;
291     // for (vector<MyTau>::iterator it = Taus.begin(); it != Taus.end(); ++it) {
292     // cout << "pt, eta, phi, ID: " << it->Pt() << ", " << it->Eta() << ", " << it->Phi() << ", " << it->GetTauID() << endl;
293     // }
294 csander 1.19
295     //////////////////////////////
296     int N_BJet = 0;
297     int N_Jet = 0;
298 csander 1.22 int Jet_Mult = 0;
299     int BJet_Mult = 0;
300 csander 1.19 double HT = 0;
301     TLorentzVector MHT(0, 0, 0, 0);
302 csander 1.22 double DeltaPhiJet1MHT = 0;
303     double DeltaPhiJet2MHT = 0;
304     double DeltaPhiJet3MHT = 0;
305 csander 1.19
306     for (vector<MyJet>::iterator it = Jets.begin(); it != Jets.end(); ++it) {
307    
308     if (!it->GetJetID() && it->Pt() > 30)
309     return 0;
310    
311     if (it->Pt() > 30)
312 csander 1.22 MHT -= *it;
313 csander 1.19
314     if (it->Pt() > 50 && fabs(it->Eta()) < 2.5)
315     HT += it->Pt();
316 csander 1.22 }
317    
318     if (HT < 500 || MHT.Pt() < 200)
319     return 0;
320    
321     N_Jet = 0;
322     bool DeltaPhiCut = false;
323     for (vector<MyJet>::iterator it = Jets.begin(); it != Jets.end(); ++it) {
324    
325     ++N_Jet;
326    
327     if (N_Jet == 1) {
328     DeltaPhiJet1MHT = MHT.DeltaPhi(*it);
329     if (fabs(DeltaPhiJet1MHT) < 0.5)
330     DeltaPhiCut = true;
331     } else if (N_Jet == 2) {
332     DeltaPhiJet2MHT = MHT.DeltaPhi(*it);
333     if (fabs(DeltaPhiJet2MHT) < 0.5)
334     DeltaPhiCut = true;
335     } else if (N_Jet == 3) {
336     DeltaPhiJet3MHT = MHT.DeltaPhi(*it);
337     if (fabs(DeltaPhiJet3MHT) < 0.3)
338     DeltaPhiCut = true;
339     }
340     }
341    
342     if (DeltaPhiCut)
343     return 0;
344    
345     for (vector<MyMuon>::iterator it = Muons.begin(); it != Muons.end(); ++it) {
346     if (it->Pt() > 10 && it->IsIsolated() && fabs(it->Eta()) < 2.4) {
347     return 0;
348     }
349     }
350    
351     for (vector<MyElectron>::iterator it = Electrons.begin(); it != Electrons.end(); ++it) {
352     if (it->Pt() > 10 && it->IsIsolated() && fabs(it->Eta()) < 2.5 && !(fabs(it->Eta()) < 1.566 && fabs(it->Eta()) > 1.444)) {
353     return 0;
354     }
355     }
356    
357     N_Jet = 0;
358     for (vector<MyJet>::iterator it = Jets.begin(); it != Jets.end(); ++it) {
359    
360     ++N_Jet;
361    
362     if (it->Pt() > 50 && fabs(it->Eta()) < 2.5)
363     ++Jet_Mult;
364 csander 1.19
365     if (N_Jet == 1) {
366     h_Jet1_Pt->Fill(it->Pt(), EventWeight);
367     h_Jet1_Eta->Fill(it->Eta(), EventWeight);
368 csander 1.22 h_DeltaPhiJet1MHT->Fill(DeltaPhiJet1MHT, EventWeight);
369 csander 1.19 } else if (N_Jet == 2) {
370     h_Jet2_Pt->Fill(it->Pt(), EventWeight);
371     h_Jet2_Eta->Fill(it->Eta(), EventWeight);
372 csander 1.22 h_DeltaPhiJet2MHT->Fill(DeltaPhiJet2MHT, EventWeight);
373 csander 1.19 } else if (N_Jet == 3) {
374     h_Jet3_Pt->Fill(it->Pt(), EventWeight);
375     h_Jet3_Eta->Fill(it->Eta(), EventWeight);
376 csander 1.22 h_DeltaPhiJet3MHT->Fill(DeltaPhiJet3MHT, EventWeight);
377 csander 1.19 }
378     if (it->IsBTagged()) {
379     ++N_BJet;
380 csander 1.22 if (it->Pt() > 30)
381     ++BJet_Mult;
382 csander 1.19 if (N_BJet == 1) {
383     h_BJet1_Pt->Fill(it->Pt(), EventWeight);
384     h_BJet1_Eta->Fill(it->Eta(), EventWeight);
385     } else if (N_BJet == 2) {
386     h_BJet2_Pt->Fill(it->Pt(), EventWeight);
387     h_BJet2_Eta->Fill(it->Eta(), EventWeight);
388     }
389     }
390     }
391 csander 1.22 h_NBJet->Fill(BJet_Mult, EventWeight);
392     h_NJet->Fill(Jet_Mult, EventWeight);
393 csander 1.19
394     h_MET->Fill(met.Pt(), EventWeight);
395     h_MHT->Fill(MHT.Pt(), EventWeight);
396     h_HT->Fill(HT, EventWeight);
397     //////////////////////////////
398    
399     //////////////////////////////
400 csander 1.20 if (Jets.size() > 1) {
401     h_DeltaPhiJet1Jet2->Fill(Jets.at(0).DeltaPhi(Jets.at(1)), EventWeight);
402     h_Jet2OverHT->Fill(Jets.at(1).Pt() / HT, EventWeight);
403     h_Jet12OverHT->Fill((Jets.at(0).Pt() + Jets.at(1).Pt()) / HT, EventWeight);
404     }
405 csander 1.21 if (HT > 0)
406     h_Jet1OverHT->Fill(Jets.at(0).Pt() / HT, EventWeight);
407     if (HT > 0)
408     h_MHTOverHT->Fill(MHT.Pt() / HT, EventWeight);
409 csander 1.20 //////////////////////////////
410    
411     //////////////////////////////
412 csander 1.19 if (NMuon > 1) {
413 csander 1.20 if (Muons.at(0).GetCharge() * Muons.at(1).GetCharge() < 1 && Muons.at(0).IsIsolated() && Muons.at(1).IsIsolated()) {
414 csander 1.19 h_Mmumu->Fill((Muons.at(0) + Muons.at(1)).M(), EventWeight);
415     }
416     }
417     //////////////////////////////
418 csander 1.8
419 csander 1.19 return kTRUE;
420 csander 1.1 }
421    
422 csander 1.2 void MyAnalysis::SlaveTerminate() {
423 csander 1.19 // The SlaveTerminate() function is called after all entries or objects
424     // have been processed. When running with PROOF SlaveTerminate() is called
425     // on each slave server.
426 csander 1.1
427     }
428    
429 csander 1.2 void MyAnalysis::Terminate() {
430 csander 1.19 // The Terminate() function is the last function to be called during
431     // a query. It always runs on the client, it can be used to present
432     // the results graphically or save the results to file.
433 csander 1.1
434     }