34 <<
"--------------------------------------------------------------------\n" 35 <<
"dRMax = " << dRMax <<
'\n' 36 <<
"dPhiMax = " << dPhiMax <<
'\n' 37 <<
"dRIntMax = " << dRIntMax <<
'\n' 38 <<
"dPhiIntMax = " << dPhiIntMax <<
'\n' 39 <<
"chi2Max = " << chi2Max <<
'\n' 40 <<
"wideSeg = " << wideSeg <<
'\n' 41 <<
"minLayersApart = " << minLayersApart << std::endl;
59 int recHits_per_layer[6] = {0, 0, 0, 0, 0, 0};
61 if (rechits.size() > 150) {
62 return std::vector<CSCSegment>();
65 for (
unsigned int i = 0;
i < rechits.size();
i++) {
66 recHits_per_layer[rechits[
i]->cscDetId().layer() - 1]++;
67 layerIndex[
i] = rechits[
i]->cscDetId().layer();
72 reverse(layerIndex.begin(), layerIndex.end());
73 reverse(rechits.begin(), rechits.end());
75 if (rechits.size() < 2) {
76 return std::vector<CSCSegment>();
106 int scale_factor = 1;
111 std::vector<CSCSegment> segments;
115 aState.windowScale = 1.;
116 bool search_disp =
false;
117 aState.strip_iadd = 1;
118 aState.chi2D_iadd = 1;
119 int npass = (
wideSeg > 1.) ? 3 : 2;
120 for (
int ipass = 0; ipass < npass; ++ipass) {
121 if (aState.windowScale > 1.) {
123 aState.strip_iadd = 2 * scale_factor;
124 aState.chi2D_iadd = 2 * scale_factor;
125 if (aState.enlarge) {
127 if (rechits.size() <= 12)
139 if (aState.doCollisions && search_disp &&
140 int(rechits.size() - used_rh) >
142 aState.doCollisions =
false;
143 aState.windowScale = 1.;
144 aState.dRMax = scale_factor * 2.0;
145 aState.dPhiMax = scale_factor * 2 * aState.dPhiMax;
146 aState.dRIntMax = scale_factor * 2 * aState.dRIntMax;
147 aState.dPhiIntMax = scale_factor * 2 * aState.dPhiIntMax;
148 aState.chi2Norm_2D_ = scale_factor * 5 * aState.chi2Norm_2D_;
149 aState.chi2_str_ = scale_factor * 100;
150 aState.chi2Max = scale_factor * 2 * aState.chi2Max;
155 for (
unsigned int n_seg_min = 6u; n_seg_min > 2u + iadd; --n_seg_min) {
157 std::array<BoolContainer, 120> common_used_it = {};
158 for (
unsigned int i = 0;
i < common_used_it.size();
i++) {
159 common_used_it[
i] = common_used;
162 float min_chi[120] = {9999};
164 bool first_proto_segment =
true;
168 if (used[
i1 - ib] || recHits_per_layer[
int(layerIndex[
i1 - ib]) - 1] > 25 ||
169 (n_seg_min == 3 && used3p[
i1 -
ib]))
171 int layer1 = layerIndex[
i1 -
ib];
174 if (used[
i2 - ib] || recHits_per_layer[
int(layerIndex[
i2 - ib]) - 1] > 25 ||
175 (n_seg_min == 3 && used3p[
i2 -
ib]))
177 int layer2 = layerIndex[
i2 -
ib];
178 if ((
abs(layer2 - layer1) + 1) <
int(n_seg_min))
182 aState.proto_segment.clear();
183 if (!
addHit(aState, h1, layer1))
185 if (!
addHit(aState, h2, layer2))
192 if (aState.proto_segment.size() > n_seg_min) {
196 if (aState.sfit->chi2() > aState.chi2Norm_2D_ * aState.chi2D_iadd ||
197 aState.proto_segment.size() < n_seg_min)
198 aState.proto_segment.clear();
199 if (!aState.proto_segment.empty()) {
202 if (first_proto_segment) {
204 min_chi[0] = aState.sfit->chi2();
205 best_proto_segment[0] = aState.proto_segment;
206 first_proto_segment =
false;
210 min_chi[common_it] = aState.sfit->chi2();
211 best_proto_segment[common_it] = aState.proto_segment;
213 int iter = common_it;
214 for (iu = ib; iu != ie; ++iu) {
215 for (hi = aState.proto_segment.begin(); hi != aState.proto_segment.end(); ++hi) {
218 for (
int k = 0;
k < iter + 1;
k++) {
219 if (common_used_it[
k][iu - ib] ==
true) {
220 if (merge_nr != -1) {
222 for (ik = ib; ik != ie; ++ik) {
223 if (common_used_it[
k][ik - ib] ==
true) {
224 common_used_it[merge_nr][ik -
ib] =
true;
225 common_used_it[
k][ik -
ib] =
false;
229 if (min_chi[
k] < min_chi[merge_nr]) {
230 min_chi[merge_nr] = min_chi[
k];
231 best_proto_segment[merge_nr] = best_proto_segment[
k];
232 best_proto_segment[
k].clear();
254 for (
int j = 0;
j < common_it + 1;
j++) {
255 aState.proto_segment = best_proto_segment[
j];
256 best_proto_segment[
j].clear();
258 if (aState.proto_segment.empty())
263 aState.sfit->intercept(),
264 aState.sfit->localdir(),
265 aState.sfit->covarianceMatrix(),
266 aState.sfit->chi2());
267 aState.sfit =
nullptr;
268 segments.push_back(
temp);
270 if (aState.proto_segment.size() == 3) {
275 aState.proto_segment.clear();
282 aState.doCollisions =
true;
284 aState.chi2_str_ = 100;
285 aState.dPhiMax = 0.5 * aState.dPhiMax / scale_factor;
286 aState.dRIntMax = 0.5 * aState.dRIntMax / scale_factor;
287 aState.dPhiIntMax = 0.5 * aState.dPhiIntMax / scale_factor;
288 aState.chi2Norm_2D_ = 0.2 * aState.chi2Norm_2D_ / scale_factor;
289 aState.chi2Max = 0.5 * aState.chi2Max / scale_factor;
292 std::vector<CSCSegment>::iterator it = segments.begin();
293 bool good_segs =
false;
294 while (it != segments.end()) {
295 if ((*it).nRecHits() > 3) {
302 aState.doCollisions) {
308 if (!aState.doCollisions && !search_disp)
314 std::vector<CSCSegment>::iterator it = segments.begin();
315 while (it != segments.end()) {
316 if ((*it).nRecHits() == 3) {
317 bool found_common =
false;
318 const std::vector<CSCRecHit2D>& theseRH = (*it).specificRecHits();
320 if (used[
i1 - ib] && used3p[
i1 - ib]) {
323 int sh1layer =
id.
layer();
324 int RH_centerid = sh1->
nStrips() / 2;
325 int RH_centerStrip = sh1->
channels(RH_centerid);
327 std::vector<CSCRecHit2D>::const_iterator sh;
328 for (sh = theseRH.begin(); sh != theseRH.end(); ++sh) {
331 int shlayer = idRH.
layer();
332 int SegRH_centerid = sh->nStrips() / 2;
333 int SegRH_centerStrip = sh->channels(SegRH_centerid);
334 int SegRH_wg = sh->hitWire();
335 if (sh1layer == shlayer && SegRH_centerStrip == RH_centerStrip && SegRH_wg == RH_wg) {
337 segments.erase(it, (it + 1));
375 int layer = layerIndex[
i -
ib];
378 if (layerIndex[
i - ib] == layerIndex[i1 - ib] || layerIndex[
i - ib] == layerIndex[i2 - ib] || used[
i - ib])
396 float maxWG_width[10] = {0, 0, 4.1, 5.69, 2.49, 5.06, 2.49, 5.06, 1.87, 5.06};
401 if (iStn == 0 || iStn == 1) {
403 maxWG_width[0] = 9.25;
404 maxWG_width[1] = 9.25;
406 if (wg_num > 1 && wg_num < 48) {
407 maxWG_width[0] = 3.14;
408 maxWG_width[1] = 3.14;
411 maxWG_width[0] = 10.75;
412 maxWG_width[1] = 10.75;
435 return (gp2.
perp() > ((gp1.
perp() - aState.
dRMax * maxWG_width[iStn]) * h2z) / h1z &&
436 gp2.
perp() < ((gp1.
perp() + aState.
dRMax * maxWG_width[iStn]) * h2z) / h1z)
445 float strip_width[10] = {0.003878509,
464 if (err_stpos_h1 > 0.25 * strip_width[iStn] || err_stpos_h2 > 0.25 * strip_width[iStn])
465 dphi_incr = 0.5 * strip_width[iStn];
467 return (fabs(dphi12) < (aState.
dPhiMax * aState.
strip_iadd + dphi_incr)) ?
true :
false;
475 float strip_width[10] = {0.003878509,
489 float err_stpos_h1 = (*(aState.
proto_segment.begin()))->errorWithinStrip();
490 float err_stpos_h2 = (*(aState.
proto_segment.begin() + 1))->errorWithinStrip();
494 float hphi = hp.
phi();
497 float sphi =
phiAtZ(aState, hp.
z());
498 float phidif = sphi - hphi;
509 float stpos = (*h).positionWithinStrip();
510 bool centr_str =
false;
511 if (iStn != 0 && iStn != 1) {
512 if (stpos > -0.25 && stpos < 0.25)
515 if (err_stpos_h1 < 0.25 * strip_width[iStn] || err_stpos_h2 < 0.25 * strip_width[iStn] ||
516 err_stpos_h < 0.25 * strip_width[iStn]) {
517 dphi_incr = 0.5 * strip_width[iStn];
523 r_glob((*(aState.
proto_segment.begin() + 1))->cscDetId().layer() - 1) = gp2.
perp();
526 float r_interpolated =
fit_r_phi(aState, r_glob, layer);
527 float dr = fabs(r_interpolated - R);
528 float maxWG_width[10] = {0, 0, 4.1, 5.69, 2.49, 5.06, 2.49, 5.06, 1.87, 5.06};
531 if (iStn == 0 || iStn == 1) {
533 maxWG_width[0] = 9.25;
534 maxWG_width[1] = 9.25;
536 if (wg_num > 1 && wg_num < 48) {
537 maxWG_width[0] = 3.14;
538 maxWG_width[1] = 3.14;
541 maxWG_width[0] = 10.75;
542 maxWG_width[1] = 10.75;
554 fabs(dr) < aState.
dRIntMax * maxWG_width[iStn])
567 float x = gp.
x() + (gv.
x() / gv.
z()) * (z - gp.
z());
568 float y = gp.
y() + (gv.
y() / gv.
z()) * (z - gp.
z());
569 float phi = atan2(y, x);
581 unsigned int iadd = (rechitsInChamber.size() > 20) ? 1 : 0;
584 if (rechitsInChamber.size() <= 12 && aState.
enlarge)
599 for (iu = ib; iu != rechitsInChamber.end(); ++iu) {
601 used[iu -
ib] =
true;
610 ChamberHitContainer::const_iterator it;
612 if (((*it)->cscDetId().layer() == layer) && (aHit != (*it)))
633 for (
int i = 1;
i < 7;
i++) {
639 Sxy = Sxy + ((
i)*
points(i - 1));
641 float delta = 2 * Sxx - Sx * Sx;
642 float intercept = (Sxx * Sy - Sx * Sxy) / delta;
643 float slope = (2 * Sxy - Sx * Sy) / delta;
644 return (intercept + slope * layer);
655 buffer.reserve(init_size);
656 while (buffer.size() < init_size) {
657 ChamberHitContainer::iterator
min;
663 if (kLayer < min_layer) {
668 buffer.push_back(*min);
673 for (ChamberHitContainer::const_iterator
cand = buffer.begin();
cand != buffer.end();
cand++) {
681 int kRing = idRH.
ring();
685 int centerid = iRHp->
nStrips() / 2;
686 int centerStrip = iRHp->
channels(centerid);
687 float stpos = (*iRHp).positionWithinStrip();
688 se(kLayer - 1) = (*iRHp).errorWithinStrip();
690 if (kStation == 1 && (kRing == 1 || kRing == 4))
691 sp(kLayer - 1) = stpos + centerStrip;
693 if (kLayer == 1 || kLayer == 3 || kLayer == 5)
694 sp(kLayer - 1) = stpos + centerStrip;
695 if (kLayer == 2 || kLayer == 4 || kLayer == 6)
696 sp(kLayer - 1) = stpos - 0.5 + centerStrip;
700 fitX(aState, sp, se, -1, -1, chi2_str);
710 ChamberHitContainer::const_iterator rh_to_be_deleted_1;
711 ChamberHitContainer::const_iterator rh_to_be_deleted_2;
718 int z1 = idRH1.
layer();
729 if (ir ==
i1 || ir ==
i2)
735 int worst_layer = idRH.
layer();
740 if (
i ==
i1 ||
i ==
i2 ||
i == ir)
742 float slope = (sp(z2 - 1) - sp(z1 - 1)) / (z2 - z1);
743 float intersept = sp(z1 - 1) - slope * z1;
746 float di = fabs(sp(z - 1) - intersept - slope * z);
751 bad_layer = worst_layer;
753 rh_to_be_deleted_1 = ir;
758 fitX(aState, sp, se, bad_layer, -1, chi2_str);
764 if (iworst > -1 && (nhits - 1) > n_seg_min && (chi2_str) > aState.
chi2_str_ * aState.
chi2D_iadd) {
774 int z1 = idRH1.
layer();
786 if (ir ==
i1 || ir ==
i2)
790 int worst_layer = idRH.
layer();
791 for (ChamberHitContainer::const_iterator ir2 = aState.
proto_segment.begin();
795 if (ir2 ==
i1 || ir2 ==
i2 || ir2 == ir)
801 int worst_layer2 = idRH.
layer();
806 if (
i ==
i1 ||
i ==
i2 ||
i == ir ||
i == ir2)
808 float slope = (sp(z2 - 1) - sp(z1 - 1)) / (z2 - z1);
809 float intersept = sp(z1 - 1) - slope * z1;
812 float di = fabs(sp(z - 1) - intersept - slope * z);
819 bad_layer = worst_layer;
820 bad_layer2 = worst_layer2;
821 rh_to_be_deleted_1 = ir;
822 rh_to_be_deleted_2 = ir2;
828 fitX(aState, sp, se, bad_layer, bad_layer2, chi2_str);
834 if (iworst2 - 1 >= 0 && iworst2 <=
int(aState.
proto_segment.size())) {
837 if (iworst - 1 >= 0 && iworst <=
int(aState.
proto_segment.size())) {
850 for (
int i = 1;
i < 7;
i++) {
851 if (
i == ir ||
i == ir2 ||
points(
i - 1) == 0.)
855 S = S + (1 / sigma2);
856 Sy = Sy + (
points(
i - 1) / sigma2);
857 Sx = Sx + ((
i1) / sigma2);
858 Sxx = Sxx + (i1 *
i1) / sigma2;
859 Sxy = Sxy + (((
i1)*
points(
i - 1)) / sigma2);
861 float delta = S * Sxx - Sx * Sx;
862 float intercept = (Sxx * Sy - Sx * Sxy) / delta;
863 float slope = (S * Sxy - Sx * Sy) / delta;
867 for (
int i = 1;
i < 7;
i++) {
868 if (
i == ir ||
i == ir2 ||
points(
i - 1) == 0.)
870 chi_str = (
points(
i - 1) - intercept - slope * (
i - 3.5)) / (
errors(
i - 1));
871 chi2_str = chi2_str + chi_str * chi_str;
873 return (intercept + slope * 0);
880 if ((*it)->cscDetId().layer() == layer)
887 ChamberHitContainer::const_iterator it;
889 if ((*it)->cscDetId().layer() == layer)
894 return addHit(aState, h, layer);
899 std::unique_ptr<CSCSegFit> oldfit;
906 if ((aState.
sfit->chi2() >= oldfit->chi2()) || !ok) {
915 std::unique_ptr<CSCSegFit> oldfit;
922 if (!ok || ((aState.
sfit->ndof() > 0) && (aState.
sfit->chi2() / aState.
sfit->ndof() >= aState.
chi2Max))) {
T getParameter(std::string const &) const
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
bool areHitsCloseInR(const AlgoState &aState, const CSCRecHit2D *h1, const CSCRecHit2D *h2) const
Utility functions.
CSCDetId cscDetId() const
std::vector< const CSCRecHit2D * >::const_iterator ChamberHitContainerCIt
bool areHitsCloseInGlobalPhi(const AlgoState &aState, const CSCRecHit2D *h1, const CSCRecHit2D *h2) const
float phiAtZ(const AlgoState &aState, float z) const
static const double slope[3]
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
bool replaceHit(AlgoState &aState, const CSCRecHit2D *h, int layer) const
Geom::Phi< T > phi() const
LocalPoint localPosition() const override
ChamberHitContainer proto_segment
std::unique_ptr< CSCSegFit > sfit
void tryAddingHitsToSegment(AlgoState &aState, const ChamberHitContainer &rechitsInChamber, const BoolContainer &used, const LayerIndex &layerIndex, const ChamberHitContainerCIt i1, const ChamberHitContainerCIt i2) const
const CSCChamber * aChamber
int channels(unsigned int i) const
Extracting strip channel numbers comprising the rechit - low.
const Surface::PositionType & position() const
The position (origin of the R.F.)
unsigned int nStrips() const
bool isSegmentGood(const AlgoState &aState, const ChamberHitContainer &rechitsInChamber) const
Abs< T >::type abs(const T &t)
void baseline(AlgoState &aState, int n_seg_min) const
const CSCLayer * layer(CSCDetId id) const
Return the layer corresponding to the given id.
bool isHitNearSegment(const AlgoState &aState, const CSCRecHit2D *h) const
unsigned short iChamberType() const
static const std::string kLayer("layer")
void increaseProtoSegment(AlgoState &aState, const CSCRecHit2D *h, int layer, int chi2_factor) const
CSCSegAlgoRU(const edm::ParameterSet &ps)
Constructor.
std::vector< const CSCRecHit2D * > ChamberHitContainer
std::vector< bool > BoolContainer
std::vector< int > LayerIndex
void updateParameters(AlgoState &aState) const
void compareProtoSegment(AlgoState &aState, const CSCRecHit2D *h, int layer) const
ROOT::Math::SVector< double, 6 > SVector6
Typedefs.
bool addHit(AlgoState &aState, const CSCRecHit2D *hit, int layer) const
Utility functions.
float fit_r_phi(const AlgoState &aState, const SVector6 &points, int layer) const
short int hitWire() const
L1A.
std::vector< CSCSegment > buildSegments(const CSCChamber *aChamber, const ChamberHitContainer &rechits) const
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
bool hasHitOnLayer(const AlgoState &aState, int layer) const
float errorWithinStrip() const
The uncertainty of the estimated position within the strip.