35 <<
"--------------------------------------------------------------------\n" 36 <<
"dRMax = " <<
dRMax <<
'\n' 37 <<
"dPhiMax = " <<
dPhiMax <<
'\n' 40 <<
"chi2Max = " <<
chi2Max <<
'\n' 41 <<
"wideSeg = " <<
wideSeg <<
'\n' 60 int recHits_per_layer[6] = {0, 0, 0, 0, 0, 0};
62 if (rechits.size() > 150) {
63 return std::vector<CSCSegment>();
66 for (
unsigned int i = 0;
i < rechits.size();
i++) {
67 recHits_per_layer[rechits[
i]->cscDetId().layer() - 1]++;
68 layerIndex[
i] = rechits[
i]->cscDetId().layer();
73 reverse(layerIndex.begin(), layerIndex.end());
74 reverse(rechits.begin(), rechits.end());
76 if (rechits.size() < 2) {
77 return std::vector<CSCSegment>();
107 std::vector<CSCSegment> segments;
111 aState.windowScale = 1.;
112 bool search_disp =
false;
113 aState.strip_iadd = 1;
114 aState.chi2D_iadd = 1;
115 int npass = (
wideSeg > 1.) ? 3 : 2;
116 for (
int ipass = 0; ipass < npass; ++ipass) {
117 if (aState.windowScale > 1.) {
119 aState.strip_iadd = 4;
120 aState.chi2D_iadd = 4;
122 if (rechits.size() <= 12)
133 if (aState.doCollisions && search_disp &&
134 int(rechits.size() - used_rh) >
136 aState.doCollisions =
false;
137 aState.windowScale = 1.;
139 aState.dPhiMax = 4 * aState.dPhiMax;
140 aState.dRIntMax = 4 * aState.dRIntMax;
141 aState.dPhiIntMax = 4 * aState.dPhiIntMax;
142 aState.chi2Norm_2D_ = 10 * aState.chi2Norm_2D_;
143 aState.chi2_str_ = 200;
144 aState.chi2Max = 4 * aState.chi2Max;
149 for (
unsigned int n_seg_min = 6u; n_seg_min > 2u + iadd; --n_seg_min) {
151 std::array<BoolContainer, 120> common_used_it = {};
152 for (
unsigned int i = 0;
i < common_used_it.size();
i++) {
153 common_used_it[
i] = common_used;
156 float min_chi[120] = {9999};
158 bool first_proto_segment =
true;
162 if (used[
i1 -
ib] || recHits_per_layer[
int(layerIndex[
i1 -
ib]) - 1] > 25 ||
163 (n_seg_min == 3 && used3p[
i1 -
ib]))
165 int layer1 = layerIndex[
i1 -
ib];
168 if (used[
i2 -
ib] || recHits_per_layer[
int(layerIndex[
i2 -
ib]) - 1] > 25 ||
169 (n_seg_min == 3 && used3p[
i2 -
ib]))
171 int layer2 = layerIndex[
i2 -
ib];
172 if ((
abs(layer2 - layer1) + 1) <
int(n_seg_min))
176 aState.proto_segment.clear();
177 if (!
addHit(aState, h1, layer1))
179 if (!
addHit(aState, h2, layer2))
186 if (aState.proto_segment.size() > n_seg_min) {
190 if (aState.sfit->chi2() > aState.chi2Norm_2D_ * aState.chi2D_iadd ||
191 aState.proto_segment.size() < n_seg_min)
192 aState.proto_segment.clear();
193 if (!aState.proto_segment.empty()) {
196 if (first_proto_segment) {
198 min_chi[0] = aState.sfit->chi2();
199 best_proto_segment[0] = aState.proto_segment;
200 first_proto_segment =
false;
204 min_chi[common_it] = aState.sfit->chi2();
205 best_proto_segment[common_it] = aState.proto_segment;
207 int iter = common_it;
208 for (iu =
ib; iu != ie; ++iu) {
209 for (
hi = aState.proto_segment.begin();
hi != aState.proto_segment.end(); ++
hi) {
212 for (
int k = 0;
k < iter + 1;
k++) {
213 if (common_used_it[
k][iu -
ib] ==
true) {
214 if (merge_nr != -1) {
216 for (ik =
ib; ik != ie; ++ik) {
217 if (common_used_it[
k][ik -
ib] ==
true) {
218 common_used_it[merge_nr][ik -
ib] =
true;
219 common_used_it[
k][ik -
ib] =
false;
223 if (min_chi[
k] < min_chi[merge_nr]) {
224 min_chi[merge_nr] = min_chi[
k];
225 best_proto_segment[merge_nr] = best_proto_segment[
k];
226 best_proto_segment[
k].clear();
248 for (
int j = 0;
j < common_it + 1;
j++) {
249 aState.proto_segment = best_proto_segment[
j];
250 best_proto_segment[
j].clear();
252 if (aState.proto_segment.empty())
257 aState.sfit->intercept(),
258 aState.sfit->localdir(),
259 aState.sfit->covarianceMatrix(),
260 aState.sfit->chi2());
261 aState.sfit =
nullptr;
262 segments.push_back(
temp);
264 if (aState.proto_segment.size() == 3) {
269 aState.proto_segment.clear();
276 aState.doCollisions =
true;
278 aState.chi2_str_ = 100;
279 aState.dPhiMax = 0.25 * aState.dPhiMax;
280 aState.dRIntMax = 0.25 * aState.dRIntMax;
281 aState.dPhiIntMax = 0.25 * aState.dPhiIntMax;
282 aState.chi2Norm_2D_ = 0.1 * aState.chi2Norm_2D_;
283 aState.chi2Max = 0.25 * aState.chi2Max;
286 std::vector<CSCSegment>::iterator
it = segments.begin();
287 bool good_segs =
false;
288 while (
it != segments.end()) {
289 if ((*it).nRecHits() > 3) {
296 aState.doCollisions) {
302 if (!aState.doCollisions && !search_disp)
308 std::vector<CSCSegment>::iterator
it = segments.begin();
309 while (
it != segments.end()) {
310 if ((*it).nRecHits() == 3) {
311 bool found_common =
false;
312 const std::vector<CSCRecHit2D>& theseRH = (*it).specificRecHits();
314 if (used[
i1 -
ib] && used3p[
i1 -
ib]) {
317 int sh1layer =
id.
layer();
318 int RH_centerid = sh1->
nStrips() / 2;
319 int RH_centerStrip = sh1->
channels(RH_centerid);
321 std::vector<CSCRecHit2D>::const_iterator sh;
322 for (sh = theseRH.begin(); sh != theseRH.end(); ++sh) {
325 int shlayer = idRH.
layer();
326 int SegRH_centerid = sh->nStrips() / 2;
327 int SegRH_centerStrip = sh->channels(SegRH_centerid);
328 int SegRH_wg = sh->hitWire();
329 if (sh1layer == shlayer && SegRH_centerStrip == RH_centerStrip && SegRH_wg == RH_wg) {
331 segments.erase(
it, (
it + 1));
372 if (layerIndex[
i -
ib] == layerIndex[
i1 -
ib] || layerIndex[
i -
ib] == layerIndex[
i2 -
ib] || used[
i -
ib])
390 float maxWG_width[10] = {0, 0, 4.1, 5.69, 2.49, 5.06, 2.49, 5.06, 1.87, 5.06};
395 if (iStn == 0 || iStn == 1) {
397 maxWG_width[0] = 9.25;
398 maxWG_width[1] = 9.25;
400 if (wg_num > 1 && wg_num < 48) {
401 maxWG_width[0] = 3.14;
402 maxWG_width[1] = 3.14;
405 maxWG_width[0] = 10.75;
406 maxWG_width[1] = 10.75;
430 float strip_width[10] = {0.003878509,
449 if (err_stpos_h1 > 0.25 * strip_width[iStn] || err_stpos_h2 > 0.25 * strip_width[iStn])
450 dphi_incr = 0.5 * strip_width[iStn];
460 float strip_width[10] = {0.003878509,
474 float err_stpos_h1 = (*(aState.
proto_segment.begin()))->errorWithinStrip();
475 float err_stpos_h2 = (*(aState.
proto_segment.begin() + 1))->errorWithinStrip();
478 float err_stpos_h =
h->errorWithinStrip();
479 float hphi =
hp.phi();
482 float sphi =
phiAtZ(aState,
hp.z());
483 float phidif = sphi - hphi;
490 int iStn =
id.iChamberType() - 1;
494 float stpos = (*h).positionWithinStrip();
495 bool centr_str =
false;
496 if (iStn != 0 && iStn != 1) {
497 if (stpos > -0.25 && stpos < 0.25)
500 if (err_stpos_h1 < 0.25 * strip_width[iStn] || err_stpos_h2 < 0.25 * strip_width[iStn] ||
501 err_stpos_h < 0.25 * strip_width[iStn]) {
502 dphi_incr = 0.5 * strip_width[iStn];
508 r_glob((*(aState.
proto_segment.begin() + 1))->cscDetId().layer() - 1) = gp2.
perp();
510 int layer =
h->cscDetId().layer();
512 float dr = fabs(r_interpolated -
R);
513 float maxWG_width[10] = {0, 0, 4.1, 5.69, 2.49, 5.06, 2.49, 5.06, 1.87, 5.06};
515 int wg_num =
h->hitWire();
516 if (iStn == 0 || iStn == 1) {
518 maxWG_width[0] = 9.25;
519 maxWG_width[1] = 9.25;
521 if (wg_num > 1 && wg_num < 48) {
522 maxWG_width[0] = 3.14;
523 maxWG_width[1] = 3.14;
526 maxWG_width[0] = 10.75;
527 maxWG_width[1] = 10.75;
543 float x =
gp.x() + (gv.
x() / gv.
z()) * (
z -
gp.z());
544 float y =
gp.y() + (gv.
y() / gv.
z()) * (
z -
gp.z());
545 float phi = atan2(
y,
x);
557 unsigned int iadd = (rechitsInChamber.size() > 20) ? 1 : 0;
560 if (rechitsInChamber.size() <= 12)
575 for (iu =
ib; iu != rechitsInChamber.end(); ++iu) {
577 used[iu -
ib] =
true;
586 ChamberHitContainer::const_iterator
it;
588 if (((*it)->cscDetId().layer() ==
layer) && (aHit != (*
it)))
609 for (
int i = 1;
i < 7;
i++) {
610 if (points(
i - 1) == 0.)
612 Sy = Sy + (points(
i - 1));
615 Sxy = Sxy + ((
i)*points(
i - 1));
617 float delta = 2 * Sxx - Sx * Sx;
618 float intercept = (Sxx * Sy - Sx * Sxy) /
delta;
631 buffer.reserve(init_size);
632 while (
buffer.size() < init_size) {
633 ChamberHitContainer::iterator
min;
657 int kRing = idRH.
ring();
661 int centerid = iRHp->
nStrips() / 2;
662 int centerStrip = iRHp->
channels(centerid);
663 float stpos = (*iRHp).positionWithinStrip();
664 se(
kLayer - 1) = (*iRHp).errorWithinStrip();
666 if (kStation == 1 && (kRing == 1 || kRing == 4))
667 sp(
kLayer - 1) = stpos + centerStrip;
670 sp(
kLayer - 1) = stpos + centerStrip;
672 sp(
kLayer - 1) = stpos - 0.5 + centerStrip;
684 ChamberHitContainer::const_iterator rh_to_be_deleted_1;
685 ChamberHitContainer::const_iterator rh_to_be_deleted_2;
691 int z1 = idRH1.
layer();
700 if (ir ==
i1 || ir ==
i2)
705 int worst_layer = idRH.
layer();
709 if (
i ==
i1 ||
i ==
i2 ||
i == ir)
711 float slope = (sp(
z2 - 1) - sp(z1 - 1)) / (
z2 - z1);
712 float intersept = sp(z1 - 1) -
slope * z1;
715 float di = fabs(sp(
z - 1) - intersept -
slope *
z);
720 bad_layer = worst_layer;
722 rh_to_be_deleted_1 = ir;
740 int z1 = idRH1.
layer();
750 if (ir ==
i1 || ir ==
i2)
754 int worst_layer = idRH.
layer();
755 for (ChamberHitContainer::const_iterator ir2 = aState.
proto_segment.begin();
759 if (ir2 ==
i1 || ir2 ==
i2 || ir2 == ir)
764 int worst_layer2 = idRH.
layer();
768 if (
i ==
i1 ||
i ==
i2 ||
i == ir ||
i == ir2)
770 float slope = (sp(
z2 - 1) - sp(z1 - 1)) / (
z2 - z1);
771 float intersept = sp(z1 - 1) -
slope * z1;
774 float di = fabs(sp(
z - 1) - intersept -
slope *
z);
781 bad_layer = worst_layer;
782 bad_layer2 = worst_layer2;
783 rh_to_be_deleted_1 = ir;
784 rh_to_be_deleted_2 = ir2;
796 if (iworst2 - 1 >= 0 && iworst2 <=
int(aState.
proto_segment.size())) {
799 if (iworst - 1 >= 0 && iworst <=
int(aState.
proto_segment.size())) {
812 for (
int i = 1;
i < 7;
i++) {
813 if (
i == ir ||
i == ir2 || points(
i - 1) == 0.)
817 S =
S + (1 / sigma2);
818 Sy = Sy + (points(
i - 1) / sigma2);
819 Sx = Sx + ((
i1) / sigma2);
820 Sxx = Sxx + (
i1 *
i1) / sigma2;
821 Sxy = Sxy + (((
i1)*points(
i - 1)) / sigma2);
823 float delta =
S * Sxx - Sx * Sx;
824 float intercept = (Sxx * Sy - Sx * Sxy) /
delta;
829 for (
int i = 1;
i < 7;
i++) {
830 if (
i == ir ||
i == ir2 || points(
i - 1) == 0.)
832 chi_str = (points(
i - 1) - intercept -
slope * (
i - 3.5)) / (
errors(
i - 1));
835 return (intercept +
slope * 0);
842 if ((*it)->cscDetId().layer() ==
layer)
849 ChamberHitContainer::const_iterator
it;
851 if ((*it)->cscDetId().layer() ==
layer)
861 std::unique_ptr<CSCSegFit> oldfit;
868 if ((aState.
sfit->chi2() >= oldfit->chi2()) || !
ok) {
877 std::unique_ptr<CSCSegFit> oldfit;
884 if (!
ok || ((aState.
sfit->ndof() > 0) && (aState.
sfit->chi2() / aState.
sfit->ndof() >= aState.
chi2Max))) {
T getParameter(std::string const &) const
unsigned int nStrips() const
const CSCLayer * layer(CSCDetId id) const
Return the layer corresponding to the given id.
std::vector< const CSCRecHit2D * >::const_iterator ChamberHitContainerCIt
void baseline(AlgoState &aState, int n_seg_min) const
bool areHitsCloseInR(const AlgoState &aState, const CSCRecHit2D *h1, const CSCRecHit2D *h2) const
Utility functions.
static const double slope[3]
CSCDetId cscDetId() const
std::vector< CSCSegment > buildSegments(const CSCChamber *aChamber, const ChamberHitContainer &rechits) const
float errorWithinStrip() const
The uncertainty of the estimated position within the strip.
unsigned short iChamberType() const
bool replaceHit(AlgoState &aState, const CSCRecHit2D *h, int layer) const
ChamberHitContainer proto_segment
std::unique_ptr< CSCSegFit > sfit
bool isHitNearSegment(const AlgoState &aState, const CSCRecHit2D *h) const
bool areHitsCloseInGlobalPhi(const AlgoState &aState, const CSCRecHit2D *h1, const CSCRecHit2D *h2) const
void compareProtoSegment(AlgoState &aState, const CSCRecHit2D *h, int layer) const
const CSCChamber * aChamber
float fitX(const AlgoState &aState, SVector6 points, SVector6 errors, int ir, int ir2, float &chi2_str) const
void flagHitsAsUsed(const AlgoState &aState, const ChamberHitContainer &rechitsInChamber, BoolContainer &used) const
float fit_r_phi(const AlgoState &aState, const SVector6 &points, int layer) const
Abs< T >::type abs(const T &t)
static const std::string kLayer("layer")
CSCSegAlgoRU(const edm::ParameterSet &ps)
Constructor.
std::vector< const CSCRecHit2D * > ChamberHitContainer
std::vector< bool > BoolContainer
std::vector< int > LayerIndex
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
void tryAddingHitsToSegment(AlgoState &aState, const ChamberHitContainer &rechitsInChamber, const BoolContainer &used, const LayerIndex &layerIndex, const ChamberHitContainerCIt i1, const ChamberHitContainerCIt i2) const
ROOT::Math::SVector< double, 6 > SVector6
Typedefs.
LocalPoint localPosition() const override
float phiAtZ(const AlgoState &aState, float z) const
void increaseProtoSegment(AlgoState &aState, const CSCRecHit2D *h, int layer, int chi2_factor) const
const Surface::PositionType & position() const
The position (origin of the R.F.)
void updateParameters(AlgoState &aState) const
bool hasHitOnLayer(const AlgoState &aState, int layer) const
int channels(unsigned int i) const
Extracting strip channel numbers comprising the rechit - low.
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
short int hitWire() const
L1A.
bool isSegmentGood(const AlgoState &aState, const ChamberHitContainer &rechitsInChamber) const
bool addHit(AlgoState &aState, const CSCRecHit2D *hit, int layer) const
Utility functions.