10using namespace asg::msgUserCode;
15StatusCode
runOverlapRemoval(std::vector<FPGATrackSimTrack>& tracks,
const float minChi2,
const int NumOfHitPerGrouping,
ORAlgo orAlgo, ToolHandle<GenericMonitoringTool> & monTool,
bool compareAllHits)
20 std::vector<int> flags_OR;
24 int ntrack_passOR = 0;
26 std::vector<int> track_passOR_counter;
27 std::vector<int> track_passOR_barcodefrac;
28 track_passOR_counter.clear();
29 track_passOR_barcodefrac.clear();
30 int ntrack_passOR_total = 0;
31 int trackMuon_gt0pt5_passOR = 0;
32 float tmp_TrueTrack_BCF = -999;
36 for(
unsigned int i=0; i<tracks.size();i++)
49 std::vector<int> duplicates(1,i);
52 for(
unsigned int j=0; j<tracks.size(); j++)
69 int nOverlappingHits = 0;
72 if(nOverlappingHits >= NumOfHitPerGrouping)
74 duplicates.push_back(j);
80 int nNotOverlappingHits=0;
84 if(nNotOverlappingHits <= NumOfHitPerGrouping)
86 duplicates.push_back(j);
96 track_passOR_counter.push_back(ntrack);
104 trackMuon_gt0pt5_passOR++;
106 if(trackMuon_gt0pt5_passOR == 1) {
119 for(
unsigned int i=0; i<tracks.size();i++){
123 ANA_MSG_DEBUG(
"track# = " << track_passOR_counter[i] <<
": chi2 = " << fit1.
getChi2ndof() <<
" barcodefrac = " << track_passOR_barcodefrac[i]);
126 ntrack_passOR_total += ntrack_passOR;
131 ANA_MSG_DEBUG(
"Number of tracks passing OR (total) = " << ntrack_passOR_total);
134 return StatusCode::SUCCESS;
139 int nonOverlapHits=0;
179 return nonOverlapHits;
183void findMinChi2MaxHit(
const std::vector<int>& duplicates, std::vector<FPGATrackSimTrack>& RMtracks, std::vector<int> flags_OR,
const float minChi2)
185 int ntr_belowMinChi2 = 0;
186 std::vector<int> track_counter;
188 for(
unsigned int i=0; i<RMtracks.size();i++)
190 if(RMtracks.at(i).getChi2ndof() > minChi2) {
191 track_counter.push_back(0);
192 flags_OR.push_back(-1);
196 track_counter.push_back(ntr_belowMinChi2);
197 flags_OR.push_back(1);
202 float head_chi2 = 0.;
205 for(
auto dup: duplicates)
207 float t_chi2 = RMtracks.at(dup).getChi2ndof();
208 int t_nhitlayers = RMtracks.at(dup).getFPGATrackSimHits().size();
209 for(
auto& hit : RMtracks.at(dup).getFPGATrackSimHits())
212 ANA_MSG_DEBUG(
"Real hit info (global) = Gphi= " << hit.getGPhi() <<
" Z=" << hit.getZ() <<
" R=" << hit.getR() <<
" chi2=" << t_chi2);
219 if (dup_counter == 0) {
221 head_chi2 = RMtracks.at(head_track).getChi2ndof();
222 head_nhits = t_nhitlayers;
224 if (dup_counter > 0){
225 if(t_nhitlayers>head_nhits)
227 RMtracks.at(head_track).setPassedOR(0);
229 else if(t_nhitlayers==head_nhits)
231 if((head_chi2-t_chi2)>0.000001)
233 RMtracks.at(head_track).setPassedOR(0);
235 if(std::abs(t_chi2-head_chi2)<0.000001)
237 if(track_counter[head_track] < track_counter[dup]) {
238 RMtracks.at(dup).setPassedOR(0);
240 if(track_counter[head_track] > track_counter[dup]) {
241 RMtracks.at(head_track).setPassedOR(0);
247 if(!RMtracks.at(head_track).passedOR()) flags_OR[head_track] = 0;
248 if(RMtracks.at(head_track).passedOR()) flags_OR[head_track] = 1;
265 if (hit2_matched[j])
continue;
266 else if (!hit1.isReal() || !hit2.isReal())
continue;
267 else if (hit1.getLayer() != hit2.getLayer())
continue;
268 else if (hit1.getIdentifierHash() != hit2.getIdentifierHash())
continue;
274 if (std::abs(hit1.getX() - hit2.getX()) <
EPSILON &&
275 std::abs(hit1.getY() - hit2.getY()) <
EPSILON &&
276 std::abs(hit1.getZ() - hit2.getZ()) <
EPSILON)
279 hit2_matched[j] =
true;
285 else if (std::abs(hit1.getGPhi() - hit2.getGPhi()) < 0.001 &&
286 std::abs(hit1.getZ() - hit2.getZ()) < 0.001 &&
287 std::abs(hit1.getR() - hit2.getR()) < 0.001)
290 hit2_matched[j] =
true;
311 if (hit2_matched[j])
continue;
312 else if (!hit1.isReal() || !hit2.isReal())
continue;
313 else if (hit1.getLayer() != hit2.getLayer())
continue;
314 else if (hit1.getIdentifierHash() != hit2.getIdentifierHash())
continue;
320 if (std::abs(hit1.getX() - hit2.getX()) <
EPSILON &&
321 std::abs(hit1.getY() - hit2.getY()) <
EPSILON &&
322 std::abs(hit1.getZ() - hit2.getZ()) <
EPSILON)
325 hit2_matched[j] =
true;
331 else if (std::abs(hit1.getGPhi() - hit2.getGPhi()) <
EPSILON &&
332 std::abs(hit1.getZ() - hit2.getZ()) <
EPSILON &&
333 std::abs(hit1.getR() - hit2.getR()) <
EPSILON)
336 hit2_matched[j] =
true;
397 nMissing = FPGATrackSimMapping->PlaneMap_1st(subregion)->getNCoords();
403 for (
unsigned layer = 0; layer < FPGATrackSimMapping->PlaneMap_1st(subregion)->getNLogiLayers(); layer++)
410 int ix = FPGATrackSimMapping->PlaneMap_1st(subregion)->getCoordOffset(layer);
412 if (FPGATrackSimMapping->PlaneMap_1st(subregion)->isSCT(layer))
414 missing_mask |= 1 << ix;
419 missing_mask |= (1<<ix) | (1<<iy);
425 if (FPGATrackSimMapping->PlaneMap_1st(subregion)->isSCT(layer)) missStrip =
true;
426 else missPixel =
true;
429 else if (!((wclayers >> layer) & 1)) {
430 int ix = FPGATrackSimMapping->PlaneMap_1st(subregion)->getCoordOffset(layer);
432 if (FPGATrackSimMapping->PlaneMap_1st(subregion)->isSCT(layer))
434 missing_mask |= 1 << ix;
439 missing_mask |= (1<<ix) | (1<<iy);
460 auto pmap = FPGATrackSimMapping->PlaneMap_2nd(subregion);
463 pmap = FPGATrackSimMapping->PlaneMap_1st(subregion);
467 track_cands.resize(combs.size(), temp);
474 for (
size_t icomb = 0; icomb < combs.size(); icomb++)
477 track_cands[icomb].setTrackID(idbase + icomb);
478 track_cands[icomb].setNLayers(pmap->getNLogiLayers());
481 track_cands[icomb].setIdealRadii(SUBREGIONMAP->
getAvgRadii(subregion));
482 track_cands[icomb].setPassedOR(1);
484 std::vector<int>
const & hit_indices = combs[icomb];
485 for (
unsigned layer = 0; layer < pmap->getNLogiLayers(); layer++)
487 if (hit_indices[layer] < 0)
495 if (wcbits & (1 << layer ) ) {
500 track_cands[icomb].setFPGATrackSimHit(layer, newhit);
504 const std::shared_ptr<const FPGATrackSimHit> hit = road.
getHits(layer)[hit_indices[layer]];
510 if (layer == 0)
throw (std::out_of_range(
"makeTrackCandidates: Attempt to access vector at element -1"));
511 const FPGATrackSimHit & inner_hit = track_cands[icomb].getFPGATrackSimHits().at(layer - 1);
513 track_cands[icomb].setValidCand(
false);
516 track_cands[icomb].setFPGATrackSimHit(layer, *hit);
521 idbase += combs.size();
547 if (hit.
getR() == 0.0) {
561 if (hit.
getZ() >= 0.) {
569 if (hit.
getZ() >= 0.) {
596 long offset = -10000;
598 if(volumeID == 10) offset = 0;
599 if(volumeID == 8) offset = 4;
600 if(volumeID == 12) offset = 10;
601 if(volumeID == 0) offset = 16;
602 if(volumeID == -2) offset = 21;
603 if(volumeID == 2) offset = 30;
604 return offset + layerID;
635 if(volumeID == -999)
return -999;
638 if(layerID == 0) offset = 21;
639 if(layerID == 1) offset = 21+15;
640 if(layerID == 2) offset = 21+15+6;
641 if(layerID == 3) offset = 21+15+6+23;
642 if(layerID == 4) offset = 21+15+6+23+6;
643 if(layerID == 5) offset = 21+15+6+23+6+11;
644 if(layerID == 6) offset = 21+15+6+23+6+11+8;
645 if(layerID == 7) offset = 21+15+6+23+6+11+8+8;
646 if(layerID == 8) offset = 21+15+6+23+6+11+8+8+9;
647 return offset + etaID;
651 if(layerID == 0) offset = 116;
652 if(layerID == 1) offset = 116+15;
653 if(layerID == 2) offset = 116+15+6;
654 if(layerID == 3) offset = 116+15+6+23;
655 if(layerID == 4) offset = 116+15+6+23+6;
656 if(layerID == 5) offset = 116+15+6+23+6+11;
657 if(layerID == 6) offset = 116+15+6+23+6+11+8;
658 if(layerID == 7) offset = 116+15+6+23+6+11+8+8;
659 if(layerID == 8) offset = 116+15+6+23+6+11+8+8+9;
660 return offset + etaID;
671 for (
const std::shared_ptr<const FPGATrackSimRoad>& road : roads) {
676 temp.setPatternID(road->getPID());
677 temp.setHoughX(road->getX());
678 temp.setHoughY(road->getY());
679 temp.setQOverPt(road->getY());
681 temp.setSubRegion(road->getSubRegion());
682 temp.setHoughXBin(road->getXBin());
683 temp.setHoughYBin(road->getYBin());
686 temp.setBinIdx(road->getBinIdx());
689 std::vector<std::vector<int>> combs =
getComboIndices(road->getNHits_layer());
690 unsigned existing_size = track_cands.size();
691 track_cands.resize(existing_size + combs.size(), temp);
696 for (
size_t icomb = 0; icomb < combs.size(); icomb++)
698 if ((existing_size + icomb) >= track_cands.size())
continue;
699 track_cands[existing_size + icomb].setNLayers(pmap->
getNLogiLayers());
700 std::vector<int>
const & hit_indices = combs[icomb];
703 if (hit_indices[layer] < 0)
711 if (wcbits & (1 << layer ) ) {
716 track_cands[existing_size + icomb].setFPGATrackSimHit(layer, newhit);
720 const std::shared_ptr<const FPGATrackSimHit> hit = road->getHits(layer)[hit_indices[layer]];
725 if (hit->getHitType() ==
HitType::spacepoint && (hit->getPhysLayer() % 2) == 1 && (layer>0)) {
726 const FPGATrackSimHit inner_hit = track_cands[existing_size + icomb].getFPGATrackSimHits().at(layer - 1);
727 if ((hit->getX() != inner_hit.
getX()) || (hit->getY() != inner_hit.
getY()) || (hit->getZ() != inner_hit.
getZ())) {
728 track_cands[existing_size + icomb].setValidCand(
false);
731 track_cands[existing_size + icomb].setFPGATrackSimHit(layer, *hit);
std::vector< Identifier > ID
std::vector< std::vector< int > > getComboIndices(std::vector< size_t > const &sizes)
Given a vector of sizes (of arrays), generates a vector of all combinations of indices to index one e...
bool isFineIDInStrip(long ID)
long getFineID(const FPGATrackSimHit &hit)
void getMissingInfo(const FPGATrackSimRoad &road, int &nMissing, bool &missPixel, bool &missStrip, layer_bitmask_t &missing_mask, layer_bitmask_t &norecovery_mask, const ServiceHandle< IFPGATrackSimMappingSvc > &FPGATrackSimMapping, const TrackCorrType idealCoordFitType)
int findNonOverlapHits(const FPGATrackSimTrack &Track1, const FPGATrackSimTrack &Track2)
int findNCommonHits_v2(const FPGATrackSimTrack &Track1, const FPGATrackSimTrack &Track2)
long getCoarseID(const FPGATrackSimHit &hit)
StatusCode runOverlapRemoval(std::vector< FPGATrackSimTrack > &tracks, const float minChi2, const int NumOfHitPerGrouping, ORAlgo orAlgo, ToolHandle< GenericMonitoringTool > &monTool, bool compareAllHits)
long getVolumeID(const FPGATrackSimHit &hit)
void findMinChi2MaxHit(const std::vector< int > &duplicates, std::vector< FPGATrackSimTrack > &RMtracks, std::vector< int > flags_OR, const float minChi2)
int findNCommonHitsGlobal(const FPGATrackSimTrack &Track1, const FPGATrackSimTrack &Track2)
void makeTrackCandidates(const FPGATrackSimRoad &road, const FPGATrackSimTrack &temp, std::vector< FPGATrackSimTrack > &track_cands, const ServiceHandle< IFPGATrackSimMappingSvc > &FPGATrackSimMapping)
Creates a list of track candidates by taking all possible combination of hits in road.
bool isFineIDInPixel(long ID)
void roadsToTrack(std::vector< std::shared_ptr< const FPGATrackSimRoad > > &roads, std::vector< FPGATrackSimTrack > &track_cands, const FPGATrackSimPlaneMap *pmap)
int findNCommonHits(const FPGATrackSimTrack &Track1, const FPGATrackSimTrack &Track2)
static const uint32_t nHits
void setLayer(unsigned v)
unsigned getIdentifierHash() const
void setHitType(HitType type)
int getEtaModule(bool old=false) const
unsigned getLayerDisk(bool old=false) const
void setSection(unsigned v)
HitType getHitType() const
void setDetType(SiliconTech detType)
uint32_t getNLogiLayers() const
uint32_t getDim(size_t logiLayer) const
const std::vector< double > & getAvgRadii(unsigned region) const
const std::vector< std::shared_ptr< const FPGATrackSimHit > > & getHits(size_t layer) const
layer_bitmask_t getWCLayers() const
std::vector< size_t > getNHits_layer() const
float getBarcodeFrac() const
void setPassedOR(unsigned int)
unsigned int passedOR() const
float getChi2ndof() const
void setNLayers(int)
set the number of layers in the track.
const std::vector< FPGATrackSimHit > & getFPGATrackSimHits() const
Group of local monitoring quantities and retain correlation when filling histograms
Declare a monitored scalar variable.