CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TrackClusterRemover.cc
Go to the documentation of this file.
1 
2 
8 
10 
14 
15 
20 
22 
25 
27 
28 #include<limits>
29 
30 namespace {
31 
32  class TrackClusterRemover final : public edm::global::EDProducer<> {
33  public:
34  TrackClusterRemover(const edm::ParameterSet& iConfig) ;
35  ~TrackClusterRemover(){}
36  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
37  private:
38 
39  virtual void produce(edm::StreamID, edm::Event& evt, const edm::EventSetup&) const override;
40 
43 
44  using QualityMaskCollection = std::vector<unsigned char>;
45 
46  const float maxChi2_;
47  const int minNumberOfLayersWithMeasBeforeFiltering_;
48  const reco::TrackBase::TrackQuality trackQuality_;
49 
50 
51  const TrackCollectionTokens trajectories_;
53 
56 
57  edm::EDGetTokenT<PixelMaskContainer> oldPxlMaskToken_;
58  edm::EDGetTokenT<StripMaskContainer> oldStrMaskToken_;
59 
60  // backward compatibility during transition period
61  edm::EDGetTokenT<edm::ValueMap<int>> overrideTrkQuals_;
62 
63  };
64 
65  void TrackClusterRemover::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
67  desc.add<edm::InputTag>("trajectories",edm::InputTag());
68  desc.add<edm::InputTag>("trackClassifier",edm::InputTag("","QualityMasks"));
69  desc.add<edm::InputTag>("pixelClusters",edm::InputTag("siPixelClusters"));
70  desc.add<edm::InputTag>("stripClusters",edm::InputTag("siStripClusters"));
71  desc.add<edm::InputTag>("oldClusterRemovalInfo",edm::InputTag());
72 
73  desc.add<std::string>("TrackQuality","highPurity");
74  desc.add<double>("maxChi2",30.);
75  desc.add<int>("minNumberOfLayersWithMeasBeforeFiltering",0);
76  // old mode
77  desc.add<edm::InputTag>("overrideTrkQuals",edm::InputTag());
78 
79  descriptions.add("trackClusterRemover", desc);
80 
81  }
82 
83  TrackClusterRemover::TrackClusterRemover(const edm::ParameterSet& iConfig) :
84  maxChi2_(iConfig.getParameter<double>("maxChi2")),
85  minNumberOfLayersWithMeasBeforeFiltering_(iConfig.getParameter<int>("minNumberOfLayersWithMeasBeforeFiltering")),
86  trackQuality_(reco::TrackBase::qualityByName(iConfig.getParameter<std::string>("TrackQuality"))),
87 
88  trajectories_(iConfig.getParameter<edm::InputTag>("trajectories"),consumesCollector()),
89  pixelClusters_(consumes<edmNew::DetSetVector<SiPixelCluster> >(iConfig.getParameter<edm::InputTag>("pixelClusters"))),
90  stripClusters_(consumes<edmNew::DetSetVector<SiStripCluster> >(iConfig.getParameter<edm::InputTag>("stripClusters")))
91  {
92 
93  produces<edm::ContainerMask<edmNew::DetSetVector<SiPixelCluster> > >();
94  produces<edm::ContainerMask<edmNew::DetSetVector<SiStripCluster> > >();
95 
96  // old mode
97  auto const & overrideTrkQuals = iConfig.getParameter<edm::InputTag>("overrideTrkQuals");
98  if ( !overrideTrkQuals.label().empty() )
99  overrideTrkQuals_ = consumes<edm::ValueMap<int> >(overrideTrkQuals);
100 
101  auto const & classifier = iConfig.getParameter<edm::InputTag>("trackClassifier");
102  if ( !classifier.label().empty())
103  srcQuals = consumes<QualityMaskCollection>(classifier);
104 
105  auto const & oldClusterRemovalInfo = iConfig.getParameter<edm::InputTag>("oldClusterRemovalInfo");
106  if (!oldClusterRemovalInfo.label().empty()) {
107  oldPxlMaskToken_ = consumes<PixelMaskContainer>(oldClusterRemovalInfo);
108  oldStrMaskToken_ = consumes<StripMaskContainer>(oldClusterRemovalInfo);
109  }
110 
111  }
112 
113 
114  void
115  TrackClusterRemover::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup&) const
116  {
117 
118 
120  iEvent.getByToken(pixelClusters_, pixelClusters);
122  iEvent.getByToken(stripClusters_, stripClusters);
123 
124 
125  std::vector<bool> collectedStrips;
126  std::vector<bool> collectedPixels;
127 
128  if(!oldPxlMaskToken_.isUninitialized()) {
131  iEvent.getByToken(oldPxlMaskToken_ ,oldPxlMask);
132  iEvent.getByToken(oldStrMaskToken_ ,oldStrMask);
133  LogDebug("TrackClusterRemover")<<"to merge in, "<<oldStrMask->size()<<" strp and "<<oldPxlMask->size()<<" pxl";
134  // std::cout <<"TrackClusterRemover "<<"to merge in, "<<oldStrMask->size()<<" strp and "<<oldPxlMask->size()<<" pxl" << std::endl;
135  oldStrMask->copyMaskTo(collectedStrips);
136  oldPxlMask->copyMaskTo(collectedPixels);
137  assert(stripClusters->dataSize()>=collectedStrips.size());
138  collectedStrips.resize(stripClusters->dataSize(), false);
139  //std::cout << "TrackClusterRemover " <<"total strip already to skip: "
140  // <<std::count(collectedStrips.begin(),collectedStrips.end(),true) <<std::endl;
141 
142  }else {
143  collectedStrips.resize(stripClusters->dataSize(), false);
144  collectedPixels.resize(pixelClusters->dataSize(), false);
145  }
146 
147 
148 
149 
150  // loop over trajectories, filter, mask clusters../
151 
152  unsigned char qualMask = ~0;
153  if (trackQuality_!=reco::TrackBase::undefQuality) qualMask = 1<<trackQuality_;
154 
155 
156  auto const & tracks = trajectories_.tracks(iEvent);
157  auto const & trajs = trajectories_.trajectories(iEvent);
158  auto s = tracks.size();
159 
160  assert(s==trajs.size());
161 
162  QualityMaskCollection oldStyle;
163  QualityMaskCollection const * pquals=nullptr;
164 
165  if (!overrideTrkQuals_.isUninitialized()) {
167  iEvent.getByToken(overrideTrkQuals_,quals);
168  assert(s==(*quals).size());
169 
170  oldStyle.resize(s,0);
171  for (auto i=0U; i<s; ++i) if ( (*quals).get(i) > 0 ) oldStyle[i] = (255)&(*quals).get(i);
172  pquals = &oldStyle;
173  }
174 
175  if (!srcQuals.isUninitialized()) {
177  iEvent.getByToken(srcQuals, hqual);
178  pquals = hqual.product();
179  }
180 
181  // if (!pquals) std::cout << "no qual collection" << std::endl;
182 
183  for (auto i=0U; i<s; ++i){
184  const reco::Track & track = tracks[i];
185  bool goodTk = (pquals) ? (*pquals)[i] & qualMask : track.quality(trackQuality_);
186  if ( !goodTk) continue;
187  if(track.hitPattern().trackerLayersWithMeasurement() < minNumberOfLayersWithMeasBeforeFiltering_) continue;
188  const Trajectory &tj = trajs[i];
189  const auto & tms = tj.measurements();
190  for (auto const & tm : tms) {
191  auto const & hit = *tm.recHit();
192  if (!hit.isValid()) continue;
193  if ( tm.estimate() > maxChi2_ ) continue; // skip outliers
194  auto const & thit = reinterpret_cast<BaseTrackerRecHit const&>(hit);
195  auto const & cluster = thit.firstClusterRef();
196  if (cluster.isStrip()) collectedStrips[cluster.key()]=true;
197  else collectedPixels[cluster.key()]=true;
198  if (trackerHitRTTI::isMatched(thit))
199  collectedStrips[reinterpret_cast<SiStripMatchedRecHit2D const&>(hit).stereoClusterRef().key()]=true;
200  }
201  }
202 
203 
204  auto removedStripClusterMask =
205  std::make_unique<StripMaskContainer>(edm::RefProd<edmNew::DetSetVector<SiStripCluster>>(stripClusters),collectedStrips);
206  LogDebug("TrackClusterRemover")<<"total strip to skip: "<<std::count(collectedStrips.begin(),collectedStrips.end(),true);
207  // std::cout << "TrackClusterRemover " <<"total strip to skip: "<<std::count(collectedStrips.begin(),collectedStrips.end(),true) <<std::endl;
208  iEvent.put(std::move(removedStripClusterMask));
209 
210  auto removedPixelClusterMask=
211  std::make_unique<PixelMaskContainer>(edm::RefProd<edmNew::DetSetVector<SiPixelCluster>>(pixelClusters),collectedPixels);
212  LogDebug("TrackClusterRemover")<<"total pxl to skip: "<<std::count(collectedPixels.begin(),collectedPixels.end(),true);
213  iEvent.put(std::move(removedPixelClusterMask));
214 
215 
216 
217  }
218 
219 
220 }
221 
222 
225 DEFINE_FWK_MODULE(TrackClusterRemover);
226 
#define LogDebug(id)
T getParameter(std::string const &) const
int i
Definition: DBlmapReader.cc:9
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:464
TrackQuality
track quality
Definition: TrackBase.h:149
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
assert(m_qm.get())
int trackerLayersWithMeasurement() const
Definition: HitPattern.cc:516
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
DataContainer const & measurements() const
Definition: Trajectory.h:203
int iEvent
Definition: GenABIO.cc:230
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:120
def move
Definition: eostools.py:510
bool isMatched(TrackingRecHit const &hit)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
static void fillDescriptions(ConfigurationDescriptions &descriptions)
T const * product() const
Definition: Handle.h:81
const HitPattern & hitPattern() const
Access the hit pattern, indicating in which Tracker layers the track has hits.
Definition: TrackBase.h:437
tuple tracks
Definition: testEve_cfg.py:39
virtual void produce(StreamID, Event &, EventSetup const &) const =0
string const
Definition: compareJSON.py:14
bool quality(const TrackQuality) const
Track quality.
Definition: TrackBase.h:497
Pixel cluster – collection of neighboring pixels above threshold.