CMS 3D CMS Logo

AlignmentMuonHIPTrajectorySelector.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: AlignmentMuonHIPTrajectorySelector
4 // Class: AlignmentMuonHIPTrajectorySelector
5 //
13 //
14 // Original Author: Jim Pivarski
15 // Created: Wed Feb 20 10:56:46 CST 2008
16 // $Id: AlignmentMuonHIPTrajectorySelector.cc,v 1.4 2010/01/06 15:26:10 mussgill Exp $
17 //
18 //
19 
20 
21 // system include files
22 #include <memory>
23 #include <map>
24 #include <fstream>
25 
26 // user include files
35 
49 #include "TH1F.h"
50 
51 //
52 // class decleration
53 //
54 
56  public:
59 
60  private:
61  void produce(edm::Event&, const edm::EventSetup&) override;
62 
63  // ---------- member data --------------------------------
65  double m_minPt;
69 
70  bool m_hists;
73 };
74 
75 //
76 // constants, enums and typedefs
77 //
78 
79 
80 //
81 // static data member definitions
82 //
83 
84 //
85 // constructors and destructor
86 //
88  : m_input(iConfig.getParameter<edm::InputTag>("input"))
89  , m_minPt(iConfig.getParameter<double>("minPt"))
90  , m_maxTrackerForwardRedChi2(iConfig.getParameter<double>("maxTrackerForwardRedChi2"))
91  , m_minTrackerDOF(iConfig.getParameter<int>("minTrackerDOF"))
92  , m_maxMuonResidual(iConfig.getParameter<double>("maxMuonResidual"))
93  , m_hists(iConfig.getParameter<bool>("hists"))
95 {
96  produces<TrajTrackAssociationCollection>();
97 
98  if (m_hists) {
100  m_pt = fs->make<TH1F>("pt", "Transverse momentum (GeV)", 100, 0., 100.);
101  m_tracker_forwardredchi2 = fs->make<TH1F>("trackerForwardRedChi2", "forward-biased reduced chi2 in tracker", 100, 0., 5.);
102  m_tracker_dof = fs->make<TH1F>("trackerDOF", "DOF in tracker", 61, -0.5, 60.5);
103  m_resid_before = fs->make<TH1F>("residBefore", "muon residuals before cut (cm)", 100, -20, 20);
104  m_resid_after = fs->make<TH1F>("residAfter", "muon residuals after cut (cm)", 100, -20, 20);
105  }
106 }
107 
108 
110 
111 
112 //
113 // member functions
114 //
115 
116 // ------------ method called to produce the data ------------
117 void
119 {
120  // input
121  edm::Handle<TrajTrackAssociationCollection> originalTrajTrackMap;
122  iEvent.getByLabel(m_input, originalTrajTrackMap);
123 
124  // output
125  auto newTrajTrackMap = std::make_unique<TrajTrackAssociationCollection>();
126 
127  TrajectoryStateCombiner tsoscomb;
128 
129  for (TrajTrackAssociationCollection::const_iterator iPair = originalTrajTrackMap->begin(); iPair != originalTrajTrackMap->end(); ++iPair) {
130  if (m_hists) {
131  m_pt->Fill((*(*iPair).val).pt());
132  }
133 
134  if ((*(*iPair).val).pt() > m_minPt) {
135 
136  std::vector<TrajectoryMeasurement> measurements = (*(*iPair).key).measurements();
137 
138  bool has_bad_residual = false;
139 
140  double tracker_forwardchi2 = 0.;
141  double tracker_dof = 0.;
142  for (std::vector<TrajectoryMeasurement>::const_iterator im = measurements.begin(); im != measurements.end(); ++im) {
143  const TrajectoryMeasurement meas = *im;
144  auto hit = &(*meas.recHit());
145  const DetId id = hit->geographicalId();
146 
147  if (hit->isValid() && id.det() == DetId::Tracker) {
148  if (hit->dimension() == 1) {
149  double residual = meas.forwardPredictedState().localPosition().x() - hit->localPosition().x();
150  double error2 = meas.forwardPredictedState().localError().positionError().xx() + hit->localPositionError().xx();
151 
152  tracker_forwardchi2 += residual * residual / error2;
153  tracker_dof += 1.;
154  }
155  else if (hit->dimension() == 2) {
156  double residualx = meas.forwardPredictedState().localPosition().x() - hit->localPosition().x();
157  double residualy = meas.forwardPredictedState().localPosition().y() - hit->localPosition().y();
158  double errorxx2 = meas.forwardPredictedState().localError().positionError().xx() + hit->localPositionError().xx();
159  double errorxy2 = meas.forwardPredictedState().localError().positionError().xy() + hit->localPositionError().xy();
160  double erroryy2 = meas.forwardPredictedState().localError().positionError().yy() + hit->localPositionError().yy();
161 
162  tracker_forwardchi2 += (residualx * residualx + residualy * residualy) / (errorxx2 + 2.*errorxy2 + erroryy2);
163  tracker_dof += 2.;
164  }
165  } // end if a tracker hit
166 
167  if (hit->isValid() && id.det() == DetId::Muon && (id.subdetId() == MuonSubdetId::DT || id.subdetId() == MuonSubdetId::CSC)) {
168  TrajectoryStateOnSurface tsosc = tsoscomb.combine(meas.forwardPredictedState(), meas.backwardPredictedState());
169  double residual = tsosc.localPosition().x() - hit->localPosition().x();
170  m_resid_before->Fill(residual);
171  if (fabs(residual) > m_maxMuonResidual) {
172  has_bad_residual = true;
173  }
174  } // end if a muon hit
175 
176  }
177  tracker_dof -= 5.;
178  double tracker_forwardredchi2 = tracker_forwardchi2 / tracker_dof;
179 
180  if (m_hists) {
181  m_tracker_forwardredchi2->Fill(tracker_forwardredchi2);
182  m_tracker_dof->Fill(tracker_dof);
183 
184  for (std::vector<TrajectoryMeasurement>::const_iterator im = measurements.begin(); im != measurements.end(); ++im) {
185  const TrajectoryMeasurement meas = *im;
186  auto hit = &(*meas.recHit());
187  const DetId id = hit->geographicalId();
188 
189  if (!has_bad_residual) {
190  if (hit->isValid() && id.det() == DetId::Muon && (id.subdetId() == MuonSubdetId::DT || id.subdetId() == MuonSubdetId::CSC)) {
191  TrajectoryStateOnSurface tsosc = tsoscomb.combine(meas.forwardPredictedState(), meas.backwardPredictedState());
192  double residual = tsosc.localPosition().x() - hit->localPosition().x();
193  m_resid_after->Fill(residual);
194  }
195  } // end if residuals pass cut
196  } // end second loop over hits
197  } // end if filling histograms
198 
199  if (tracker_forwardredchi2 < m_maxTrackerForwardRedChi2 && tracker_dof >= m_minTrackerDOF && !has_bad_residual) {
200  newTrajTrackMap->insert((*iPair).key, (*iPair).val);
201  } // end if passes tracker cuts
202  } // end if passes pT cut
203  } // end loop over original trajTrackMap
204 
205  // put it in the Event
206  iEvent.put(std::move(newTrajTrackMap));
207 }
208 
209 //define this as a plug-in
float xx() const
Definition: LocalError.h:24
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:137
ConstRecHitPointer const & recHit() const
const_iterator end() const
last iterator over the map (read only)
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
T y() const
Definition: PV3DBase.h:63
T * make(const Args &...args) const
make new ROOT object
Definition: TFileService.h:64
#define nullptr
LocalError positionError() const
float xy() const
Definition: LocalError.h:25
int iEvent
Definition: GenABIO.cc:230
static const int CSC
Definition: MuonSubdetId.h:13
float yy() const
Definition: LocalError.h:26
const LocalTrajectoryError & localError() const
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:535
TrajectoryStateOnSurface const & forwardPredictedState() const
Access to forward predicted state (from fitter or builder)
Definition: DetId.h:18
void produce(edm::Event &, const edm::EventSetup &) override
HLT enums.
static const int DT
Definition: MuonSubdetId.h:12
const_iterator begin() const
first iterator over the map (read only)
T x() const
Definition: PV3DBase.h:62
def move(src, dest)
Definition: eostools.py:511
TrajectoryStateOnSurface const & backwardPredictedState() const
Access to backward predicted state (from smoother)