test
CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TrackClusterRemoverPhase2.cc
Go to the documentation of this file.
6 
8 
11 
16 
18 
21 
23 
24 #include<limits>
25 
26 /* This is a copy of the TrackClusterRemover
27  * for Phase2 Tk upgrade
28  * FIXME:: changing with new phase2 pixel DataFormats!
29  * FIXME:: still to be factorized
30  */
31 
32 namespace {
33 
34  class TrackClusterRemoverPhase2 final : public edm::global::EDProducer<> {
35  public:
36  TrackClusterRemoverPhase2(const edm::ParameterSet& iConfig) ;
37  ~TrackClusterRemoverPhase2(){}
38  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
39  private:
40 
41  virtual void produce(edm::StreamID, edm::Event& evt, const edm::EventSetup&) const override;
42 
45 
46  using QualityMaskCollection = std::vector<unsigned char>;
47 
48  const float maxChi2_;
49  const int minNumberOfLayersWithMeasBeforeFiltering_;
50  const reco::TrackBase::TrackQuality trackQuality_;
51 
52 
53  const TrackCollectionTokens trajectories_;
55 
58 
59  edm::EDGetTokenT<PixelMaskContainer> oldPxlMaskToken_;
60  edm::EDGetTokenT<Phase2OTMaskContainer> oldPh2OTMaskToken_;
61 
62  // backward compatibility during transition period
63  edm::EDGetTokenT<edm::ValueMap<int>> overrideTrkQuals_;
64 
65  };
66 
67  void TrackClusterRemoverPhase2::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
69  desc.add<edm::InputTag>("trajectories",edm::InputTag());
70  desc.add<edm::InputTag>("trackClassifier",edm::InputTag("","QualityMasks"));
71  desc.add<edm::InputTag>("phase2pixelClusters",edm::InputTag("siPixelClusters"));
72  desc.add<edm::InputTag>("phase2OTClusters",edm::InputTag("siPhase2Clusters"));
73  desc.add<edm::InputTag>("oldClusterRemovalInfo",edm::InputTag());
74 
75  desc.add<std::string>("TrackQuality","highPurity");
76  desc.add<double>("maxChi2",30.);
77  desc.add<int>("minNumberOfLayersWithMeasBeforeFiltering",0);
78  // old mode
79  desc.add<edm::InputTag>("overrideTrkQuals",edm::InputTag());
80 
81  descriptions.add("phase2trackClusterRemover", desc);
82 
83  }
84 
85  TrackClusterRemoverPhase2::TrackClusterRemoverPhase2(const edm::ParameterSet& iConfig) :
86  maxChi2_(iConfig.getParameter<double>("maxChi2")),
87  minNumberOfLayersWithMeasBeforeFiltering_(iConfig.getParameter<int>("minNumberOfLayersWithMeasBeforeFiltering")),
88  trackQuality_(reco::TrackBase::qualityByName(iConfig.getParameter<std::string>("TrackQuality"))),
89 
90  trajectories_(iConfig.getParameter<edm::InputTag>("trajectories"),consumesCollector()),
91  pixelClusters_(consumes<edmNew::DetSetVector<SiPixelCluster> >(iConfig.getParameter<edm::InputTag>("phase2pixelClusters"))),
92  phase2OTClusters_(consumes<edmNew::DetSetVector<Phase2TrackerCluster1D> >(iConfig.getParameter<edm::InputTag>("phase2OTClusters")))
93  {
94 
95  produces<edm::ContainerMask<edmNew::DetSetVector<SiPixelCluster> > >();
96  produces<edm::ContainerMask<edmNew::DetSetVector<Phase2TrackerCluster1D> > >();
97 
98  // old mode
99  auto const & overrideTrkQuals = iConfig.getParameter<edm::InputTag>("overrideTrkQuals");
100  if ( !overrideTrkQuals.label().empty() )
101  overrideTrkQuals_ = consumes<edm::ValueMap<int> >(overrideTrkQuals);
102 
103  auto const & classifier = iConfig.getParameter<edm::InputTag>("trackClassifier");
104  if ( !classifier.label().empty())
105  srcQuals = consumes<QualityMaskCollection>(classifier);
106 
107  auto const & oldClusterRemovalInfo = iConfig.getParameter<edm::InputTag>("oldClusterRemovalInfo");
108  if (!oldClusterRemovalInfo.label().empty()) {
109  oldPxlMaskToken_ = consumes<PixelMaskContainer>(oldClusterRemovalInfo);
110  oldPh2OTMaskToken_ = consumes<Phase2OTMaskContainer>(oldClusterRemovalInfo);
111  }
112 
113  }
114 
115 
116  void
117  TrackClusterRemoverPhase2::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup&) const
118  {
119 
120 
122  iEvent.getByToken(pixelClusters_, pixelClusters);
124  iEvent.getByToken(phase2OTClusters_, phase2OTClusters);
125 
126 
127  std::vector<bool> collectedPixels;
128  std::vector<bool> collectedPhase2OTs;
129 
130  if(!oldPxlMaskToken_.isUninitialized()) {
131 
134  iEvent.getByToken(oldPxlMaskToken_ ,oldPxlMask);
135  iEvent.getByToken(oldPh2OTMaskToken_ ,oldPh2OTMask);
136  LogDebug("TrackClusterRemoverPhase2")<<"to merge in, "<<oldPxlMask->size()<<" phase2 pixel and " << oldPh2OTMask->size() << " phase2 OT";
137  oldPxlMask->copyMaskTo(collectedPixels);
138  oldPh2OTMask->copyMaskTo(collectedPhase2OTs);
139  assert(phase2OTClusters->dataSize() >= collectedPhase2OTs.size());
140  collectedPhase2OTs.resize(phase2OTClusters->dataSize(), false);
141 
142  }else {
143 
144  collectedPixels.resize(pixelClusters->dataSize(), false);
145  collectedPhase2OTs.resize(phase2OTClusters->dataSize(), false);
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  for (auto i=0U; i<s; ++i){
182 
183  const reco::Track & track = tracks[i];
184  bool goodTk = (pquals) ? (*pquals)[i] & qualMask : track.quality(trackQuality_);
185  if ( !goodTk) continue;
186  if(track.hitPattern().trackerLayersWithMeasurement() < minNumberOfLayersWithMeasBeforeFiltering_) continue;
187  const Trajectory &tj = trajs[i];
188  const auto & tms = tj.measurements();
189  for (auto const & tm : tms) {
190  auto const & hit = *tm.recHit();
191  if (!hit.isValid()) continue;
192  if ( tm.estimate() > maxChi2_ ) continue; // skip outliers
193  auto const & thit = reinterpret_cast<BaseTrackerRecHit const&>(hit);
194  auto const & cluster = thit.firstClusterRef();
195  // FIXME when we will get also Phase2 pixel
196  if (cluster.isPixel()) collectedPixels[cluster.key()]=true;
197  else if (cluster.isPhase2()) collectedPhase2OTs[cluster.key()]=true;
198  }
199 
200  }
201 
202 
203  auto removedPixelClusterMask=
204  std::make_unique<PixelMaskContainer>(edm::RefProd<edmNew::DetSetVector<SiPixelCluster>>(pixelClusters),collectedPixels);
205  LogDebug("TrackClusterRemoverPhase2")<<"total pxl to skip: "<<std::count(collectedPixels.begin(),collectedPixels.end(),true);
206  iEvent.put(std::move(removedPixelClusterMask));
207 
208  auto removedPhase2OTClusterMask=
209  std::make_unique<Phase2OTMaskContainer>(edm::RefProd<edmNew::DetSetVector<Phase2TrackerCluster1D>>(phase2OTClusters),collectedPhase2OTs);
210  LogDebug("TrackClusterRemoverPhase2")<<"total ph2OT to skip: "<<std::count(collectedPhase2OTs.begin(),collectedPhase2OTs.end(),true);
211  iEvent.put(std::move(removedPhase2OTClusterMask));
212 
213 
214  }
215 
216 
217 }
218 
219 
222 DEFINE_FWK_MODULE(TrackClusterRemoverPhase2);
223 
#define LogDebug(id)
T getParameter(std::string const &) const
int i
Definition: DBlmapReader.cc:9
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:122
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:457
TrackQuality
track quality
Definition: TrackBase.h:151
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
assert(m_qm.get())
int trackerLayersWithMeasurement() const
Definition: HitPattern.cc:518
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
DataContainer const & measurements() const
Definition: Trajectory.h:196
int iEvent
Definition: GenABIO.cc:230
def move
Definition: eostools.py:510
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:445
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:505
Pixel cluster – collection of neighboring pixels above threshold.