ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/FakeMods/src/GenFakesMod.cc
Revision: 1.4
Committed: Mon Aug 10 16:07:26 2009 UTC (15 years, 8 months ago) by phedex
Content type: text/plain
Branch: MAIN
Changes since 1.3: +92 -52 lines
Log Message:
Use TH2DAsymError class to store asymmetric statistical and systematic errors. Do comment and style cleanup.

File Contents

# User Rev Content
1 phedex 1.4 // $Id: GenFakesMod.cc,v 1.3 2009/07/13 11:27:13 loizides Exp $
2 loizides 1.1
3     #include "MitPhysics/FakeMods/interface/GenFakesMod.h"
4     #include "MitCommon/MathTools/interface/MathUtils.h"
5     #include "MitAna/DataUtil/interface/Debug.h"
6 loizides 1.3 #include "MitAna/DataTree/interface/ElectronCol.h"
7     #include "MitAna/DataTree/interface/MuonCol.h"
8     #include "MitAna/DataTree/interface/PhotonCol.h"
9     #include "MitAna/DataTree/interface/JetCol.h"
10     #include "MitAna/DataTree/interface/ParticleCol.h"
11     #include "MitAna/DataTree/interface/MCParticleCol.h"
12 loizides 1.1 #include "MitPhysics/Init/interface/ModNames.h"
13     #include "MitPhysics/FakeMods/interface/FakeEventHeader.h"
14 loizides 1.3 #include "MitPhysics/FakeMods/interface/FakeRate.h"
15 loizides 1.1
16     using namespace mithep;
17    
18     ClassImp(mithep::GenFakesMod)
19    
20     //--------------------------------------------------------------------------------------------------
21     GenFakesMod::GenFakesMod(const char *name, const char *title) :
22     BaseMod(name,title),
23     fElectronFRFilename("InputRequired"),
24     fMuonFRFilename("InputRequired"),
25     fUse2DFakeRate(false),
26     fUseFitFunction(false),
27     fElectronFRFunctionName("InputRequired"),
28     fMuonFRFunctionName("InputRequired"),
29     fElectronFRHistName("InputRequired"),
30     fMuonFRHistName("InputRequired"),
31     fCleanElectronsName(ModNames::gkCleanElectronsName),
32     fCleanMuonsName(ModNames::gkCleanMuonsName),
33     fCleanPhotonsName(ModNames::gkCleanPhotonsName),
34     fCleanJetsName(ModNames::gkCleanJetsName),
35 loizides 1.3 fMCLeptonsName(ModNames::gkMCLeptonsName),
36     fMCTausName(ModNames::gkMCTausName),
37 phedex 1.2 fElFakeableObjsName(ModNames::gkElFakeableObjsName),
38     fMuFakeableObjsName(ModNames::gkMuFakeableObjsName),
39 loizides 1.1 fFakeEventHeadersName(ModNames::gkFakeEventHeadersName)
40     {
41     // Constructor.
42     }
43    
44     //--------------------------------------------------------------------------------------------------
45     void GenFakesMod::LoadFakeRate()
46     {
47     //Load FakeRate Probabilities.
48     fFakeRate = new FakeRate(fElectronFRFilename,fMuonFRFilename,fElectronFRFunctionName,
49     fMuonFRFunctionName,fElectronFRHistName,
50     fMuonFRHistName,fUse2DFakeRate, fUseFitFunction );
51     }
52    
53     //--------------------------------------------------------------------------------------------------
54     void GenFakesMod::Process()
55     {
56     // Process entries of the tree.
57    
58     // get input Fakeable object collections
59 phedex 1.2 const ElectronCol *ElFakeableObjs = 0;
60     if (!fElFakeableObjsName.IsNull())
61     ElFakeableObjs = GetObjThisEvt<ElectronCol>(fElFakeableObjsName);
62     const MuonCol *MuFakeableObjs = 0;
63     if (!fMuFakeableObjsName.IsNull())
64     MuFakeableObjs = GetObjThisEvt<MuonCol>(fMuFakeableObjsName);
65 loizides 1.1
66     // get input clean object collections
67     const ElectronCol *CleanElectrons = 0;
68     if (!fCleanElectronsName.IsNull())
69     CleanElectrons = GetObjThisEvt<ElectronCol>(fCleanElectronsName);
70     const MuonCol *CleanMuons = 0;
71     if (!fCleanMuonsName.IsNull())
72     CleanMuons = GetObjThisEvt<MuonCol>(fCleanMuonsName);
73     const PhotonCol *CleanPhotons = 0;
74     if (!fCleanPhotonsName.IsNull())
75     CleanPhotons = GetObjThisEvt<PhotonCol>(fCleanPhotonsName);
76     const JetCol *CleanJets = 0;
77     if (!fCleanJetsName.IsNull())
78     CleanJets = GetObjThisEvt<JetCol>(fCleanJetsName);
79     mithep::ParticleOArr *CleanLeptons = dynamic_cast<mithep::ParticleOArr*>
80     (FindObjThisEvt(ModNames::gkMergedLeptonsName));
81    
82     //get monte carlo collections
83     const MCParticleCol *GenLeptons = 0;
84     if (!fMCLeptonsName.IsNull())
85     GenLeptons = GetObjThisEvt<MCParticleCol>(fMCLeptonsName);
86     const MCParticleCol *GenTaus = 0;
87     if (!fMCTausName.IsNull())
88     GenTaus = GetObjThisEvt<MCParticleCol>(fMCTausName);
89     ObjArray<MCParticle> *GenLeptonsAndTaus = new ObjArray<MCParticle>;
90     if (GenLeptons) {
91     for (UInt_t i=0; i<GenLeptons->GetEntries(); i++)
92     GenLeptonsAndTaus->Add(GenLeptons->At(i));
93     }
94     if (GenTaus) {
95     for (UInt_t i=0; i<GenTaus->GetEntries(); i++)
96     GenLeptonsAndTaus->Add(GenTaus->At(i));
97     }
98    
99     // create final output collection
100     ObjArray <FakeEventHeader> *FakeEventHeaders = new ObjArray <FakeEventHeader> ;
101     FakeEventHeaders->SetOwner(kTRUE);
102    
103     //initialize with one fake event containing no fake objects and all jets.
104     FakeEventHeader *initialFakeEvent = new FakeEventHeader();
105     for (UInt_t j=0;j<CleanJets->GetEntries();j++)
106     initialFakeEvent->AddJets(CleanJets->At(j));
107    
108     FakeEventHeaders->AddOwned(initialFakeEvent);
109    
110     // *****************************************************************************************
111     // Fake into Muons
112     // Loop through all Muon Fakeable objects and consider the fake possibility.
113     // *****************************************************************************************
114 phedex 1.4 for (UInt_t n = 0; n < MuFakeableObjs->GetEntries(); ++n) {
115 loizides 1.1
116     //make temporary fake event headers array
117     ObjArray <FakeEventHeader> *tempFakeEventHeaders = new ObjArray <FakeEventHeader> ;
118     tempFakeEventHeaders->SetOwner(kTRUE);
119    
120     //loop over all fake events generated so far - and perform an additional fake if necessary
121     for (UInt_t i=0; i<FakeEventHeaders->GetEntries();i++) {
122    
123     // *****************************************************************************************
124     // Determine if the fakeable object was a clean lepton
125     // *****************************************************************************************
126     Bool_t isCleanLepton = false;
127     for (UInt_t j = 0; j < CleanLeptons->GetEntries() ; j++) {
128 phedex 1.2 Double_t deltaR = MathUtils::DeltaR(MuFakeableObjs->At(n)->Phi(),
129     MuFakeableObjs->At(n)->Eta(),
130 loizides 1.1 CleanLeptons->At(j)->Phi(), CleanLeptons->At(j)->Eta());
131    
132     if (deltaR < 0.3) {
133     isCleanLepton = true;
134     break;
135     }
136     }
137    
138     // *****************************************************************************************
139     // Determine if the fakeable object was a real muon from Monte Carlo
140     // *****************************************************************************************
141     Bool_t isGenMuon = false;
142     for (UInt_t l=0; l<GenLeptonsAndTaus->GetEntries(); l++) {
143 phedex 1.2 if (MathUtils::DeltaR(MuFakeableObjs->At(n)->Phi(), MuFakeableObjs->At(n)->Eta(),
144 loizides 1.1 GenLeptonsAndTaus->At(l)->Phi(),
145     GenLeptonsAndTaus->At(l)->Eta()) < 0.3) {
146     isGenMuon = true;
147     break;
148     }
149     }
150    
151     //this is used to determine the weight of the unfaked event.
152     double totalCumulativeFakeProbability = 0.0;
153    
154     // *****************************************************************************************
155     // Perform Muon Fake
156     // *****************************************************************************************
157    
158     //match fake to one of the jets
159     int fakeToJetMatch = -1; //index of the jet that matches to the fake
160     double minDR = 5000;
161     for (UInt_t jj=0;jj<FakeEventHeaders->At(i)->NJets();jj++) {
162     Double_t deltaR = MathUtils::DeltaR(FakeEventHeaders->At(i)->UnfakedJet(jj)->Mom(),
163 phedex 1.2 MuFakeableObjs->At(n)->Mom());
164 loizides 1.1 if (deltaR < minDR) {
165     minDR = deltaR;
166     fakeToJetMatch = jj;
167     }
168     }
169     if (!(minDR < 0.5)) {
170     fakeToJetMatch = -1;
171     }
172    
173     //Obtain the muon FakeRate
174     Double_t muonFakeProb = 0.0;
175 phedex 1.4 Double_t muonFakeProbStatErrorLow = 0.0;
176     Double_t muonFakeProbStatErrorHigh = 0.0;
177     Double_t muonFakeProbSysErrorLow = 0.0;
178     Double_t muonFakeProbSysErrorHigh = 0.0;
179     Double_t muonFakeProbErrorLow = 0.0;
180     Double_t muonFakeProbErrorHigh = 0.0;
181 loizides 1.1 if(fFakeRate) {
182 phedex 1.2 muonFakeProb = fFakeRate->MuonFakeRate(MuFakeableObjs->At(n)->Et(),
183     MuFakeableObjs->At(n)->Eta(),
184     MuFakeableObjs->At(n)->Phi());
185 phedex 1.4 muonFakeProbStatErrorLow = fFakeRate->MuonFakeRateStatErrorLow(MuFakeableObjs->At(n)->Et(),
186 phedex 1.2 MuFakeableObjs->At(n)->Eta(),
187     MuFakeableObjs->At(n)->Phi());
188 phedex 1.4 muonFakeProbStatErrorHigh = fFakeRate->MuonFakeRateStatErrorHigh(MuFakeableObjs->At(n)->Et(),
189 phedex 1.2 MuFakeableObjs->At(n)->Eta(),
190 phedex 1.4 MuFakeableObjs->At(n)->Phi());
191     muonFakeProbSysErrorLow = fFakeRate->MuonFakeRateSysErrorLow(MuFakeableObjs->At(n)->Et(),
192     MuFakeableObjs->At(n)->Eta(),
193     MuFakeableObjs->At(n)->Phi());
194     muonFakeProbSysErrorHigh = fFakeRate->MuonFakeRateSysErrorHigh(MuFakeableObjs->At(n)->Et(),
195     MuFakeableObjs->At(n)->Eta(),
196     MuFakeableObjs->At(n)->Phi());
197     muonFakeProbErrorLow = TMath::Sqrt(muonFakeProbStatErrorLow*muonFakeProbStatErrorLow +
198     muonFakeProbSysErrorLow*muonFakeProbSysErrorLow);
199     muonFakeProbErrorHigh = TMath::Sqrt(muonFakeProbStatErrorHigh*muonFakeProbStatErrorHigh +
200     muonFakeProbSysErrorHigh*muonFakeProbSysErrorHigh);
201    
202 loizides 1.1 } else {
203     cerr << "Error: fFakeRate is a NULL pointer.\n";
204     assert(false);
205     }
206    
207     //only fake into a muon if the fakeable object did not match to a clean lepton
208     if (!isCleanLepton) {
209    
210     //create new fake event header
211     FakeEventHeader *fakeMuonEvent = new FakeEventHeader();
212     fakeMuonEvent->SetWeight(FakeEventHeaders->At(i)->Weight() * muonFakeProb);
213 phedex 1.4 Double_t weightLowError = 0;
214     Double_t weightHighError = 0;
215     if (muonFakeProb > 0) {
216     weightLowError = FakeEventHeaders->At(i)->Weight()*muonFakeProb*
217     TMath::Sqrt((FakeEventHeaders->At(i)->WeightLowError()/
218     FakeEventHeaders->At(i)->Weight())*
219     (FakeEventHeaders->At(i)->WeightLowError()/
220     FakeEventHeaders->At(i)->Weight()) +
221     (muonFakeProbErrorLow/muonFakeProb)*
222     (muonFakeProbErrorLow/muonFakeProb));
223     weightHighError = FakeEventHeaders->At(i)->Weight()*muonFakeProb*
224     TMath::Sqrt((FakeEventHeaders->At(i)->WeightHighError()/
225     FakeEventHeaders->At(i)->Weight())*
226     (FakeEventHeaders->At(i)->WeightHighError()/
227     FakeEventHeaders->At(i)->Weight()) +
228     (muonFakeProbErrorHigh/muonFakeProb)*
229     (muonFakeProbErrorHigh/muonFakeProb));
230     }
231     fakeMuonEvent->SetWeightLowError(weightLowError);
232     fakeMuonEvent->SetWeightHighError(weightHighError);
233 loizides 1.1
234     //add all previous fakes
235     for (UInt_t f=0;f<FakeEventHeaders->At(i)->FakeObjsSize();f++) {
236     fakeMuonEvent->AddFakeObject(FakeEventHeaders->At(i)->FakeObj(f));
237     }
238     //add new fake
239 phedex 1.2 fakeMuonEvent->AddFakeObject(MuFakeableObjs->At(n),kMuon,isCleanLepton,isGenMuon);
240 loizides 1.1
241     //add all previous jets except the one matching to the new fake
242     for (UInt_t jj=0;jj<FakeEventHeaders->At(i)->NJets();jj++) {
243 loizides 1.3 if ((int)jj != fakeToJetMatch)
244 loizides 1.1 fakeMuonEvent->AddJets(FakeEventHeaders->At(i)->UnfakedJet(jj));
245     }
246    
247     //add fake event to the temporary fake event header array
248     tempFakeEventHeaders->AddOwned(fakeMuonEvent);
249    
250     //increase cumulative fake probability
251     totalCumulativeFakeProbability += muonFakeProb;
252     }
253    
254     // *****************************************************************************************
255     // Do not fake into Muon
256     // *****************************************************************************************
257     //create new fake event header
258     FakeEventHeader *notFakeEvent = new FakeEventHeader();
259     notFakeEvent->SetWeight(FakeEventHeaders->At(i)->Weight() *
260     (1-totalCumulativeFakeProbability));
261     //add previous fakes
262     for (UInt_t f=0;f<FakeEventHeaders->At(i)->FakeObjsSize();f++) {
263     notFakeEvent->AddFakeObject(FakeEventHeaders->At(i)->FakeObj(f));
264     }
265     //add previous jets
266     for (UInt_t jj=0;jj<FakeEventHeaders->At(i)->NJets();jj++) {
267     notFakeEvent->AddJets(FakeEventHeaders->At(i)->UnfakedJet(jj));
268     }
269     tempFakeEventHeaders->AddOwned(notFakeEvent);
270    
271     } //loop over all current fake event headers
272    
273     //replace current fake event headers with the new temporary ones.
274     delete FakeEventHeaders;
275     FakeEventHeaders = tempFakeEventHeaders;
276     } //loop over all muon fakeable objects
277    
278    
279     // *****************************************************************************************
280     // Fake into Electrons
281     // Loop through all Electron Fakeable objects and consider the fake possibility.
282     // *****************************************************************************************
283 phedex 1.2 for (UInt_t n = 0; n < ElFakeableObjs->GetEntries();n++) {
284 loizides 1.1
285     //make temporary fake event headers array
286     ObjArray <FakeEventHeader> *tempFakeEventHeaders = new ObjArray <FakeEventHeader> ;
287     tempFakeEventHeaders->SetOwner(kTRUE);
288    
289     //loop over all fake events generated so far - and perform an additional fake if necessary
290     for (UInt_t i=0; i<FakeEventHeaders->GetEntries();i++) {
291    
292     // *****************************************************************************************
293     // Determine if the fakeable object was a clean lepton
294     // *****************************************************************************************
295     Bool_t isCleanLepton = false;
296     for (UInt_t j = 0; j < CleanLeptons->GetEntries() ; j++) {
297 phedex 1.2 Double_t deltaR = MathUtils::DeltaR(ElFakeableObjs->At(n)->Phi(),
298     ElFakeableObjs->At(n)->Eta(),
299 loizides 1.1 CleanLeptons->At(j)->Phi(), CleanLeptons->At(j)->Eta());
300    
301     if (deltaR < 0.3) {
302     isCleanLepton = true;
303     break;
304     }
305     }
306    
307     // *****************************************************************************************
308     // Determine if the fakeable object was a real electron from Monte Carlo
309     // *****************************************************************************************
310     Bool_t isGenElectron = false;
311     for (UInt_t l=0; l<GenLeptonsAndTaus->GetEntries(); l++) {
312 phedex 1.2 if (MathUtils::DeltaR(ElFakeableObjs->At(n)->Phi(),
313     ElFakeableObjs->At(n)->Eta(),
314 loizides 1.1 GenLeptonsAndTaus->At(l)->Phi(),
315     GenLeptonsAndTaus->At(l)->Eta()) < 0.3) {
316     isGenElectron = true;
317     }
318     }
319    
320    
321     //this is used to determine the weight of the unfaked event.
322     double totalCumulativeFakeProbability = 0.0;
323    
324     // *****************************************************************************************
325     // Determine if the current electron fakeable object already corresponds to one of the
326     // fake muons already in the FakeEventHeader, determined based on deltaR proximity.
327     // If the current electron fakeable object corresponds to one of the fake muon, then
328     // we do not allow it to fake an electron, since one denominator cannot fake two leptons.
329     // *****************************************************************************************
330     Bool_t alreadyFaked = false;
331     for (UInt_t f = 0; f < FakeEventHeaders->At(i)->FakeObjsSize() ; f++) {
332     double deltaR = MathUtils::DeltaR(FakeEventHeaders->At(i)->FakeObj(f)->Mom(),
333 phedex 1.2 ElFakeableObjs->At(n)->Mom());
334 loizides 1.1 if (deltaR < 0.3)
335     alreadyFaked = true;
336     }
337     if (!alreadyFaked) {
338    
339     // *****************************************************************************************
340     // Perform Electron Fake
341     // *****************************************************************************************
342    
343     //match fake to one of the jets
344     int fakeToJetMatch = -1; //index of the jet that matches to the fake
345     double minDR = 5000;
346     for (UInt_t jj=0;jj<FakeEventHeaders->At(i)->NJets();jj++) {
347     Double_t deltaR = MathUtils::DeltaR(FakeEventHeaders->At(i)->UnfakedJet(jj)->Mom(),
348 phedex 1.2 ElFakeableObjs->At(n)->Mom());
349 loizides 1.1 if (deltaR < minDR) {
350     minDR = deltaR;
351     fakeToJetMatch = jj;
352     }
353     }
354     if (!(minDR < 0.5)) {
355     fakeToJetMatch = -1;
356     }
357    
358     //Obtain the electron FakeRate
359     Double_t electronFakeProb = 0.0;
360 phedex 1.4 Double_t electronFakeProbStatErrorLow = 0.0;
361     Double_t electronFakeProbStatErrorHigh = 0.0;
362     Double_t electronFakeProbSysErrorLow = 0.0;
363     Double_t electronFakeProbSysErrorHigh = 0.0;
364     Double_t electronFakeProbErrorLow = 0.0;
365     Double_t electronFakeProbErrorHigh = 0.0;
366 loizides 1.1 if(fFakeRate) {
367 phedex 1.2 electronFakeProb = fFakeRate->ElectronFakeRate(ElFakeableObjs->At(n)->Et(),
368     ElFakeableObjs->At(n)->Eta(),
369     ElFakeableObjs->At(n)->Phi());
370 phedex 1.4 electronFakeProbStatErrorLow =
371     fFakeRate->ElectronFakeRateStatErrorLow(ElFakeableObjs->At(n)->Et(),
372     ElFakeableObjs->At(n)->Eta(),
373     ElFakeableObjs->At(n)->Phi());
374     electronFakeProbStatErrorHigh =
375     fFakeRate->ElectronFakeRateStatErrorHigh(ElFakeableObjs->At(n)->Et(),
376     ElFakeableObjs->At(n)->Eta(),
377     ElFakeableObjs->At(n)->Phi());
378     electronFakeProbSysErrorLow =
379     fFakeRate->ElectronFakeRateSysErrorLow(ElFakeableObjs->At(n)->Et(),
380     ElFakeableObjs->At(n)->Eta(),
381     ElFakeableObjs->At(n)->Phi());
382     electronFakeProbSysErrorHigh =
383     fFakeRate->ElectronFakeRateSysErrorHigh(ElFakeableObjs->At(n)->Et(),
384     ElFakeableObjs->At(n)->Eta(),
385     ElFakeableObjs->At(n)->Phi());
386     electronFakeProbErrorLow =
387     TMath::Sqrt(electronFakeProbStatErrorLow*electronFakeProbStatErrorLow +
388     electronFakeProbSysErrorLow*electronFakeProbSysErrorLow);
389     electronFakeProbErrorHigh =
390     TMath::Sqrt(electronFakeProbStatErrorHigh*electronFakeProbStatErrorHigh +
391     electronFakeProbSysErrorHigh*electronFakeProbSysErrorHigh);
392 loizides 1.1 } else {
393     cerr << "Error: fFakeRate is a NULL pointer.\n";
394     assert(false);
395     }
396 phedex 1.4
397 loizides 1.1 //only fake into a muon if the fakeable object did not match to a clean lepton
398     if (!isCleanLepton) {
399     //create new fake event header
400     FakeEventHeader *fakeElectronEvent = new FakeEventHeader();
401     fakeElectronEvent->SetWeight(FakeEventHeaders->At(i)->Weight() * electronFakeProb);
402 phedex 1.4 Double_t weightLowError = 0;
403     Double_t weightHighError = 0;
404     if (electronFakeProb) {
405     weightLowError = FakeEventHeaders->At(i)->Weight()*electronFakeProb*
406     TMath::Sqrt((FakeEventHeaders->At(i)->WeightLowError()/
407     FakeEventHeaders->At(i)->Weight())*
408     (FakeEventHeaders->At(i)->WeightLowError()/
409     FakeEventHeaders->At(i)->Weight()) +
410     (electronFakeProbErrorLow/electronFakeProb)*
411     (electronFakeProbErrorLow/electronFakeProb));
412     weightHighError = FakeEventHeaders->At(i)->Weight()*electronFakeProb*
413     TMath::Sqrt((FakeEventHeaders->At(i)->WeightHighError()/
414     FakeEventHeaders->At(i)->Weight())*
415     (FakeEventHeaders->At(i)->WeightHighError()/
416     FakeEventHeaders->At(i)->Weight()) +
417     (electronFakeProbErrorHigh/electronFakeProb)*
418     (electronFakeProbErrorHigh/electronFakeProb));
419     }
420     fakeElectronEvent->SetWeightLowError(weightLowError);
421     fakeElectronEvent->SetWeightHighError(weightHighError);
422    
423 loizides 1.1 //add previous fakes
424     for (UInt_t f=0;f<FakeEventHeaders->At(i)->FakeObjsSize();f++) {
425     fakeElectronEvent->AddFakeObject(FakeEventHeaders->At(i)->FakeObj(f));
426     }
427     //add the new fake
428 phedex 1.2 fakeElectronEvent->AddFakeObject(ElFakeableObjs->At(n),
429 loizides 1.1 kElectron,isCleanLepton,isGenElectron);
430     //add previous jets that do not match to the new fake
431     for (UInt_t jj=0;jj<FakeEventHeaders->At(i)->NJets();jj++) {
432 loizides 1.3 if ((int)jj != fakeToJetMatch)
433 loizides 1.1 fakeElectronEvent->AddJets(FakeEventHeaders->At(i)->UnfakedJet(jj));
434     }
435    
436     //add fake event to the temporary fake event header array
437     tempFakeEventHeaders->AddOwned(fakeElectronEvent);
438     //increase cumulative fake probability
439     totalCumulativeFakeProbability += electronFakeProb;
440     }
441     }
442    
443     // *****************************************************************************************
444     // Do not fake into anything
445     // *****************************************************************************************
446     //create new fake event header
447     FakeEventHeader *notFakeEvent = new FakeEventHeader();
448     notFakeEvent->SetWeight(FakeEventHeaders->At(i)->Weight() *
449     (1-totalCumulativeFakeProbability));
450     //add previous fakes
451     for (UInt_t f=0;f<FakeEventHeaders->At(i)->FakeObjsSize();f++) {
452     notFakeEvent->AddFakeObject(FakeEventHeaders->At(i)->FakeObj(f));
453     }
454     //add previous jets
455     for (UInt_t jj=0;jj<FakeEventHeaders->At(i)->NJets();jj++) {
456     notFakeEvent->AddJets(FakeEventHeaders->At(i)->UnfakedJet(jj));
457     }
458     tempFakeEventHeaders->AddOwned(notFakeEvent);
459    
460     } //for all current fake event headers
461    
462     //replace current fake event headers with the new temporary ones.
463     delete FakeEventHeaders;
464     FakeEventHeaders = tempFakeEventHeaders;
465     } //loop over all fakeable objects
466    
467     // export FakeEventHeaders for other modules to use
468     FakeEventHeaders->SetName(fFakeEventHeadersName);
469     AddObjThisEvt(FakeEventHeaders);
470    
471     //delete temporary collections
472     delete GenLeptonsAndTaus;
473     }