21 #include "ConfigWrapper.h"
22 #include "LayerNumberConverter.h"
23 #include "mkFit/buildtestMPlex.h"
24 #include "mkFit/IterationConfig.h"
25 #include "mkFit/MkBuilderWrapper.h"
28 #include "tbb/task_arena.h"
45 void stripClusterChargeCut(
const std::vector<float>& stripClusterCharge, std::vector<bool>& mask)
const;
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"))},
74 putToken_{produces<MkFitOutputWrapper>()},
75 minGoodStripCharge_{static_cast<float>(
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")} {
89 if (
build ==
"bestHit") {
91 throw cms::Exception(
"Configuration") <<
"bestHit is temporarily disabled";
92 }
else if (
build ==
"standard") {
94 throw cms::Exception(
"Configuration") <<
"standard is temporarily disabled";
95 }
else if (
build ==
"cloneEngine") {
99 <<
"Invalid value for parameter 'buildingRoutine' " <<
build <<
", allowed are bestHit, standard, cloneEngine";
103 mkfit::MkBuilderWrapper::populate();
104 mkfit::ConfigWrapper::initializeForCMSSW(mkFitSilent_);
116 ->setComment(
"Valid values are: 'bestHit', 'standard', 'cloneEngine'");
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)
126 "Use tbb::task_arena to limit the internal concurrency to 1; useful only for timing studies when measuring "
130 descCCC.
add<
double>(
"value");
131 desc.add(
"minGoodStripCharge", descCCC);
133 descriptions.
add(
"mkFitProducerDefault",
desc);
137 return std::make_unique<mkfit::MkBuilderWrapper>();
141 std::once_flag geometryFlag;
156 const std::vector<bool>* pixelMaskPtr =
nullptr;
157 std::vector<bool> pixelMask;
158 std::vector<bool> stripMask(stripHits.hits().size(),
false);
161 pixelMask.resize(pixelContainerMask.size(),
false);
164 <<
" but pixel cluster mask has " << pixelContainerMask.refProd().id();
166 pixelContainerMask.copyMaskTo(pixelMask);
167 pixelMaskPtr = &pixelMask;
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();
174 stripContainerMask.copyMaskTo(stripMask);
182 std::call_once(geometryFlag, [
nlayers = mkFitGeom.layerNumberConverter().nLayers()]() {
183 mkfit::ConfigWrapper::setNTotalLayers(
nlayers);
187 auto seeds_mutable =
seeds.seeds();
190 auto lambda = [&]() {
191 mkfit::run_OneIteration(mkFitGeom.trackerInfo(),
194 {pixelMaskPtr, &stripMask},
195 streamCache(iID)->get(),
204 tbb::task_arena arena(1);
207 tbb::this_task_arena::isolate(
std::move(lambda));
214 if (mask.size() != stripClusterCharge.size()) {
215 throw cms::Exception(
"LogicError") <<
"Mask size (" << mask.size() <<
") inconsistent with number of hits ("
216 << stripClusterCharge.size() <<
")";
218 for (
int i = 0,
end = stripClusterCharge.size();
i <
end; ++
i) {