101 std::vector<CSCSegment> segments_temp;
102 std::vector<CSCSegment> segments;
103 std::vector<ChamberHitContainer> rechits_clusters;
108 for(
int a = 0;
a<5; ++
a) {
109 for(
int b = 0;
b<5; ++
b) {
139 for(std::vector<ChamberHitContainer>::iterator sub_rechits = rechits_clusters.begin(); sub_rechits != rechits_clusters.end(); ++sub_rechits ) {
141 segments_temp.clear();
145 segments.insert( segments.end(), segments_temp.begin(), segments_temp.end() );
149 segments_temp.clear();
152 segments.swap(segments_temp);
162 segments_temp.clear();
165 segments.swap(segments_temp);
186 std::vector<CSCSegment> segments_temp;
187 std::vector<ChamberHitContainer> rechits_clusters;
189 const float chi2ndfProbMin = 1.0e-4;
193 int hit_nr_worst = -1;
194 int hit_nr_2ndworst = -1;
196 for(std::vector<CSCSegment>::iterator it=segments.begin(); it != segments.end(); ++it) {
201 if( !use_brute_force ) {
203 float chisq = (*it).chi2();
204 int nhits = (*it).nRecHits();
211 globZ = globalPosition.
z();
217 std::vector<CSCRecHit2D> theseRecHits = (*it).specificRecHits();
218 std::vector<CSCRecHit2D>::const_iterator iRH_worst;
219 float xdist_local = -99999.;
221 float xdist_local_worst_sig = -99999.;
222 float xdist_local_2ndworst_sig = -99999.;
223 float xdist_local_sig = -99999.;
227 hit_nr_2ndworst = -1;
229 for ( std::vector<CSCRecHit2D>::const_iterator iRH = theseRecHits.begin(); iRH != theseRecHits.end(); ++iRH) {
234 float loc_x_at_target ;
235 float loc_y_at_target ;
236 float loc_z_at_target ;
239 loc_x_at_target = 0.;
240 loc_y_at_target = 0.;
241 loc_z_at_target = 0.;
246 LocalPoint localPositionRH = (*iRH).localPosition();
249 LocalError rerrlocal = (*iRH).localPositionError();
250 float xxerr = rerrlocal.
xx();
252 float target_z = globalPositionRH.
z();
255 loc_x_at_target = localPos.
x() + (segDir.
x()/fabs(segDir.
z())*( target_z - globZ ));
256 loc_y_at_target = localPos.
y() + (segDir.
y()/fabs(segDir.
z())*( target_z - globZ ));
257 loc_z_at_target = target_z;
260 loc_x_at_target = localPos.
x() + ((-1)*segDir.
x()/fabs(segDir.
z())*( target_z - globZ ));
261 loc_y_at_target = localPos.
y() + ((-1)*segDir.
y()/fabs(segDir.
z())*( target_z - globZ ));
262 loc_z_at_target = target_z;
266 xdist_local = fabs(localPositionRH.
x() - loc_x_at_target);
267 xdist_local_sig = fabs((localPositionRH.
x() -loc_x_at_target)/(xxerr));
269 if( xdist_local_sig > xdist_local_worst_sig ) {
270 xdist_local_2ndworst_sig = xdist_local_worst_sig;
271 xdist_local_worst_sig = xdist_local_sig;
273 hit_nr_2ndworst = hit_nr_worst;
274 hit_nr_worst = hit_nr;
276 else if(xdist_local_sig > xdist_local_2ndworst_sig) {
277 xdist_local_2ndworst_sig = xdist_local_sig;
278 hit_nr_2ndworst = hit_nr;
286 if ( xdist_local_worst_sig / xdist_local_2ndworst_sig < 1.5 ) {
288 hit_nr_2ndworst = -1;
296 std::vector< CSCRecHit2D > buffer;
297 std::vector< std::vector< CSCRecHit2D > > reduced_segments;
298 std::vector< CSCRecHit2D > theseRecHits = (*it).specificRecHits();
299 float best_red_seg_prob = 0.0;
303 if(
ChiSquaredProbability((
double)(*it).chi2(),(double)((2*(*it).nRecHits())-4)) < chi2ndfProbMin ) {
305 buffer = theseRecHits;
309 if( use_brute_force ) {
310 for(
size_t bi = 0; bi < buffer.size(); ++bi) {
311 reduced_segments.push_back(buffer);
312 reduced_segments[bi].erase(reduced_segments[bi].
begin()+(bi),reduced_segments[bi].
begin()+(bi+1));
317 if( hit_nr_worst >= 0 && hit_nr_worst <=
int(buffer.size()) ) {
319 buffer.erase(buffer.begin()+(hit_nr_worst),buffer.begin()+(hit_nr_worst+1));
320 reduced_segments.push_back(buffer);
324 reduced_segments.push_back(buffer);
330 for(
size_t iSegment=0; iSegment<reduced_segments.size(); ++iSegment) {
333 for(
size_t m = 0;
m<reduced_segments[iSegment].size(); ++
m ) {
394 std::vector<ChamberHitContainer> rechits_clusters;
400 float dXclus_box = 0.0;
401 float dYclus_box = 0.0;
403 std::vector<const CSCRecHit2D*>
temp;
405 std::vector< ChamberHitContainer > seeds;
407 std::vector<float> running_meanX;
408 std::vector<float> running_meanY;
410 std::vector<float> seed_minX;
411 std::vector<float> seed_maxX;
412 std::vector<float> seed_minY;
413 std::vector<float> seed_maxY;
422 for(
unsigned int i = 0;
i < rechits.size(); ++
i) {
426 temp.push_back(rechits[
i]);
428 seeds.push_back(temp);
433 running_meanX.push_back( rechits[i]->localPosition().
x() );
434 running_meanY.push_back( rechits[i]->localPosition().
y() );
437 seed_minX.push_back( rechits[i]->localPosition().
x() );
438 seed_maxX.push_back( rechits[i]->localPosition().
x() );
439 seed_minY.push_back( rechits[i]->localPosition().
y() );
440 seed_maxY.push_back( rechits[i]->localPosition().
y() );
445 for(
size_t NNN = 0; NNN < seeds.size(); ++NNN) {
447 for(
size_t MMM = NNN+1; MMM < seeds.size(); ++MMM) {
448 if(running_meanX[MMM] == 999999. || running_meanX[NNN] == 999999. ) {
449 LogDebug(
"CSCSegment|CSC") <<
"CSCSegmentST::clusterHits: Warning: Skipping used seeds, this should happen - inform developers!";
455 dXclus = fabs(running_meanX[NNN] - running_meanX[MMM]);
456 dYclus = fabs(running_meanY[NNN] - running_meanY[MMM]);
459 if ( running_meanX[NNN] > running_meanX[MMM] ) dXclus_box = seed_minX[NNN] - seed_maxX[MMM];
460 else dXclus_box = seed_minX[MMM] - seed_maxX[NNN];
461 if ( running_meanY[NNN] > running_meanY[MMM] ) dYclus_box = seed_minY[NNN] - seed_maxY[MMM];
462 else dYclus_box = seed_minY[MMM] - seed_maxY[NNN];
470 running_meanX[MMM] = (running_meanX[NNN]*seeds[NNN].size() + running_meanX[MMM]*seeds[MMM].size()) / (seeds[NNN].
size()+seeds[MMM].size());
471 running_meanY[MMM] = (running_meanY[NNN]*seeds[NNN].size() + running_meanY[MMM]*seeds[MMM].size()) / (seeds[NNN].
size()+seeds[MMM].size());
474 if ( seed_minX[NNN] <= seed_minX[MMM] ) seed_minX[MMM] = seed_minX[NNN];
475 if ( seed_maxX[NNN] > seed_maxX[MMM] ) seed_maxX[MMM] = seed_maxX[NNN];
476 if ( seed_minY[NNN] <= seed_minY[MMM] ) seed_minY[MMM] = seed_minY[NNN];
477 if ( seed_maxY[NNN] > seed_maxY[MMM] ) seed_maxY[MMM] = seed_maxY[NNN];
480 seeds[MMM].insert(seeds[MMM].
end(),seeds[NNN].
begin(),seeds[NNN].
end());
483 running_meanX[NNN] = 999999.;
484 running_meanY[NNN] = 999999.;
496 for(
size_t NNN = 0; NNN < seeds.size(); ++NNN) {
497 if(running_meanX[NNN] == 999999.)
continue;
498 rechits_clusters.push_back(seeds[NNN]);
503 return rechits_clusters;
509 std::vector<ChamberHitContainer> rechits_chains;
512 std::vector<const CSCRecHit2D*>
temp;
514 std::vector< ChamberHitContainer > seeds;
516 std::vector <bool> usedCluster;
522 for(
unsigned int i = 0;
i < rechits.size(); ++
i) {
524 temp.push_back(rechits[
i]);
525 seeds.push_back(temp);
526 usedCluster.push_back(
false);
528 bool isME11a =
false;
533 for(
size_t NNN = 0; NNN < seeds.size(); ++NNN) {
534 for(
size_t MMM = NNN+1; MMM < seeds.size(); ++MMM) {
535 if(usedCluster[MMM] || usedCluster[NNN]){
549 bool goodToMerge =
isGoodToMerge(isME11a, seeds[NNN], seeds[MMM]);
555 seeds[MMM].insert(seeds[MMM].
end(),seeds[NNN].
begin(),seeds[NNN].
end());
558 usedCluster[NNN] =
true;
571 for(
size_t NNN = 0; NNN < seeds.size(); ++NNN) {
572 if(usedCluster[NNN])
continue;
573 rechits_chains.push_back(seeds[NNN]);
578 return rechits_chains;
582 for(
size_t iRH_new = 0;iRH_new<newChain.size();++iRH_new){
583 int layer_new = newChain[iRH_new]->cscDetId().layer()-1;
584 int middleStrip_new = newChain[iRH_new]->channels().size()/2;
585 int centralStrip_new = newChain[iRH_new]->channels()[middleStrip_new];
586 int middleWire_new = newChain[iRH_new]->wgroups().size()/2;
587 int centralWire_new = newChain[iRH_new]->wgroups()[middleWire_new];
588 bool layerRequirementOK =
false;
589 bool stripRequirementOK =
false;
590 bool wireRequirementOK =
false;
591 bool goodToMerge =
false;
592 for(
size_t iRH_old = 0;iRH_old<oldChain.size();++iRH_old){
593 int layer_old = oldChain[iRH_old]->cscDetId().layer()-1;
594 int middleStrip_old = oldChain[iRH_old]->channels().size()/2;
595 int centralStrip_old = oldChain[iRH_old]->channels()[middleStrip_old];
596 int middleWire_old = oldChain[iRH_old]->wgroups().size()/2;
597 int centralWire_old = oldChain[iRH_old]->wgroups()[middleWire_old];
606 if(layer_new==layer_old+1 || layer_new==layer_old-1 ||
607 layer_new==layer_old+2 || layer_new==layer_old-2 ||
608 layer_new==layer_old+3 || layer_new==layer_old-3 ||
609 layer_new==layer_old+4 || layer_new==layer_old-4 ){
610 layerRequirementOK =
true;
616 if(centralStrip_new==centralStrip_old ||
617 centralStrip_new==centralStrip_old+1 || centralStrip_new==centralStrip_old-1 ||
618 centralStrip_new==centralStrip_old+2 || centralStrip_new==centralStrip_old-2){
619 stripRequirementOK =
true;
622 if(centralWire_new==centralWire_old ||
623 centralWire_new==centralWire_old+1 || centralWire_new==centralWire_old-1 ||
624 centralWire_new==centralWire_old+2 || centralWire_new==centralWire_old-2){
625 wireRequirementOK =
true;
629 if(centralStrip_new==centralStrip_old+1-allStrips || centralStrip_new==centralStrip_old-1-allStrips ||
630 centralStrip_new==centralStrip_old+2-allStrips || centralStrip_new==centralStrip_old-2-allStrips ||
631 centralStrip_new==centralStrip_old+1+allStrips || centralStrip_new==centralStrip_old-1+allStrips ||
632 centralStrip_new==centralStrip_old+2+allStrips || centralStrip_new==centralStrip_old-2+allStrips){
633 stripRequirementOK =
true;
636 if(layerRequirementOK && stripRequirementOK && wireRequirementOK){
648 double CSCSegAlgoST::theWeight(
double coordinate_1,
double coordinate_2,
double coordinate_3,
float layer_1,
float layer_2,
float layer_3) {
649 double sub_weight = 0;
651 ( (coordinate_2 - coordinate_3) / (layer_2 - layer_3) ) -
652 ( (coordinate_1 - coordinate_2) / (layer_1 - layer_2) )
664 std::vector<CSCSegment> segmentInChamber;
665 segmentInChamber.clear();
668 unsigned int thering = 999;
669 unsigned int thestation = 999;
670 unsigned int thecham = 999;
672 std::vector<int> hits_onLayerNumber(6);
677 for(
int iarray = 0; iarray <6; ++iarray) {
679 hits_onLayerNumber[iarray] = 0;
722 int midlayer_pointer[6] = {0,0,2,3,3,4};
725 int n_layers_occupied_tot = 0;
726 int n_layers_processed = 0;
728 float min_weight_A = 99999.9;
729 float min_weight_noLx_A = 99999.9;
731 float best_weight_B = -1.;
732 float best_weight_noLx_B = -1.;
734 float best_curv_A = -1.;
735 float best_curv_noLx_A = -1.;
738 int best_noLx_pseg = -1;
739 int best_Layer_noLx = -1;
752 for(
size_t M = 0; M < rechits.size(); ++M) {
754 hits_onLayerNumber[ rechits[M]->cscDetId().layer()-1 ] += 1;
755 if(hits_onLayerNumber[ rechits[M]->cscDetId().layer()-1 ] == 1 ) n_layers_occupied_tot += 1;
757 PAhits_onLayer[rechits[M]->cscDetId().layer()-1] .push_back(rechits[M]);
768 for(
size_t i = 0;
i< hits_onLayerNumber.size(); ++
i){
770 tothits += hits_onLayerNumber[
i];
771 if (hits_onLayerNumber[
i] > maxhits) {
772 nextlayer = maxlayer;
775 maxhits = hits_onLayerNumber[
i];
777 else if (hits_onLayerNumber[
i] > nexthits) {
779 nexthits = hits_onLayerNumber[
i];
784 if (tothits > (
int)UpperLimit) {
785 if (n_layers_occupied_tot > 4) {
786 tothits = tothits - hits_onLayerNumber[maxlayer];
787 n_layers_occupied_tot = n_layers_occupied_tot - 1;
789 hits_onLayerNumber[maxlayer] = 0;
793 if (tothits > (
int)UpperLimit) {
794 if (n_layers_occupied_tot > 4) {
795 tothits = tothits - hits_onLayerNumber[nextlayer];
796 n_layers_occupied_tot = n_layers_occupied_tot - 1;
798 hits_onLayerNumber[nextlayer] = 0;
802 if (tothits > (
int)UpperLimit){
811 if ( segShower.
nRecHits() < 3 )
return segmentInChamber;
812 if ( segShower.
chi2() == -1 )
return segmentInChamber;
814 segmentInChamber.push_back(segShower);
815 return segmentInChamber;
818 LogDebug(
"CSCSegment|CSC") <<
"Number of rechits in the cluster/chamber > "<< UpperLimit<<
819 " ... Segment finding in the cluster/chamber canceled!";
822 return segmentInChamber;
829 if( rechits.size() > 0 ) {
830 thering = rechits[0]->cscDetId().ring();
831 thestation = rechits[0]->cscDetId().station();
832 thecham = rechits[0]->cscDetId().chamber();
839 return segmentInChamber;
846 for(
int layer = 0; layer < 6; ++layer) {
856 n_layers_processed += 1;
860 int orig_number_of_psegs =
Psegments.size();
872 if( orig_number_of_psegs == 0 ) {
910 if( orig_number_of_noL1_psegs == 0 ) {
931 for(
int pseg = 0; pseg < orig_number_of_psegs; ++pseg ) {
933 int pseg_pos = (pseg)+((
hit)*orig_number_of_psegs);
934 int pseg_noL1_pos = (pseg)+((
hit)*orig_number_of_noL1_psegs);
935 int pseg_noL2_pos = (pseg)+((
hit)*orig_number_of_noL2_psegs);
936 int pseg_noL3_pos = (pseg)+((
hit)*orig_number_of_noL3_psegs);
937 int pseg_noL4_pos = (pseg)+((
hit)*orig_number_of_noL4_psegs);
938 int pseg_noL5_pos = (pseg)+((
hit)*orig_number_of_noL5_psegs);
939 int pseg_noL6_pos = (pseg)+((
hit)*orig_number_of_noL6_psegs);
965 if (n_layers_processed != 2 && pseg < orig_number_of_noL1_psegs)
curv_noL1_A.push_back(
curv_noL1_A[ pseg_noL1_pos ]);
966 if (n_layers_processed != 2 && pseg < orig_number_of_noL2_psegs)
curv_noL2_A.push_back(
curv_noL2_A[ pseg_noL2_pos ]);
967 if (n_layers_processed != 3 && pseg < orig_number_of_noL3_psegs)
curv_noL3_A.push_back(
curv_noL3_A[ pseg_noL3_pos ]);
968 if (n_layers_processed != 4 && pseg < orig_number_of_noL4_psegs)
curv_noL4_A.push_back(
curv_noL4_A[ pseg_noL4_pos ]);
969 if (n_layers_processed != 5 && pseg < orig_number_of_noL5_psegs)
curv_noL5_A.push_back(
curv_noL5_A[ pseg_noL5_pos ]);
970 if (n_layers_processed != 6 && pseg < orig_number_of_noL6_psegs)
curv_noL6_A.push_back(
curv_noL6_A[ pseg_noL6_pos ]);
982 if (n_layers_processed != 2 && pseg < orig_number_of_noL1_psegs)
Psegments_noL1[ pseg_noL1_pos ].push_back(
PAhits_onLayer[ layer ][ hit ]);
983 if (n_layers_processed != 2 && pseg < orig_number_of_noL2_psegs)
Psegments_noL2[ pseg_noL2_pos ].push_back(
PAhits_onLayer[ layer ][ hit ]);
984 if (n_layers_processed != 3 && pseg < orig_number_of_noL3_psegs)
Psegments_noL3[ pseg_noL3_pos ].push_back(
PAhits_onLayer[ layer ][ hit ]);
985 if (n_layers_processed != 4 && pseg < orig_number_of_noL4_psegs)
Psegments_noL4[ pseg_noL4_pos ].push_back(
PAhits_onLayer[ layer ][ hit ]);
986 if (n_layers_processed != 5 && pseg < orig_number_of_noL5_psegs)
Psegments_noL5[ pseg_noL5_pos ].push_back(
PAhits_onLayer[ layer ][ hit ]);
987 if (n_layers_processed != 6 && pseg < orig_number_of_noL6_psegs)
Psegments_noL6[ pseg_noL6_pos ].push_back(
PAhits_onLayer[ layer ][ hit ]);
1000 float((*(
Psegments[ pseg_pos ].
end()-1))->cscDetId().layer()),
1001 float((*(
Psegments[ pseg_pos ].
end()-2))->cscDetId().layer()),
1002 float((*(
Psegments[ pseg_pos ].
end()-3))->cscDetId().layer())
1009 float((*(
Psegments[ pseg_pos ].
end()-1))->cscDetId().layer()),
1010 float((*(
Psegments[ pseg_pos ].
end()-2))->cscDetId().layer()),
1011 float((*(
Psegments[ pseg_pos ].
end()-3))->cscDetId().layer())
1016 if(
int(
Psegments[ pseg_pos ].
size()) == n_layers_occupied_tot) {
1020 (*(
Psegments[ pseg_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-1] ))->localPosition().
x(),
1021 (*(
Psegments[ pseg_pos ].
end()-n_layers_occupied_tot ))->localPosition().
x(),
1022 float((*(
Psegments[ pseg_pos ].
end()-1))->cscDetId().layer()),
1023 float((*(
Psegments[ pseg_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-1] ))->cscDetId().layer()),
1024 float((*(
Psegments[ pseg_pos ].
end()-n_layers_occupied_tot ))->cscDetId().layer())
1031 if (
weight_A[ pseg_pos ] < min_weight_A ) {
1032 min_weight_A =
weight_A[ pseg_pos ];
1033 best_weight_B =
weight_B[ pseg_pos ];
1034 best_curv_A =
curv_A[ pseg_pos ];
1035 best_pseg = pseg_pos ;
1045 if ( n_layers_occupied_tot > 3 ) {
1046 if (pseg < orig_number_of_noL1_psegs && (n_layers_processed != 2)) {
1076 (*(
Psegments_noL1[ pseg_noL1_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-2] ))->localPosition().
x(),
1077 (*(
Psegments_noL1[ pseg_noL1_pos ].
end()-(n_layers_occupied_tot-1) ))->localPosition().
x(),
1079 float((*(
Psegments_noL1[ pseg_noL1_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-2] ))->cscDetId().layer()),
1080 float((*(
Psegments_noL1[ pseg_noL1_pos ].
end()-(n_layers_occupied_tot-1) ))->cscDetId().layer())
1092 best_noLx_pseg = pseg_noL1_pos;
1093 best_Layer_noLx = 1;
1105 if ( n_layers_occupied_tot > 3 ) {
1106 if (pseg < orig_number_of_noL2_psegs && ( n_layers_processed != 2 )) {
1136 (*(
Psegments_noL2[ pseg_noL2_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-2] ))->localPosition().
x(),
1137 (*(
Psegments_noL2[ pseg_noL2_pos ].
end()-(n_layers_occupied_tot-1) ))->localPosition().
x(),
1139 float((*(
Psegments_noL2[ pseg_noL2_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-2] ))->cscDetId().layer()),
1140 float((*(
Psegments_noL2[ pseg_noL2_pos ].
end()-(n_layers_occupied_tot-1) ))->cscDetId().layer())
1152 best_noLx_pseg = pseg_noL2_pos;
1153 best_Layer_noLx = 2;
1165 if ( n_layers_occupied_tot > 3 ) {
1166 if (pseg < orig_number_of_noL3_psegs && ( n_layers_processed != 3 )) {
1196 (*(
Psegments_noL3[ pseg_noL3_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-2] ))->localPosition().
x(),
1197 (*(
Psegments_noL3[ pseg_noL3_pos ].
end()-(n_layers_occupied_tot-1) ))->localPosition().
x(),
1199 float((*(
Psegments_noL3[ pseg_noL3_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-2] ))->cscDetId().layer()),
1200 float((*(
Psegments_noL3[ pseg_noL3_pos ].
end()-(n_layers_occupied_tot-1) ))->cscDetId().layer())
1212 best_noLx_pseg = pseg_noL3_pos;
1213 best_Layer_noLx = 3;
1225 if ( n_layers_occupied_tot > 3 ) {
1226 if (pseg < orig_number_of_noL4_psegs && ( n_layers_processed != 4 )) {
1256 (*(
Psegments_noL4[ pseg_noL4_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-2] ))->localPosition().
x(),
1257 (*(
Psegments_noL4[ pseg_noL4_pos ].
end()-(n_layers_occupied_tot-1) ))->localPosition().
x(),
1259 float((*(
Psegments_noL4[ pseg_noL4_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-2] ))->cscDetId().layer()),
1260 float((*(
Psegments_noL4[ pseg_noL4_pos ].
end()-(n_layers_occupied_tot-1) ))->cscDetId().layer())
1272 best_noLx_pseg = pseg_noL4_pos;
1273 best_Layer_noLx = 4;
1285 if ( n_layers_occupied_tot > 4 ) {
1286 if (pseg < orig_number_of_noL5_psegs && ( n_layers_processed != 5 )) {
1316 (*(
Psegments_noL5[ pseg_noL5_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-2] ))->localPosition().
x(),
1317 (*(
Psegments_noL5[ pseg_noL5_pos ].
end()-(n_layers_occupied_tot-1) ))->localPosition().
x(),
1319 float((*(
Psegments_noL5[ pseg_noL5_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-2] ))->cscDetId().layer()),
1320 float((*(
Psegments_noL5[ pseg_noL5_pos ].
end()-(n_layers_occupied_tot-1) ))->cscDetId().layer())
1332 best_noLx_pseg = pseg_noL5_pos;
1333 best_Layer_noLx = 5;
1345 if ( n_layers_occupied_tot > 5 ) {
1346 if (pseg < orig_number_of_noL6_psegs && ( n_layers_processed != 6 )) {
1376 (*(
Psegments_noL6[ pseg_noL6_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-2] ))->localPosition().
x(),
1377 (*(
Psegments_noL6[ pseg_noL6_pos ].
end()-(n_layers_occupied_tot-1) ))->localPosition().
x(),
1379 float((*(
Psegments_noL6[ pseg_noL6_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-2] ))->cscDetId().layer()),
1380 float((*(
Psegments_noL6[ pseg_noL6_pos ].
end()-(n_layers_occupied_tot-1) ))->cscDetId().layer())
1392 best_noLx_pseg = pseg_noL6_pos;
1393 best_Layer_noLx = 6;
1425 float chosen_weight = min_weight_A;
1426 float chosen_ywgt = best_weight_B;
1427 float chosen_curv = best_curv_A;
1428 int chosen_nlayers = n_layers_occupied_tot;
1429 int chosen_pseg = best_pseg;
1431 return segmentInChamber;
1436 float hit_drop_limit = -999999.999;
1439 switch ( n_layers_processed ) {
1451 if ((best_Layer_noLx < 1) || (best_Layer_noLx > 4)) {
1454 if ((best_Layer_noLx == 2) || (best_Layer_noLx == 3)) hit_drop_limit = hit_drop_limit * (1./2.);
1458 if ((best_Layer_noLx < 1) || (best_Layer_noLx > 5)) {
1461 if ((best_Layer_noLx == 2) || (best_Layer_noLx == 4)) hit_drop_limit = hit_drop_limit * (1./2.);
1462 if (best_Layer_noLx == 3) hit_drop_limit = hit_drop_limit * (1./3.);
1466 if ((best_Layer_noLx < 1) || (best_Layer_noLx > 6)) {
1469 if ((best_Layer_noLx == 2) || (best_Layer_noLx == 5)) hit_drop_limit = hit_drop_limit * (1./2.);
1470 if ((best_Layer_noLx == 3) || (best_Layer_noLx == 4)) hit_drop_limit = hit_drop_limit * (1./3.);
1475 LogDebug(
"CSCSegment|CSC") <<
"CSCSegAlgoST: Unexpected number of layers with hits - please inform developers.";
1477 hit_drop_limit = 0.1;
1481 switch ( best_Layer_noLx ) {
1525 if( min_weight_A > 0. ) {
1526 if ( min_weight_noLx_A/min_weight_A < hit_drop_limit ) {
1527 chosen_weight = min_weight_noLx_A;
1528 chosen_ywgt = best_weight_noLx_B;
1529 chosen_curv = best_curv_noLx_A;
1530 chosen_nlayers = n_layers_occupied_tot-1;
1531 chosen_pseg = best_noLx_pseg;
1546 for(
unsigned int iSegment=0; iSegment<
GoodSegments.size();++iSegment){
1567 LogDebug(
"CSCSegment|segmWierd") <<
"Wierd segment, ErrXX scaled, refit " <<std::endl;
1574 LogDebug(
"CSCSegment|segmWierd") <<
"Wierd segment, ErrXY changed to match cond. number, refit " << std::endl;
1586 LogDebug(
"CSCSegment|segmWierd") <<
"Scale factor protoChiUCorrection too big, pre-Prune, refit " << std::endl;
1601 segmentInChamber.push_back(temp);
1603 return segmentInChamber;
1614 int SumCommonHits = 0;
1616 int nr_remaining_candidates;
1617 unsigned int nr_of_segment_candidates;
1619 nr_remaining_candidates = nr_of_segment_candidates = chosen_segments.size();
1622 GoodSegments.push_back( chosen_segments[ chosen_seg ] );
1624 float chosen_weight_temp = 999999.;
1625 int chosen_seg_temp = -1;
1628 while( nr_remaining_candidates > 0 ) {
1630 for(
unsigned int iCand=0; iCand < nr_of_segment_candidates; ++iCand) {
1632 if( chosen_weight[iCand] < 0. )
continue;
1635 for(
int ihits = 0; ihits < int(chosen_segments[iCand].
size()); ++ihits ) {
1636 if( chosen_segments[iCand][ihits] == chosen_segments[chosen_seg][ihits]) {
1642 if(SumCommonHits>1) {
1643 chosen_weight[iCand] = -1.;
1644 nr_remaining_candidates -= 1;
1648 if( chosen_weight[ iCand ] < chosen_weight_temp ) {
1649 chosen_weight_temp = chosen_weight[ iCand ];
1650 chosen_seg_temp = iCand ;
1655 if( chosen_seg_temp > -1 )
GoodSegments.push_back( chosen_segments[ chosen_seg_temp ] );
1657 chosen_seg = chosen_seg_temp;
1659 chosen_weight_temp = 999999;
1660 chosen_seg_temp = -1;
1666 std::vector <unsigned int> BadCandidate;
1667 int SumCommonHits =0;
1669 BadCandidate.clear();
1670 for(
unsigned int iCand=0;iCand<
Psegments.size();++iCand) {
1672 for(
unsigned int iiCand=iCand+1;iiCand<
Psegments.size();++iiCand){
1676 LogDebug(
"CSCSegment|CSC") <<
"CSCSegmentST::ChooseSegments2: ALARM!! THIS should not happen!!";
1680 for(
int ihits = 0; ihits < int(
Psegments[iCand].
size()); ++ihits ) {
1686 if(SumCommonHits>1) {
1688 BadCandidate.push_back(iCand);
1692 BadCandidate.push_back(iiCand);
1699 for(
unsigned int isegm=0;isegm<
Psegments.size();++isegm) {
1703 for(
unsigned int ibad=0;ibad<BadCandidate.size();++ibad) {
1705 if(isegm == BadCandidate[ibad]) {
1732 LogDebug(
"CSCSegment|segmWierd") <<
"e_Cxx.size()!=protoSegment.size() IT IS A SERIOUS PROBLEM!!! " <<std::endl;
1735 CLHEP::HepMatrix M(4,4,0);
1736 CLHEP::HepVector
B(4,0);
1737 ChamberHitContainer::const_iterator ih =
protoSegment.begin();
1748 CLHEP::HepMatrix IC(2,2);
1767 LogDebug(
"CSCSegment|CSC") <<
"CSCSegment::fitSlopes: failed to invert covariance matrix=\n" << IC;
1773 M(1,3) += IC(1,1) *
z;
1774 M(1,4) += IC(1,2) *
z;
1775 B(1) += u * IC(1,1) + v * IC(1,2);
1779 M(2,3) += IC(2,1) *
z;
1780 M(2,4) += IC(2,2) *
z;
1781 B(2) += u * IC(2,1) + v * IC(2,2);
1783 M(3,1) += IC(1,1) *
z;
1784 M(3,2) += IC(1,2) *
z;
1785 M(3,3) += IC(1,1) * z *
z;
1786 M(3,4) += IC(1,2) * z *
z;
1787 B(3) += ( u * IC(1,1) + v * IC(1,2) ) * z;
1789 M(4,1) += IC(2,1) *
z;
1790 M(4,2) += IC(2,2) *
z;
1791 M(4,3) += IC(2,1) * z *
z;
1792 M(4,4) += IC(2,2) * z *
z;
1793 B(4) += ( u * IC(2,1) + v * IC(2,2) ) * z;
1795 CLHEP::HepVector
p = solve(M, B);
1812 ChamberHitContainer::const_iterator ih;
1827 CLHEP::HepMatrix IC(2,2);
1847 LogDebug(
"CSCSegment|CSC") <<
"CSCSegment::fillChiSquared: failed to invert covariance matrix=\n" << IC;
1852 chsq += du*du*IC(1,1) + 2.*du*dv*IC(1,2) + dv*dv*IC(2,2);
1867 double dz = 1./
sqrt(1. + dxdz*dxdz + dydz*dydz);
1868 double dx = dz*dxdz;
1869 double dy = dz*dydz;
1878 double directionSign = globalZpos * globalZdir;
1886 std::vector<const CSCRecHit2D*>::const_iterator it;
1902 matrix.invert(ierr);
1912 ChamberHitContainer::const_iterator it;
1914 CLHEP::HepMatrix matrix(2*nhits, 4);
1925 matrix(row, 1) = 1.;
1928 matrix(row, 2) = 1.;
1947 result.invert(ierr);
1981 std::vector<double> uu, vv, zz;
1984 double sum_U_err=0.0;
1985 double sum_Z_U_err=0.0;
1986 double sum_Z2_U_err=0.0;
1987 double sum_U_U_err=0.0;
1988 double sum_UZ_U_err=0.0;
1989 std::vector<double> chiUZind;
1990 std::vector<double>::iterator chiContribution;
1992 ChamberHitContainer::const_iterator ih =
protoSegment.begin();
2008 sum_U_err += 1./
e_Cxx.back();
2009 sum_Z_U_err += z/
e_Cxx.back();
2010 sum_Z2_U_err += (z*
z)/
e_Cxx.back();
2011 sum_U_U_err += u/
e_Cxx.back();
2012 sum_UZ_U_err += (u*
z)/
e_Cxx.back();
2018 double denom=sum_U_err*sum_Z2_U_err-
pow(sum_Z_U_err,2);
2019 double U0=(sum_Z2_U_err*sum_U_U_err-sum_Z_U_err*sum_UZ_U_err)/denom;
2020 double UZ=(sum_U_err*sum_UZ_U_err-sum_Z_U_err*sum_U_U_err)/denom;
2025 for(
unsigned i=0;
i<uu.size(); ++
i){
2026 double uMean = U0+UZ*zz[
i];
2027 chiUZind.push_back((
pow((uMean-uu[
i]),2))/
e_Cxx[i]);
2028 chiUZ += (
pow((uMean-uu[i]),2))/
e_Cxx[i];
2030 chiUZ = chiUZ/(uu.size()-2);
2034 for(
unsigned i=0;
i<uu.size(); ++
i)
2041 chiContribution=max_element(chiUZind.begin(),chiUZind.end());
2056 double condNumberCorr1=0.0;
2057 double condNumberCorr2=0.0;
2061 double IC_12_corr=0.0;
2062 double IC_11_corr=0.0;
2066 diag1=IC(1,1)*IC(2,2);
2067 diag2=IC(1,2)*IC(1,2);
2068 detCov=fabs(diag1-diag2);
2069 if((diag1<condNumberCorr2)&&(diag2<condNumberCorr2)){
2078 if(((detCov<condNumberCorr2)&&(diag1>condNumberCorr2))||
2079 ((diag2>condNumberCorr2)&&(detCov<condNumberCorr2)
2084 IC_12_corr=
sqrt(fabs(diag1-condNumberCorr2));
2086 IC(1,2)=(-1)*IC_12_corr;
2103 for(std::vector<CSCSegment>::iterator it=segments.begin(); it != segments.end(); ++it) {
2104 std::vector<CSCSegment*> duplicateSegments;
2105 for(std::vector<CSCSegment>::iterator it2=segments.begin(); it2 != segments.end(); ++it2) {
2107 bool allShared =
true;
2109 allShared = it->sharesRecHits(*it2);
2116 duplicateSegments.push_back(&(*it2));
2119 it->setDuplicateSegments(duplicateSegments);
double yweightPenaltyThreshold
T getParameter(std::string const &) const
double protoChiUCorrection
Allow to correct the error matrix.
T getUntrackedParameter(std::string const &, T const &) const
CSCSegment showerSeg(const CSCChamber *aChamber, ChamberHitContainer rechits)
bool preClustering_useChaining
CSCDetId cscDetId() const
bool passCondNumber
The number to fource the Covariance.
void doSlopesAndChi2(void)
std::vector< ChamberHitContainer > Psegments_noL5
std::vector< float > curv_noL2_A
void correctTheCovMatrix(CLHEP::HepMatrix &IC)
const CSCChamber * theChamber
std::vector< float > weight_noL4_A
void correctTheCovX(void)
std::vector< std::vector< const CSCRecHit2D * > > clusterHits(const CSCChamber *aChamber, ChamberHitContainer &rechits)
std::vector< float > curv_noL6_A
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
void ChooseSegments2(int best_seg)
void ChooseSegments3(int best_seg)
std::vector< float > weight_noL3_B
LocalPoint toLocal(const GlobalPoint &gp) const
Conversion to the R.F. of the GeomDet.
std::vector< ChamberHitContainer > Psegments_noL1
CSCSegAlgoST(const edm::ParameterSet &ps)
Constructor.
bool isGoodToMerge(bool isME11a, ChamberHitContainer &newChain, ChamberHitContainer &oldChain)
std::vector< ChamberHitContainer > chosen_Psegments
std::vector< ChamberHitContainer > Psegments
ChamberHitContainer protoSegment
double condSeed1_
Correct the error matrix for the condition number.
LocalVector protoDirection
std::vector< float > weight_noL3_A
std::string chamberTypeName() const
CSCSegAlgoShowering * showering_
virtual ~CSCSegAlgoST()
Destructor.
const CSCChamberSpecs * specs() const
CLHEP::HepMatrix AlgebraicMatrix
LocalError localPositionError() const
double covAnyNumber_
Allow to use any number for covariance for all RecHits.
std::vector< ChamberHitContainer > Psegments_noLx
double curvePenaltyThreshold
std::vector< ChamberHitContainer > Psegments_noL4
std::vector< float > weight_A
std::vector< float > weight_noL1_B
const CSCLayer * layer(CSCDetId id) const
Return the layer corresponding to the given id.
float ChiSquaredProbability(double chiSquared, double nrDOF)
std::vector< CSCSegment > prune_bad_hits(const CSCChamber *aChamber, std::vector< CSCSegment > &segments)
std::vector< float > curv_noL5_A
std::vector< ChamberHitContainer > Psegments_noL6
unsigned maxContrIndex
Chi^2 normalization for the initial fit.
std::vector< const CSCRecHit2D * > ChamberHitContainer
Typedefs.
void flipErrors(AlgebraicSymMatrix &) const
std::vector< ChamberHitContainer > Psegments_noL2
std::vector< float > weight_noL5_A
bool passCondNumber_2
Passage the condition number calculations.
AlgebraicSymMatrix weightMatrix(void) const
std::vector< float > weight_noL1_A
std::vector< float > curv_noL4_A
std::vector< float > weight_noL2_A
std::vector< float > chosen_weight_A
bool correctCov_
Correct the Error Matrix.
ChamberHitContainer Psegments_hits
void findDuplicates(std::vector< CSCSegment > &segments)
std::vector< float > curv_noL1_A
void fillChiSquared(void)
AlgebraicSymMatrix calculateError(void) const
bool covToAnyNumberAll_
Allow to use any number for covariance (by hand)
double theWeight(double coordinate_1, double coordinate_2, double coordinate_3, float layer_1, float layer_2, float layer_3)
Utility functions.
std::vector< float > curv_A
bool prePrun_
The index of the worst x RecHit in Chi^2-X method.
double chi2() const
Chi2 of the segment fit.
std::vector< std::vector< const CSCRecHit2D * > > chainHits(const CSCChamber *aChamber, ChamberHitContainer &rechits)
CLHEP::HepSymMatrix AlgebraicSymMatrix
std::vector< float > weight_noL5_B
std::vector< float > weight_B
float a_yweightPenaltyThreshold[5][5]
void ChooseSegments2a(std::vector< ChamberHitContainer > &best_segments, int best_seg)
std::vector< double > e_Cxx
CLHEP::HepMatrix derivativeMatrix(void) const
void fillLocalDirection(void)
std::vector< CSCSegment > run(const CSCChamber *aChamber, ChamberHitContainer rechits)
std::vector< float > weight_noL6_A
LocalPoint localPosition() const
std::vector< float > weight_noL2_B
bool covToAnyNumber_
The correction parameters.
std::vector< float > weight_noLx_A
std::vector< float > curv_noL3_A
std::vector< float > weight_noL6_B
tuple size
Write out results.
std::vector< CSCSegment > buildSegments(ChamberHitContainer rechits)
Power< A, B >::type pow(const A &a, const B &b)
ChamberHitContainer PAhits_onLayer[6]
LocalPoint protoIntercept
std::vector< float > weight_noL4_B
std::vector< ChamberHitContainer > Psegments_noL3
double chi2Norm_3D_
Chi^2 normalization for the corrected fit.