CMS 3D CMS Logo

MkFitProducer.cc
Go to the documentation of this file.
2 
7 
12 
19 
20 // mkFit includes
21 #include "ConfigWrapper.h"
22 #include "LayerNumberConverter.h"
23 #include "mkFit/buildtestMPlex.h"
24 #include "mkFit/IterationConfig.h"
25 #include "mkFit/MkBuilderWrapper.h"
26 
27 // TBB includes
28 #include "tbb/task_arena.h"
29 
30 // std includes
31 #include <functional>
32 
33 class MkFitProducer : public edm::global::EDProducer<edm::StreamCache<mkfit::MkBuilderWrapper>> {
34 public:
35  explicit MkFitProducer(edm::ParameterSet const& iConfig);
36  ~MkFitProducer() override = default;
37 
38  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
39 
40  std::unique_ptr<mkfit::MkBuilderWrapper> beginStream(edm::StreamID) const override;
41 
42 private:
43  void produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const override;
44 
45  void stripClusterChargeCut(const std::vector<float>& stripClusterCharge, std::vector<bool>& mask) const;
46 
57  std::function<double(mkfit::Event&, mkfit::MkBuilder&)> buildFunction_;
58  const float minGoodStripCharge_;
59  const bool seedCleaning_;
60  const bool backwardFitInCMSSW_;
61  const bool removeDuplicates_;
62  const bool mkFitSilent_;
63  const bool limitConcurrency_;
64 };
65 
67  : pixelHitsToken_{consumes(iConfig.getParameter<edm::InputTag>("pixelHits"))},
68  stripHitsToken_{consumes(iConfig.getParameter<edm::InputTag>("stripHits"))},
69  stripClusterChargeToken_{consumes(iConfig.getParameter<edm::InputTag>("stripHits"))},
70  eventOfHitsToken_{consumes(iConfig.getParameter<edm::InputTag>("eventOfHits"))},
71  seedToken_{consumes(iConfig.getParameter<edm::InputTag>("seeds"))},
72  mkFitGeomToken_{esConsumes()},
73  mkFitIterConfigToken_{esConsumes(iConfig.getParameter<edm::ESInputTag>("config"))},
74  putToken_{produces<MkFitOutputWrapper>()},
75  minGoodStripCharge_{static_cast<float>(
76  iConfig.getParameter<edm::ParameterSet>("minGoodStripCharge").getParameter<double>("value"))},
77  seedCleaning_{iConfig.getParameter<bool>("seedCleaning")},
78  backwardFitInCMSSW_{iConfig.getParameter<bool>("backwardFitInCMSSW")},
79  removeDuplicates_{iConfig.getParameter<bool>("removeDuplicates")},
80  mkFitSilent_{iConfig.getUntrackedParameter<bool>("mkFitSilent")},
81  limitConcurrency_{iConfig.getUntrackedParameter<bool>("limitConcurrency")} {
82  const auto clustersToSkip = iConfig.getParameter<edm::InputTag>("clustersToSkip");
83  if (not clustersToSkip.label().empty()) {
84  pixelMaskToken_ = consumes(clustersToSkip);
85  stripMaskToken_ = consumes(clustersToSkip);
86  }
87 
88  const auto build = iConfig.getParameter<std::string>("buildingRoutine");
89  if (build == "bestHit") {
90  //buildFunction_ = mkfit::runBuildingTestPlexBestHit;
91  throw cms::Exception("Configuration") << "bestHit is temporarily disabled";
92  } else if (build == "standard") {
93  //buildFunction_ = mkfit::runBuildingTestPlexStandard;
94  throw cms::Exception("Configuration") << "standard is temporarily disabled";
95  } else if (build == "cloneEngine") {
96  //buildFunction_ = mkfit::runBuildingTestPlexCloneEngine;
97  } else {
98  throw cms::Exception("Configuration")
99  << "Invalid value for parameter 'buildingRoutine' " << build << ", allowed are bestHit, standard, cloneEngine";
100  }
101 
102  // TODO: what to do when we have multiple instances of MkFitProducer in a job?
103  mkfit::MkBuilderWrapper::populate();
104  mkfit::ConfigWrapper::initializeForCMSSW(mkFitSilent_);
105 }
106 
109 
110  desc.add("pixelHits", edm::InputTag("mkFitSiPixelHits"));
111  desc.add("stripHits", edm::InputTag("mkFitSiStripHits"));
112  desc.add("eventOfHits", edm::InputTag("mkFitEventOfHits"));
113  desc.add("seeds", edm::InputTag("mkFitSeedConverter"));
114  desc.add("clustersToSkip", edm::InputTag());
115  desc.add<std::string>("buildingRoutine", "cloneEngine")
116  ->setComment("Valid values are: 'bestHit', 'standard', 'cloneEngine'");
117  desc.add<edm::ESInputTag>("config")->setComment(
118  "ESProduct that has the mkFit configuration parameters for this iteration");
119  desc.add("seedCleaning", true)->setComment("Clean seeds within mkFit");
120  desc.add("removeDuplicates", true)->setComment("Run duplicate removal within mkFit");
121  desc.add("backwardFitInCMSSW", false)
122  ->setComment("Do backward fit (to innermost hit) in CMSSW (true) or mkFit (false)");
123  desc.addUntracked("mkFitSilent", true)->setComment("Allows to enables printouts from mkFit with 'False'");
124  desc.addUntracked("limitConcurrency", false)
125  ->setComment(
126  "Use tbb::task_arena to limit the internal concurrency to 1; useful only for timing studies when measuring "
127  "the module time");
128 
130  descCCC.add<double>("value");
131  desc.add("minGoodStripCharge", descCCC);
132 
133  descriptions.add("mkFitProducerDefault", desc);
134 }
135 
136 std::unique_ptr<mkfit::MkBuilderWrapper> MkFitProducer::beginStream(edm::StreamID iID) const {
137  return std::make_unique<mkfit::MkBuilderWrapper>();
138 }
139 
140 namespace {
141  std::once_flag geometryFlag;
142 }
144  const auto& pixelHits = iEvent.get(pixelHitsToken_);
145  const auto& stripHits = iEvent.get(stripHitsToken_);
146  const auto& eventOfHits = iEvent.get(eventOfHitsToken_);
147  const auto& seeds = iEvent.get(seedToken_);
148  // This producer does not strictly speaking need the MkFitGeometry,
149  // but the ESProducer sets global variables (yes, that "feature"
150  // should be removed), so getting the MkFitGeometry makes it
151  // sure that the ESProducer is called even if the input/output
152  // converters
153  const auto& mkFitGeom = iSetup.getData(mkFitGeomToken_);
154  const auto& mkFitIterConfig = iSetup.getData(mkFitIterConfigToken_);
155 
156  const std::vector<bool>* pixelMaskPtr = nullptr;
157  std::vector<bool> pixelMask;
158  std::vector<bool> stripMask(stripHits.hits().size(), false);
159  if (not pixelMaskToken_.isUninitialized()) {
160  const auto& pixelContainerMask = iEvent.get(pixelMaskToken_);
161  pixelMask.resize(pixelContainerMask.size(), false);
162  if UNLIKELY (pixelContainerMask.refProd().id() != pixelHits.clustersID()) {
163  throw cms::Exception("LogicError") << "MkFitHitWrapper has pixel cluster ID " << pixelHits.clustersID()
164  << " but pixel cluster mask has " << pixelContainerMask.refProd().id();
165  }
166  pixelContainerMask.copyMaskTo(pixelMask);
167  pixelMaskPtr = &pixelMask;
168 
169  const auto& stripContainerMask = iEvent.get(stripMaskToken_);
170  if UNLIKELY (stripContainerMask.refProd().id() != stripHits.clustersID()) {
171  throw cms::Exception("LogicError") << "MkFitHitWrapper has strip cluster ID " << stripHits.clustersID()
172  << " but strip cluster mask has " << stripContainerMask.refProd().id();
173  }
174  stripContainerMask.copyMaskTo(stripMask);
175  } else {
177  }
178 
179  // Initialize the number of layers, has to be done exactly once in
180  // the whole program.
181  // TODO: the mechanism needs to be improved...
182  std::call_once(geometryFlag, [nlayers = mkFitGeom.layerNumberConverter().nLayers()]() {
183  mkfit::ConfigWrapper::setNTotalLayers(nlayers);
184  });
185 
186  // seeds need to be mutable because of the possible cleaning
187  auto seeds_mutable = seeds.seeds();
189 
190  auto lambda = [&]() {
191  mkfit::run_OneIteration(mkFitGeom.trackerInfo(),
192  mkFitIterConfig,
193  eventOfHits.get(),
194  {pixelMaskPtr, &stripMask},
195  streamCache(iID)->get(),
196  seeds_mutable,
197  tracks,
201  };
202 
203  if (limitConcurrency_) {
204  tbb::task_arena arena(1);
205  arena.execute(std::move(lambda));
206  } else {
207  tbb::this_task_arena::isolate(std::move(lambda));
208  }
209 
211 }
212 
213 void MkFitProducer::stripClusterChargeCut(const std::vector<float>& stripClusterCharge, std::vector<bool>& mask) const {
214  if (mask.size() != stripClusterCharge.size()) {
215  throw cms::Exception("LogicError") << "Mask size (" << mask.size() << ") inconsistent with number of hits ("
216  << stripClusterCharge.size() << ")";
217  }
218  for (int i = 0, end = stripClusterCharge.size(); i < end; ++i) {
219  // mask == true means skip the cluster
220  mask[i] = mask[i] || (stripClusterCharge[i] <= minGoodStripCharge_);
221  }
222 }
223 
edm::StreamID
Definition: StreamID.h:30
SiStripClusterfwd.h
MkFitSeedWrapper.h
MkFitProducer::seedToken_
const edm::EDGetTokenT< MkFitSeedWrapper > seedToken_
Definition: MkFitProducer.cc:51
mps_fire.i
i
Definition: mps_fire.py:428
edm::ESInputTag
Definition: ESInputTag.h:87
edm::ParameterSetDescription::add
ParameterDescriptionBase * add(U const &iLabel, T const &value)
Definition: ParameterSetDescription.h:95
MkFitProducer::removeDuplicates_
const bool removeDuplicates_
Definition: MkFitProducer.cc:61
MkFitProducer::stripHitsToken_
const edm::EDGetTokenT< MkFitHitWrapper > stripHitsToken_
Definition: MkFitProducer.cc:48
ContainerMask.h
MkFitProducer
Definition: MkFitProducer.cc:33
MkFitProducer::putToken_
const edm::EDPutTokenT< MkFitOutputWrapper > putToken_
Definition: MkFitProducer.cc:56
ESHandle.h
HLT_FULL_cff.clustersToSkip
clustersToSkip
Definition: HLT_FULL_cff.py:10036
edm::EDGetTokenT< MkFitHitWrapper >
edm::EDPutTokenT< MkFitOutputWrapper >
MkFitProducer::pixelMaskToken_
edm::EDGetTokenT< edm::ContainerMask< edmNew::DetSetVector< SiPixelCluster > > > pixelMaskToken_
Definition: MkFitProducer.cc:52
MkFitProducer::stripMaskToken_
edm::EDGetTokenT< edm::ContainerMask< edmNew::DetSetVector< SiStripCluster > > > stripMaskToken_
Definition: MkFitProducer.cc:53
SiPixelCluster.h
edm::ParameterSetDescription
Definition: ParameterSetDescription.h:52
TrackerRecoGeometryRecord.h
MkFitOutputWrapper.h
edm::EDGetTokenT::isUninitialized
constexpr bool isUninitialized() const noexcept
Definition: EDGetToken.h:99
MkFitProducer::backwardFitInCMSSW_
const bool backwardFitInCMSSW_
Definition: MkFitProducer.cc:60
newFWLiteAna.build
build
Definition: newFWLiteAna.py:126
UNLIKELY
#define UNLIKELY(x)
Definition: Likely.h:21
MakerMacros.h
MkFitProducer::buildFunction_
std::function< double(mkfit::Event &, mkfit::MkBuilder &)> buildFunction_
Definition: MkFitProducer.cc:57
DEFINE_FWK_MODULE
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
edm::ConfigurationDescriptions::add
void add(std::string const &label, ParameterSetDescription const &psetDescription)
Definition: ConfigurationDescriptions.cc:57
MkFitEventOfHits.h
mps_fire.end
end
Definition: mps_fire.py:242
MkFitProducer::mkFitSilent_
const bool mkFitSilent_
Definition: MkFitProducer.cc:62
MkFitProducer::produce
void produce(edm::StreamID, edm::Event &iEvent, const edm::EventSetup &iSetup) const override
Definition: MkFitProducer.cc:143
edm::global::EDProducer
Definition: EDProducer.h:32
edm::ConfigurationDescriptions
Definition: ConfigurationDescriptions.h:28
MkFitProducer::minGoodStripCharge_
const float minGoodStripCharge_
Definition: MkFitProducer.cc:58
mkfit::TrackVec
std::vector< Track > TrackVec
Definition: MkFitOutputWrapper.h:8
edm::ParameterSet
Definition: ParameterSet.h:47
Event.h
tracks
const uint32_t *__restrict__ const HitContainer *__restrict__ TkSoA *__restrict__ tracks
Definition: CAHitNtupletGeneratorKernelsImpl.h:176
MkFitProducer::beginStream
std::unique_ptr< mkfit::MkBuilderWrapper > beginStream(edm::StreamID) const override
Definition: MkFitProducer.cc:136
iEvent
int iEvent
Definition: GenABIO.cc:224
MkFitProducer::stripClusterChargeToken_
const edm::EDGetTokenT< std::vector< float > > stripClusterChargeToken_
Definition: MkFitProducer.cc:49
MkFitProducer::limitConcurrency_
const bool limitConcurrency_
Definition: MkFitProducer.cc:63
MkFitProducer::stripClusterChargeCut
void stripClusterChargeCut(const std::vector< float > &stripClusterCharge, std::vector< bool > &mask) const
Definition: MkFitProducer.cc:213
edm::EventSetup
Definition: EventSetup.h:58
MkFitProducer::~MkFitProducer
~MkFitProducer() override=default
AlCaHLTBitMon_QueryRunRegistry.string
string string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
edm::ESGetToken< MkFitGeometry, TrackerRecoGeometryRecord >
InitialStepPreSplitting_cff.eventOfHits
eventOfHits
Definition: InitialStepPreSplitting_cff.py:154
edm::EventSetup::getData
bool getData(T &iHolder) const
Definition: EventSetup.h:127
MkFitProducer::eventOfHitsToken_
const edm::EDGetTokenT< MkFitEventOfHits > eventOfHitsToken_
Definition: MkFitProducer.cc:50
submitPVResolutionJobs.desc
string desc
Definition: submitPVResolutionJobs.py:251
eostools.move
def move(src, dest)
Definition: eostools.py:511
DetachedQuadStep_cff.seeds
seeds
Definition: DetachedQuadStep_cff.py:195
MkFitProducer::fillDescriptions
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Definition: MkFitProducer.cc:107
Exception
Definition: hltDiff.cc:245
HiBiasedCentrality_cfi.function
function
Definition: HiBiasedCentrality_cfi.py:4
edm::ParameterSet::getParameter
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
MkFitProducer::pixelHitsToken_
const edm::EDGetTokenT< MkFitHitWrapper > pixelHitsToken_
Definition: MkFitProducer.cc:47
MkFitProducer::mkFitIterConfigToken_
const edm::ESGetToken< mkfit::IterationConfig, TrackerRecoGeometryRecord > mkFitIterConfigToken_
Definition: MkFitProducer.cc:55
ParameterSet.h
edm::EDConsumerBase::consumes
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
Definition: EDConsumerBase.h:159
EDProducer.h
DeDxTools::esConsumes
ESGetTokenH3DDVariant esConsumes(std::string const &Reccord, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
edm::Event
Definition: Event.h:73
MkFitProducer::mkFitGeomToken_
const edm::ESGetToken< MkFitGeometry, TrackerRecoGeometryRecord > mkFitGeomToken_
Definition: MkFitProducer.cc:54
InitialStepPreSplitting_cff.pixelHits
pixelHits
Definition: InitialStepPreSplitting_cff.py:142
MkFitProducer::seedCleaning_
const bool seedCleaning_
Definition: MkFitProducer.cc:59
DetSetVectorNew.h
edm::InputTag
Definition: InputTag.h:15
MkFitProducer::MkFitProducer
MkFitProducer(edm::ParameterSet const &iConfig)
Definition: MkFitProducer.cc:66
MkFitGeometry.h
nlayers
Definition: HIMultiTrackSelector.h:48
MkFitHitWrapper.h