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

# Content
1 // $Id: FillerPFCandidates.cc,v 1.15 2012/03/11 23:11:56 pharris Exp $
2
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 #include "MitAna/DataTree/interface/Names.h"
12 #include "MitAna/DataTree/interface/PFCandidateCol.h"
13 #include "MitAna/DataTree/interface/Track.h"
14 #include "MitProd/ObjectService/interface/ObjectService.h"
15
16 using namespace std;
17 using namespace edm;
18 using namespace mithep;
19
20 //--------------------------------------------------------------------------------------------------
21 FillerPFCandidates::FillerPFCandidates(const edm::ParameterSet &cfg,
22 const char *name, bool active) :
23 BaseFiller(cfg,name,active),
24 edmName_(Conf().getUntrackedParameter<string>("edmName","particleFlow")),
25 edmPfNoPileupName_(Conf().getUntrackedParameter<string>("edmName","pfNoElectrons")),
26 mitName_(Conf().getUntrackedParameter<string>("mitName",Names::gkPFCandidatesBrn)),
27 trackerTrackMapNames_(Conf().exists("trackerTrackMapNames") ?
28 Conf().getUntrackedParameter<vector<string> >("trackerTrackMapNames") :
29 vector<string>()),
30 gsfTrackMapName_(Conf().getUntrackedParameter<string>("gsfTrackMapName","")),
31 muonMapName_(Conf().getUntrackedParameter<string>("muonMapName","")),
32 conversionMapName_(Conf().getUntrackedParameter<string>("conversionMapName","")),
33 pfCandMapName_(Conf().getUntrackedParameter<string>("pfCandMapName","")),
34 pfNoPileupCandMapName_(Conf().getUntrackedParameter<string>("pfNoPileupMapName","")),
35 allowMissingTrackRef_(Conf().getUntrackedParameter<bool>("allowMissingTrackRef",false)),
36 fillPfNoPileup_(Conf().getUntrackedParameter<bool>("fillPfNoPileup",true)),
37 gsfTrackMap_(0),
38 muonMap_(0),
39 conversionMap_(0),
40 pfCandMap_(new mithep::PFCandidateMap),
41 pfNoPileupCandMap_(new mithep::PFCandidateMap),
42 pfCands_(new mithep::PFCandidateArr(16))
43 {
44 // Constructor.
45 }
46
47 //--------------------------------------------------------------------------------------------------
48 FillerPFCandidates::~FillerPFCandidates()
49 {
50 // Destructor.
51
52 delete pfCands_;
53 delete pfCandMap_;
54 delete pfNoPileupCandMap_;
55 }
56
57 //--------------------------------------------------------------------------------------------------
58 void FillerPFCandidates::BookDataBlock(TreeWriter &tws)
59 {
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 // 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 }
81
82 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 if (!pfNoPileupCandMapName_.empty()) {
102 pfNoPileupCandMap_->SetBrName(mitName_);
103 OS()->add<PFCandidateMap>(pfNoPileupCandMap_,pfNoPileupCandMapName_);
104 }
105 }
106
107 //--------------------------------------------------------------------------------------------------
108 void FillerPFCandidates::FillDataBlock(const edm::Event &event,
109 const edm::EventSetup &setup)
110 {
111 // Fill muon information.
112
113 pfCands_->Delete();
114 pfCandMap_->Reset();
115 pfNoPileupCandMap_->Reset();
116
117 Handle<reco::PFCandidateCollection> hPfCandProduct;
118 GetProduct(edmName_, hPfCandProduct, event);
119 const reco::PFCandidateCollection &inPfCands = *(hPfCandProduct.product());
120
121 Handle<reco::PFCandidateCollection> hPfNoPileupCandProduct;
122 GetProduct(edmPfNoPileupName_, hPfNoPileupCandProduct, event);
123 const reco::PFCandidateCollection &inPfNoPileupCands = *(hPfNoPileupCandProduct.product());
124 for (reco::PFCandidateCollection::const_iterator iP = inPfCands.begin();
125 iP != inPfCands.end(); ++iP) {
126 mithep::PFCandidate *outPfCand = pfCands_->Allocate();
127 new (outPfCand) mithep::PFCandidate(iP->px(),iP->py(),iP->pz(),iP->energy());
128
129 // fill variables
130 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 outPfCand->SetPhiECal(iP->positionAtECALEntrance().phi());
146
147 // fill source vertex
148 outPfCand->SetVertex(iP->vertex().x(),iP->vertex().y(),iP->vertex().z());
149
150 // fill pf type enum
151 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 // 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 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 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
204 //printf("pf type = %i\n",iP->particleId());
205
206 // fill references to other branches
207 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 }
212 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 // add to exported pf candidate map
220 reco::PFCandidatePtr thePtr(hPfCandProduct, iP - inPfCands.begin());
221 pfCandMap_->Add(thePtr, outPfCand);
222
223 //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 }
241 pfCands_->Trim();
242 }
243
244 //--------------------------------------------------------------------------------------------------
245 void FillerPFCandidates::ResolveLinks(const edm::Event &event,
246 const edm::EventSetup &setup)
247 {
248 // Resolve and fill mother-daughter links.
249
250 Handle<reco::PFCandidateCollection> hPfCandProduct;
251 GetProduct(edmName_, hPfCandProduct, event);
252 const reco::PFCandidateCollection &inPfCands = *(hPfCandProduct.product());
253
254 // 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 reco::PFCandidatePtr thePtr(hPfCandProduct, iP - inPfCands.begin());
259
260 //mithep::PFCandidate *outPfCand = pfCandMap_->GetMit(thePtr);
261 // fill mother-daughter links
262 // 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 }
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 }
285 }
286
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 }