CMS 3D CMS Logo

PATMuonSlimmer.cc
Go to the documentation of this file.
1 
10 
14 
22 
23 namespace pat {
24 
26  public:
27  explicit PATMuonSlimmer(const edm::ParameterSet &iConfig);
28  ~PATMuonSlimmer() override {}
29 
30  void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override;
31 
32  private:
34  std::vector<edm::EDGetTokenT<reco::PFCandidateCollection>> pf_;
35  std::vector<edm::EDGetTokenT<edm::Association<pat::PackedCandidateCollection>>> pf2pc_;
41  std::unique_ptr<pat::ObjectModifier<pat::Muon>> muonModifier_;
42  std::vector<edm::EDGetTokenT<edm::Association<reco::TrackExtraCollection>>> trackExtraAssocs_;
43  };
44 
45 } // namespace pat
46 
48  : src_(consumes<pat::MuonCollection>(iConfig.getParameter<edm::InputTag>("src"))),
49  linkToPackedPF_(iConfig.getParameter<bool>("linkToPackedPFCandidates")),
50  linkToLostTrack_(iConfig.getParameter<bool>("linkToLostTrack")),
51  saveTeVMuons_(iConfig.getParameter<std::string>("saveTeVMuons")),
52  dropDirectionalIso_(iConfig.getParameter<std::string>("dropDirectionalIso")),
53  dropPfP4_(iConfig.getParameter<std::string>("dropPfP4")),
54  slimCaloVars_(iConfig.getParameter<std::string>("slimCaloVars")),
55  slimKinkVars_(iConfig.getParameter<std::string>("slimKinkVars")),
56  slimCaloMETCorr_(iConfig.getParameter<std::string>("slimCaloMETCorr")),
57  slimMatches_(iConfig.getParameter<std::string>("slimMatches")),
58  segmentsMuonSelection_(iConfig.getParameter<std::string>("segmentsMuonSelection")),
59  saveSegments_(iConfig.getParameter<bool>("saveSegments")),
60  modifyMuon_(iConfig.getParameter<bool>("modifyMuons")) {
61  if (linkToPackedPF_) {
62  const std::vector<edm::InputTag> &pf = iConfig.getParameter<std::vector<edm::InputTag>>("pfCandidates");
63  const std::vector<edm::InputTag> &pf2pc = iConfig.getParameter<std::vector<edm::InputTag>>("packedPFCandidates");
64  if (pf.size() != pf2pc.size())
65  throw cms::Exception("Configuration") << "Mismatching pfCandidates and packedPFCandidates\n";
66  for (const edm::InputTag &tag : pf)
67  pf_.push_back(consumes<reco::PFCandidateCollection>(tag));
68  for (const edm::InputTag &tag : pf2pc)
70  }
71  if (linkToLostTrack_) {
73  consumes<edm::Association<pat::PackedCandidateCollection>>(iConfig.getParameter<edm::InputTag>("lostTracks"));
74  }
75 
76  if (modifyMuon_) {
77  const edm::ParameterSet &mod_config = iConfig.getParameter<edm::ParameterSet>("modifierConfig");
78  muonModifier_ = std::make_unique<pat::ObjectModifier<pat::Muon>>(mod_config, consumesCollector());
79  }
80  produces<std::vector<pat::Muon>>();
81  if (saveSegments_) {
82  produces<DTRecSegment4DCollection>();
83  produces<CSCSegmentCollection>();
84  }
85 
86  //associations for rekeying of TrackExtra refs in embedded tracks
87  std::vector<edm::InputTag> trackExtraAssocTags = iConfig.getParameter<std::vector<edm::InputTag>>("trackExtraAssocs");
88  for (edm::InputTag const &tag : trackExtraAssocTags) {
90  }
91 }
92 
94  using namespace edm;
95  using namespace std;
96 
97  if (modifyMuon_)
98  muonModifier_->setEventContent(iSetup);
99 
101  iEvent.getByToken(src_, src);
102 
103  auto out = std::make_unique<std::vector<pat::Muon>>();
104  out->reserve(src->size());
105 
106  auto outDTSegments = std::make_unique<DTRecSegment4DCollection>();
107  std::set<DTRecSegment4DRef> dtSegmentsRefs;
108  auto outCSCSegments = std::make_unique<CSCSegmentCollection>();
109  std::set<CSCSegmentRef> cscSegmentsRefs;
110 
111  if (modifyMuon_) {
112  muonModifier_->setEvent(iEvent);
113  }
114 
115  std::map<reco::CandidatePtr, pat::PackedCandidateRef> mu2pc;
116  if (linkToPackedPF_) {
119  for (unsigned int ipfh = 0, npfh = pf_.size(); ipfh < npfh; ++ipfh) {
120  iEvent.getByToken(pf_[ipfh], pf);
121  iEvent.getByToken(pf2pc_[ipfh], pf2pc);
122  const auto &pfcoll = (*pf);
123  const auto &pfmap = (*pf2pc);
124  for (unsigned int i = 0, n = pf->size(); i < n; ++i) {
125  const reco::PFCandidate &p = pfcoll[i];
126  if (p.muonRef().isNonnull())
127  mu2pc[refToPtr(p.muonRef())] = pfmap[reco::PFCandidateRef(pf, i)];
128  }
129  }
130  }
131  if (linkToLostTrack_) {
132  const auto &trk2LT = iEvent.get(track2LostTrack_);
133  for (const auto &mu : *src) {
134  const auto &track = dynamic_cast<const reco::Muon *>(mu.originalObject())->innerTrack();
135  if (track.isNonnull() && trk2LT.contains(track.id())) {
136  const auto &lostTrack = trk2LT[track];
137  if (lostTrack.isNonnull())
138  mu2pc[mu.refToOrig_] = lostTrack;
139  }
140  }
141  }
142 
143  std::vector<edm::Handle<edm::Association<reco::TrackExtraCollection>>> trackExtraAssocs(trackExtraAssocs_.size());
144  for (unsigned int i = 0; i < trackExtraAssocs_.size(); ++i) {
145  iEvent.getByToken(trackExtraAssocs_[i], trackExtraAssocs[i]);
146  }
147 
148  for (vector<pat::Muon>::const_iterator it = src->begin(), ed = src->end(); it != ed; ++it) {
149  out->push_back(*it);
150  pat::Muon &mu = out->back();
151 
152  if (modifyMuon_) {
153  muonModifier_->modify(mu);
154  }
155 
156  if (saveTeVMuons_(mu)) {
157  mu.embedPickyMuon();
158  mu.embedTpfmsMuon();
159  mu.embedDytMuon();
160  }
161  if (linkToPackedPF_ || linkToLostTrack_) {
162  mu.refToOrig_ = refToPtr(mu2pc[mu.refToOrig_]);
163  }
164  if (dropDirectionalIso_(mu)) {
166  mu.setPFIsolation("pfIsoMeanDRProfileR03", zero);
167  mu.setPFIsolation("pfIsoSumDRProfileR03", zero);
168  mu.setPFIsolation("pfIsoMeanDRProfileR04", zero);
169  mu.setPFIsolation("pfIsoSumDRProfileR04", zero);
170  }
171  if (mu.isPFMuon() && dropPfP4_(mu))
173  if (slimCaloVars_(mu) && mu.isEnergyValid()) {
174  reco::MuonEnergy ene = mu.calEnergy();
175  if (ene.tower)
176  ene.tower = MiniFloatConverter::reduceMantissaToNbitsRounding<12>(ene.tower);
177  if (ene.towerS9)
178  ene.towerS9 = MiniFloatConverter::reduceMantissaToNbitsRounding<12>(ene.towerS9);
179  if (ene.had)
180  ene.had = MiniFloatConverter::reduceMantissaToNbitsRounding<12>(ene.had);
181  if (ene.hadS9)
182  ene.hadS9 = MiniFloatConverter::reduceMantissaToNbitsRounding<12>(ene.hadS9);
183  if (ene.hadMax)
184  ene.hadMax = MiniFloatConverter::reduceMantissaToNbitsRounding<12>(ene.hadMax);
185  if (ene.em)
186  ene.em = MiniFloatConverter::reduceMantissaToNbitsRounding<12>(ene.em);
187  if (ene.emS25)
188  ene.emS25 = MiniFloatConverter::reduceMantissaToNbitsRounding<12>(ene.emS25);
189  if (ene.emMax)
190  ene.emMax = MiniFloatConverter::reduceMantissaToNbitsRounding<12>(ene.emMax);
191  if (ene.hcal_time)
192  ene.hcal_time = MiniFloatConverter::reduceMantissaToNbitsRounding<12>(ene.hcal_time);
193  if (ene.hcal_timeError)
194  ene.hcal_timeError = MiniFloatConverter::reduceMantissaToNbitsRounding<12>(ene.hcal_timeError);
195  if (ene.ecal_time)
196  ene.ecal_time = MiniFloatConverter::reduceMantissaToNbitsRounding<12>(ene.ecal_time);
197  if (ene.ecal_timeError)
198  ene.ecal_timeError = MiniFloatConverter::reduceMantissaToNbitsRounding<12>(ene.ecal_timeError);
199  ene.ecal_position = math::XYZPointF(MiniFloatConverter::reduceMantissaToNbitsRounding<14>(ene.ecal_position.X()),
200  MiniFloatConverter::reduceMantissaToNbitsRounding<14>(ene.ecal_position.Y()),
201  MiniFloatConverter::reduceMantissaToNbitsRounding<14>(ene.ecal_position.Z()));
202  ene.hcal_position = math::XYZPointF(MiniFloatConverter::reduceMantissaToNbitsRounding<12>(ene.hcal_position.X()),
203  MiniFloatConverter::reduceMantissaToNbitsRounding<12>(ene.hcal_position.Y()),
204  MiniFloatConverter::reduceMantissaToNbitsRounding<12>(ene.hcal_position.Z()));
205  mu.setCalEnergy(ene);
206  }
207  if (slimKinkVars_(mu) && mu.isQualityValid()) {
208  reco::MuonQuality qual = mu.combinedQuality();
209  qual.tkKink_position =
210  math::XYZPointF(MiniFloatConverter::reduceMantissaToNbitsRounding<12>(qual.tkKink_position.X()),
211  MiniFloatConverter::reduceMantissaToNbitsRounding<12>(qual.tkKink_position.Y()),
212  MiniFloatConverter::reduceMantissaToNbitsRounding<12>(qual.tkKink_position.Z()));
213  mu.setCombinedQuality(qual);
214  }
215  if (slimCaloMETCorr_(mu) && mu.caloMETMuonCorrs().type() != reco::MuonMETCorrectionData::NotUsed) {
216  reco::MuonMETCorrectionData corrs = mu.caloMETMuonCorrs();
217  corrs = reco::MuonMETCorrectionData(corrs.type(),
218  MiniFloatConverter::reduceMantissaToNbitsRounding<10>(corrs.corrX()),
219  MiniFloatConverter::reduceMantissaToNbitsRounding<10>(corrs.corrY()));
220  mu.embedCaloMETMuonCorrs(corrs);
221  }
222  if (slimMatches_(mu) && mu.isMatchesValid()) {
223  for (reco::MuonChamberMatch &cmatch : mu.matches()) {
224  cmatch.edgeX = MiniFloatConverter::reduceMantissaToNbitsRounding<12>(cmatch.edgeX);
225  cmatch.edgeY = MiniFloatConverter::reduceMantissaToNbitsRounding<12>(cmatch.edgeY);
226  cmatch.xErr = MiniFloatConverter::reduceMantissaToNbitsRounding<12>(cmatch.xErr);
227  cmatch.yErr = MiniFloatConverter::reduceMantissaToNbitsRounding<12>(cmatch.yErr);
228  cmatch.dXdZErr = MiniFloatConverter::reduceMantissaToNbitsRounding<12>(cmatch.dXdZErr);
229  cmatch.dYdZErr = MiniFloatConverter::reduceMantissaToNbitsRounding<12>(cmatch.dYdZErr);
230  for (reco::MuonSegmentMatch &smatch : cmatch.segmentMatches) {
231  smatch.xErr = MiniFloatConverter::reduceMantissaToNbitsRounding<12>(smatch.xErr);
232  smatch.yErr = MiniFloatConverter::reduceMantissaToNbitsRounding<12>(smatch.yErr);
233  smatch.dXdZErr = MiniFloatConverter::reduceMantissaToNbitsRounding<12>(smatch.dXdZErr);
234  smatch.dYdZErr = MiniFloatConverter::reduceMantissaToNbitsRounding<12>(smatch.dYdZErr);
235  if (saveSegments_ && segmentsMuonSelection_(mu)) {
236  if (smatch.dtSegmentRef.isNonnull())
237  dtSegmentsRefs.insert(smatch.dtSegmentRef);
238  if (smatch.cscSegmentRef.isNonnull())
239  cscSegmentsRefs.insert(smatch.cscSegmentRef);
240  }
241  }
242  }
243  }
244  // rekey TrackExtra references in embedded tracks
245  mu.rekeyEmbeddedTracks(trackExtraAssocs);
246  }
247 
248  if (saveSegments_) {
249  std::map<DTRecSegment4DRef, size_t> dtMap;
250  std::vector<DTRecSegment4D> outDTSegmentsTmp;
251  std::map<CSCSegmentRef, size_t> cscMap;
252  std::vector<CSCSegment> outCSCSegmentsTmp;
253  for (auto &seg : dtSegmentsRefs) {
254  dtMap[seg] = outDTSegments->size();
255  outDTSegmentsTmp.push_back(*seg);
256  }
257  for (auto &seg : cscSegmentsRefs) {
258  cscMap[seg] = outCSCSegments->size();
259  outCSCSegmentsTmp.push_back(*seg);
260  }
261  outDTSegments->put(DTChamberId(), outDTSegmentsTmp.begin(), outDTSegmentsTmp.end());
262  outCSCSegments->put(CSCDetId(), outCSCSegmentsTmp.begin(), outCSCSegmentsTmp.end());
263  auto dtHandle = iEvent.put(std::move(outDTSegments));
264  auto cscHandle = iEvent.put(std::move(outCSCSegments));
265  for (auto &mu : *out) {
266  if (mu.isMatchesValid()) {
267  for (reco::MuonChamberMatch &cmatch : mu.matches()) {
268  for (reco::MuonSegmentMatch &smatch : cmatch.segmentMatches) {
269  if (dtMap.find(smatch.dtSegmentRef) != dtMap.end())
270  smatch.dtSegmentRef = DTRecSegment4DRef(dtHandle, dtMap[smatch.dtSegmentRef]);
271  if (cscMap.find(smatch.cscSegmentRef) != cscMap.end())
272  smatch.cscSegmentRef = CSCSegmentRef(cscHandle, cscMap[smatch.cscSegmentRef]);
273  }
274  }
275  }
276  }
277  }
278 
279  iEvent.put(std::move(out));
280 }
281 
283 using namespace pat;
const edm::EDGetTokenT< pat::MuonCollection > src_
float ecal_timeError
Definition: MuonEnergy.h:48
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
DTRecSegment4DRef dtSegmentRef
const StringCutObjectSelector< pat::Muon > dropDirectionalIso_
const StringCutObjectSelector< pat::Muon > slimKinkVars_
Ptr< typename C::value_type > refToPtr(Ref< C, typename C::value_type, refhelper::FindUsingAdvance< C, typename C::value_type > > const &ref)
Definition: RefToPtr.h:18
PATMuonSlimmer(const edm::ParameterSet &iConfig)
CSCSegmentRef cscSegmentRef
const bool linkToPackedPF_
std::vector< edm::EDGetTokenT< reco::PFCandidateCollection > > pf_
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:238
const StringCutObjectSelector< pat::Muon > slimCaloVars_
ROOT::Math::PositionVector3D< ROOT::Math::Cartesian3D< float > > XYZPointF
point in space with cartesian internal representation
Definition: Point3D.h:10
std::unique_ptr< pat::ObjectModifier< pat::Muon > > muonModifier_
float towerS9
total energy in 3x3 tower shape
Definition: MuonEnergy.h:22
float ecal_time
Calorimeter timing.
Definition: MuonEnergy.h:47
Definition: HeavyIon.h:7
const StringCutObjectSelector< pat::Muon > segmentsMuonSelection_
int iEvent
Definition: GenABIO.cc:224
float emS25
energy deposited in 5x5 ECAL crystal shape around central crystal
Definition: MuonEnergy.h:30
edm::EDGetTokenT< edm::Association< pat::PackedCandidateCollection > > track2LostTrack_
~PATMuonSlimmer() override
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
math::XYZPointF hcal_position
Definition: MuonEnergy.h:54
Slimmer of PAT Muons.
float emMax
maximal energy of ECAL crystal in the 5x5 shape
Definition: MuonEnergy.h:32
const StringCutObjectSelector< pat::Muon > dropPfP4_
float hadMax
maximal energy of HCAL tower in the 3x3 shape
Definition: MuonEnergy.h:40
std::vector< edm::EDGetTokenT< edm::Association< reco::TrackExtraCollection > > > trackExtraAssocs_
const StringCutObjectSelector< pat::Muon > slimMatches_
std::vector< Muon > MuonCollection
Definition: Muon.h:35
void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
const bool linkToLostTrack_
Particle reconstructed by the particle flow algorithm.
Definition: PFCandidate.h:41
HLT enums.
std::vector< edm::EDGetTokenT< edm::Association< pat::PackedCandidateCollection > > > pf2pc_
float hcal_timeError
Definition: MuonEnergy.h:50
const StringCutObjectSelector< pat::Muon > saveTeVMuons_
const StringCutObjectSelector< pat::Muon > slimCaloMETCorr_
math::XYZPointF ecal_position
Trajectory position at the calorimeter.
Definition: MuonEnergy.h:53
math::XYZTLorentzVector LorentzVector
Lorentz vector.
Definition: Particle.h:21
Analysis-level muon class.
Definition: Muon.h:51
const bool saveSegments_
float hadS9
energy deposited in 3x3 HCAL tower shape around central tower
Definition: MuonEnergy.h:38
def move(src, dest)
Definition: eostools.py:511