CMS 3D CMS Logo

MeasurementTrackerEventProducer.cc
Go to the documentation of this file.
2 
7 
14 
15 #include <algorithm>
16 
18  measurementTrackerLabel_(iConfig.getParameter<std::string>("measurementTracker")),
19  switchOffPixelsIfEmpty_(iConfig.getParameter<bool>("switchOffPixelsIfEmpty"))
20 {
21  std::vector<edm::InputTag> inactivePixelDetectorTags(iConfig.getParameter<std::vector<edm::InputTag> >("inactivePixelDetectorLabels"));
22  for (auto &t : inactivePixelDetectorTags) theInactivePixelDetectorLabels.push_back(consumes<DetIdCollection>(t));
23 
24  std::vector<edm::InputTag> badPixelFEDChannelCollectionTags = iConfig.getParameter<std::vector<edm::InputTag> >("badPixelFEDChannelCollectionLabels");
25  if (!badPixelFEDChannelCollectionTags.empty()) {
26  for (auto &t : badPixelFEDChannelCollectionTags) theBadPixelFEDChannelsLabels.push_back(consumes<PixelFEDChannelCollection>(t));
27  pixelCablingMapLabel_ = iConfig.getParameter<std::string> ("pixelCablingMapLabel");
28  }
29 
30  std::vector<edm::InputTag> inactiveStripDetectorTags(iConfig.getParameter<std::vector<edm::InputTag> >("inactiveStripDetectorLabels"));
31  for (auto &t : inactiveStripDetectorTags) theInactiveStripDetectorLabels.push_back(consumes<DetIdCollection>(t));
32 
33  //the measurement tracking is set to skip clusters, the other option is set from outside
34  edm::InputTag skip=iConfig.getParameter<edm::InputTag>("skipClusters");
35  selfUpdateSkipClusters_ = !( skip==edm::InputTag("") );
36  LogDebug("MeasurementTracker")<<"skipping clusters: "<<selfUpdateSkipClusters_;
37  isPhase2 = false;
38 
39  if (iConfig.getParameter<std::string>("stripClusterProducer") != "") {
40  theStripClusterLabel = consumes<edmNew::DetSetVector<SiStripCluster> >(edm::InputTag(iConfig.getParameter<std::string>("stripClusterProducer")));
41  if (selfUpdateSkipClusters_) theStripClusterMask = consumes<edm::ContainerMask<edmNew::DetSetVector<SiStripCluster>>>(iConfig.getParameter<edm::InputTag>("skipClusters"));
42  }
43  if (iConfig.getParameter<std::string>("pixelClusterProducer") != "") {
44  thePixelClusterLabel = consumes<edmNew::DetSetVector<SiPixelCluster> >(edm::InputTag(iConfig.getParameter<std::string>("pixelClusterProducer")));
45  if (selfUpdateSkipClusters_) thePixelClusterMask = consumes<edm::ContainerMask<edmNew::DetSetVector<SiPixelCluster>>>(iConfig.getParameter<edm::InputTag>("skipClusters"));
46  }
47  if (iConfig.getParameter<std::string>("Phase2TrackerCluster1DProducer") != "") {
48  thePh2OTClusterLabel = consumes<edmNew::DetSetVector<Phase2TrackerCluster1D> >(edm::InputTag(iConfig.getParameter<std::string>("Phase2TrackerCluster1DProducer")));
49  isPhase2 = true;
50  }
51 
52  produces<MeasurementTrackerEvent>();
53 }
54 
57 
58  desc.add<std::string>("measurementTracker", "");
59  desc.add<edm::InputTag>("skipClusters", edm::InputTag());
60  desc.add<std::string>("pixelClusterProducer", "siPixelClusters");
61  desc.add<std::string>("stripClusterProducer", "siStripClusters");
62  desc.add<std::string>("Phase2TrackerCluster1DProducer", "");
63 
64  desc.add<std::vector<edm::InputTag>>("inactivePixelDetectorLabels", std::vector<edm::InputTag>{{edm::InputTag("siPixelDigis")}})->setComment("One or more DetIdCollections of modules to mask on the fly for a given event");
65  desc.add<std::vector<edm::InputTag>>("badPixelFEDChannelCollectionLabels", std::vector<edm::InputTag>())->setComment("One or more PixelFEDChannelCollections of modules+ROCs to mask on the fly for a given event");
66  desc.add<std::string>("pixelCablingMapLabel", "");
67 
68  desc.add<std::vector<edm::InputTag>>("inactiveStripDetectorLabels", std::vector<edm::InputTag>{{edm::InputTag("siStripDigis")}})->setComment("One or more DetIdCollections of modules to mask on the fly for a given event");
69 
70  desc.add<bool>("switchOffPixelsIfEmpty", true)->setComment("let's keep it like this, for cosmics");
71 
72  descriptions.add("measurementTrackerEventDefault",desc);
73 }
74 
75 
76 void
78 {
79  edm::ESHandle<MeasurementTracker> measurementTracker;
80  iSetup.get<CkfComponentsRecord>().get(measurementTrackerLabel_, measurementTracker);
81 
82  // create new data structures from templates
83  auto stripData = std::make_unique<StMeasurementDetSet>(measurementTracker->stripDetConditions());
84  auto pixelData= std::make_unique<PxMeasurementDetSet>(measurementTracker->pixelDetConditions());
85  auto phase2OTData = std::make_unique<Phase2OTMeasurementDetSet>(measurementTracker->phase2DetConditions());
86  std::vector<bool> stripClustersToSkip;
87  std::vector<bool> pixelClustersToSkip;
88  std::vector<bool> phase2ClustersToSkip;
89  // fill them
90  updateStrips(iEvent, *stripData, stripClustersToSkip);
91  updatePixels(iEvent, *pixelData, pixelClustersToSkip, dynamic_cast<const TrackerGeometry&>(*(measurementTracker->geomTracker())), iSetup);
92  updatePhase2OT(iEvent, *phase2OTData);
93  updateStacks(iEvent, *phase2OTData);
94 
95  // put into MTE
96  // put into event
97  iEvent.put(std::move(
98  std::make_unique<MeasurementTrackerEvent>(*measurementTracker,
99  stripData.release(), pixelData.release(), phase2OTData.release(),
100  stripClustersToSkip, pixelClustersToSkip, phase2ClustersToSkip)
101  ));
102 }
103 
104 void
105 MeasurementTrackerEventProducer::updatePixels( const edm::Event& event, PxMeasurementDetSet & thePxDets, std::vector<bool> & pixelClustersToSkip,
106  const TrackerGeometry& trackerGeom, const edm::EventSetup& iSetup) const
107 {
108  // start by clearinng everything
109  thePxDets.setEmpty();
110 
111  std::vector<uint32_t> rawInactiveDetIds;
112  if (!theInactivePixelDetectorLabels.empty()) {
115  if (event.getByToken(tk, detIds)){
116  rawInactiveDetIds.insert(rawInactiveDetIds.end(), detIds->begin(), detIds->end());
117  }else{
118  static std::atomic<bool> iFailedAlready{false};
119  bool expected = false;
120  if (iFailedAlready.compare_exchange_strong(expected,true,std::memory_order_acq_rel)){
121  edm::LogError("MissingProduct")<<"I fail to get the list of inactive pixel modules, because of 4.2/4.4 event content change.";
122  }
123  }
124  }
125  if (!rawInactiveDetIds.empty()) std::sort(rawInactiveDetIds.begin(), rawInactiveDetIds.end());
126  // mark as inactive if in rawInactiveDetIds
127  int i=0, endDet = thePxDets.size();
128  unsigned int idp=0;
129  for ( auto id : rawInactiveDetIds) {
130  if (id==idp) continue; // skip multiple id
131  idp=id;
132  i=thePxDets.find(id,i);
133  assert(i!=endDet && id == thePxDets.id(i));
134  thePxDets.setActiveThisEvent(i,false);
135  }
136  }
137 
138  if (!theBadPixelFEDChannelsLabels.empty()) {
140  iSetup.get<SiPixelFedCablingMapRcd>().get(pixelCablingMapLabel_, cablingMap);
141 
142  edm::Handle<PixelFEDChannelCollection> pixelFEDChannelCollectionHandle;
144  if (!event.getByToken(tk, pixelFEDChannelCollectionHandle)) continue;
145  int i=0;
146  for (const auto& disabledChannels: *pixelFEDChannelCollectionHandle) {
148  for(const auto& ch: disabledChannels) {
149  const sipixelobjects::PixelROC *roc_first=nullptr, *roc_last=nullptr;
150  sipixelobjects::CablingPathToDetUnit path = {ch.fed, ch.link, 0};
151  // PixelFEDChannelCollection addresses the ROCs by their 'idInDetUnit' (from 0 to 15), ROCs also know their on 'idInDetUnit',
152  // however the cabling map uses a numbering [1,numberOfROCs], see sipixelobjects::PixelFEDLink::roc(unsigned int id), not necessarily sorted in the same direction.
153  // PixelFEDChannelCollection MUST be filled such that ch.roc_first (ch.roc_last) correspond to the lowest (highest) 'idInDetUnit' in the channel
154  for (path.roc=1; path.roc<=(ch.roc_last-ch.roc_first)+1; path.roc++) {
155  const sipixelobjects::PixelROC *roc = cablingMap->findItem(path);
156  if (roc==nullptr) continue;
157  assert(roc->rawId()==disabledChannels.detId());
158  if (roc->idInDetUnit()==ch.roc_first) roc_first=roc;
159  if (roc->idInDetUnit()==ch.roc_last) roc_last=roc;
160  }
161  if (roc_first==nullptr || roc_last==nullptr) {
162  edm::LogError("PixelFEDChannelCollection")<<"Do not find either roc_first or roc_last in the cabling map.";
163  continue;
164  }
165  const PixelGeomDetUnit * theGeomDet = dynamic_cast<const PixelGeomDetUnit*> (trackerGeom.idToDet(roc_first->rawId()));
166  PixelTopology const * topology = &(theGeomDet->specificTopology());
167  sipixelobjects::LocalPixel::RocRowCol local = {topology->rowsperroc()/2, topology->colsperroc()/2}; //corresponding to center of ROC row, col
169  LocalPoint lp1 = topology->localPosition(MeasurementPoint(global.row, global.col));
170  global = roc_last->toGlobal(sipixelobjects::LocalPixel(local));
171  LocalPoint lp2 = topology->localPosition(MeasurementPoint(global.row, global.col));
172  LocalPoint ll(std::min(lp1.x(), lp2.x()), std::min(lp1.y(), lp2.y()), std::min(lp1.z(), lp2.z()));
173  LocalPoint ur(std::max(lp1.x(), lp2.x()), std::max(lp1.y(), lp2.y()), std::max(lp1.z(), lp2.z()));
174  positions.push_back(std::make_pair(ll, ur));
175  } // loop on channels
176  if (!positions.empty()) {
177  i=thePxDets.find(disabledChannels.detId(),i);
178  assert(i!=thePxDets.size() && thePxDets.id(i)==disabledChannels.detId());
179  thePxDets.addBadFEDChannelPositions(i, positions);
180  }
181  } // loop on DetId-s
182  } // loop on labels
183  } // if collection labels are populated
184 
185  // Pixel Clusters
186  if( thePixelClusterLabel.isUninitialized() ) { //clusters have not been produced
188  thePxDets.setActiveThisEvent(false);
189  }
190  }else{
191 
193  if(event.getByToken(thePixelClusterLabel, pixelClusters)) {
194 
195  const edmNew::DetSetVector<SiPixelCluster>* pixelCollection = pixelClusters.product();
196 
197 
198  if (switchOffPixelsIfEmpty_ && pixelCollection->empty()) {
199  thePxDets.setActiveThisEvent(false);
200  } else {
201 
202  //std::cout <<"updatePixels "<<pixelCollection->dataSize()<<std::endl;
203  pixelClustersToSkip.resize(pixelCollection->dataSize());
204  std::fill(pixelClustersToSkip.begin(),pixelClustersToSkip.end(),false);
205 
208  //and get the collection of pixel ref to skip
209  event.getByToken(thePixelClusterMask,pixelClusterMask);
210  LogDebug("MeasurementTracker")<<"getting pxl refs to skip";
211  if (pixelClusterMask.failedToGet())edm::LogError("MeasurementTracker")<<"not getting the pixel clusters to skip";
212  if (pixelClusterMask->refProd().id()!=pixelClusters.id()){
213  edm::LogError("ProductIdMismatch")<<"The pixel masking does not point to the proper collection of clusters: "<<pixelClusterMask->refProd().id()<<"!="<<pixelClusters.id();
214  }
215  pixelClusterMask->copyMaskTo(pixelClustersToSkip);
216  }
217 
218 
219  // FIXME: should check if lower_bound is better
220  int i = 0, endDet = thePxDets.size();
221  for (edmNew::DetSetVector<SiPixelCluster>::const_iterator it = pixelCollection->begin(), ed = pixelCollection->end(); it != ed; ++it) {
223  unsigned int id = set.id();
224  while ( id != thePxDets.id(i)) {
225  ++i;
226  if (endDet==i) throw "we have a problem!!!!";
227  }
228  // push cluster range in det
229  if ( thePxDets.isActive(i) ) {
230  thePxDets.update(i,set);
231  }
232  }
233  }
234  } else {
236  labelsForToken(thePixelClusterLabel, labels);
237  edm::LogWarning("MeasurementTrackerEventProducer") << "input pixel clusters collection " << labels.module << " is not valid";
238  }
239  }
240 }
241 
242 void
243 MeasurementTrackerEventProducer::updateStrips( const edm::Event& event, StMeasurementDetSet & theStDets, std::vector<bool> & stripClustersToSkip ) const
244 {
245  typedef edmNew::DetSet<SiStripCluster> StripDetSet;
246 
247  std::vector<uint32_t> rawInactiveDetIds;
248  getInactiveStrips(event,rawInactiveDetIds);
249 
250  // Strip Clusters
251  //first clear all of them
252  theStDets.setEmpty();
253 
254 
255  if( theStripClusterLabel.isUninitialized() ) return; //clusters have not been produced
256 
257  const int endDet = theStDets.size();
258 
259 
260  // mark as inactive if in rawInactiveDetIds
261  int i=0;
262  unsigned int idp=0;
263  for ( auto id : rawInactiveDetIds) {
264  if (id==idp) continue; // skip multiple id
265  idp=id;
266  i=theStDets.find(id,i);
267  assert(i!=endDet && id == theStDets.id(i));
268  theStDets.setActiveThisEvent(i,false);
269  }
270 
271  //========= actually load cluster =============
272  {
274  if (event.getByToken(theStripClusterLabel, clusterHandle)) {
275  const edmNew::DetSetVector<SiStripCluster>* clusterCollection = clusterHandle.product();
276 
277 
280  //and get the collection of pixel ref to skip
281  LogDebug("MeasurementTracker")<<"getting strp refs to skip";
282  event.getByToken(theStripClusterMask,stripClusterMask);
283  if (stripClusterMask.failedToGet()) edm::LogError("MeasurementTracker")<<"not getting the strip clusters to skip";
284  if (stripClusterMask->refProd().id()!=clusterHandle.id()){
285  edm::LogError("ProductIdMismatch")<<"The strip masking does not point to the proper collection of clusters: "<<stripClusterMask->refProd().id()<<"!="<<clusterHandle.id();
286  }
287  stripClusterMask->copyMaskTo(stripClustersToSkip);
288  }
289 
290  theStDets.handle() = clusterHandle;
291  int i=0;
292  // cluster and det and in order (both) and unique so let's use set intersection
293  for ( auto j = 0U; j< (*clusterCollection).size(); ++j) {
294  unsigned int id = (*clusterCollection).id(j);
295  while ( id != theStDets.id(i)) { // eventually change to lower_bound
296  ++i;
297  if (endDet==i) throw "we have a problem in strips!!!!";
298  }
299 
300  // push cluster range in det
301  if ( theStDets.isActive(i) )
302  theStDets.update(i,j);
303  }
304  } else {
306  labelsForToken(theStripClusterLabel, labels);
307  edm::LogWarning("MeasurementTrackerEventProducer") << "input strip cluster collection " << labels.module << " is not valid";
308  }
309  }
310 }
311 
312 //FIXME: just a temporary solution for phase2!
313 void
315 
316 
317  // Phase2OT Clusters
318  if ( isPhase2 ) {
319 
320  if( thePh2OTClusterLabel.isUninitialized() ) { //clusters have not been produced
321  thePh2OTDets.setActiveThisEvent(false);
322  } else {
323 
325  if (event.getByToken(thePh2OTClusterLabel, phase2OTClusters)) {
326  const edmNew::DetSetVector<Phase2TrackerCluster1D>* phase2OTCollection = phase2OTClusters.product();
327 
328  int i = 0, endDet = thePh2OTDets.size();
329  for (edmNew::DetSetVector<Phase2TrackerCluster1D>::const_iterator it = phase2OTCollection->begin(), ed = phase2OTCollection->end(); it != ed; ++it) {
330 
332  unsigned int id = set.id();
333  while ( id != thePh2OTDets.id(i)) {
334  ++i;
335  if (endDet==i) throw "we have a problem!!!!";
336  }
337  // push cluster range in det
338  if ( thePh2OTDets.isActive(i) ) {
339  thePh2OTDets.update(i,set);
340  }
341  }
342  } else {
344  labelsForToken(thePh2OTClusterLabel, labels);
345  edm::LogWarning("MeasurementTrackerEventProducer") << "input Phase2TrackerCluster1D collection " << labels.module << " is not valid";
346  }
347  }
348 
349  }
350  return;
351 }
352 
353 void
354 MeasurementTrackerEventProducer::getInactiveStrips(const edm::Event& event,std::vector<uint32_t> & rawInactiveDetIds) const
355 {
356  if (!theInactiveStripDetectorLabels.empty()) {
359  if (event.getByToken(tk, detIds)){
360  rawInactiveDetIds.insert(rawInactiveDetIds.end(), detIds->begin(), detIds->end());
361  }
362  }
363  if (!rawInactiveDetIds.empty()) std::sort(rawInactiveDetIds.begin(), rawInactiveDetIds.end());
364  }
365 
366 }
367 
368 
369 
#define LogDebug(id)
T getParameter(std::string const &) const
void setComment(std::string const &value)
boost::transform_iterator< IterHelp, const_IdIter > const_iterator
const_iterator end(bool update=false) const
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:137
size_type dataSize() const
virtual int rowsperroc() const =0
std::vector< edm::EDGetTokenT< DetIdCollection > > theInactiveStripDetectorLabels
CaloTopology const * topology(0)
ProductID id() const
Definition: HandleBase.cc:15
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:579
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
const_iterator end() const
Definition: EDCollection.h:153
MeasurementTrackerEventProducer(const edm::ParameterSet &iConfig)
T y() const
Definition: PV3DBase.h:63
void updateStrips(const edm::Event &, StMeasurementDetSet &theStDets, std::vector< bool > &stripClustersToSkip) const
void update(int i, const StripDetset &detSet)
edm::EDGetTokenT< edmNew::DetSetVector< Phase2TrackerCluster1D > > thePh2OTClusterLabel
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
const edm::Handle< edmNew::DetSetVector< SiPixelCluster > > & handle() const
std::vector< std::pair< LocalPoint, LocalPoint > > BadFEDChannelPositions
virtual const Phase2OTMeasurementConditionSet & phase2DetConditions() const =0
identify pixel inside single ROC
Definition: LocalPixel.h:7
global coordinates (row and column in DetUnit, as in PixelDigi)
Definition: GlobalPixel.h:6
unsigned int id(int i) const
unsigned int id(int i) const
int find(unsigned int jd, int i=0) const
std::vector< edm::EDGetTokenT< PixelFEDChannelCollection > > theBadPixelFEDChannelsLabels
Measurement2DPoint MeasurementPoint
Measurement points are two-dimensional by default.
int iEvent
Definition: GenABIO.cc:230
virtual int colsperroc() const =0
void setActiveThisEvent(int i, bool active)
Turn on/off the module for reconstruction for one events. This per-event flag is cleared by any call ...
void updatePhase2OT(const edm::Event &, Phase2OTMeasurementDetSet &thePh2OTDets) const
const edm::Handle< edmNew::DetSetVector< Phase2TrackerCluster1D > > & handle() const
bool isActive(int i) const
T z() const
Definition: PV3DBase.h:64
unsigned int idInDetUnit() const
id of this ROC in DetUnit etermined by token path
Definition: PixelROC.h:40
uint32_t rawId() const
return the DetUnit to which this ROC belongs to.
Definition: PixelROC.h:37
void getInactiveStrips(const edm::Event &event, std::vector< uint32_t > &rawInactiveDetIds) const
const TrackingGeometry * geomTracker() const
void updateStacks(const edm::Event &, Phase2OTMeasurementDetSet &theStDets) const
T min(T a, T b)
Definition: MathUtil.h:58
void update(int i, const PixelDetSet &detSet)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
void addBadFEDChannelPositions(int i, BadFEDChannelPositions &positions)
char const * module
Definition: ProductLabels.h:5
void produce(edm::Event &, const edm::EventSetup &) override
bool failedToGet() const
Definition: HandleBase.h:78
const_iterator begin() const
Definition: EDCollection.h:146
T const * product() const
Definition: Handle.h:81
virtual const PixelTopology & specificTopology() const
Returns a reference to the pixel proxy topology.
edm::EDGetTokenT< edm::ContainerMask< edmNew::DetSetVector< SiPixelCluster > > > thePixelClusterMask
row and collumn in ROC representation
Definition: LocalPixel.h:15
void add(std::string const &label, ParameterSetDescription const &psetDescription)
const sipixelobjects::PixelROC * findItem(const sipixelobjects::CablingPathToDetUnit &path) const final
virtual const StMeasurementConditionSet & stripDetConditions() const =0
Provide templates to be filled in.
virtual LocalPoint localPosition(const MeasurementPoint &) const =0
bool isActive(int i) const
void updatePixels(const edm::Event &, PxMeasurementDetSet &thePxDets, std::vector< bool > &pixelClustersToSkip, const TrackerGeometry &trackerGeom, const edm::EventSetup &iSetup) const
void setActiveThisEvent(bool active)
edm::EDGetTokenT< edmNew::DetSetVector< SiStripCluster > > theStripClusterLabel
T get() const
Definition: EventSetup.h:62
const TrackerGeomDet * idToDet(DetId) const override
id_type id() const
Definition: DetSetNew.h:81
virtual const PxMeasurementConditionSet & pixelDetConditions() const =0
int find(unsigned int jd, int i=0) const
bool isUninitialized() const
Definition: EDGetToken.h:73
void setActiveThisEvent(bool active)
edm::Handle< edmNew::DetSetVector< SiStripCluster > > & handle()
unsigned int id(int i) const
void update(int i, const Phase2DetSet &detSet)
T x() const
Definition: PV3DBase.h:62
edm::EDGetTokenT< edmNew::DetSetVector< SiPixelCluster > > thePixelClusterLabel
def move(src, dest)
Definition: eostools.py:511
edm::EDGetTokenT< edm::ContainerMask< edmNew::DetSetVector< SiStripCluster > > > theStripClusterMask
const_iterator begin(bool update=false) const
std::vector< edm::EDGetTokenT< DetIdCollection > > theInactivePixelDetectorLabels
Definition: event.py:1
GlobalPixel toGlobal(const LocalPixel &loc) const
Definition: PixelROC.h:59