ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitAna/PhysicsMod/src/ttEvtSelMod.cc
Revision: 1.3
Committed: Fri Oct 10 10:54:13 2008 UTC (16 years, 7 months ago) by ceballos
Content type: text/plain
Branch: MAIN
Changes since 1.2: +3 -1 lines
Log Message:
fixing small memory leaks

File Contents

# User Rev Content
1 ceballos 1.3 // $Id: ttEvtSelMod.cc,v 1.2 2008/10/09 18:10:23 ceballos Exp $
2 ceballos 1.1
3     #include "MitAna/PhysicsMod/interface/ttEvtSelMod.h"
4     #include <TH1D.h>
5     #include <TH2D.h>
6     #include "MitAna/DataTree/interface/Names.h"
7     #include "MitAna/DataCont/interface/ObjArray.h"
8     #include "MitCommon/MathTools/interface/MathUtils.h"
9    
10     using namespace mithep;
11     ClassImp(mithep::ttEvtSelMod)
12    
13     //--------------------------------------------------------------------------------------------------
14     ttEvtSelMod::ttEvtSelMod(const char *name, const char *title) :
15     BaseMod(name,title),
16     fPrintDebug(false),
17     fMetName(Names::gkCaloMetBrn),
18     fMuonName(Names::gkMuonBrn),
19     fCleanJetsName(Names::gkCleanJetsName),
20     fMCLeptonsName(Names::gkMCLeptonsName),
21     fMCQuarksName(Names::gkMCQuarksName),
22     fMet(0),
23     fMuons(0),
24     fNEventsProcessed(0)
25     {
26     // Constructor.
27     }
28    
29     //--------------------------------------------------------------------------------------------------
30     void ttEvtSelMod::Begin()
31     {
32     // Run startup code on the client machine. For this module, we dont do
33     // anything here.
34     }
35    
36     //--------------------------------------------------------------------------------------------------
37     void ttEvtSelMod::Process()
38     {
39     // Process entries of the tree. For this module, we just load the branches and
40     fNEventsProcessed++;
41    
42     if (fNEventsProcessed % 1000 == 0 || fPrintDebug) {
43     time_t systime;
44     systime = time(NULL);
45     cerr << endl << "ttEvtSelMod : Process Event " << fNEventsProcessed << " Time: " << ctime(&systime) << endl;
46     }
47    
48     //Get Generator Level information for matching
49     //ObjArray<MCParticle> *GenLeptons = dynamic_cast<ObjArray<MCParticle>* > (FindObjThisEvt(fMCLeptonsName.Data()));
50     ObjArray<MCParticle> *GenQuarks = dynamic_cast<ObjArray<MCParticle>* > (FindObjThisEvt(fMCQuarksName.Data()));
51    
52     //Obtain all the good objects from the event cleaning module
53     ObjArray<Electron> *CleanElectrons = dynamic_cast<ObjArray<Electron>* >
54     (FindObjThisEvt(Names::gkCleanElectronsName));
55     ObjArray<Muon> *CleanMuons = dynamic_cast<ObjArray<Muon>* >
56     (FindObjThisEvt(Names::gkCleanMuonsName));
57     ObjArray<Jet> *CleanJets = dynamic_cast<ObjArray<Jet>* >
58     (FindObjThisEvt(fCleanJetsName.Data()));
59    
60     LoadBranch(fMetName);
61     Met *caloMet = fMet->At(0);
62    
63     vector<ChargedParticle*> leptons;
64     vector<string> leptonType;
65    
66     LoadBranch(fMuonName);
67     ObjArray<Muon> *DirtyMuons = new ObjArray<Muon>;
68     for (UInt_t i=0; i<fMuons->GetEntries(); ++i) {
69     Muon *mu = fMuons->At(i);
70     if(!mu->GlobalTrk()) continue;
71     if(mu->Pt() < 5.0) continue;
72    
73     bool isCleanMuon = false;
74     for (UInt_t j=0; j<CleanMuons->GetEntries(); j++) {
75     if(fMuons->At(i) == CleanMuons->At(j)) isCleanMuon = true;
76     }
77     if(isCleanMuon == false) DirtyMuons->Add(mu);
78     }
79    
80     // Make lepton vector from muons and electrons
81     for (UInt_t j=0; j<CleanMuons->GetEntries(); j++) {
82     leptons.push_back(CleanMuons->At(j));
83     leptonType.push_back("mu");
84     }
85     for (UInt_t j=0; j<CleanElectrons->GetEntries(); j++) {
86     leptons.push_back(CleanElectrons->At(j));
87     leptonType.push_back("e");
88     }
89    
90     // Sort the Leptons by Pt
91     for(UInt_t i=0; i<leptons.size(); i++){
92     for(UInt_t j=i+1; j<leptons.size(); j++){
93     if(leptons[i]->Pt() < leptons[j]->Pt()) {
94     //swap i and j
95     ChargedParticle* templepton = leptons[i];
96     leptons[i] = leptons[j];
97     leptons[j] = templepton;
98     string templeptonType = leptonType[i];
99     leptonType[i] = leptonType[j];
100     leptonType[j] = templeptonType;
101     }
102     }
103     }
104     if (fPrintDebug) {
105     cout << "Check Lepton Sort\n";
106     for(UInt_t i=0; i<leptons.size(); i++)
107     cout << leptons[i]->Pt() << endl;
108     }
109    
110 ceballos 1.2 // Pt requirements && MET requirements
111     if (leptons.size() >= 2 && caloMet->Pt() >= 0 &&
112     leptons[0]->Pt() > 20 && leptons[1]->Pt() > 15){
113    
114     CompositeParticle *dilepton = new CompositeParticle();
115     dilepton->AddDaughter(leptons[0]);
116     dilepton->AddDaughter(leptons[1]);
117     // Charge of the leptons should be opposite && minimum mass requirement
118     if (dilepton->Charge() == 0 && dilepton->Mass() > 12){
119    
120     // Sort and count the number of central Jets for vetoing
121     vector<Jet*> sortedJets;
122     int nCentralJets = 0;
123     for(UInt_t i=0; i<CleanJets->GetEntries(); i++){
124     if(fabs(CleanJets->At(i)->Eta()) < 2.5){
125     nCentralJets++;
126     Jet* jet_f = new Jet(CleanJets->At(i)->Px()*CleanJets->At(i)->L2RelativeCorrectionScale()*CleanJets->At(i)->L3AbsoluteCorrectionScale(),
127     CleanJets->At(i)->Py()*CleanJets->At(i)->L2RelativeCorrectionScale()*CleanJets->At(i)->L3AbsoluteCorrectionScale(),
128     CleanJets->At(i)->Pz()*CleanJets->At(i)->L2RelativeCorrectionScale()*CleanJets->At(i)->L3AbsoluteCorrectionScale(),
129     CleanJets->At(i)->E() *CleanJets->At(i)->L2RelativeCorrectionScale()*CleanJets->At(i)->L3AbsoluteCorrectionScale());
130     sortedJets.push_back(jet_f);
131     }
132     }
133     for(UInt_t i=0; i<sortedJets.size(); i++){
134     for(UInt_t j=i+1; j<sortedJets.size(); j++){
135     if(sortedJets[i]->Pt() < sortedJets[j]->Pt()) {
136     //swap i and j
137     Jet* tempjet = sortedJets[i];
138     sortedJets[i] = sortedJets[j];
139     sortedJets[j] = tempjet;
140     }
141     }
142 ceballos 1.1 }
143    
144 ceballos 1.2 // Delta phi between the 2 leptons in degrees
145     double deltaPhiLeptons = MathUtils::DeltaPhi(leptons[0]->Phi(),
146     leptons[1]->Phi())* 180./TMath::Pi();
147    
148     double deltaEtaLeptons = abs(leptons[0]->Eta() - leptons[1]->Eta());
149    
150     double deltaPhiDileptonMet = MathUtils::DeltaPhi(caloMet->Phi(),
151     dilepton->Phi())* 180./TMath::Pi();
152    
153     double mtHiggs = TMath::Sqrt(2.0*dilepton->Pt() * caloMet->Pt()*
154     (1.0 - cos(deltaPhiDileptonMet * TMath::Pi()/180.0)));
155    
156     // Angle between MET and closest lepton
157     double deltaPhiMetLepton[2] = {MathUtils::DeltaPhi(caloMet->Phi(), leptons[0]->Phi()),
158     MathUtils::DeltaPhi(caloMet->Phi(), leptons[1]->Phi())};
159    
160     double minDeltaPhiMetLepton = (deltaPhiMetLepton[0] < deltaPhiMetLepton[1])?
161     deltaPhiMetLepton[0]:deltaPhiMetLepton[1];
162     minDeltaPhiMetLepton = minDeltaPhiMetLepton * 180./TMath::Pi();
163    
164     double METdeltaPhilEt = caloMet->Pt();
165     if(minDeltaPhiMetLepton < 90.0)
166     METdeltaPhilEt = METdeltaPhilEt * sin(minDeltaPhiMetLepton * TMath::Pi()/180.);
167    
168     double mTW[2] = {TMath::Sqrt(2.0*leptons[0]->Pt()*caloMet->Pt()*
169     (1.0 - cos(deltaPhiMetLepton[0]))),
170     TMath::Sqrt(2.0*leptons[1]->Pt()*caloMet->Pt()*
171     (1.0 - cos(deltaPhiMetLepton[1])))};
172    
173     int pairType = -1;
174     if (leptonType[0] == "mu" && leptonType[1] == "mu" )
175     pairType = 0;
176     else if(leptonType[0] == "e" && leptonType[1] == "e")
177     pairType = 1;
178     else if((leptonType[0] == "e" && leptonType[1] == "mu") ||
179     (leptonType[0] == "mu" && leptonType[1] == "e"))
180     pairType = 2;
181     else {
182     cout << "Hey, this is not possible, leptonTypes: "
183     << leptonType[0] << " - "
184     << leptonType[1] << endl;
185     }
186 ceballos 1.1
187 ceballos 1.2 hDttPresel[ 0+100*pairType]->Fill((double)leptons.size());
188     // No more than 2 isolated good leptons
189     if (leptons.size() > 2) return;
190    
191     hDttPresel[ 1+100*pairType]->Fill(caloMet->Pt());
192     hDttPresel[ 2+100*pairType]->Fill(leptons[0]->Pt());
193     hDttPresel[ 3+100*pairType]->Fill(leptons[1]->Pt());
194     hDttPresel[ 4+100*pairType]->Fill(dilepton->Mass());
195     hDttPresel[ 5+100*pairType]->Fill((double)nCentralJets);
196     hDttPresel[ 6+100*pairType]->Fill(deltaEtaLeptons);
197     hDttPresel[ 7+100*pairType]->Fill(deltaPhiLeptons);
198     hDttPresel[ 8+100*pairType]->Fill(mtHiggs);
199     hDttPresel[ 9+100*pairType]->Fill(minDeltaPhiMetLepton);
200     hDttPresel[10+100*pairType]->Fill(METdeltaPhilEt);
201     hDttPresel[11+100*pairType]->Fill(caloMet->MetSig());
202     hDttPresel[12+100*pairType]->Fill(caloMet->SumEt());
203     hDttPresel[13+100*pairType]->Fill(TMath::Max(mTW[0],mTW[1]));
204     hDttPresel[14+100*pairType]->Fill(TMath::Min(mTW[0],mTW[1]));
205     hDttPresel[15+100*pairType]->Fill(leptons[0]->Pt()+leptons[1]->Pt()+caloMet->Pt());
206     for (UInt_t j=0; j<CleanMuons->GetEntries(); j++) {
207     hDttPresel[16+100*pairType]->Fill(TMath::Min(fabs(CleanMuons->At(j)->GlobalTrk()->D0()),0.3999));
208 ceballos 1.1 }
209 ceballos 1.2 for (UInt_t j=0; j<CleanElectrons->GetEntries(); j++) {
210     hDttPresel[17+100*pairType]->Fill(TMath::Min(fabs(CleanElectrons->At(j)->GsfTrk()->D0()),0.3999));
211 ceballos 1.1 }
212 ceballos 1.2
213     // Study for genuine tt->WbWb->2l2nubb
214     if(nCentralJets >= 2){
215     hDttPresel[18+100*pairType]->Fill(TMath::Max(fabs(sortedJets[0]->Eta()),
216     fabs(sortedJets[1]->Eta())));
217     hDttPresel[19+100*pairType]->Fill(TMath::Min(fabs(sortedJets[0]->Eta()),
218     fabs(sortedJets[1]->Eta())));
219     hDttPresel[20+100*pairType]->Fill(MathUtils::DeltaPhi(sortedJets[0]->Phi(),sortedJets[1]->Phi())
220     * 180.0 / TMath::Pi());
221     hDttPresel[21+100*pairType]->Fill(fabs(sortedJets[0]->Eta()-sortedJets[1]->Eta()));
222     hDttPresel[22+100*pairType]->Fill(MathUtils::DeltaR(sortedJets[0]->Phi(),sortedJets[0]->Eta(),
223     sortedJets[1]->Phi(),sortedJets[1]->Eta()));
224     hDttPresel[23+100*pairType]->Fill(TMath::Max(fabs(sortedJets[0]->Pt()),
225     fabs(sortedJets[1]->Pt())));
226     hDttPresel[24+100*pairType]->Fill(TMath::Min(fabs(sortedJets[0]->Pt()),
227     fabs(sortedJets[1]->Pt())));
228     CompositeParticle *dijet = new CompositeParticle();
229     dijet->AddDaughter(sortedJets[0]);
230     dijet->AddDaughter(sortedJets[1]);
231     hDttPresel[25+100*pairType]->Fill(dijet->Mass());
232     hDttPresel[26+100*pairType]->Fill(dijet->Pt());
233    
234     // Study energy scale corrections
235     if(GenQuarks->GetEntries() >= 2){
236     double deltarAux[2];
237     double deltaPt;
238     deltarAux[0] = MathUtils::DeltaR(sortedJets[0]->Phi(),sortedJets[0]->Eta(),
239     GenQuarks->At(0)->Phi(),GenQuarks->At(0)->Eta());
240     deltarAux[1] = MathUtils::DeltaR(sortedJets[0]->Phi(),sortedJets[0]->Eta(),
241     GenQuarks->At(1)->Phi(),GenQuarks->At(1)->Eta());
242     hDttPresel[27+100*pairType]->Fill(TMath::Min(deltarAux[0],deltarAux[1]));
243     deltaPt = -999;
244     if (deltarAux[0] < deltarAux[1] && deltarAux[0] < 1.0){
245     deltaPt = (sortedJets[0]->Pt()-GenQuarks->At(0)->Pt())/sortedJets[0]->Pt();
246     }
247     else if(deltarAux[1] < deltarAux[0] && deltarAux[1] < 1.0){
248     deltaPt = (sortedJets[0]->Pt()-GenQuarks->At(1)->Pt())/sortedJets[0]->Pt();
249     }
250     if(deltaPt != -999) hDttPresel[28+100*pairType]->Fill(deltaPt);
251     deltarAux[0] = MathUtils::DeltaR(sortedJets[1]->Phi(),sortedJets[1]->Eta(),
252     GenQuarks->At(0)->Phi(),GenQuarks->At(0)->Eta());
253     deltarAux[1] = MathUtils::DeltaR(sortedJets[1]->Phi(),sortedJets[1]->Eta(),
254     GenQuarks->At(1)->Phi(),GenQuarks->At(1)->Eta());
255     hDttPresel[29+100*pairType]->Fill(TMath::Min(deltarAux[0],deltarAux[1]));
256     deltaPt = -999;
257     if (deltarAux[0] < deltarAux[1] && deltarAux[0] < 1.0){
258     deltaPt = (sortedJets[1]->Pt()-GenQuarks->At(0)->Pt())/sortedJets[1]->Pt();
259     }
260     else if(deltarAux[1] < deltarAux[0] && deltarAux[1] < 1.0){
261     deltaPt = (sortedJets[1]->Pt()-GenQuarks->At(1)->Pt())/sortedJets[1]->Pt();
262     }
263     if(deltaPt != -999) hDttPresel[30+100*pairType]->Fill(deltaPt);
264     }
265     delete dijet;
266     } // Njets >=2
267    
268     // Study for additional muons
269     hDttPresel[31+100*pairType]->Fill((double)DirtyMuons->GetEntries());
270     for (UInt_t i=0; i<DirtyMuons->GetEntries(); ++i) {
271     Muon *mu = DirtyMuons->At(i);
272     hDttPresel[32+100*pairType]->Fill(mu->Pt());
273     hDttPresel[33+100*pairType]->Fill(TMath::Min(fabs(mu->GlobalTrk()->D0()),0.3999));
274 ceballos 1.1 }
275 ceballos 1.2 if(DirtyMuons->GetEntries() > 0){
276     hDttPresel[34+100*pairType]->Fill((double)nCentralJets);
277 ceballos 1.1 }
278    
279 ceballos 1.2 // Study dijet mass
280     if(nCentralJets >= 2){
281     double dijetMass = 999.;
282     int indDiJet[2] = {-1, -1};
283     for(UInt_t i=0; i<sortedJets.size(); i++){
284     for(UInt_t j=i+1; j<sortedJets.size(); j++){
285     CompositeParticle *dijetTemp = new CompositeParticle();
286     dijetTemp->AddDaughter(sortedJets[i]);
287     dijetTemp->AddDaughter(sortedJets[j]);
288     if(fabs(dijetTemp->Mass()-91.18) < fabs(dijetMass-91.18)){
289     dijetMass = dijetTemp->Mass();
290     indDiJet[0] = i;
291     indDiJet[1] = j;
292     }
293     delete dijetTemp;
294     }
295 ceballos 1.1 }
296 ceballos 1.2 hDttPresel[35+100*pairType]->Fill(dijetMass);
297     if(indDiJet[0] == 0 && indDiJet[1] == 1)
298     hDttPresel[36+100*pairType]->Fill(dijetMass);
299     else
300     hDttPresel[37+100*pairType]->Fill(dijetMass);
301     hDttPresel[38+100*pairType]->Fill((double)(indDiJet[0]+10*indDiJet[1]));
302 ceballos 1.1 }
303 ceballos 1.3 for(UInt_t i=0; i<sortedJets.size(); i++) delete sortedJets[i];
304 ceballos 1.2 } // q1+q2==0 && mass_ll>12
305     delete dilepton;
306     } // Minimun Pt, Nleptons and MET requirements
307     delete DirtyMuons;
308 ceballos 1.3 leptons.clear();
309 ceballos 1.1 }
310     //--------------------------------------------------------------------------------------------------
311     void ttEvtSelMod::SlaveBegin()
312     {
313     // Run startup code on the computer (slave) doing the actual analysis. Here,
314     // we typically initialize histograms and other analysis objects and request
315     // branches. For this module, we request a branch of the MitTree.
316    
317     ReqBranch(fMetName, fMet);
318     ReqBranch(fMuonName, fMuons);
319    
320     char sb[200];
321     for(int j=0; j<3; j++){
322     int ind = 100 * j;
323     sprintf(sb,"hDttPresel_%d",ind+0); hDttPresel[ind+0] = new TH1D(sb,sb,10,-0.5,9.5);
324     sprintf(sb,"hDttPresel_%d",ind+1); hDttPresel[ind+1] = new TH1D(sb,sb,150,0.0,300.);
325     sprintf(sb,"hDttPresel_%d",ind+2); hDttPresel[ind+2] = new TH1D(sb,sb,100,0.0,200.);
326     sprintf(sb,"hDttPresel_%d",ind+3); hDttPresel[ind+3] = new TH1D(sb,sb,100,0.0,200.);
327     sprintf(sb,"hDttPresel_%d",ind+4); hDttPresel[ind+4] = new TH1D(sb,sb,150,0.0,300.);
328     sprintf(sb,"hDttPresel_%d",ind+5); hDttPresel[ind+5] = new TH1D(sb,sb,10,-0.5,9.5);
329     sprintf(sb,"hDttPresel_%d",ind+6); hDttPresel[ind+6] = new TH1D(sb,sb,50,0.0,5.);
330     sprintf(sb,"hDttPresel_%d",ind+7); hDttPresel[ind+7] = new TH1D(sb,sb,90,0.0,180.);
331     sprintf(sb,"hDttPresel_%d",ind+8); hDttPresel[ind+8] = new TH1D(sb,sb,150,0.0,300.);
332     sprintf(sb,"hDttPresel_%d",ind+9); hDttPresel[ind+9] = new TH1D(sb,sb,90,0.0,180.);
333     sprintf(sb,"hDttPresel_%d",ind+10); hDttPresel[ind+10] = new TH1D(sb,sb,150,0.0,300.);
334     sprintf(sb,"hDttPresel_%d",ind+11); hDttPresel[ind+11] = new TH1D(sb,sb,100,0.0,20.);
335     sprintf(sb,"hDttPresel_%d",ind+12); hDttPresel[ind+12] = new TH1D(sb,sb,200,0.0,800.);
336     sprintf(sb,"hDttPresel_%d",ind+13); hDttPresel[ind+13] = new TH1D(sb,sb,200,0.0,300.);
337     sprintf(sb,"hDttPresel_%d",ind+14); hDttPresel[ind+14] = new TH1D(sb,sb,200,0.0,300.);
338     sprintf(sb,"hDttPresel_%d",ind+15); hDttPresel[ind+15] = new TH1D(sb,sb,250,0.0,500.);
339     sprintf(sb,"hDttPresel_%d",ind+16); hDttPresel[ind+16] = new TH1D(sb,sb,200,0.0,0.4);
340     sprintf(sb,"hDttPresel_%d",ind+17); hDttPresel[ind+17] = new TH1D(sb,sb,200,0.0,0.4);
341     sprintf(sb,"hDttPresel_%d",ind+18); hDttPresel[ind+18] = new TH1D(sb,sb,25,0.0,2.5);
342     sprintf(sb,"hDttPresel_%d",ind+19); hDttPresel[ind+19] = new TH1D(sb,sb,25,0.0,2.5);
343     sprintf(sb,"hDttPresel_%d",ind+20); hDttPresel[ind+20] = new TH1D(sb,sb,90,0.0,180.);
344     sprintf(sb,"hDttPresel_%d",ind+21); hDttPresel[ind+21] = new TH1D(sb,sb,50,0.0, 5.0);
345     sprintf(sb,"hDttPresel_%d",ind+22); hDttPresel[ind+22] = new TH1D(sb,sb,50,0.0,10.0);
346     sprintf(sb,"hDttPresel_%d",ind+23); hDttPresel[ind+23] = new TH1D(sb,sb,100,0.0,200.0);
347     sprintf(sb,"hDttPresel_%d",ind+24); hDttPresel[ind+24] = new TH1D(sb,sb,100,0.0,200.0);
348     sprintf(sb,"hDttPresel_%d",ind+25); hDttPresel[ind+25] = new TH1D(sb,sb,100,0.0,400.0);
349     sprintf(sb,"hDttPresel_%d",ind+26); hDttPresel[ind+26] = new TH1D(sb,sb,100,0.0,400.0);
350     sprintf(sb,"hDttPresel_%d",ind+27); hDttPresel[ind+27] = new TH1D(sb,sb,200,0.0,10.0);
351     sprintf(sb,"hDttPresel_%d",ind+28); hDttPresel[ind+28] = new TH1D(sb,sb,80,-2.0,2.0);
352     sprintf(sb,"hDttPresel_%d",ind+29); hDttPresel[ind+29] = new TH1D(sb,sb,200,0.0,10.0);
353     sprintf(sb,"hDttPresel_%d",ind+30); hDttPresel[ind+30] = new TH1D(sb,sb,80,-2.0,2.0);
354     sprintf(sb,"hDttPresel_%d",ind+31); hDttPresel[ind+31] = new TH1D(sb,sb,10,-0.5,9.5);
355     sprintf(sb,"hDttPresel_%d",ind+32); hDttPresel[ind+32] = new TH1D(sb,sb,200,0.0,50.0);
356     sprintf(sb,"hDttPresel_%d",ind+33); hDttPresel[ind+33] = new TH1D(sb,sb,200,0.0,0.4);
357     sprintf(sb,"hDttPresel_%d",ind+34); hDttPresel[ind+34] = new TH1D(sb,sb,10,-0.5,9.5);
358     sprintf(sb,"hDttPresel_%d",ind+35); hDttPresel[ind+35] = new TH1D(sb,sb,100,0.0,400.0);
359     sprintf(sb,"hDttPresel_%d",ind+36); hDttPresel[ind+36] = new TH1D(sb,sb,100,0.0,400.0);
360     sprintf(sb,"hDttPresel_%d",ind+37); hDttPresel[ind+37] = new TH1D(sb,sb,100,0.0,400.0);
361     sprintf(sb,"hDttPresel_%d",ind+38); hDttPresel[ind+38] = new TH1D(sb,sb,100,-0.5,99.5);
362     }
363    
364     for(int i=0; i<39; i++){
365     for(int j=0; j<3; j++){
366     AddOutput(hDttPresel[i+j*100]);
367     }
368     }
369     }
370    
371     //--------------------------------------------------------------------------------------------------
372     void ttEvtSelMod::SlaveTerminate()
373     {
374     // Run finishing code on the computer (slave) that did the analysis
375     }
376    
377     //--------------------------------------------------------------------------------------------------
378     void ttEvtSelMod::Terminate()
379     {
380     // Run finishing code on the client computer
381     }