ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerPFCandidates.cc
Revision: 1.16
Committed: Sat May 5 16:49:59 2012 UTC (13 years ago) by paus
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_028a, Mit_028, Mit_027a, Mit_027
Changes since 1.15: +9 -9 lines
Log Message:
Version 027 - complete version for ICHEP 2012.

File Contents

# User Rev Content
1 paus 1.16 // $Id: FillerPFCandidates.cc,v 1.15 2012/03/11 23:11:56 pharris Exp $
2 bendavid 1.1
3     #include "MitProd/TreeFiller/interface/FillerPFCandidates.h"
4     #include "DataFormats/ParticleFlowCandidate/interface/PFCandidate.h"
5     #include "DataFormats/ParticleFlowCandidate/interface/PFCandidateFwd.h"
6     #include "DataFormats/GsfTrackReco/interface/GsfTrack.h"
7     #include "DataFormats/MuonReco/interface/Muon.h"
8     #include "DataFormats/MuonReco/interface/MuonFwd.h"
9     #include "DataFormats/Common/interface/RefToPtr.h"
10     #include "MitAna/DataTree/interface/Muon.h"
11 loizides 1.3 #include "MitAna/DataTree/interface/Names.h"
12     #include "MitAna/DataTree/interface/PFCandidateCol.h"
13 bendavid 1.1 #include "MitAna/DataTree/interface/Track.h"
14 loizides 1.3 #include "MitProd/ObjectService/interface/ObjectService.h"
15 bendavid 1.1
16     using namespace std;
17     using namespace edm;
18     using namespace mithep;
19    
20     //--------------------------------------------------------------------------------------------------
21 loizides 1.2 FillerPFCandidates::FillerPFCandidates(const edm::ParameterSet &cfg,
22     const char *name, bool active) :
23 bendavid 1.1 BaseFiller(cfg,name,active),
24     edmName_(Conf().getUntrackedParameter<string>("edmName","particleFlow")),
25 pharris 1.15 edmPfNoPileupName_(Conf().getUntrackedParameter<string>("edmName","pfNoElectrons")),
26 bendavid 1.1 mitName_(Conf().getUntrackedParameter<string>("mitName",Names::gkPFCandidatesBrn)),
27 bendavid 1.13 trackerTrackMapNames_(Conf().exists("trackerTrackMapNames") ?
28     Conf().getUntrackedParameter<vector<string> >("trackerTrackMapNames") :
29     vector<string>()),
30 bendavid 1.1 gsfTrackMapName_(Conf().getUntrackedParameter<string>("gsfTrackMapName","")),
31     muonMapName_(Conf().getUntrackedParameter<string>("muonMapName","")),
32     conversionMapName_(Conf().getUntrackedParameter<string>("conversionMapName","")),
33     pfCandMapName_(Conf().getUntrackedParameter<string>("pfCandMapName","")),
34 pharris 1.15 pfNoPileupCandMapName_(Conf().getUntrackedParameter<string>("pfNoPileupMapName","")),
35 bendavid 1.12 allowMissingTrackRef_(Conf().getUntrackedParameter<bool>("allowMissingTrackRef",false)),
36 pharris 1.15 fillPfNoPileup_(Conf().getUntrackedParameter<bool>("fillPfNoPileup",true)),
37 bendavid 1.1 gsfTrackMap_(0),
38     muonMap_(0),
39     conversionMap_(0),
40     pfCandMap_(new mithep::PFCandidateMap),
41 pharris 1.15 pfNoPileupCandMap_(new mithep::PFCandidateMap),
42 bendavid 1.1 pfCands_(new mithep::PFCandidateArr(16))
43     {
44     // Constructor.
45     }
46    
47     //--------------------------------------------------------------------------------------------------
48 loizides 1.2 FillerPFCandidates::~FillerPFCandidates()
49     {
50     // Destructor.
51    
52 bendavid 1.1 delete pfCands_;
53     delete pfCandMap_;
54 pharris 1.15 delete pfNoPileupCandMap_;
55 bendavid 1.1 }
56    
57     //--------------------------------------------------------------------------------------------------
58 bendavid 1.5 void FillerPFCandidates::BookDataBlock(TreeWriter &tws)
59 loizides 1.2 {
60     // Add particle-flow candidate branch to tree and get pointers to maps.
61    
62     tws.AddBranch(mitName_,&pfCands_);
63     OS()->add<mithep::PFCandidateArr>(pfCands_,mitName_);
64    
65 bendavid 1.13 // if (!trackerTrackMapName_.empty()) {
66     // trackerTrackMap_ = OS()->get<TrackMap>(trackerTrackMapName_);
67     // if (trackerTrackMap_)
68     // AddBranchDep(mitName_,trackerTrackMap_->GetBrName());
69     // }
70    
71     for (std::vector<std::string>::const_iterator bmapName = trackerTrackMapNames_.begin();
72     bmapName!=trackerTrackMapNames_.end(); ++bmapName) {
73     if (!bmapName->empty()) {
74     const TrackMap *map = OS()->get<TrackMap>(*bmapName);
75     if (map) {
76     trackerTrackMaps_.push_back(map);
77     AddBranchDep(mitName_,map->GetBrName());
78     }
79     }
80 loizides 1.2 }
81 bendavid 1.13
82 loizides 1.2 if (!gsfTrackMapName_.empty()) {
83     gsfTrackMap_ = OS()->get<TrackMap>(gsfTrackMapName_);
84     if (gsfTrackMap_)
85     AddBranchDep(mitName_,gsfTrackMap_->GetBrName());
86     }
87     if (!muonMapName_.empty()) {
88     muonMap_ = OS()->get<MuonMap>(muonMapName_);
89     if (muonMap_)
90     AddBranchDep(mitName_,muonMap_->GetBrName());
91     }
92     if (!conversionMapName_.empty()) {
93     conversionMap_ = OS()->get<ConversionMap>(conversionMapName_);
94     if (conversionMap_)
95     AddBranchDep(mitName_,conversionMap_->GetBrName());
96     }
97     if (!pfCandMapName_.empty()) {
98     pfCandMap_->SetBrName(mitName_);
99     OS()->add<PFCandidateMap>(pfCandMap_,pfCandMapName_);
100     }
101 pharris 1.15 if (!pfNoPileupCandMapName_.empty()) {
102     pfNoPileupCandMap_->SetBrName(mitName_);
103     OS()->add<PFCandidateMap>(pfNoPileupCandMap_,pfNoPileupCandMapName_);
104     }
105 bendavid 1.1 }
106    
107     //--------------------------------------------------------------------------------------------------
108     void FillerPFCandidates::FillDataBlock(const edm::Event &event,
109 loizides 1.2 const edm::EventSetup &setup)
110 bendavid 1.1 {
111     // Fill muon information.
112    
113     pfCands_->Delete();
114     pfCandMap_->Reset();
115 pharris 1.15 pfNoPileupCandMap_->Reset();
116    
117 bendavid 1.1 Handle<reco::PFCandidateCollection> hPfCandProduct;
118     GetProduct(edmName_, hPfCandProduct, event);
119     const reco::PFCandidateCollection &inPfCands = *(hPfCandProduct.product());
120    
121 pharris 1.15 Handle<reco::PFCandidateCollection> hPfNoPileupCandProduct;
122     GetProduct(edmPfNoPileupName_, hPfNoPileupCandProduct, event);
123     const reco::PFCandidateCollection &inPfNoPileupCands = *(hPfNoPileupCandProduct.product());
124 loizides 1.2 for (reco::PFCandidateCollection::const_iterator iP = inPfCands.begin();
125     iP != inPfCands.end(); ++iP) {
126 bendavid 1.1 mithep::PFCandidate *outPfCand = pfCands_->Allocate();
127     new (outPfCand) mithep::PFCandidate(iP->px(),iP->py(),iP->pz(),iP->energy());
128    
129 loizides 1.2 // fill variables
130 bendavid 1.1 outPfCand->SetCharge(iP->charge());
131     outPfCand->SetEECal(iP->ecalEnergy());
132     outPfCand->SetEHCal(iP->hcalEnergy());
133     outPfCand->SetEECalRaw(iP->rawEcalEnergy());
134     outPfCand->SetEHCalRaw(iP->rawHcalEnergy());
135     outPfCand->SetEPS1(iP->pS1Energy());
136     outPfCand->SetEPS2(iP->pS2Energy());
137     outPfCand->SetPError(iP->deltaP());
138     outPfCand->SetMvaEPi(iP->mva_e_pi());
139     outPfCand->SetMvaEMu(iP->mva_e_mu());
140     outPfCand->SetMvaPiMu(iP->mva_pi_mu());
141     outPfCand->SetMvaGamma(iP->mva_nothing_gamma());
142     outPfCand->SetMvaNeutralH(iP->mva_nothing_nh());
143     outPfCand->SetMvaGammaNeutralH(iP->mva_gamma_nh());
144     outPfCand->SetEtaECal(iP->positionAtECALEntrance().eta());
145 bendavid 1.10 outPfCand->SetPhiECal(iP->positionAtECALEntrance().phi());
146 bendavid 1.1
147 loizides 1.2 // fill source vertex
148 bendavid 1.1 outPfCand->SetVertex(iP->vertex().x(),iP->vertex().y(),iP->vertex().z());
149    
150 loizides 1.2 // fill pf type enum
151 bendavid 1.1 if (iP->particleId()==reco::PFCandidate::X)
152     outPfCand->SetPFType(mithep::PFCandidate::eX);
153     else if (iP->particleId()==reco::PFCandidate::h)
154     outPfCand->SetPFType(mithep::PFCandidate::eHadron);
155     else if (iP->particleId()==reco::PFCandidate::e)
156     outPfCand->SetPFType(mithep::PFCandidate::eElectron);
157     else if (iP->particleId()==reco::PFCandidate::mu)
158     outPfCand->SetPFType(mithep::PFCandidate::eMuon);
159     else if (iP->particleId()==reco::PFCandidate::gamma)
160     outPfCand->SetPFType(mithep::PFCandidate::eGamma);
161     else if (iP->particleId()==reco::PFCandidate::h0)
162     outPfCand->SetPFType(mithep::PFCandidate::eNeutralHadron);
163     else if (iP->particleId()==reco::PFCandidate::h_HF)
164     outPfCand->SetPFType(mithep::PFCandidate::eHadronHF);
165     else if (iP->particleId()==reco::PFCandidate::egamma_HF)
166     outPfCand->SetPFType(mithep::PFCandidate::eEGammaHF);
167    
168 loizides 1.2 // fill pf flags bitmask
169     outPfCand->SetFlag(mithep::PFCandidate::eNormal,
170     iP->flag(reco::PFCandidate::NORMAL));
171     outPfCand->SetFlag(mithep::PFCandidate::eEMPhiSModules,
172     iP->flag(reco::PFCandidate::E_PHI_SMODULES));
173     outPfCand->SetFlag(mithep::PFCandidate::eEMEta0,
174     iP->flag(reco::PFCandidate::E_ETA_0));
175     outPfCand->SetFlag(mithep::PFCandidate::eEMEtaModules,
176     iP->flag(reco::PFCandidate::E_ETA_MODULES));
177     outPfCand->SetFlag(mithep::PFCandidate::eEMBarrelEndcap,
178     iP->flag(reco::PFCandidate::E_BARREL_ENDCAP));
179     outPfCand->SetFlag(mithep::PFCandidate::eEMPreshowerEdge,
180     iP->flag(reco::PFCandidate::E_PRESHOWER_EDGE));
181     outPfCand->SetFlag(mithep::PFCandidate::eEMPreshower,
182     iP->flag(reco::PFCandidate::E_PRESHOWER));
183     outPfCand->SetFlag(mithep::PFCandidate::eEMEndCapEdge,
184     iP->flag(reco::PFCandidate::E_ENDCAP_EDGE));
185     outPfCand->SetFlag(mithep::PFCandidate::eHEta0,
186     iP->flag(reco::PFCandidate::H_ETA_0));
187     outPfCand->SetFlag(mithep::PFCandidate::eHBarrelEndcap,
188     iP->flag(reco::PFCandidate::H_BARREL_ENDCAP));
189     outPfCand->SetFlag(mithep::PFCandidate::eHEndcapVFCal,
190     iP->flag(reco::PFCandidate::H_ENDCAP_VFCAL));
191     outPfCand->SetFlag(mithep::PFCandidate::eHVFCalEdge,
192     iP->flag(reco::PFCandidate::H_VFCAL_EDGE));
193 bendavid 1.9 outPfCand->SetFlag(mithep::PFCandidate::eToDispVtx,
194     iP->flag(reco::PFCandidate::T_TO_DISP));
195     outPfCand->SetFlag(mithep::PFCandidate::eFromDispVtx,
196     iP->flag(reco::PFCandidate::T_FROM_DISP));
197 loizides 1.2 outPfCand->SetFlag(mithep::PFCandidate::eFromV0,
198     iP->flag(reco::PFCandidate::T_FROM_V0));
199     outPfCand->SetFlag(mithep::PFCandidate::eFromGammaConv,
200     iP->flag(reco::PFCandidate::T_FROM_GAMMACONV));
201     outPfCand->SetFlag(mithep::PFCandidate::eToConversion,
202     iP->flag(reco::PFCandidate::GAMMA_TO_GAMMACONV));
203 bendavid 1.1
204 bendavid 1.13 //printf("pf type = %i\n",iP->particleId());
205    
206 loizides 1.2 // fill references to other branches
207 bendavid 1.13 if (iP->trackRef().isNonnull()) {
208     //printf("track: process = %i, product = %i, algo = %i, highPurity = %i\n",iP->trackRef().id().processIndex(),iP->trackRef().id().productIndex(),iP->trackRef()->algo(),iP->trackRef()->quality(reco::TrackBase::highPurity));
209     const mithep::Track *thetrack = getMitTrack(refToPtr(iP->trackRef()),allowMissingTrackRef_);
210     outPfCand->SetTrackerTrk(thetrack);
211 bendavid 1.12 }
212 bendavid 1.1 if (gsfTrackMap_ && iP->gsfTrackRef().isNonnull())
213     outPfCand->SetGsfTrk(gsfTrackMap_->GetMit(refToPtr(iP->gsfTrackRef())));
214     if (muonMap_ && iP->muonRef().isNonnull())
215     outPfCand->SetMuon(muonMap_->GetMit(refToPtr(iP->muonRef())));
216     if (conversionMap_ && iP->conversionRef().isNonnull())
217     outPfCand->SetConversion(conversionMap_->GetMit(iP->conversionRef()));
218    
219 loizides 1.2 // add to exported pf candidate map
220 bendavid 1.1 reco::PFCandidatePtr thePtr(hPfCandProduct, iP - inPfCands.begin());
221     pfCandMap_->Add(thePtr, outPfCand);
222    
223 pharris 1.15 //add pf No Pileup map
224     //===> Do I do a loop?
225     bool found = false;
226     if(fillPfNoPileup_) {
227     outPfCand->SetFlag(mithep::PFCandidate::ePFNoPileup,false);
228     for (reco::PFCandidateCollection::const_iterator iNoPileupP = inPfNoPileupCands.begin();
229     iNoPileupP != inPfNoPileupCands.end(); ++iNoPileupP) {
230     if(iP->px() == iNoPileupP->px() && iP->py() == iNoPileupP->py() && iNoPileupP->pz() == iP->pz()) {
231     reco::PFCandidatePtr theNoPileupPtr(hPfNoPileupCandProduct, iNoPileupP - inPfNoPileupCands.begin());
232     pfNoPileupCandMap_->Add(theNoPileupPtr, outPfCand);
233     outPfCand->SetFlag(mithep::PFCandidate::ePFNoPileup,true);
234     if(found) edm::Exception(edm::errors::Configuration, "FillerPFCandidates:FillDataBlock()\n")
235     << "Error! PF No Pileup double linked " << endl;
236     found = true;
237     }
238     }
239     }
240 bendavid 1.1 }
241     pfCands_->Trim();
242     }
243    
244     //--------------------------------------------------------------------------------------------------
245     void FillerPFCandidates::ResolveLinks(const edm::Event &event,
246 loizides 1.2 const edm::EventSetup &setup)
247 bendavid 1.1 {
248 loizides 1.2 // Resolve and fill mother-daughter links.
249 bendavid 1.1
250     Handle<reco::PFCandidateCollection> hPfCandProduct;
251     GetProduct(edmName_, hPfCandProduct, event);
252     const reco::PFCandidateCollection &inPfCands = *(hPfCandProduct.product());
253    
254 loizides 1.2 // loop through pf candidates and resolve mother-daughter links
255     for (reco::PFCandidateCollection::const_iterator iP = inPfCands.begin();
256     iP != inPfCands.end(); ++iP) {
257    
258 bendavid 1.1 reco::PFCandidatePtr thePtr(hPfCandProduct, iP - inPfCands.begin());
259    
260 paus 1.16 //mithep::PFCandidate *outPfCand = pfCandMap_->GetMit(thePtr);
261 loizides 1.2 // fill mother-daughter links
262 paus 1.16 // const reco::CandidatePtr motherCandPtr = iP->sourceCandidatePtr(0);
263     // const reco::PFCandidatePtr motherPtr(motherCandPtr);
264     // if (motherCandPtr.isNonnull()) {
265     // mithep::PFCandidate *mother = pfCandMap_->GetMit(motherPtr);
266     // outPfCand->SetMother(mother);
267     // mother->AddDaughter(outPfCand);
268     // }
269 bendavid 1.13 }
270     }
271    
272     //--------------------------------------------------------------------------------------------------
273     const mithep::Track *FillerPFCandidates::getMitTrack(mitedm::TrackPtr ptr, bool allowmissing) const
274     {
275     // Return our particle referenced by the edm pointer.
276    
277     mithep::Track *mitPart = 0;
278     for (std::vector<const mithep::TrackMap*>::const_iterator bmap = trackerTrackMaps_.begin();
279     bmap!=trackerTrackMaps_.end(); ++bmap) {
280     const mithep::TrackMap *theMap = *bmap;
281     if (theMap->HasMit(ptr)) {
282     mitPart = theMap->GetMit(ptr);
283     return mitPart;
284 bendavid 1.12 }
285 bendavid 1.1 }
286 bendavid 1.13
287     if (!mitPart && !allowmissing)
288     throw edm::Exception(edm::errors::Configuration, "FillerPFCandidates::FillDataBlock()\n")
289     << "Error! MITHEP Object "
290     << "not found in AssociationMaps (" << typeid(*this).name() << ")." << std::endl;
291    
292     return mitPart;
293 pharris 1.15 }