CMS 3D CMS Logo

HGCalTrackCollectionProducer.cc
Go to the documentation of this file.
1 // S. Zenz, 12 February 2015
2 //
3 // Splits a track collection into two, based on whether they propagate to the HGCal or not
4 // Tracks with bad pt resolution (suspected fakes) are dropped and not in either collection
5 
20 
21 // for track propagation through HGC
22 // N.B. we are only propogating to first layer, so check these later
30 
31 //geometry records
35 
36 #include <memory>
37 #include <unordered_map>
38 
40 public:
42  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
43 
44 private:
45  void produce(edm::Event&, const edm::EventSetup&) override;
46  void beginLuminosityBlock(const edm::LuminosityBlock&, const edm::EventSetup&) override;
47 
49 
50  // variables needed for copied goodPtResolution function
51  // need to go back and figure out sensible values
52 
54  const std::vector<double> DPtovPtCut_;
55  const std::vector<unsigned> NHitCut_;
56  const bool useIterTracking_;
57  // const bool _useFirstLayerOnly; // always true now
58 
59  // variables needed for copied extrapolation
64  std::array<std::string, 1> hgc_names_; // 3 --> 1; extrapolate to hgcee only
65  std::array<edm::ESGetToken<HGCalGeometry, IdealGeometryRecord>, 1>
66  hgcGeometryTokens_; // 3 --> 1; extrapolate to hgcee only
67  std::array<const HGCalGeometry*, 1> hgcGeometries_; // 3 --> 1; extrapolate to hgcee only
68  std::array<std::vector<ReferenceCountingPointer<BoundDisk>>, 1> plusSurface_,
69  minusSurface_; // 3 --> 1; extrapolate to hgcee only
70  std::unique_ptr<PropagatorWithMaterial> mat_prop_;
71 
74 };
75 
78  desc.add<edm::InputTag>("src", {"pfTrack"});
79  desc.add<std::string>("trackQuality", "highPurity");
80  desc.add<bool>("useIterativeTracking", true);
81  desc.add<std::vector<double>>("DPtOverPtCuts_byTrackAlgo", {10.0, 10.0, 10.0, 10.0, 10.0, 5.0});
82  desc.add<std::vector<uint32_t>>("NHitCuts_byTrackAlgo", {3, 3, 3, 3, 3, 3});
84  pset.add<std::string>("HGC_ECAL", "HGCalEESensitive");
85  desc.add<edm::ParameterSetDescription>("hgcalGeometryNames", pset);
86  descriptions.add("hgcalTrackCollection", desc);
87 }
88 
90  : src_(consumes<edm::View<reco::PFRecTrack>>(iConfig.getParameter<edm::InputTag>("src"))),
91  trackQuality_(reco::TrackBase::qualityByName(iConfig.getParameter<std::string>("trackQuality"))),
92  DPtovPtCut_(iConfig.getParameter<std::vector<double>>("DPtOverPtCuts_byTrackAlgo")),
93  NHitCut_(iConfig.getParameter<std::vector<unsigned>>("NHitCuts_byTrackAlgo")),
94  useIterTracking_(iConfig.getParameter<bool>("useIterativeTracking")),
95  magneticFieldToken_(esConsumes<edm::Transition::BeginLuminosityBlock>()),
96  tkerGeomToken_(esConsumes<edm::Transition::BeginLuminosityBlock>()) {
97  LogDebug("HGCalTrackCollectionProducer")
98  << " HGCalTrackCollectionProducer::HGCalTrackCollectionProducer " << std::endl;
99 
100  const edm::ParameterSet& geoconf = iConfig.getParameterSet("hgcalGeometryNames");
101  hgc_names_[0] = geoconf.getParameter<std::string>("HGC_ECAL");
102  for (unsigned i = 0; i < hgcGeometryTokens_.size(); i++) {
103  hgcGeometryTokens_[i] = esConsumes<edm::Transition::BeginLuminosityBlock>(edm::ESInputTag("", hgc_names_[i]));
104  }
105 
106  produces<reco::PFRecTrackCollection>("TracksInHGCal");
107  produces<reco::PFRecTrackCollection>("TracksNotInHGCal");
108 }
109 
110 // From https://github.com/cms-sw/cmssw/blob/CMSSW_6_2_X_SLHC/RecoParticleFlow/PFClusterProducer/src/HGCClusterizer.cc#L441-L447 and beyond
111 // TODO: we only need the front of the calorimeter, so modify this
113  constexpr float m_pion = 0.1396;
114  // get dependencies for setting up propagator
117  // get HGC geometries (assume that layers are ordered in Z!)
118  for (unsigned i = 0; i < hgcGeometries_.size(); ++i) {
120  }
121 
122  // make propagator
123  mat_prop_ = std::make_unique<PropagatorWithMaterial>(alongMomentum, m_pion, bField_);
124  // setup HGC layers for track propagation
125  Surface::RotationType rot; //unit rotation matrix
126  for (unsigned i = 0; i < hgcGeometries_.size(); ++i) {
127  minusSurface_[i].clear();
128  plusSurface_[i].clear();
129  const HGCalDDDConstants& dddCons = hgcGeometries_[i]->topology().dddConstants();
130  std::map<float, float> zrhoCoord;
131  std::map<float, float> innerRadiusCoord;
132  auto theTrForms = dddCons.getTrForms();
133  const auto& firstLayerIt = theTrForms.back();
134  float Z(std::abs(firstLayerIt.h3v.z()));
135  // use hardcoded radii for now (FIX ME)
136  diskInnerRadius_ = 31.5;
137  diskOuterRadius_ = 161.0f;
138  LogDebug("HGCalTrackCollectionProducer") << "O HAI I'm making a bound disk with Outer R=" << diskOuterRadius_
139  << " Inner R=" << diskInnerRadius_ << " and Z=" << Z << std::endl;
144  }
145 }
146 
149  evt.getByToken(src_, trackHandle);
150  const auto& tracks = *trackHandle;
151 
152  auto outputInHGCal = std::make_unique<reco::PFRecTrackCollection>();
153  auto outputNotInHGCal = std::make_unique<reco::PFRecTrackCollection>();
154 
155  for (unsigned int i = 0; i < tracks.size(); i++) {
156  const auto track = tracks.ptrAt(i);
157  bool isGood =
159  LogDebug("HGCalTrackCollectionProducer") << "HGCalTrackCollectionProducer Track number " << i
160  << " has a goodPtResolution result of " << isGood << std::endl;
161  if (!isGood)
162  continue;
163  bool found = false;
164  const TrajectoryStateOnSurface myTSOS =
166  auto detbegin = myTSOS.globalPosition().z() > 0 ? plusSurface_.begin() : minusSurface_.begin();
167  auto detend = myTSOS.globalPosition().z() > 0 ? plusSurface_.end() : minusSurface_.end();
168  for (auto det = detbegin; det != detend; ++det) {
169  LogDebug("HGCalTrackCollectionProducer") << "at HGC detector: " << std::distance(detbegin, det) << std::endl;
170  unsigned layer_count = 1;
171  for (const auto& layer : *det) {
172  LogDebug("HGCalTrackCollectionProducer") << " at DET layer: " << layer_count++ << std::endl;
173  TrajectoryStateOnSurface piStateAtSurface = mat_prop_->propagate(myTSOS, *layer);
174  if (piStateAtSurface.isValid()) {
175  LogDebug("HGCalTrackCollectionProducer") << "Extrapolation is valid!" << std::endl;
176  GlobalPoint pt = piStateAtSurface.globalPosition();
177  if (pt.perp() < diskOuterRadius_) {
178  if (pt.perp() > diskInnerRadius_) {
179  LogDebug("HGCalTrackCollectionProducer")
180  << "(x,y,z,r)=(" << pt.x() << ", " << pt.y() << ", " << pt.z() << ", "
181  << sqrt(pt.x() * pt.x() + pt.y() * pt.y()) << ")" << std::endl;
182  if (std::abs(track->trackRef()->eta()) < 1.47)
183  LogDebug("HGCalTrackCollectionProducer") << " ETA IN BARREL REGION: " << track->trackRef()->eta()
184  << " (PT: " << track->trackRef()->pt() << ")" << std::endl;
185  found = true;
186  } else {
187  LogDebug("HGCalTrackCollectionProducer")
188  << " but r=" << pt.perp() << " < diskInnerRadius=" << diskInnerRadius_ << " so skipping "
189  << std::endl;
190  }
191  } else {
192  LogDebug("HGCalTrackCollectionProducer")
193  << " but r=" << pt.perp() << " > diskOuterRadius=" << diskOuterRadius_ << " so skipping " << std::endl;
194  }
195  } else {
196  LogDebug("HGCalTrackCollectionProducer") << "Extrapolation is NOT valid!" << std::endl;
197  }
198  }
199  }
200  if (found) {
201  LogDebug("HGCalTrackCollectionProducer") << " Track going to outputInHGCal pt eta " << track->trackRef()->pt()
202  << " " << track->trackRef()->eta() << std::endl;
203  outputInHGCal->push_back(*track);
204  } else {
205  outputNotInHGCal->push_back(*track);
206  }
207  } // track loop
208 
209  evt.put(std::move(outputInHGCal), "TracksInHGCal");
210  evt.put(std::move(outputNotInHGCal), "TracksNotInHGCal");
211 }
212 
std::array< edm::ESGetToken< HGCalGeometry, IdealGeometryRecord >, 1 > hgcGeometryTokens_
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
bool goodPtResolution(const reco::TrackRef &, const std::vector< double > &DPtovPtCut, const std::vector< unsigned > &NHitCut, bool useIterTracking, const reco::TrackBase::TrackQuality trackQuality)
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:133
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
Quality qualityByName(std::string const &name)
TrajectoryStateOnSurface outerStateOnSurface(const reco::Track &tk, const TrackingGeometry &geom, const MagneticField *field, bool withErr=true)
T z() const
Definition: PV3DBase.h:61
TrackQuality
track quality
Definition: TrackBase.h:150
std::array< std::string, 1 > hgc_names_
ParameterSet const & getParameterSet(std::string const &) const
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:526
std::array< std::vector< ReferenceCountingPointer< BoundDisk > >, 1 > minusSurface_
const std::vector< unsigned > NHitCut_
edm::EDGetTokenT< edm::View< reco::PFRecTrack > > src_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
const edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > magneticFieldToken_
GlobalPoint globalPosition() const
std::array< const HGCalGeometry *, 1 > hgcGeometries_
T sqrt(T t)
Definition: SSEVec.h:23
std::unique_ptr< PropagatorWithMaterial > mat_prop_
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
Transition
Definition: Transition.h:12
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
const edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > tkerGeomToken_
void beginLuminosityBlock(const edm::LuminosityBlock &, const edm::EventSetup &) override
HGCalTrackCollectionProducer(const edm::ParameterSet &)
const reco::TrackBase::TrackQuality trackQuality_
void add(std::string const &label, ParameterSetDescription const &psetDescription)
Disk BoundDisk
Definition: BoundDisk.h:54
const std::vector< double > DPtovPtCut_
std::array< std::vector< ReferenceCountingPointer< BoundDisk > >, 1 > plusSurface_
std::vector< HGCalParameters::hgtrform > getTrForms() const
fixed size matrix
HLT enums.
void produce(edm::Event &, const edm::EventSetup &) override
def move(src, dest)
Definition: eostools.py:511
#define LogDebug(id)