CMS 3D CMS Logo

Phase2OTValidateCluster.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //bookLayer
3 // Package: Phase2OTValidateCluster
4 // Class: Phase2OTValidateCluster
5 //
11 //
12 // Author: Gabriel Ramirez, Suvankar Roy Chowdhury
13 // Date: May 23, 2020
14 //
15 #include <memory>
26 
33 
38 
45 // DQM Histograming
49 
51 public:
52  typedef std::map<unsigned int, std::vector<PSimHit>> SimHitsMap;
53  typedef std::map<unsigned int, SimTrack> SimTracksMap;
54 
56  ~Phase2OTValidateCluster() override;
57  void bookHistograms(DQMStore::IBooker& ibooker, edm::Run const& iRun, edm::EventSetup const& iSetup) override;
58  void analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) override;
59  void dqmBeginRun(const edm::Run& iRun, const edm::EventSetup& iSetup) override;
60  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
61 
62 private:
63  struct ClusterMEs {
72  };
73 
74  void fillOTHistos(const edm::Event& iEvent,
76  const std::map<unsigned int, SimTrack>& simTracks);
77  void bookLayerHistos(DQMStore::IBooker& ibooker, uint32_t det_it, const std::string& subdir);
78  std::vector<unsigned int> getSimTrackId(const edm::Handle<edm::DetSetVector<PixelDigiSimLink>>& pixelSimLinks,
79  const DetId& detId,
80  unsigned int channel);
81 
82  std::map<std::string, ClusterMEs> layerMEs_;
83 
86  std::vector<edm::EDGetTokenT<edm::PSimHitContainer>> simHitTokens_;
91  std::vector<edm::InputTag> pSimHitSrc_;
94  const TrackerGeometry* tkGeom_ = nullptr;
95  const TrackerTopology* tTopo_ = nullptr;
96 };
99 //
100 // constructors
101 //
103  : config_(iConfig),
104  simtrackminpt_(config_.getParameter<double>("SimTrackMinPt")),
105  simOTLinksToken_(consumes<edm::DetSetVector<PixelDigiSimLink>>(
106  config_.getParameter<edm::InputTag>("OuterTrackerDigiSimLinkSource"))),
107  simTracksToken_(consumes<edm::SimTrackContainer>(config_.getParameter<edm::InputTag>("simtracks"))),
108  clustersToken_(
109  consumes<Phase2TrackerCluster1DCollectionNew>(config_.getParameter<edm::InputTag>("ClusterSource"))),
110  pSimHitSrc_(config_.getParameter<std::vector<edm::InputTag>>("PSimHitSource")),
112  topoToken_(esConsumes<TrackerTopology, TrackerTopologyRcd, edm::Transition::BeginRun>()) {
113  edm::LogInfo("Phase2OTValidateCluster") << ">>> Construct Phase2OTValidateCluster ";
114  for (const auto& itag : pSimHitSrc_)
115  simHitTokens_.push_back(consumes<edm::PSimHitContainer>(itag));
116 }
117 
119  // do anything here that needs to be done at desctruction time
120  // (e.g. close files, deallocate resources etc.)
121  edm::LogInfo("Phase2OTValidateCluster") << ">>> Destroy Phase2OTValidateCluster ";
122 }
123 //
124 // -- DQM Begin Run
125 //
127  tkGeom_ = &iSetup.getData(geomToken_);
128  tTopo_ = &iSetup.getData(topoToken_);
129 }
130 
131 // -- Analyze
132 //
134  // Getting simHits
135  std::vector<edm::Handle<edm::PSimHitContainer>> simHits;
136  for (const auto& itoken : simHitTokens_) {
137  const auto& simHitHandle = iEvent.getHandle(itoken);
138  if (!simHitHandle.isValid())
139  continue;
140  simHits.emplace_back(simHitHandle);
141  }
142  // Get the SimTracks
143  const auto& simTracksRaw = iEvent.getHandle(simTracksToken_);
144  // Rearrange the simTracks for ease of use <simTrackID, simTrack>
146  for (edm::SimTrackContainer::const_iterator simTrackIt(simTracksRaw->begin()); simTrackIt != simTracksRaw->end();
147  ++simTrackIt) {
148  if (simTrackIt->momentum().pt() > simtrackminpt_) {
149  simTracks.emplace(simTrackIt->trackId(), *simTrackIt);
150  }
151  }
153 }
154 
157  const std::map<unsigned int, SimTrack>& simTracks) {
158  // Getting the clusters
159  const auto& clusterHandle = iEvent.getHandle(clustersToken_);
160  // Getting PixelDigiSimLinks
161  const auto& pixelSimLinksHandle = iEvent.getHandle(simOTLinksToken_);
162 
163  // Number of clusters
164  std::map<std::string, unsigned int> nPrimarySimHits[3];
165  std::map<std::string, unsigned int> nOtherSimHits[3];
166  for (const auto& DSVItr : *clusterHandle) {
167  // Getting the id of detector unit
168  uint32_t rawid = DSVItr.detId();
169  DetId detId(rawid);
170  const GeomDetUnit* geomDetUnit(tkGeom_->idToDetUnit(detId));
171  if (!geomDetUnit)
172  continue;
174 
175  std::string folderkey = phase2tkutil::getOTHistoId(detId, tTopo_);
176  for (const auto& clusterItr : DSVItr) {
177  MeasurementPoint mpCluster(clusterItr.center(), clusterItr.column() + 0.5);
178  Local3DPoint localPosCluster = geomDetUnit->topology().localPosition(mpCluster);
179 
180  // Get simTracks from the cluster
181  std::vector<unsigned int> clusterSimTrackIds;
182  for (unsigned int i(0); i < clusterItr.size(); ++i) {
183  unsigned int channel(Phase2TrackerDigi::pixelToChannel(clusterItr.firstRow() + i, clusterItr.column()));
184  std::vector<unsigned int> simTrackIds(getSimTrackId(pixelSimLinksHandle, detId, channel));
185  for (auto it : simTrackIds) {
186  bool add = true;
187  for (unsigned int j = 0; j < clusterSimTrackIds.size(); ++j) {
188  // only save simtrackids that are not present yet
189  if (it == clusterSimTrackIds.at(j))
190  add = false;
191  }
192  if (add)
193  clusterSimTrackIds.push_back(it);
194  }
195  }
196  std::sort(clusterSimTrackIds.begin(), clusterSimTrackIds.end());
197  const PSimHit* closestSimHit = nullptr;
198  float mind = 1e4;
199  // Get the SimHit
200  for (const auto& psimhitCont : simHits) {
201  for (const auto& simhitIt : *psimhitCont) {
202  if (rawid == simhitIt.detUnitId()) {
203  auto it = std::lower_bound(clusterSimTrackIds.begin(), clusterSimTrackIds.end(), simhitIt.trackId());
204  if (it != clusterSimTrackIds.end() && *it == simhitIt.trackId()) {
205  float dx = simhitIt.localPosition().x() - localPosCluster.x();
206  float dy = simhitIt.localPosition().y() - localPosCluster.y();
207  float dist = dx * dx + dy * dy;
208  if (!closestSimHit || dist < mind) {
209  mind = dist;
210  closestSimHit = &simhitIt;
211  }
212  }
213  }
214  } //end loop over PSimhitcontainers
215  } //end loop over simHits
216 
217  if (!closestSimHit)
218  continue;
219  // only look at simhits from highpT tracks
220  auto simTrackIt(simTracks.find(closestSimHit->trackId()));
221  if (simTrackIt == simTracks.end())
222  continue;
223 
224  Local3DPoint localPosSimHit(closestSimHit->localPosition());
225  const float deltaX = localPosCluster.x() - localPosSimHit.x();
226  const float deltaY = localPosCluster.y() - localPosSimHit.y();
227 
228  auto layerMEit = layerMEs_.find(folderkey);
229  if (layerMEit == layerMEs_.end())
230  continue;
231 
232  ClusterMEs& local_mes = layerMEit->second;
234  local_mes.deltaX_P->Fill(phase2tkutil::cmtomicron * deltaX);
235  local_mes.deltaY_P->Fill(phase2tkutil::cmtomicron * deltaY);
237  local_mes.deltaX_S->Fill(phase2tkutil::cmtomicron * deltaX);
238  local_mes.deltaY_S->Fill(deltaY);
239  }
240  // Primary particles only
241  if (phase2tkutil::isPrimary(simTrackIt->second, closestSimHit)) {
243  local_mes.deltaX_P_primary->Fill(phase2tkutil::cmtomicron * deltaX);
244  local_mes.deltaY_P_primary->Fill(phase2tkutil::cmtomicron * deltaY);
246  local_mes.deltaX_S_primary->Fill(phase2tkutil::cmtomicron * deltaX);
247  local_mes.deltaY_S_primary->Fill(deltaY);
248  }
249  }
250  }
251  }
252 }
253 
254 //
255 // -- Book Histograms
256 //
258  edm::Run const& iRun,
259  edm::EventSetup const& iSetup) {
260  std::string top_folder = config_.getParameter<std::string>("TopFolderName");
261  edm::LogInfo("Phase2OTValidateCluster") << " Booking Histograms in: " << top_folder;
262 
263  edm::ESWatcher<TrackerDigiGeometryRecord> theTkDigiGeomWatcher;
264  if (theTkDigiGeomWatcher.check(iSetup)) {
265  for (auto const& det_u : tkGeom_->detUnits()) {
266  //Always check TrackerNumberingBuilder before changing this part
267  if ((det_u->subDetector() == GeomDetEnumerators::SubDetector::P2PXB ||
268  det_u->subDetector() == GeomDetEnumerators::SubDetector::P2PXEC))
269  continue; //continue if Pixel
270  uint32_t detId_raw = det_u->geographicalId().rawId();
271  bookLayerHistos(ibooker, detId_raw, top_folder);
272  }
273  }
274 }
275 
279  if (folderName.empty()) {
280  edm::LogWarning("Phase2OTValidateCluster") << ">>>> Invalid histo_id ";
281  return;
282  }
283 
284  if (layerMEs_.find(folderName) == layerMEs_.end()) {
285  ibooker.cd();
286  edm::LogInfo("Phase2TrackerValidateDigi") << " Booking Histograms in: " << subdir + '/' + folderName;
287  ClusterMEs local_mes;
289  ibooker.setCurrentFolder(subdir + '/' + folderName);
290 
291  local_mes.deltaX_P =
293 
294  local_mes.deltaY_P =
296 
297  // Puting primary digis in a subfolder
298  ibooker.setCurrentFolder(subdir + '/' + folderName + "/PrimarySimHits");
299 
300  local_mes.deltaX_P_primary =
301  phase2tkutil::book1DFromPSet(config_.getParameter<edm::ParameterSet>("Delta_X_Pixel_Primary"), ibooker);
302 
303  local_mes.deltaY_P_primary =
304  phase2tkutil::book1DFromPSet(config_.getParameter<edm::ParameterSet>("Delta_Y_Pixel_Primary"), ibooker);
305  }
306  ibooker.setCurrentFolder(subdir + '/' + folderName);
307 
308  local_mes.deltaX_S =
310 
311  local_mes.deltaY_S =
313 
314  // Puting primary digis in a subfolder
315  ibooker.setCurrentFolder(subdir + '/' + folderName + "/PrimarySimHits");
316 
317  local_mes.deltaX_S_primary =
318  phase2tkutil::book1DFromPSet(config_.getParameter<edm::ParameterSet>("Delta_X_Strip_Primary"), ibooker);
319 
320  local_mes.deltaY_S_primary =
321  phase2tkutil::book1DFromPSet(config_.getParameter<edm::ParameterSet>("Delta_Y_Strip_Primary"), ibooker);
322 
323  layerMEs_.emplace(folderName, local_mes);
324  }
325 }
326 
327 std::vector<unsigned int> Phase2OTValidateCluster::getSimTrackId(
328  const edm::Handle<edm::DetSetVector<PixelDigiSimLink>>& pixelSimLinks, const DetId& detId, unsigned int channel) {
329  std::vector<unsigned int> retvec;
330  edm::DetSetVector<PixelDigiSimLink>::const_iterator DSViter(pixelSimLinks->find(detId));
331  if (DSViter == pixelSimLinks->end())
332  return retvec;
333  for (edm::DetSet<PixelDigiSimLink>::const_iterator it = DSViter->data.begin(); it != DSViter->data.end(); ++it) {
334  if (channel == it->channel()) {
335  retvec.push_back(it->SimTrackId());
336  }
337  }
338  return retvec;
339 }
340 
343  //for macro-pixel sensors
344  std::string mptag = "macro-pixel sensor";
345  std::string striptag = "strip sensor";
346  {
348  psd0.add<std::string>("name", "Delta_X_Pixel");
349  psd0.add<std::string>("title", "#Delta X " + mptag + ";Cluster resolution X coordinate [#mum]");
350  psd0.add<bool>("switch", true);
351  psd0.add<double>("xmax", 250);
352  psd0.add<double>("xmin", -250);
353  psd0.add<int>("NxBins", 100);
354  desc.add<edm::ParameterSetDescription>("Delta_X_Pixel", psd0);
355  }
356  {
358  psd0.add<std::string>("name", "Delta_Y_Pixel");
359  psd0.add<std::string>("title", "#Delta Y " + mptag + ";Cluster resolution Y coordinate [#mum]");
360  psd0.add<bool>("switch", true);
361  psd0.add<double>("xmin", -1500);
362  psd0.add<double>("xmax", 1500);
363  psd0.add<int>("NxBins", 100);
364  desc.add<edm::ParameterSetDescription>("Delta_Y_Pixel", psd0);
365  }
366  {
368  psd0.add<std::string>("name", "Delta_X_Pixel_Primary");
369  psd0.add<std::string>("title", "#Delta X " + mptag + ";cluster resolution X coordinate [#mum]");
370  psd0.add<bool>("switch", true);
371  psd0.add<double>("xmin", -250);
372  psd0.add<double>("xmax", 250);
373  psd0.add<int>("NxBins", 100);
374  desc.add<edm::ParameterSetDescription>("Delta_X_Pixel_Primary", psd0);
375  }
376  {
378  psd0.add<std::string>("name", "Delta_Y_Pixel_Primary");
379  psd0.add<std::string>("title", "#Delta Y " + mptag + ";cluster resolution Y coordinate [#mum]");
380  psd0.add<bool>("switch", true);
381  psd0.add<double>("xmin", -1500);
382  psd0.add<double>("xmax", 1500);
383  psd0.add<int>("NxBins", 100);
384  desc.add<edm::ParameterSetDescription>("Delta_Y_Pixel_Primary", psd0);
385  }
386 
387  //strip sensors
388  {
390  psd0.add<std::string>("name", "Delta_X_Strip");
391  psd0.add<std::string>("title", "#Delta X " + striptag + ";Cluster resolution X coordinate [#mum]");
392  psd0.add<bool>("switch", true);
393  psd0.add<double>("xmin", -250);
394  psd0.add<double>("xmax", 250);
395  psd0.add<int>("NxBins", 100);
396  desc.add<edm::ParameterSetDescription>("Delta_X_Strip", psd0);
397  }
398  {
400  psd0.add<std::string>("name", "Delta_Y_Strip");
401  psd0.add<std::string>("title", "#Delta Y " + striptag + ";Cluster resolution Y coordinate [cm]");
402  psd0.add<double>("xmin", -5.0);
403  psd0.add<bool>("switch", true);
404  psd0.add<double>("xmax", 5.0);
405  psd0.add<int>("NxBins", 100);
406  desc.add<edm::ParameterSetDescription>("Delta_Y_Strip", psd0);
407  }
408  {
410  psd0.add<std::string>("name", "Delta_X_Strip_Primary");
411  psd0.add<std::string>("title", "#Delta X " + striptag + ";Cluster resolution X coordinate [#mum]");
412  psd0.add<bool>("switch", true);
413  psd0.add<double>("xmin", -250);
414  psd0.add<double>("xmax", 250);
415  psd0.add<int>("NxBins", 100);
416  desc.add<edm::ParameterSetDescription>("Delta_X_Strip_Primary", psd0);
417  }
418  {
420  psd0.add<std::string>("name", "Delta_Y_Strip_Primary");
421  psd0.add<std::string>("title", "#Delta Y " + striptag + ";Cluster resolution Y coordinate [cm]");
422  psd0.add<double>("xmin", -5.0);
423  psd0.add<bool>("switch", true);
424  psd0.add<double>("xmax", 5.0);
425  psd0.add<int>("NxBins", 100);
426  desc.add<edm::ParameterSetDescription>("Delta_Y_Strip_Primary", psd0);
427  }
428  desc.add<std::string>("TopFolderName", "TrackerPhase2OTClusterV");
429  desc.add<edm::InputTag>("ClusterSource", edm::InputTag("siPhase2Clusters"));
430  desc.add<edm::InputTag>("OuterTrackerDigiSimLinkSource", edm::InputTag("simSiPixelDigis", "Tracker"));
431  desc.add<edm::InputTag>("simtracks", edm::InputTag("g4SimHits"));
432  desc.add<double>("SimTrackMinPt", 0.0);
433  desc.add<std::vector<edm::InputTag>>("PSimHitSource",
434  {
435  edm::InputTag("g4SimHits:TrackerHitsTIBLowTof"),
436  edm::InputTag("g4SimHits:TrackerHitsTIBHighTof"),
437  edm::InputTag("g4SimHits:TrackerHitsTIDLowTof"),
438  edm::InputTag("g4SimHits:TrackerHitsTIDHighTof"),
439  edm::InputTag("g4SimHits:TrackerHitsTOBLowTof"),
440  edm::InputTag("g4SimHits:TrackerHitsTOBHighTof"),
441  edm::InputTag("g4SimHits:TrackerHitsTECLowTof"),
442  edm::InputTag("g4SimHits:TrackerHitsTECHighTof"),
443  edm::InputTag("g4SimHits:TrackerHitsPixelBarrelLowTof"),
444  edm::InputTag("g4SimHits:TrackerHitsPixelBarrelHighTof"),
445  edm::InputTag("g4SimHits:TrackerHitsPixelEndcapLowTof"),
446  edm::InputTag("g4SimHits:TrackerHitsPixelEndcapHighTof"),
447  });
448  descriptions.add("Phase2OTValidateCluster", desc);
449 }
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
std::map< unsigned int, std::vector< PSimHit > > SimHitsMap
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
const TrackerGeomDet * idToDetUnit(DetId) const override
Return the pointer to the GeomDetUnit corresponding to a given DetId.
static constexpr float cmtomicron
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:36
bool isPrimary(const SimTrack &simTrk, const PSimHit *simHit)
Phase2OTValidateCluster(const edm::ParameterSet &)
std::map< unsigned int, SimTrack > SimTracksMap
edm::EDGetTokenT< edm::SimTrackContainer > simTracksToken_
const DetContainer & detUnits() const override
Returm a vector of all GeomDet.
std::vector< edm::InputTag > pSimHitSrc_
void bookHistograms(DQMStore::IBooker &ibooker, edm::Run const &iRun, edm::EventSetup const &iSetup) override
const TrackerGeometry * tkGeom_
edm::EDGetTokenT< edm::DetSetVector< PixelDigiSimLink > > simOTLinksToken_
void Fill(long long x)
const edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > topoToken_
T x() const
Definition: PV3DBase.h:59
T y() const
Definition: PV3DBase.h:60
void fillOTHistos(const edm::Event &iEvent, const std::vector< edm::Handle< edm::PSimHitContainer >> &simHits, const std::map< unsigned int, SimTrack > &simTracks)
int iEvent
Definition: GenABIO.cc:224
const TrackerTopology * tTopo_
std::string getOTHistoId(uint32_t det_id, const TrackerTopology *tTopo)
void bookLayerHistos(DQMStore::IBooker &ibooker, uint32_t det_it, const std::string &subdir)
ModuleType getDetectorType(DetId) const
static PackedDigiType pixelToChannel(unsigned int row, unsigned int col)
void dqmBeginRun(const edm::Run &iRun, const edm::EventSetup &iSetup) override
Transition
Definition: Transition.h:12
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
bool getData(T &iHolder) const
Definition: EventSetup.h:122
ParameterDescriptionBase * add(U const &iLabel, T const &value)
MonitorElement * book1DFromPSet(const edm::ParameterSet &hpars, DQMStore::IBooker &ibooker)
Log< level::Info, false > LogInfo
Definition: DetId.h:17
const edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > geomToken_
std::map< std::string, ClusterMEs > layerMEs_
void add(std::string const &label, ParameterSetDescription const &psetDescription)
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:57
void add(std::map< std::string, TH1 *> &h, TH1 *hist)
HLT enums.
std::vector< edm::EDGetTokenT< edm::PSimHitContainer > > simHitTokens_
void analyze(const edm::Event &iEvent, const edm::EventSetup &iSetup) override
edm::EDGetTokenT< Phase2TrackerCluster1DCollectionNew > clustersToken_
std::vector< unsigned int > getSimTrackId(const edm::Handle< edm::DetSetVector< PixelDigiSimLink >> &pixelSimLinks, const DetId &detId, unsigned int channel)
Log< level::Warning, false > LogWarning
collection_type::const_iterator const_iterator
Definition: DetSet.h:31
collection_type::const_iterator const_iterator
Definition: DetSetVector.h:102
edm::EDGetTokenT< edm::DetSetVector< PixelDigiSimLink > > simITLinksToken_
std::vector< SimTrack > SimTrackContainer
Definition: Run.h:45