CMS 3D CMS Logo

Phase2ITValidateCluster.cc
Go to the documentation of this file.
1 // -*- C++ -*-
3 // Package: Phase2ITValidateCluster
4 // Class: Phase2ITValidateCluster
5 //
11 //
12 // Author: Gabriel Ramirez, Suvankar Roy Chowdhury
13 // Date: May 23, 2020
14 //
15 #include <memory>
25 
33 
38 
43 
44 // DQM Histograming
48 
50 public:
51  typedef std::map<unsigned int, std::vector<PSimHit>> SimHitsMap;
52  typedef std::map<unsigned int, SimTrack> SimTracksMap;
53 
55  ~Phase2ITValidateCluster() override;
56  void bookHistograms(DQMStore::IBooker& ibooker, edm::Run const& iRun, edm::EventSetup const& iSetup) override;
57  void analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) override;
58  void dqmBeginRun(const edm::Run& iRun, const edm::EventSetup& iSetup) override;
59  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
60 
61 private:
62  struct ClusterMEs {
67  };
68 
69  void fillITHistos(const edm::Event& iEvent,
71  const std::map<unsigned int, SimTrack>& simTracks);
72  void bookLayerHistos(DQMStore::IBooker& ibooker, uint32_t det_it, const std::string& subdir);
73  std::vector<unsigned int> getSimTrackId(const edm::Handle<edm::DetSetVector<PixelDigiSimLink>>& pixelSimLinks,
74  const DetId& detId,
75  unsigned int channel);
76 
77  std::map<std::string, ClusterMEs> layerMEs_;
78 
81  std::vector<edm::EDGetTokenT<edm::PSimHitContainer>> simHitTokens_;
85  std::vector<edm::InputTag> pSimHitSrc_;
88  const TrackerGeometry* tkGeom_ = nullptr;
89  const TrackerTopology* tTopo_ = nullptr;
90 };
93 
94 //
95 // constructors
96 //
97 
99  : config_(iConfig),
100  simtrackminpt_(config_.getParameter<double>("SimTrackMinPt")),
101  simITLinksToken_(consumes<edm::DetSetVector<PixelDigiSimLink>>(
102  config_.getParameter<edm::InputTag>("InnerTrackerDigiSimLinkSource"))),
103  simTracksToken_(consumes<edm::SimTrackContainer>(config_.getParameter<edm::InputTag>("simtracks"))),
104  clustersToken_(
105  consumes<edmNew::DetSetVector<SiPixelCluster>>(config_.getParameter<edm::InputTag>("ClusterSource"))),
106  pSimHitSrc_(config_.getParameter<std::vector<edm::InputTag>>("PSimHitSource")),
108  topoToken_(esConsumes<TrackerTopology, TrackerTopologyRcd, edm::Transition::BeginRun>()) {
109  edm::LogInfo("Phase2ITValidateCluster") << ">>> Construct Phase2ITValidateCluster ";
110  for (const auto& itag : pSimHitSrc_)
111  simHitTokens_.push_back(consumes<edm::PSimHitContainer>(itag));
112 }
113 
115  // do anything here that needs to be done at desctruction time
116  // (e.g. close files, deallocate resources etc.)
117  edm::LogInfo("Phase2ITValidateCluster") << ">>> Destroy Phase2ITValidateCluster ";
118 }
119 //
120 // -- DQM Begin Run
121 //
123  tkGeom_ = &iSetup.getData(geomToken_);
124  tTopo_ = &iSetup.getData(topoToken_);
125 }
126 
127 // -- Analyze
128 //
130  // Getting simHits
131  std::vector<edm::Handle<edm::PSimHitContainer>> simHits;
132  for (const auto& itoken : simHitTokens_) {
133  const auto& simHitHandle = iEvent.getHandle(itoken);
134  if (!simHitHandle.isValid())
135  continue;
136  simHits.emplace_back(simHitHandle);
137  }
138  // Get the SimTracks
139  const auto& simTracksRaw = iEvent.getHandle(simTracksToken_);
140  // Rearrange the simTracks for ease of use <simTrackID, simTrack>
142  for (edm::SimTrackContainer::const_iterator simTrackIt(simTracksRaw->begin()); simTrackIt != simTracksRaw->end();
143  ++simTrackIt) {
144  if (simTrackIt->momentum().pt() > simtrackminpt_) {
145  simTracks.emplace(simTrackIt->trackId(), *simTrackIt);
146  }
147  }
149 }
150 
153  const std::map<unsigned int, SimTrack>& simTracks) {
154  // Getting the clusters
155  const auto& clusterHandle = iEvent.getHandle(clustersToken_);
156  // Getting PixelDigiSimLinks
157  const auto& pixelSimLinksHandle = iEvent.getHandle(simITLinksToken_);
158 
159  for (const auto& DSVItr : *clusterHandle) {
160  // Getting the id of detector unit
161  uint32_t rawid = DSVItr.detId();
162  DetId detId(rawid);
163  const GeomDetUnit* geomDetUnit(tkGeom_->idToDetUnit(detId));
164  if (!geomDetUnit)
165  continue;
166 
167  std::string folderkey = phase2tkutil::getITHistoId(detId, tTopo_);
168  for (const auto& clusterItr : DSVItr) {
169  MeasurementPoint mpCluster(clusterItr.x(), clusterItr.y());
170  Local3DPoint localPosCluster = geomDetUnit->topology().localPosition(mpCluster);
171  // Get simTracks from the cluster
172  std::vector<unsigned int> clusterSimTrackIds;
173  for (int irow = clusterItr.minPixelRow(); irow <= clusterItr.maxPixelRow(); ++irow) {
174  for (int icol = clusterItr.minPixelCol(); icol <= clusterItr.maxPixelCol(); ++icol) {
175  uint32_t channel = PixelChannelIdentifier::pixelToChannel(irow, icol);
176  std::vector<unsigned int> simTrackIds(getSimTrackId(pixelSimLinksHandle, detId, channel));
177  for (auto it : simTrackIds) {
178  bool add = true;
179  for (unsigned int j = 0; j < clusterSimTrackIds.size(); ++j) {
180  // only save simtrackids that are not present yet
181  if (it == clusterSimTrackIds.at(j))
182  add = false;
183  }
184  if (add)
185  clusterSimTrackIds.push_back(it);
186  }
187  }
188  }
189  std::sort(clusterSimTrackIds.begin(), clusterSimTrackIds.end());
190  const PSimHit* closestSimHit = nullptr;
191  float mind = 10000.;
192  // Get the SimHit
193  for (const auto& psimhitCont : simHits) {
194  for (const auto& simhitIt : *psimhitCont) {
195  if (rawid == simhitIt.detUnitId()) {
196  auto it = std::lower_bound(clusterSimTrackIds.begin(), clusterSimTrackIds.end(), simhitIt.trackId());
197  if (it != clusterSimTrackIds.end() && *it == simhitIt.trackId()) {
198  float dx = simhitIt.localPosition().x() - localPosCluster.x();
199  float dy = simhitIt.localPosition().y() - localPosCluster.y();
200  float dist = dx * dx + dy * dy;
201  if (!closestSimHit || dist < mind) {
202  mind = dist;
203  closestSimHit = &simhitIt;
204  }
205  }
206  }
207  } //end loop over PSimhitcontainers
208  } //end loop over simHits
209 
210  if (!closestSimHit)
211  continue;
212  // only look at simhits from highpT tracks
213  auto simTrackIt(simTracks.find(closestSimHit->trackId()));
214  if (simTrackIt == simTracks.end())
215  continue;
216  Local3DPoint localPosSimHit(closestSimHit->localPosition());
217  const double deltaX = phase2tkutil::cmtomicron * (localPosCluster.x() - localPosSimHit.x());
218  const double deltaY = phase2tkutil::cmtomicron * (localPosCluster.y() - localPosSimHit.y());
219 
220  auto layerMEIt = layerMEs_.find(folderkey);
221  if (layerMEIt == layerMEs_.end())
222  continue;
223 
224  ClusterMEs& local_mes = layerMEIt->second;
225  local_mes.deltaX_P->Fill(deltaX);
226  local_mes.deltaY_P->Fill(deltaY);
227  // Primary particles only
228  if (phase2tkutil::isPrimary(simTrackIt->second, closestSimHit)) {
229  local_mes.deltaX_P_primary->Fill(deltaX);
230  local_mes.deltaY_P_primary->Fill(deltaY);
231  }
232  }
233  }
234 }
235 
236 //
237 // -- Book Histograms
238 //
240  edm::Run const& iRun,
241  edm::EventSetup const& iSetup) {
242  std::string top_folder = config_.getParameter<std::string>("TopFolderName");
243  edm::LogInfo("Phase2ITValidateCluster") << " Booking Histograms in: " << top_folder;
244 
245  edm::ESWatcher<TrackerDigiGeometryRecord> theTkDigiGeomWatcher;
246  if (theTkDigiGeomWatcher.check(iSetup)) {
247  for (auto const& det_u : tkGeom_->detUnits()) {
248  //Always check TrackerNumberingBuilder before changing this part
249  if (!(det_u->subDetector() == GeomDetEnumerators::SubDetector::P2PXB ||
250  det_u->subDetector() == GeomDetEnumerators::SubDetector::P2PXEC))
251  continue; //continue if not Pixel
252  uint32_t detId_raw = det_u->geographicalId().rawId();
253  bookLayerHistos(ibooker, detId_raw, top_folder);
254  }
255  }
256 }
257 
261  if (folderName.empty()) {
262  edm::LogWarning("Phase2ITValidateCluster") << ">>>> Invalid histo_id ";
263  return;
264  }
265 
266  if (layerMEs_.find(folderName) == layerMEs_.end()) {
267  ibooker.cd();
268  ibooker.setCurrentFolder(subdir + '/' + folderName);
269  edm::LogInfo("Phase2TrackerValidateDigi") << " Booking Histograms in: " << subdir + '/' + folderName;
270  ClusterMEs local_mes;
271 
272  local_mes.deltaX_P =
274 
275  local_mes.deltaY_P =
277 
278  // Puting primary digis in a subfolder
279  ibooker.setCurrentFolder(subdir + '/' + folderName + "/PrimarySimHits");
280 
281  local_mes.deltaX_P_primary =
282  phase2tkutil::book1DFromPSet(config_.getParameter<edm::ParameterSet>("Delta_X_Pixel_Primary"), ibooker);
283 
284  local_mes.deltaY_P_primary =
285  phase2tkutil::book1DFromPSet(config_.getParameter<edm::ParameterSet>("Delta_Y_Pixel_Primary"), ibooker);
286  layerMEs_.emplace(folderName, local_mes);
287  }
288 }
289 
290 std::vector<unsigned int> Phase2ITValidateCluster::getSimTrackId(
291  const edm::Handle<edm::DetSetVector<PixelDigiSimLink>>& pixelSimLinks, const DetId& detId, unsigned int channel) {
292  std::vector<unsigned int> retvec;
293  edm::DetSetVector<PixelDigiSimLink>::const_iterator DSViter(pixelSimLinks->find(detId));
294  if (DSViter == pixelSimLinks->end())
295  return retvec;
296  for (edm::DetSet<PixelDigiSimLink>::const_iterator it = DSViter->data.begin(); it != DSViter->data.end(); ++it) {
297  if (channel == it->channel()) {
298  retvec.push_back(it->SimTrackId());
299  }
300  }
301  return retvec;
302 }
303 
306  //for macro-pixel sensors
307  {
309  psd0.add<std::string>("name", "Delta_X_Pixel");
310  psd0.add<std::string>("title", "#Delta X;Cluster resolution X coordinate [#mum]");
311  psd0.add<bool>("switch", true);
312  psd0.add<double>("xmax", 250.);
313  psd0.add<double>("xmin", -250.);
314  psd0.add<int>("NxBins", 100);
315  desc.add<edm::ParameterSetDescription>("Delta_X_Pixel", psd0);
316  }
317  {
319  psd0.add<std::string>("name", "Delta_Y_Pixel");
320  psd0.add<std::string>("title", "#Delta Y ;Cluster resolution Y coordinate [#mum]");
321  psd0.add<double>("xmin", -250.);
322  psd0.add<double>("xmax", 250.);
323  psd0.add<bool>("switch", true);
324  psd0.add<int>("NxBins", 100);
325  desc.add<edm::ParameterSetDescription>("Delta_Y_Pixel", psd0);
326  }
327  {
329  psd0.add<std::string>("name", "Delta_X_Pixel_Primary");
330  psd0.add<std::string>("title", "#Delta X ;cluster resolution X coordinate [#mum]");
331  psd0.add<double>("xmin", -250.);
332  psd0.add<double>("xmax", 250.);
333  psd0.add<bool>("switch", true);
334  psd0.add<int>("NxBins", 100);
335  desc.add<edm::ParameterSetDescription>("Delta_X_Pixel_Primary", psd0);
336  }
337  {
339  psd0.add<std::string>("name", "Delta_Y_Pixel_Primary");
340  psd0.add<std::string>("title", "#Delta Y ;cluster resolution Y coordinate [#mum]");
341  psd0.add<double>("xmin", -250.);
342  psd0.add<double>("xmax", 250.);
343  psd0.add<bool>("switch", true);
344  psd0.add<int>("NxBins", 100);
345  desc.add<edm::ParameterSetDescription>("Delta_Y_Pixel_Primary", psd0);
346  }
347 
348  desc.add<std::string>("TopFolderName", "TrackerPhase2ITClusterV");
349  desc.add<edm::InputTag>("ClusterSource", edm::InputTag("siPixelClusters"));
350  desc.add<edm::InputTag>("InnerTrackerDigiSimLinkSource", edm::InputTag("simSiPixelDigis", "Pixel"));
351  desc.add<edm::InputTag>("simtracks", edm::InputTag("g4SimHits"));
352  desc.add<double>("SimTrackMinPt", 0.0);
353  desc.add<std::vector<edm::InputTag>>("PSimHitSource",
354  {
355  edm::InputTag("g4SimHits:TrackerHitsPixelBarrelLowTof"),
356  edm::InputTag("g4SimHits:TrackerHitsPixelBarrelHighTof"),
357  edm::InputTag("g4SimHits:TrackerHitsPixelEndcapLowTof"),
358  edm::InputTag("g4SimHits:TrackerHitsPixelEndcapHighTof"),
359  });
360  descriptions.add("Phase2ITValidateCluster", desc);
361 }
std::map< std::string, ClusterMEs > layerMEs_
const TrackerGeometry * tkGeom_
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
std::vector< edm::InputTag > pSimHitSrc_
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
const TrackerTopology * tTopo_
bool isPrimary(const SimTrack &simTrk, const PSimHit *simHit)
void bookHistograms(DQMStore::IBooker &ibooker, edm::Run const &iRun, edm::EventSetup const &iSetup) override
std::vector< edm::EDGetTokenT< edm::PSimHitContainer > > simHitTokens_
edm::EDGetTokenT< edm::DetSetVector< PixelDigiSimLink > > simITLinksToken_
edm::EDGetTokenT< edm::SimTrackContainer > simTracksToken_
const DetContainer & detUnits() const override
Returm a vector of all GeomDet.
std::string getITHistoId(uint32_t det_id, const TrackerTopology *tTopo)
void Fill(long long x)
int iEvent
Definition: GenABIO.cc:224
std::map< unsigned int, std::vector< PSimHit > > SimHitsMap
const edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > geomToken_
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
std::vector< unsigned int > getSimTrackId(const edm::Handle< edm::DetSetVector< PixelDigiSimLink >> &pixelSimLinks, const DetId &detId, unsigned int channel)
void fillITHistos(const edm::Event &iEvent, const std::vector< edm::Handle< edm::PSimHitContainer >> &simHits, const std::map< unsigned int, SimTrack > &simTracks)
void add(std::string const &label, ParameterSetDescription const &psetDescription)
edm::EDGetTokenT< edmNew::DetSetVector< SiPixelCluster > > clustersToken_
void dqmBeginRun(const edm::Run &iRun, const edm::EventSetup &iSetup) override
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:57
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
const edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > topoToken_
Pixel cluster – collection of neighboring pixels above threshold.
void add(std::map< std::string, TH1 *> &h, TH1 *hist)
HLT enums.
std::map< unsigned int, SimTrack > SimTracksMap
static int pixelToChannel(int row, int col)
void bookLayerHistos(DQMStore::IBooker &ibooker, uint32_t det_it, const std::string &subdir)
Phase2ITValidateCluster(const edm::ParameterSet &)
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
std::vector< SimTrack > SimTrackContainer
Definition: Run.h:45
void analyze(const edm::Event &iEvent, const edm::EventSetup &iSetup) override