243 std::vector<const HitDoublets *> hitDoublets;
254 const int numberOfHitsInNtuplet = 4;
255 std::vector<CACell::CAntuplet> foundQuadruplets;
260 for(
const auto& regionLayerPairs: regionDoublets) {
264 foundQuadruplets.clear();
266 createGraphStructure(layers, g);
269 clearGraphStructure(layers, g);
272 fillGraph(layers, g, hitDoublets,
275 std::vector<const HitDoublets *>& hitDoublets) {
277 auto found = std::find_if(regionLayerPairs.begin(), regionLayerPairs.end(),
278 std::bind(layerPairEqual, _1, inner.
index(), outer.
index()));
279 if(
found != regionLayerPairs.end()) {
280 hitDoublets.emplace_back(&(
found->doublets()));
288 ca.createAndConnectCells(hitDoublets, region,
caThetaCut,
291 ca.evolve(numberOfHitsInNtuplet);
293 ca.findNtuplets(foundQuadruplets, numberOfHitsInNtuplet);
299 std::array<float, 4> bc_r;
300 std::array<float, 4> bc_z;
301 std::array<float, 4> bc_errZ2;
302 std::array<GlobalPoint, 4> gps;
303 std::array<GlobalError, 4> ges;
304 std::array<bool, 4> barrels;
305 bool hasAlreadyPushedACandidate =
false;
307 unsigned int previousfourthLayerId = 0;
308 std::array<unsigned int, 2> previousCellIds ={{0,0}};
309 unsigned int previousSideId = 0;
310 int previousSubDetId = 0;
312 unsigned int numberOfFoundQuadruplets = foundQuadruplets.size();
315 for (
unsigned int quadId = 0; quadId < numberOfFoundQuadruplets; ++quadId)
322 for(
unsigned int i = 0;
i< 3; ++
i)
324 auto const& ahit = foundQuadruplets[quadId][
i]->getInnerHit();
325 gps[
i] = ahit->globalPosition();
326 ges[
i] = ahit->globalPositionError();
327 barrels[
i] =
isBarrel(ahit->geographicalId().subdetId());
330 auto const& ahit = foundQuadruplets[quadId][2]->getOuterHit();
331 gps[3] = ahit->globalPosition();
332 ges[3] = ahit->globalPositionError();
333 barrels[3] =
isBarrel(ahit->geographicalId().subdetId());
336 const auto fourthLayerId = tTopo->
layer(ahit->geographicalId());
337 const auto sideId = tTopo->
side(ahit->geographicalId());
338 const auto subDetId = ahit->geographicalId().subdetId();
339 const auto isTheSameTriplet = (quadId != 0) && (foundQuadruplets[quadId][0]->getCellId() == previousCellIds[0]) && (foundQuadruplets[quadId][1]->getCellId() == previousCellIds[1]);
340 const auto isTheSameFourthLayer = (quadId != 0) && (fourthLayerId == previousfourthLayerId) && (
subDetId == previousSubDetId) && (sideId == previousSideId);
342 previousCellIds = {{foundQuadruplets[quadId][0]->getCellId(), foundQuadruplets[quadId][1]->getCellId()}};
343 previousfourthLayerId = fourthLayerId;
346 if(!(isTheSameTriplet && isTheSameFourthLayer ))
349 hasAlreadyPushedACandidate =
false;
361 const float abscurv =
std::abs(curvature);
362 const float thisMaxChi2 = maxChi2Eval.value(abscurv);
365 SeedingHitSet tmpTriplet(foundQuadruplets[quadId][0]->getInnerHit(), foundQuadruplets[quadId][2]->getInnerHit(), foundQuadruplets[quadId][2]->getOuterHit());
374 float chi2 = std::numeric_limits<float>::quiet_NaN();
379 const float simpleCot = ( gps.back().z() - gps.front().z() ) / (gps.back().perp() - gps.front().perp() );
381 for (
int i=0;
i < 4; ++
i)
387 bc_z[
i] = point.
z() - region.
origin().
z();
388 bc_errZ2[
i] = (barrels[
i]) ? error.
czz() : error.
rerr(point)*
sqr(simpleCot);
391 chi2 = rzLine.chi2();
395 RZLine rzLine(gps, ges, barrels);
396 chi2 = rzLine.chi2();
413 if (chi2 < selectedChi2)
416 if(hasAlreadyPushedACandidate)
420 result[
index].emplace_back(foundQuadruplets[quadId][0]->getInnerHit(), foundQuadruplets[quadId][1]->getInnerHit(),foundQuadruplets[quadId][2]->getInnerHit(), foundQuadruplets[quadId][2]->getOuterHit());
421 hasAlreadyPushedACandidate =
true;
426 result[
index].emplace_back(foundQuadruplets[quadId][0]->getInnerHit(), foundQuadruplets[quadId][1]->getInnerHit(), foundQuadruplets[quadId][2]->getInnerHit(), foundQuadruplets[quadId][2]->getOuterHit());
const bool useBendingCorrection
GlobalPoint const & origin() const
unsigned int side(const DetId &id) const
std::unique_ptr< SeedComparitor > theComparitor
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e g
T inversePt(T curvature, const edm::EventSetup &iSetup)
T curvature(T InversePt, const edm::EventSetup &iSetup)
Abs< T >::type abs(const T &t)
const float extraHitRPhitolerance
const bool fitFastCircleChi2Cut
unsigned short LayerIndex
const QuantityDependsPt maxChi2
T rerr(const GlobalPoint &aPoint) const
unsigned int layer(const DetId &id) const
Square< F >::type sqr(const F &f)
const bool caOnlyOneLastHitPerLayerFilter
QuantityDependsPtEval evaluator(const edm::EventSetup &es) const
unsigned int subDetId[20]
T const * product() const
*vegas h *****************************************************used in the default bin number in original ***version of VEGAS is ***a higher bin number might help to derive a more precise ***grade subtle point