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;
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;
221 float xdist_local_worst_sig = -99999.;
222 float xdist_local_2ndworst_sig = -99999.;
223 float xdist_local_sig = -99999.;
229 for ( std::vector<CSCRecHit2D>::const_iterator iRH = theseRecHits.begin(); iRH != theseRecHits.end(); ++iRH) {
234 float loc_x_at_target ;
239 loc_x_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 ));
260 loc_x_at_target = localPos.
x() + ((-1)*segDir.
x()/fabs(segDir.
z())*( target_z - globZ ));
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;
274 hit_nr_worst = hit_nr;
276 else if(xdist_local_sig > xdist_local_2ndworst_sig) {
277 xdist_local_2ndworst_sig = xdist_local_sig;
286 if ( xdist_local_worst_sig / xdist_local_2ndworst_sig < 1.5 ) {
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!";
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]->nStrips()/2;
585 int centralStrip_new = newChain[iRH_new]->channels(middleStrip_new);
586 int centralWire_new = newChain[iRH_new]->hitWire();
587 bool layerRequirementOK =
false;
588 bool stripRequirementOK =
false;
589 bool wireRequirementOK =
false;
590 bool goodToMerge =
false;
591 for(
size_t iRH_old = 0;iRH_old<oldChain.size();++iRH_old){
592 int layer_old = oldChain[iRH_old]->cscDetId().layer()-1;
593 int middleStrip_old = oldChain[iRH_old]->nStrips()/2;
594 int centralStrip_old = oldChain[iRH_old]->channels(middleStrip_old);
595 int centralWire_old = oldChain[iRH_old]->hitWire();
604 if(layer_new==layer_old+1 || layer_new==layer_old-1 ||
605 layer_new==layer_old+2 || layer_new==layer_old-2 ||
606 layer_new==layer_old+3 || layer_new==layer_old-3 ||
607 layer_new==layer_old+4 || layer_new==layer_old-4 ){
608 layerRequirementOK =
true;
614 if(centralStrip_new==centralStrip_old ||
615 centralStrip_new==centralStrip_old+1 || centralStrip_new==centralStrip_old-1 ||
616 centralStrip_new==centralStrip_old+2 || centralStrip_new==centralStrip_old-2){
617 stripRequirementOK =
true;
620 if(centralWire_new==centralWire_old ||
621 centralWire_new==centralWire_old+1 || centralWire_new==centralWire_old-1 ||
622 centralWire_new==centralWire_old+2 || centralWire_new==centralWire_old-2){
623 wireRequirementOK =
true;
627 if(centralStrip_new==centralStrip_old+1-allStrips || centralStrip_new==centralStrip_old-1-allStrips ||
628 centralStrip_new==centralStrip_old+2-allStrips || centralStrip_new==centralStrip_old-2-allStrips ||
629 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 stripRequirementOK =
true;
634 if(layerRequirementOK && stripRequirementOK && wireRequirementOK){
646 double CSCSegAlgoST::theWeight(
double coordinate_1,
double coordinate_2,
double coordinate_3,
float layer_1,
float layer_2,
float layer_3) {
647 double sub_weight = 0;
649 ( (coordinate_2 - coordinate_3) / (layer_2 - layer_3) ) -
650 ( (coordinate_1 - coordinate_2) / (layer_1 - layer_2) )
662 std::vector<CSCSegment> segmentInChamber;
663 segmentInChamber.clear();
666 unsigned int thering = 999;
667 unsigned int thestation = 999;
670 std::vector<int> hits_onLayerNumber(6);
675 for(
int iarray = 0; iarray <6; ++iarray) {
677 hits_onLayerNumber[iarray] = 0;
720 int midlayer_pointer[6] = {0,0,2,3,3,4};
723 int n_layers_occupied_tot = 0;
724 int n_layers_processed = 0;
726 float min_weight_A = 99999.9;
727 float min_weight_noLx_A = 99999.9;
736 int best_noLx_pseg = -1;
737 int best_Layer_noLx = -1;
750 for(
size_t M = 0; M < rechits.size(); ++M) {
752 hits_onLayerNumber[ rechits[M]->cscDetId().layer()-1 ] += 1;
753 if(hits_onLayerNumber[ rechits[M]->cscDetId().layer()-1 ] == 1 ) n_layers_occupied_tot += 1;
755 PAhits_onLayer[rechits[M]->cscDetId().layer()-1] .push_back(rechits[M]);
766 for(
size_t i = 0;
i< hits_onLayerNumber.size(); ++
i){
768 tothits += hits_onLayerNumber[
i];
769 if (hits_onLayerNumber[
i] > maxhits) {
770 nextlayer = maxlayer;
773 maxhits = hits_onLayerNumber[
i];
775 else if (hits_onLayerNumber[
i] > nexthits) {
777 nexthits = hits_onLayerNumber[
i];
782 if (tothits > (
int)UpperLimit) {
783 if (n_layers_occupied_tot > 4) {
784 tothits = tothits - hits_onLayerNumber[maxlayer];
785 n_layers_occupied_tot = n_layers_occupied_tot - 1;
787 hits_onLayerNumber[maxlayer] = 0;
791 if (tothits > (
int)UpperLimit) {
792 if (n_layers_occupied_tot > 4) {
793 tothits = tothits - hits_onLayerNumber[nextlayer];
794 n_layers_occupied_tot = n_layers_occupied_tot - 1;
796 hits_onLayerNumber[nextlayer] = 0;
800 if (tothits > (
int)UpperLimit){
809 if ( segShower.
nRecHits() < 3 )
return segmentInChamber;
810 if ( segShower.
chi2() == -1 )
return segmentInChamber;
812 segmentInChamber.push_back(segShower);
813 return segmentInChamber;
816 LogDebug(
"CSCSegment|CSC") <<
"Number of rechits in the cluster/chamber > "<< UpperLimit<<
817 " ... Segment finding in the cluster/chamber canceled!";
820 return segmentInChamber;
827 if( rechits.size() > 0 ) {
828 thering = rechits[0]->cscDetId().ring();
829 thestation = rechits[0]->cscDetId().station();
837 return segmentInChamber;
844 for(
int layer = 0; layer < 6; ++layer) {
854 n_layers_processed += 1;
858 int orig_number_of_psegs =
Psegments.size();
870 if( orig_number_of_psegs == 0 ) {
908 if( orig_number_of_noL1_psegs == 0 ) {
929 for(
int pseg = 0; pseg < orig_number_of_psegs; ++pseg ) {
931 int pseg_pos = (pseg)+((
hit)*orig_number_of_psegs);
932 int pseg_noL1_pos = (pseg)+((
hit)*orig_number_of_noL1_psegs);
933 int pseg_noL2_pos = (pseg)+((
hit)*orig_number_of_noL2_psegs);
934 int pseg_noL3_pos = (pseg)+((
hit)*orig_number_of_noL3_psegs);
935 int pseg_noL4_pos = (pseg)+((
hit)*orig_number_of_noL4_psegs);
936 int pseg_noL5_pos = (pseg)+((
hit)*orig_number_of_noL5_psegs);
937 int pseg_noL6_pos = (pseg)+((
hit)*orig_number_of_noL6_psegs);
963 if (n_layers_processed != 2 && pseg < orig_number_of_noL1_psegs)
curv_noL1_A.push_back(
curv_noL1_A[ pseg_noL1_pos ]);
964 if (n_layers_processed != 2 && pseg < orig_number_of_noL2_psegs)
curv_noL2_A.push_back(
curv_noL2_A[ pseg_noL2_pos ]);
965 if (n_layers_processed != 3 && pseg < orig_number_of_noL3_psegs)
curv_noL3_A.push_back(
curv_noL3_A[ pseg_noL3_pos ]);
966 if (n_layers_processed != 4 && pseg < orig_number_of_noL4_psegs)
curv_noL4_A.push_back(
curv_noL4_A[ pseg_noL4_pos ]);
967 if (n_layers_processed != 5 && pseg < orig_number_of_noL5_psegs)
curv_noL5_A.push_back(
curv_noL5_A[ pseg_noL5_pos ]);
968 if (n_layers_processed != 6 && pseg < orig_number_of_noL6_psegs)
curv_noL6_A.push_back(
curv_noL6_A[ pseg_noL6_pos ]);
980 if (n_layers_processed != 2 && pseg < orig_number_of_noL1_psegs)
Psegments_noL1[ pseg_noL1_pos ].push_back(
PAhits_onLayer[ layer ][ hit ]);
981 if (n_layers_processed != 2 && pseg < orig_number_of_noL2_psegs)
Psegments_noL2[ pseg_noL2_pos ].push_back(
PAhits_onLayer[ layer ][ hit ]);
982 if (n_layers_processed != 3 && pseg < orig_number_of_noL3_psegs)
Psegments_noL3[ pseg_noL3_pos ].push_back(
PAhits_onLayer[ layer ][ hit ]);
983 if (n_layers_processed != 4 && pseg < orig_number_of_noL4_psegs)
Psegments_noL4[ pseg_noL4_pos ].push_back(
PAhits_onLayer[ layer ][ hit ]);
984 if (n_layers_processed != 5 && pseg < orig_number_of_noL5_psegs)
Psegments_noL5[ pseg_noL5_pos ].push_back(
PAhits_onLayer[ layer ][ hit ]);
985 if (n_layers_processed != 6 && pseg < orig_number_of_noL6_psegs)
Psegments_noL6[ pseg_noL6_pos ].push_back(
PAhits_onLayer[ layer ][ hit ]);
998 float((*(
Psegments[ pseg_pos ].
end()-1))->cscDetId().layer()),
999 float((*(
Psegments[ pseg_pos ].
end()-2))->cscDetId().layer()),
1000 float((*(
Psegments[ pseg_pos ].
end()-3))->cscDetId().layer())
1007 float((*(
Psegments[ pseg_pos ].
end()-1))->cscDetId().layer()),
1008 float((*(
Psegments[ pseg_pos ].
end()-2))->cscDetId().layer()),
1009 float((*(
Psegments[ pseg_pos ].
end()-3))->cscDetId().layer())
1014 if(
int(
Psegments[ pseg_pos ].
size()) == n_layers_occupied_tot) {
1018 (*(
Psegments[ pseg_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-1] ))->localPosition().
x(),
1019 (*(
Psegments[ pseg_pos ].
end()-n_layers_occupied_tot ))->localPosition().
x(),
1020 float((*(
Psegments[ pseg_pos ].
end()-1))->cscDetId().layer()),
1021 float((*(
Psegments[ pseg_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-1] ))->cscDetId().layer()),
1022 float((*(
Psegments[ pseg_pos ].
end()-n_layers_occupied_tot ))->cscDetId().layer())
1029 if (
weight_A[ pseg_pos ] < min_weight_A ) {
1030 min_weight_A =
weight_A[ pseg_pos ];
1033 best_pseg = pseg_pos ;
1043 if ( n_layers_occupied_tot > 3 ) {
1044 if (pseg < orig_number_of_noL1_psegs && (n_layers_processed != 2)) {
1074 (*(
Psegments_noL1[ pseg_noL1_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-2] ))->localPosition().
x(),
1075 (*(
Psegments_noL1[ pseg_noL1_pos ].
end()-(n_layers_occupied_tot-1) ))->localPosition().
x(),
1077 float((*(
Psegments_noL1[ pseg_noL1_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-2] ))->cscDetId().layer()),
1078 float((*(
Psegments_noL1[ pseg_noL1_pos ].
end()-(n_layers_occupied_tot-1) ))->cscDetId().layer())
1090 best_noLx_pseg = pseg_noL1_pos;
1091 best_Layer_noLx = 1;
1103 if ( n_layers_occupied_tot > 3 ) {
1104 if (pseg < orig_number_of_noL2_psegs && ( n_layers_processed != 2 )) {
1134 (*(
Psegments_noL2[ pseg_noL2_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-2] ))->localPosition().
x(),
1135 (*(
Psegments_noL2[ pseg_noL2_pos ].
end()-(n_layers_occupied_tot-1) ))->localPosition().
x(),
1137 float((*(
Psegments_noL2[ pseg_noL2_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-2] ))->cscDetId().layer()),
1138 float((*(
Psegments_noL2[ pseg_noL2_pos ].
end()-(n_layers_occupied_tot-1) ))->cscDetId().layer())
1150 best_noLx_pseg = pseg_noL2_pos;
1151 best_Layer_noLx = 2;
1163 if ( n_layers_occupied_tot > 3 ) {
1164 if (pseg < orig_number_of_noL3_psegs && ( n_layers_processed != 3 )) {
1194 (*(
Psegments_noL3[ pseg_noL3_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-2] ))->localPosition().
x(),
1195 (*(
Psegments_noL3[ pseg_noL3_pos ].
end()-(n_layers_occupied_tot-1) ))->localPosition().
x(),
1197 float((*(
Psegments_noL3[ pseg_noL3_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-2] ))->cscDetId().layer()),
1198 float((*(
Psegments_noL3[ pseg_noL3_pos ].
end()-(n_layers_occupied_tot-1) ))->cscDetId().layer())
1210 best_noLx_pseg = pseg_noL3_pos;
1211 best_Layer_noLx = 3;
1223 if ( n_layers_occupied_tot > 3 ) {
1224 if (pseg < orig_number_of_noL4_psegs && ( n_layers_processed != 4 )) {
1254 (*(
Psegments_noL4[ pseg_noL4_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-2] ))->localPosition().
x(),
1255 (*(
Psegments_noL4[ pseg_noL4_pos ].
end()-(n_layers_occupied_tot-1) ))->localPosition().
x(),
1257 float((*(
Psegments_noL4[ pseg_noL4_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-2] ))->cscDetId().layer()),
1258 float((*(
Psegments_noL4[ pseg_noL4_pos ].
end()-(n_layers_occupied_tot-1) ))->cscDetId().layer())
1270 best_noLx_pseg = pseg_noL4_pos;
1271 best_Layer_noLx = 4;
1283 if ( n_layers_occupied_tot > 4 ) {
1284 if (pseg < orig_number_of_noL5_psegs && ( n_layers_processed != 5 )) {
1314 (*(
Psegments_noL5[ pseg_noL5_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-2] ))->localPosition().
x(),
1315 (*(
Psegments_noL5[ pseg_noL5_pos ].
end()-(n_layers_occupied_tot-1) ))->localPosition().
x(),
1317 float((*(
Psegments_noL5[ pseg_noL5_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-2] ))->cscDetId().layer()),
1318 float((*(
Psegments_noL5[ pseg_noL5_pos ].
end()-(n_layers_occupied_tot-1) ))->cscDetId().layer())
1330 best_noLx_pseg = pseg_noL5_pos;
1331 best_Layer_noLx = 5;
1343 if ( n_layers_occupied_tot > 5 ) {
1344 if (pseg < orig_number_of_noL6_psegs && ( n_layers_processed != 6 )) {
1374 (*(
Psegments_noL6[ pseg_noL6_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-2] ))->localPosition().
x(),
1375 (*(
Psegments_noL6[ pseg_noL6_pos ].
end()-(n_layers_occupied_tot-1) ))->localPosition().
x(),
1377 float((*(
Psegments_noL6[ pseg_noL6_pos ].
end()-midlayer_pointer[n_layers_occupied_tot-2] ))->cscDetId().layer()),
1378 float((*(
Psegments_noL6[ pseg_noL6_pos ].
end()-(n_layers_occupied_tot-1) ))->cscDetId().layer())
1390 best_noLx_pseg = pseg_noL6_pos;
1391 best_Layer_noLx = 6;
1427 int chosen_pseg = best_pseg;
1429 return segmentInChamber;
1434 float hit_drop_limit = -999999.999;
1437 switch ( n_layers_processed ) {
1449 if ((best_Layer_noLx < 1) || (best_Layer_noLx > 4)) {
1452 if ((best_Layer_noLx == 2) || (best_Layer_noLx == 3)) hit_drop_limit = hit_drop_limit * (1./2.);
1456 if ((best_Layer_noLx < 1) || (best_Layer_noLx > 5)) {
1459 if ((best_Layer_noLx == 2) || (best_Layer_noLx == 4)) hit_drop_limit = hit_drop_limit * (1./2.);
1460 if (best_Layer_noLx == 3) hit_drop_limit = hit_drop_limit * (1./3.);
1464 if ((best_Layer_noLx < 1) || (best_Layer_noLx > 6)) {
1467 if ((best_Layer_noLx == 2) || (best_Layer_noLx == 5)) hit_drop_limit = hit_drop_limit * (1./2.);
1468 if ((best_Layer_noLx == 3) || (best_Layer_noLx == 4)) hit_drop_limit = hit_drop_limit * (1./3.);
1473 LogDebug(
"CSCSegment|CSC") <<
"CSCSegAlgoST: Unexpected number of layers with hits - please inform developers.";
1475 hit_drop_limit = 0.1;
1479 switch ( best_Layer_noLx ) {
1523 if( min_weight_A > 0. ) {
1524 if ( min_weight_noLx_A/min_weight_A < hit_drop_limit ) {
1529 chosen_pseg = best_noLx_pseg;
1544 for(
unsigned int iSegment=0; iSegment<
GoodSegments.size();++iSegment){
1565 LogDebug(
"CSCSegment|segmWierd") <<
"Wierd segment, ErrXX scaled, refit " <<std::endl;
1572 LogDebug(
"CSCSegment|segmWierd") <<
"Wierd segment, ErrXY changed to match cond. number, refit " << std::endl;
1584 LogDebug(
"CSCSegment|segmWierd") <<
"Scale factor protoChiUCorrection too big, pre-Prune, refit " << std::endl;
1599 segmentInChamber.push_back(temp);
1601 return segmentInChamber;
1612 int SumCommonHits = 0;
1614 int nr_remaining_candidates;
1615 unsigned int nr_of_segment_candidates;
1617 nr_remaining_candidates = nr_of_segment_candidates = chosen_segments.size();
1620 GoodSegments.push_back( chosen_segments[ chosen_seg ] );
1622 float chosen_weight_temp = 999999.;
1623 int chosen_seg_temp = -1;
1626 while( nr_remaining_candidates > 0 ) {
1628 for(
unsigned int iCand=0; iCand < nr_of_segment_candidates; ++iCand) {
1630 if( chosen_weight[iCand] < 0. )
continue;
1633 for(
int ihits = 0; ihits < int(chosen_segments[iCand].
size()); ++ihits ) {
1634 if( chosen_segments[iCand][ihits] == chosen_segments[chosen_seg][ihits]) {
1640 if(SumCommonHits>1) {
1641 chosen_weight[iCand] = -1.;
1642 nr_remaining_candidates -= 1;
1646 if( chosen_weight[ iCand ] < chosen_weight_temp ) {
1647 chosen_weight_temp = chosen_weight[ iCand ];
1648 chosen_seg_temp = iCand ;
1653 if( chosen_seg_temp > -1 )
GoodSegments.push_back( chosen_segments[ chosen_seg_temp ] );
1655 chosen_seg = chosen_seg_temp;
1657 chosen_weight_temp = 999999;
1658 chosen_seg_temp = -1;
1664 std::vector <unsigned int> BadCandidate;
1665 int SumCommonHits =0;
1667 BadCandidate.clear();
1668 for(
unsigned int iCand=0;iCand<
Psegments.size();++iCand) {
1670 for(
unsigned int iiCand=iCand+1;iiCand<
Psegments.size();++iiCand){
1674 LogDebug(
"CSCSegment|CSC") <<
"CSCSegmentST::ChooseSegments2: ALARM!! THIS should not happen!!";
1678 for(
int ihits = 0; ihits < int(
Psegments[iCand].
size()); ++ihits ) {
1684 if(SumCommonHits>1) {
1686 BadCandidate.push_back(iCand);
1690 BadCandidate.push_back(iiCand);
1697 for(
unsigned int isegm=0;isegm<
Psegments.size();++isegm) {
1701 for(
unsigned int ibad=0;ibad<BadCandidate.size();++ibad) {
1703 if(isegm == BadCandidate[ibad]) {
1730 LogDebug(
"CSCSegment|segmWierd") <<
"e_Cxx.size()!=protoSegment.size() IT IS A SERIOUS PROBLEM!!! " <<std::endl;
1733 CLHEP::HepMatrix M(4,4,0);
1734 CLHEP::HepVector
B(4,0);
1735 ChamberHitContainer::const_iterator ih =
protoSegment.begin();
1746 CLHEP::HepMatrix IC(2,2);
1765 LogDebug(
"CSCSegment|CSC") <<
"CSCSegment::fitSlopes: failed to invert covariance matrix=\n" << IC;
1771 M(1,3) += IC(1,1) *
z;
1772 M(1,4) += IC(1,2) *
z;
1773 B(1) += u * IC(1,1) + v * IC(1,2);
1777 M(2,3) += IC(2,1) *
z;
1778 M(2,4) += IC(2,2) *
z;
1779 B(2) += u * IC(2,1) + v * IC(2,2);
1781 M(3,1) += IC(1,1) *
z;
1782 M(3,2) += IC(1,2) *
z;
1783 M(3,3) += IC(1,1) * z *
z;
1784 M(3,4) += IC(1,2) * z *
z;
1785 B(3) += ( u * IC(1,1) + v * IC(1,2) ) * z;
1787 M(4,1) += IC(2,1) *
z;
1788 M(4,2) += IC(2,2) *
z;
1789 M(4,3) += IC(2,1) * z *
z;
1790 M(4,4) += IC(2,2) * z *
z;
1791 B(4) += ( u * IC(2,1) + v * IC(2,2) ) * z;
1793 CLHEP::HepVector
p = solve(M, B);
1810 ChamberHitContainer::const_iterator ih;
1825 CLHEP::HepMatrix IC(2,2);
1845 LogDebug(
"CSCSegment|CSC") <<
"CSCSegment::fillChiSquared: failed to invert covariance matrix=\n" << IC;
1850 chsq += du*du*IC(1,1) + 2.*du*dv*IC(1,2) + dv*dv*IC(2,2);
1865 double dz = 1./
sqrt(1. + dxdz*dxdz + dydz*dydz);
1866 double dx = dz*dxdz;
1867 double dy = dz*dydz;
1876 double directionSign = globalZpos * globalZdir;
1884 std::vector<const CSCRecHit2D*>::const_iterator it;
1900 matrix.invert(ierr);
1910 ChamberHitContainer::const_iterator it;
1912 CLHEP::HepMatrix
matrix(2*nhits, 4);
1945 result.invert(ierr);
1979 std::vector<double> uu, vv, zz;
1982 double sum_U_err=0.0;
1983 double sum_Z_U_err=0.0;
1984 double sum_Z2_U_err=0.0;
1985 double sum_U_U_err=0.0;
1986 double sum_UZ_U_err=0.0;
1987 std::vector<double> chiUZind;
1988 std::vector<double>::iterator chiContribution;
1990 ChamberHitContainer::const_iterator ih =
protoSegment.begin();
2006 sum_U_err += 1./
e_Cxx.back();
2007 sum_Z_U_err += z/
e_Cxx.back();
2008 sum_Z2_U_err += (z*
z)/
e_Cxx.back();
2009 sum_U_U_err += u/
e_Cxx.back();
2010 sum_UZ_U_err += (u*
z)/
e_Cxx.back();
2016 double denom=sum_U_err*sum_Z2_U_err-
pow(sum_Z_U_err,2);
2017 double U0=(sum_Z2_U_err*sum_U_U_err-sum_Z_U_err*sum_UZ_U_err)/denom;
2018 double UZ=(sum_U_err*sum_UZ_U_err-sum_Z_U_err*sum_U_U_err)/denom;
2023 for(
unsigned i=0;
i<uu.size(); ++
i){
2024 double uMean = U0+UZ*zz[
i];
2025 chiUZind.push_back((
pow((uMean-uu[
i]),2))/
e_Cxx[i]);
2026 chiUZ += (
pow((uMean-uu[i]),2))/
e_Cxx[i];
2028 chiUZ = chiUZ/(uu.size()-2);
2032 for(
unsigned i=0;
i<uu.size(); ++
i)
2039 chiContribution=max_element(chiUZind.begin(),chiUZind.end());
2055 double condNumberCorr2=0.0;
2059 double IC_12_corr=0.0;
2060 double IC_11_corr=0.0;
2064 diag1=IC(1,1)*IC(2,2);
2065 diag2=IC(1,2)*IC(1,2);
2066 detCov=fabs(diag1-diag2);
2067 if((diag1<condNumberCorr2)&&(diag2<condNumberCorr2)){
2076 if(((detCov<condNumberCorr2)&&(diag1>condNumberCorr2))||
2077 ((diag2>condNumberCorr2)&&(detCov<condNumberCorr2)
2082 IC_12_corr=
sqrt(fabs(diag1-condNumberCorr2));
2084 IC(1,2)=(-1)*IC_12_corr;
2101 for(std::vector<CSCSegment>::iterator it=segments.begin(); it != segments.end(); ++it) {
2102 std::vector<CSCSegment*> duplicateSegments;
2103 for(std::vector<CSCSegment>::iterator it2=segments.begin(); it2 != segments.end(); ++it2) {
2105 bool allShared =
true;
2107 allShared = it->sharesRecHits(*it2);
2114 duplicateSegments.push_back(&(*it2));
2117 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.