ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/FakeMods/src/GenFakesMod.cc
Revision: 1.5
Committed: Tue Aug 11 09:16:01 2009 UTC (15 years, 8 months ago) by loizides
Content type: text/plain
Branch: MAIN
Changes since 1.4: +5 -4 lines
Log Message:
Further cleanup

File Contents

# User Rev Content
1 loizides 1.5 // $Id: GenFakesMod.cc,v 1.4 2009/08/10 16:07:26 phedex 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 loizides 1.5 muonFakeProbStatErrorHigh =
189     fFakeRate->MuonFakeRateStatErrorHigh(MuFakeableObjs->At(n)->Et(),
190     MuFakeableObjs->At(n)->Eta(),
191     MuFakeableObjs->At(n)->Phi());
192 phedex 1.4 muonFakeProbSysErrorLow = fFakeRate->MuonFakeRateSysErrorLow(MuFakeableObjs->At(n)->Et(),
193     MuFakeableObjs->At(n)->Eta(),
194     MuFakeableObjs->At(n)->Phi());
195     muonFakeProbSysErrorHigh = fFakeRate->MuonFakeRateSysErrorHigh(MuFakeableObjs->At(n)->Et(),
196     MuFakeableObjs->At(n)->Eta(),
197     MuFakeableObjs->At(n)->Phi());
198     muonFakeProbErrorLow = TMath::Sqrt(muonFakeProbStatErrorLow*muonFakeProbStatErrorLow +
199     muonFakeProbSysErrorLow*muonFakeProbSysErrorLow);
200     muonFakeProbErrorHigh = TMath::Sqrt(muonFakeProbStatErrorHigh*muonFakeProbStatErrorHigh +
201     muonFakeProbSysErrorHigh*muonFakeProbSysErrorHigh);
202    
203 loizides 1.1 } else {
204     cerr << "Error: fFakeRate is a NULL pointer.\n";
205     assert(false);
206     }
207    
208     //only fake into a muon if the fakeable object did not match to a clean lepton
209     if (!isCleanLepton) {
210    
211     //create new fake event header
212     FakeEventHeader *fakeMuonEvent = new FakeEventHeader();
213     fakeMuonEvent->SetWeight(FakeEventHeaders->At(i)->Weight() * muonFakeProb);
214 phedex 1.4 Double_t weightLowError = 0;
215     Double_t weightHighError = 0;
216     if (muonFakeProb > 0) {
217     weightLowError = FakeEventHeaders->At(i)->Weight()*muonFakeProb*
218     TMath::Sqrt((FakeEventHeaders->At(i)->WeightLowError()/
219     FakeEventHeaders->At(i)->Weight())*
220     (FakeEventHeaders->At(i)->WeightLowError()/
221     FakeEventHeaders->At(i)->Weight()) +
222     (muonFakeProbErrorLow/muonFakeProb)*
223     (muonFakeProbErrorLow/muonFakeProb));
224     weightHighError = FakeEventHeaders->At(i)->Weight()*muonFakeProb*
225     TMath::Sqrt((FakeEventHeaders->At(i)->WeightHighError()/
226     FakeEventHeaders->At(i)->Weight())*
227     (FakeEventHeaders->At(i)->WeightHighError()/
228     FakeEventHeaders->At(i)->Weight()) +
229     (muonFakeProbErrorHigh/muonFakeProb)*
230     (muonFakeProbErrorHigh/muonFakeProb));
231     }
232     fakeMuonEvent->SetWeightLowError(weightLowError);
233     fakeMuonEvent->SetWeightHighError(weightHighError);
234 loizides 1.1
235     //add all previous fakes
236     for (UInt_t f=0;f<FakeEventHeaders->At(i)->FakeObjsSize();f++) {
237     fakeMuonEvent->AddFakeObject(FakeEventHeaders->At(i)->FakeObj(f));
238     }
239     //add new fake
240 phedex 1.2 fakeMuonEvent->AddFakeObject(MuFakeableObjs->At(n),kMuon,isCleanLepton,isGenMuon);
241 loizides 1.1
242     //add all previous jets except the one matching to the new fake
243     for (UInt_t jj=0;jj<FakeEventHeaders->At(i)->NJets();jj++) {
244 loizides 1.3 if ((int)jj != fakeToJetMatch)
245 loizides 1.1 fakeMuonEvent->AddJets(FakeEventHeaders->At(i)->UnfakedJet(jj));
246     }
247    
248     //add fake event to the temporary fake event header array
249     tempFakeEventHeaders->AddOwned(fakeMuonEvent);
250    
251     //increase cumulative fake probability
252     totalCumulativeFakeProbability += muonFakeProb;
253     }
254    
255     // *****************************************************************************************
256     // Do not fake into Muon
257     // *****************************************************************************************
258     //create new fake event header
259     FakeEventHeader *notFakeEvent = new FakeEventHeader();
260     notFakeEvent->SetWeight(FakeEventHeaders->At(i)->Weight() *
261     (1-totalCumulativeFakeProbability));
262     //add previous fakes
263     for (UInt_t f=0;f<FakeEventHeaders->At(i)->FakeObjsSize();f++) {
264     notFakeEvent->AddFakeObject(FakeEventHeaders->At(i)->FakeObj(f));
265     }
266     //add previous jets
267     for (UInt_t jj=0;jj<FakeEventHeaders->At(i)->NJets();jj++) {
268     notFakeEvent->AddJets(FakeEventHeaders->At(i)->UnfakedJet(jj));
269     }
270     tempFakeEventHeaders->AddOwned(notFakeEvent);
271    
272     } //loop over all current fake event headers
273    
274     //replace current fake event headers with the new temporary ones.
275     delete FakeEventHeaders;
276     FakeEventHeaders = tempFakeEventHeaders;
277     } //loop over all muon fakeable objects
278    
279    
280     // *****************************************************************************************
281     // Fake into Electrons
282     // Loop through all Electron Fakeable objects and consider the fake possibility.
283     // *****************************************************************************************
284 phedex 1.2 for (UInt_t n = 0; n < ElFakeableObjs->GetEntries();n++) {
285 loizides 1.1
286     //make temporary fake event headers array
287     ObjArray <FakeEventHeader> *tempFakeEventHeaders = new ObjArray <FakeEventHeader> ;
288     tempFakeEventHeaders->SetOwner(kTRUE);
289    
290     //loop over all fake events generated so far - and perform an additional fake if necessary
291     for (UInt_t i=0; i<FakeEventHeaders->GetEntries();i++) {
292    
293     // *****************************************************************************************
294     // Determine if the fakeable object was a clean lepton
295     // *****************************************************************************************
296     Bool_t isCleanLepton = false;
297     for (UInt_t j = 0; j < CleanLeptons->GetEntries() ; j++) {
298 phedex 1.2 Double_t deltaR = MathUtils::DeltaR(ElFakeableObjs->At(n)->Phi(),
299     ElFakeableObjs->At(n)->Eta(),
300 loizides 1.1 CleanLeptons->At(j)->Phi(), CleanLeptons->At(j)->Eta());
301    
302     if (deltaR < 0.3) {
303     isCleanLepton = true;
304     break;
305     }
306     }
307    
308     // *****************************************************************************************
309     // Determine if the fakeable object was a real electron from Monte Carlo
310     // *****************************************************************************************
311     Bool_t isGenElectron = false;
312     for (UInt_t l=0; l<GenLeptonsAndTaus->GetEntries(); l++) {
313 phedex 1.2 if (MathUtils::DeltaR(ElFakeableObjs->At(n)->Phi(),
314     ElFakeableObjs->At(n)->Eta(),
315 loizides 1.1 GenLeptonsAndTaus->At(l)->Phi(),
316     GenLeptonsAndTaus->At(l)->Eta()) < 0.3) {
317     isGenElectron = true;
318     }
319     }
320    
321    
322     //this is used to determine the weight of the unfaked event.
323     double totalCumulativeFakeProbability = 0.0;
324    
325     // *****************************************************************************************
326     // Determine if the current electron fakeable object already corresponds to one of the
327     // fake muons already in the FakeEventHeader, determined based on deltaR proximity.
328     // If the current electron fakeable object corresponds to one of the fake muon, then
329     // we do not allow it to fake an electron, since one denominator cannot fake two leptons.
330     // *****************************************************************************************
331     Bool_t alreadyFaked = false;
332     for (UInt_t f = 0; f < FakeEventHeaders->At(i)->FakeObjsSize() ; f++) {
333     double deltaR = MathUtils::DeltaR(FakeEventHeaders->At(i)->FakeObj(f)->Mom(),
334 phedex 1.2 ElFakeableObjs->At(n)->Mom());
335 loizides 1.1 if (deltaR < 0.3)
336     alreadyFaked = true;
337     }
338     if (!alreadyFaked) {
339    
340     // *****************************************************************************************
341     // Perform Electron Fake
342     // *****************************************************************************************
343    
344     //match fake to one of the jets
345     int fakeToJetMatch = -1; //index of the jet that matches to the fake
346     double minDR = 5000;
347     for (UInt_t jj=0;jj<FakeEventHeaders->At(i)->NJets();jj++) {
348     Double_t deltaR = MathUtils::DeltaR(FakeEventHeaders->At(i)->UnfakedJet(jj)->Mom(),
349 phedex 1.2 ElFakeableObjs->At(n)->Mom());
350 loizides 1.1 if (deltaR < minDR) {
351     minDR = deltaR;
352     fakeToJetMatch = jj;
353     }
354     }
355     if (!(minDR < 0.5)) {
356     fakeToJetMatch = -1;
357     }
358    
359     //Obtain the electron FakeRate
360     Double_t electronFakeProb = 0.0;
361 phedex 1.4 Double_t electronFakeProbStatErrorLow = 0.0;
362     Double_t electronFakeProbStatErrorHigh = 0.0;
363     Double_t electronFakeProbSysErrorLow = 0.0;
364     Double_t electronFakeProbSysErrorHigh = 0.0;
365     Double_t electronFakeProbErrorLow = 0.0;
366     Double_t electronFakeProbErrorHigh = 0.0;
367 loizides 1.1 if(fFakeRate) {
368 phedex 1.2 electronFakeProb = fFakeRate->ElectronFakeRate(ElFakeableObjs->At(n)->Et(),
369     ElFakeableObjs->At(n)->Eta(),
370     ElFakeableObjs->At(n)->Phi());
371 phedex 1.4 electronFakeProbStatErrorLow =
372     fFakeRate->ElectronFakeRateStatErrorLow(ElFakeableObjs->At(n)->Et(),
373     ElFakeableObjs->At(n)->Eta(),
374     ElFakeableObjs->At(n)->Phi());
375     electronFakeProbStatErrorHigh =
376     fFakeRate->ElectronFakeRateStatErrorHigh(ElFakeableObjs->At(n)->Et(),
377     ElFakeableObjs->At(n)->Eta(),
378     ElFakeableObjs->At(n)->Phi());
379     electronFakeProbSysErrorLow =
380     fFakeRate->ElectronFakeRateSysErrorLow(ElFakeableObjs->At(n)->Et(),
381     ElFakeableObjs->At(n)->Eta(),
382     ElFakeableObjs->At(n)->Phi());
383     electronFakeProbSysErrorHigh =
384     fFakeRate->ElectronFakeRateSysErrorHigh(ElFakeableObjs->At(n)->Et(),
385     ElFakeableObjs->At(n)->Eta(),
386     ElFakeableObjs->At(n)->Phi());
387     electronFakeProbErrorLow =
388     TMath::Sqrt(electronFakeProbStatErrorLow*electronFakeProbStatErrorLow +
389     electronFakeProbSysErrorLow*electronFakeProbSysErrorLow);
390     electronFakeProbErrorHigh =
391     TMath::Sqrt(electronFakeProbStatErrorHigh*electronFakeProbStatErrorHigh +
392     electronFakeProbSysErrorHigh*electronFakeProbSysErrorHigh);
393 loizides 1.1 } else {
394     cerr << "Error: fFakeRate is a NULL pointer.\n";
395     assert(false);
396     }
397 phedex 1.4
398 loizides 1.1 //only fake into a muon if the fakeable object did not match to a clean lepton
399     if (!isCleanLepton) {
400     //create new fake event header
401     FakeEventHeader *fakeElectronEvent = new FakeEventHeader();
402     fakeElectronEvent->SetWeight(FakeEventHeaders->At(i)->Weight() * electronFakeProb);
403 phedex 1.4 Double_t weightLowError = 0;
404     Double_t weightHighError = 0;
405     if (electronFakeProb) {
406     weightLowError = FakeEventHeaders->At(i)->Weight()*electronFakeProb*
407     TMath::Sqrt((FakeEventHeaders->At(i)->WeightLowError()/
408     FakeEventHeaders->At(i)->Weight())*
409     (FakeEventHeaders->At(i)->WeightLowError()/
410     FakeEventHeaders->At(i)->Weight()) +
411     (electronFakeProbErrorLow/electronFakeProb)*
412     (electronFakeProbErrorLow/electronFakeProb));
413     weightHighError = FakeEventHeaders->At(i)->Weight()*electronFakeProb*
414     TMath::Sqrt((FakeEventHeaders->At(i)->WeightHighError()/
415     FakeEventHeaders->At(i)->Weight())*
416     (FakeEventHeaders->At(i)->WeightHighError()/
417     FakeEventHeaders->At(i)->Weight()) +
418     (electronFakeProbErrorHigh/electronFakeProb)*
419     (electronFakeProbErrorHigh/electronFakeProb));
420     }
421     fakeElectronEvent->SetWeightLowError(weightLowError);
422     fakeElectronEvent->SetWeightHighError(weightHighError);
423    
424 loizides 1.1 //add previous fakes
425     for (UInt_t f=0;f<FakeEventHeaders->At(i)->FakeObjsSize();f++) {
426     fakeElectronEvent->AddFakeObject(FakeEventHeaders->At(i)->FakeObj(f));
427     }
428     //add the new fake
429 phedex 1.2 fakeElectronEvent->AddFakeObject(ElFakeableObjs->At(n),
430 loizides 1.1 kElectron,isCleanLepton,isGenElectron);
431     //add previous jets that do not match to the new fake
432     for (UInt_t jj=0;jj<FakeEventHeaders->At(i)->NJets();jj++) {
433 loizides 1.3 if ((int)jj != fakeToJetMatch)
434 loizides 1.1 fakeElectronEvent->AddJets(FakeEventHeaders->At(i)->UnfakedJet(jj));
435     }
436    
437     //add fake event to the temporary fake event header array
438     tempFakeEventHeaders->AddOwned(fakeElectronEvent);
439     //increase cumulative fake probability
440     totalCumulativeFakeProbability += electronFakeProb;
441     }
442     }
443    
444     // *****************************************************************************************
445     // Do not fake into anything
446     // *****************************************************************************************
447     //create new fake event header
448     FakeEventHeader *notFakeEvent = new FakeEventHeader();
449     notFakeEvent->SetWeight(FakeEventHeaders->At(i)->Weight() *
450     (1-totalCumulativeFakeProbability));
451     //add previous fakes
452     for (UInt_t f=0;f<FakeEventHeaders->At(i)->FakeObjsSize();f++) {
453     notFakeEvent->AddFakeObject(FakeEventHeaders->At(i)->FakeObj(f));
454     }
455     //add previous jets
456     for (UInt_t jj=0;jj<FakeEventHeaders->At(i)->NJets();jj++) {
457     notFakeEvent->AddJets(FakeEventHeaders->At(i)->UnfakedJet(jj));
458     }
459     tempFakeEventHeaders->AddOwned(notFakeEvent);
460    
461     } //for all current fake event headers
462    
463     //replace current fake event headers with the new temporary ones.
464     delete FakeEventHeaders;
465     FakeEventHeaders = tempFakeEventHeaders;
466     } //loop over all fakeable objects
467    
468     // export FakeEventHeaders for other modules to use
469     FakeEventHeaders->SetName(fFakeEventHeadersName);
470     AddObjThisEvt(FakeEventHeaders);
471    
472     //delete temporary collections
473     delete GenLeptonsAndTaus;
474     }