CMS 3D CMS Logo

AlignmentMonitorTemplate.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: CommonAlignmentProducer
4 // Class : AlignmentMonitorTemplate
5 //
6 // Implementation:
7 // <Notes on implementation>
8 //
9 // Original Author: Jim Pivarski
10 // Created: Thu Mar 29 13:59:56 CDT 2007
11 // $Id: AlignmentMonitorTemplate.cc,v 1.6 2010/02/25 00:27:56 wmtan Exp $
12 //
13 
14 // system include files
16 #include "TH1.h"
17 #include "TObject.h"
18 // #include "PluginManager/ModuleDef.h"
21 
22 // user include files
23 
24 //
25 // class definition
26 //
27 
29 public:
30  AlignmentMonitorTemplate(const edm::ParameterSet& cfg) : AlignmentMonitorBase(cfg, "AlignmentMonitorTemplate"){};
32 
33  void book() override;
34  void event(const edm::Event& iEvent,
35  const edm::EventSetup& iSetup,
36  const ConstTrajTrackPairCollection& iTrajTracks) override;
37  void afterAlignment() override;
38 
39 private:
41  std::map<Alignable*, TH1F*> m_residuals;
42 };
43 
44 //
45 // constants, enums and typedefs
46 //
47 
48 //
49 // static data member definitions
50 //
51 
52 //
53 // member functions
54 //
55 
57  m_hist = book1D("/", "hist", "hist", 10, 0.5, 10.5); // there's only one of these per job
58  m_ihist = book1D("/iterN/", "ihist", "ihist", 10, 0, 1); // there's a new one of these for each iteration
59  // "/iterN/" is a special directory name, in which the "N" gets replaced by the current iteration number.
60 
61  m_otherdir = book1D("/otherdir/", "hist", "this is a histogram in another directory", 10, 0.5, 10.5);
62  m_otherdir2 =
63  book1D("/iterN/otherdir/", "hist", "here's one in another directory inside the iterN directories", 10, 0.5, 10.5);
64 
65  // This is a procedure that makes one histogram for each selected alignable, and puts them in the iterN directory.
66  // This is not a constant-time lookup. If you need something faster, see AlignmentMonitorMuonHIP, which has a
67  // dynamically-allocated array of TH1F*s.
68  const auto& alignables = pStore()->alignables();
69  for (const auto& it : alignables) {
70  char name[256], title[256];
71  snprintf(name, sizeof(name), "xresid%d", it->geomDetId().rawId());
72  snprintf(title, sizeof(title), "x track-hit for DetId %d", it->geomDetId().rawId());
73 
74  m_residuals[it] = book1D("/iterN/", name, title, 100, -5., 5.);
75  }
76 
77  // Important: you create TObject pointers with the "new" operator, but YOU don't delete them. They're deleted by the
78  // base class, which knows when they are no longer needed (based on whether they are in the /iterN/ directory or not).
79 
80  // For more detail, see the twiki page:
81  // https://twiki.cern.ch/twiki/bin/view/CMS/SWGuideAlignmentMonitors for creating a plugin like this one
82  // https://twiki.cern.ch/twiki/bin/view/CMS/SWGuideAlignmentAlgorithms#Monitoring for configuring it
83 }
84 
86  const edm::EventSetup& iSetup,
88  m_hist->Fill(iteration()); // get the number of events per iteration
89  m_ihist->Fill(0.5); // get the number of events in this iteration in the central bin
90 
91  TrajectoryStateCombiner tsoscomb;
92 
93  // This is a procedure that loops over tracks/hits, calculates residuals, and fills the appropriate histogram.
94  for (ConstTrajTrackPairCollection::const_iterator it = tracks.begin(); it != tracks.end(); ++it) {
95  const Trajectory* traj = it->first;
96  // const reco::Track* track = it->second;
97  // If your tracks are refit using the producer in RecoTracker, you'll get updated reco::Track objects with
98  // each iteration, and it makes sense to make plots using these.
99  // If your tracks are refit using TrackingTools/TrackRefitter, only the Trajectories will be updated.
100  // We're working on that. I'll try to remember to change this comment when the update is ready.
101 
102  std::vector<TrajectoryMeasurement> measurements = traj->measurements();
103  for (std::vector<TrajectoryMeasurement>::const_iterator im = measurements.begin(); im != measurements.end(); ++im) {
104  const TrajectoryMeasurement meas = *im;
105  const TransientTrackingRecHit* hit = &(*meas.recHit());
106  const DetId id = hit->geographicalId();
107 
108  if (hit->isValid() && pNavigator()->detAndSubdetInMap(id)) {
109  // Combine the forward-propagated state with the backward-propagated state to get a minimally-biased residual.
110  // This is the same procedure that is used to calculate residuals in the HIP algorithm
112 
113  // Search for our histogram using the Alignable* -> TH1F* map
114  // The "alignable = alignable->mother()" part ascends the alignable tree, because hits are on the lowest-level
115  // while our histograms may be associated with higher-level Alignables.
116  Alignable* alignable = pNavigator()->alignableFromDetId(id);
117  std::map<Alignable*, TH1F*>::const_iterator search = m_residuals.find(alignable);
118  while (search == m_residuals.end() && (alignable = alignable->mother()))
119  search = m_residuals.find(alignable);
120 
121  if (search != m_residuals.end()) {
122  search->second->Fill(tsosc.localPosition().x() - hit->localPosition().x());
123  }
124  } // end if hit is valid
125  } // end loop over hits
126  } // end loop over tracks/trajectories
127 }
128 
130  m_otherdir->Fill(
131  iteration()); // this one will only get one fill per iteration, because it's called in afterAlignment()
132 }
133 
134 //
135 // constructors and destructor
136 //
137 
138 // AlignmentMonitorTemplate::AlignmentMonitorTemplate(const AlignmentMonitorTemplate& rhs)
139 // {
140 // // do actual copying here;
141 // }
142 
143 //
144 // assignment operators
145 //
146 // const AlignmentMonitorTemplate& AlignmentMonitorTemplate::operator=(const AlignmentMonitorTemplate& rhs)
147 // {
148 // //An exception safe implementation is
149 // AlignmentMonitorTemplate temp(rhs);
150 // swap(rhs);
151 //
152 // return *this;
153 // }
154 
155 //
156 // const member functions
157 //
158 
159 //
160 // static member functions
161 //
162 
163 //
164 // SEAL definitions
165 //
166 
167 //
168 // DEFINE_SEAL_PLUGIN(AlignmentMonitorPluginFactory, AlignmentMonitorTemplate, "AlignmentMonitorTemplate");
AlignableNavigator * pNavigator()
AlignmentParameterStore * pStore()
ConstRecHitPointer const & recHit() const
TSOS combine(const TSOS &pTsos1, const TSOS &pTsos2) const
std::vector< T >::const_iterator search(const cond::Time_t &val, const std::vector< T > &container)
Definition: IOVProxy.cc:315
std::map< Alignable *, TH1F * > m_residuals
AlignmentMonitorTemplate(const edm::ParameterSet &cfg)
DataContainer const & measurements() const
Definition: Trajectory.h:178
void event(const edm::Event &iEvent, const edm::EventSetup &iSetup, const ConstTrajTrackPairCollection &iTrajTracks) override
Called for each event (by "run()"): may be reimplemented.
int iEvent
Definition: GenABIO.cc:224
std::vector< ConstTrajTrackPair > ConstTrajTrackPairCollection
virtual LocalPoint localPosition() const =0
TH1F * book1D(std::string dir, std::string name, std::string title, int nchX, double lowX, double highX)
TrajectoryStateOnSurface const & forwardPredictedState() const
Access to forward predicted state (from fitter or builder)
Definition: DetId.h:17
bool isValid() const
void book() override
Book or retrieve histograms; MUST be reimplemented.
#define DEFINE_EDM_PLUGIN(factory, type, name)
DetId geographicalId() const
bool detAndSubdetInMap(const DetId &detid) const
Given a DetId, returns true if DetIds with this detector and subdetector id are in the map (not neces...
T x() const
Definition: PV3DBase.h:59
AlignableDetOrUnitPtr alignableFromDetId(const DetId &detid)
Returns AlignableDetOrUnitPtr corresponding to given DetId.
Alignable * mother() const
Return pointer to container alignable (if any)
Definition: Alignable.h:91
const align::Alignables & alignables(void) const
get all alignables
TrajectoryStateOnSurface const & backwardPredictedState() const
Access to backward predicted state (from smoother)