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(tracks.size(), -1);
27 std::vector<int> track_passOR_barcodefrac(tracks.size(), -1);
28 int ntrack_passOR_total = 0;
29 int trackMuon_gt0pt5_passOR = 0;
30 float tmp_TrueTrack_BCF = -999;
33 std::vector<unsigned int> goodTrackIndices;
34 goodTrackIndices.reserve(tracks.size());
35 for(
unsigned int i = 0; i < tracks.size(); i++)
37 if(tracks[i].getChi2ndof() > minChi2)
39 tracks[i].setPassedOR(0);
43 goodTrackIndices.push_back(i);
48 std::vector<int> track_counter;
49 int ntr_belowMinChi2 = 0;
50 for(
unsigned int i=0; i<tracks.size();i++)
52 if(tracks.at(i).getChi2ndof() > minChi2) {
53 track_counter.push_back(0);
54 flags_OR.push_back(-1);
57 track_counter.push_back(ntr_belowMinChi2);
58 flags_OR.push_back(1);
63 for(
size_t idx = 0; idx < goodTrackIndices.size(); idx++)
65 unsigned int i = goodTrackIndices[idx];
72 std::vector<int> duplicates(1,i);
75 for(
size_t jdx = 0; jdx < goodTrackIndices.size(); jdx++)
77 if(jdx == idx)
continue;
79 unsigned int j = goodTrackIndices[jdx];
88 int nOverlappingHits = 0;
92 if(nOverlappingHits >= NumOfHitPerGrouping)
94 duplicates.push_back(j);
100 int nNotOverlappingHits = 0;
104 if(nNotOverlappingHits <= NumOfHitPerGrouping)
106 duplicates.push_back(j);
115 track_passOR_counter[i] = ntrack;
123 trackMuon_gt0pt5_passOR++;
125 if(trackMuon_gt0pt5_passOR == 1) {
138 for(
unsigned int i=0; i<tracks.size();i++){
142 ANA_MSG_DEBUG(
"track# = " << track_passOR_counter[i] <<
": chi2 = " << fit1.
getChi2ndof() <<
" barcodefrac = " << track_passOR_barcodefrac[i]);
145 ntrack_passOR_total += ntrack_passOR;
150 ANA_MSG_DEBUG(
"Number of tracks passing OR (total) = " << ntrack_passOR_total);
153 return StatusCode::SUCCESS;
158 int nonOverlapHits=0;
198 return nonOverlapHits;
202void findMinChi2MaxHit(
const std::vector<int>& duplicates, std::vector<FPGATrackSimTrack>& RMtracks, std::vector<int>& flags_OR,
const std::vector<int>& track_counter)
206 float head_chi2 = 0.;
209 for(
auto dup: duplicates)
211 float t_chi2 = RMtracks.at(dup).getChi2ndof();
212 int t_nhitlayers = RMtracks.at(dup).getFPGATrackSimHits().size();
213 for(
auto& hit : RMtracks.at(dup).getFPGATrackSimHits())
216 ANA_MSG_DEBUG(
"Real hit info (global) = Gphi= " << hit.getGPhi() <<
" Z=" << hit.getZ() <<
" R=" << hit.getR() <<
" chi2=" << t_chi2);
223 if (dup_counter == 0) {
225 head_chi2 = RMtracks.at(head_track).getChi2ndof();
226 head_nhits = t_nhitlayers;
228 if (dup_counter > 0){
229 if(t_nhitlayers>head_nhits)
231 RMtracks.at(head_track).setPassedOR(0);
233 else if(t_nhitlayers==head_nhits)
235 if((head_chi2-t_chi2)>0.000001)
237 RMtracks.at(head_track).setPassedOR(0);
239 if(std::abs(t_chi2-head_chi2)<0.000001)
241 if(track_counter[head_track] < track_counter[dup]) {
242 RMtracks.at(dup).setPassedOR(0);
244 if(track_counter[head_track] > track_counter[dup]) {
245 RMtracks.at(head_track).setPassedOR(0);
251 if(!RMtracks.at(head_track).passedOR()) flags_OR[head_track] = 0;
252 if(RMtracks.at(head_track).passedOR()) flags_OR[head_track] = 1;
265 if (!hit1.isReal())
continue;
271 if (hit2_matched[j])
continue;
272 else if (!hit2.isReal())
continue;
273 else if (hit1.getLayer() != hit2.getLayer())
continue;
274 else if (hit1.getIdentifierHash() != hit2.getIdentifierHash())
continue;
280 if (std::abs(hit1.getX() - hit2.getX()) <
EPSILON &&
281 std::abs(hit1.getY() - hit2.getY()) <
EPSILON &&
282 std::abs(hit1.getZ() - hit2.getZ()) <
EPSILON)
285 hit2_matched[j] =
true;
291 else if (std::abs(hit1.getGPhi() - hit2.getGPhi()) < 0.001 &&
292 std::abs(hit1.getZ() - hit2.getZ()) < 0.001 &&
293 std::abs(hit1.getR() - hit2.getR()) < 0.001)
296 hit2_matched[j] =
true;
313 if (!hit1.isReal())
continue;
319 if (hit2_matched[j])
continue;
320 else if (!hit2.isReal())
continue;
321 else if (hit1.getLayer() != hit2.getLayer())
continue;
322 else if (hit1.getIdentifierHash() != hit2.getIdentifierHash())
continue;
328 if (std::abs(hit1.getX() - hit2.getX()) <
EPSILON &&
329 std::abs(hit1.getY() - hit2.getY()) <
EPSILON &&
330 std::abs(hit1.getZ() - hit2.getZ()) <
EPSILON)
333 hit2_matched[j] =
true;
339 else if (std::abs(hit1.getGPhi() - hit2.getGPhi()) <
EPSILON &&
340 std::abs(hit1.getZ() - hit2.getZ()) <
EPSILON &&
341 std::abs(hit1.getR() - hit2.getR()) <
EPSILON)
344 hit2_matched[j] =
true;
405 nMissing = FPGATrackSimMapping->PlaneMap_1st(subregion)->getNCoords();
411 for (
unsigned layer = 0; layer < FPGATrackSimMapping->PlaneMap_1st(subregion)->getNLogiLayers(); layer++)
418 int ix = FPGATrackSimMapping->PlaneMap_1st(subregion)->getCoordOffset(layer);
420 if (FPGATrackSimMapping->PlaneMap_1st(subregion)->isSCT(layer))
422 missing_mask |= 1 << ix;
427 missing_mask |= (1<<ix) | (1<<iy);
433 if (FPGATrackSimMapping->PlaneMap_1st(subregion)->isSCT(layer)) missStrip =
true;
434 else missPixel =
true;
437 else if (!((wclayers >> layer) & 1)) {
438 int ix = FPGATrackSimMapping->PlaneMap_1st(subregion)->getCoordOffset(layer);
440 if (FPGATrackSimMapping->PlaneMap_1st(subregion)->isSCT(layer))
442 missing_mask |= 1 << ix;
447 missing_mask |= (1<<ix) | (1<<iy);
468 auto pmap = FPGATrackSimMapping->PlaneMap_2nd(subregion);
471 pmap = FPGATrackSimMapping->PlaneMap_1st(subregion);
475 track_cands.resize(combs.size(), temp);
482 for (
size_t icomb = 0; icomb < combs.size(); icomb++)
485 track_cands[icomb].setTrackID(idbase + icomb);
486 track_cands[icomb].setNLayers(pmap->getNLogiLayers());
489 track_cands[icomb].setIdealRadii(SUBREGIONMAP->
getAvgRadii(subregion));
490 track_cands[icomb].setPassedOR(1);
492 std::vector<int>
const & hit_indices = combs[icomb];
493 for (
unsigned layer = 0; layer < pmap->getNLogiLayers(); layer++)
495 if (hit_indices[layer] < 0)
503 if (wcbits & (1 << layer ) ) {
508 track_cands[icomb].setFPGATrackSimHit(layer, newhit);
512 const std::shared_ptr<const FPGATrackSimHit> hit = road.
getHits(layer)[hit_indices[layer]];
518 if (layer == 0)
throw (std::out_of_range(
"makeTrackCandidates: Attempt to access vector at element -1"));
519 const FPGATrackSimHit & inner_hit = track_cands[icomb].getFPGATrackSimHits().at(layer - 1);
521 track_cands[icomb].setValidCand(
false);
524 track_cands[icomb].setFPGATrackSimHit(layer, *hit);
529 idbase += combs.size();
555 if (hit.
getR() == 0.0) {
569 if (hit.
getZ() >= 0.) {
577 if (hit.
getZ() >= 0.) {
604 long offset = -10000;
606 if(volumeID == 10) offset = 0;
607 if(volumeID == 8) offset = 4;
608 if(volumeID == 12) offset = 10;
609 if(volumeID == 0) offset = 16;
610 if(volumeID == -2) offset = 21;
611 if(volumeID == 2) offset = 30;
612 return offset + layerID;
643 if(volumeID == -999)
return -999;
646 if(layerID == 0) offset = 21;
647 if(layerID == 1) offset = 21+15;
648 if(layerID == 2) offset = 21+15+6;
649 if(layerID == 3) offset = 21+15+6+23;
650 if(layerID == 4) offset = 21+15+6+23+6;
651 if(layerID == 5) offset = 21+15+6+23+6+11;
652 if(layerID == 6) offset = 21+15+6+23+6+11+8;
653 if(layerID == 7) offset = 21+15+6+23+6+11+8+8;
654 if(layerID == 8) offset = 21+15+6+23+6+11+8+8+9;
655 return offset + etaID;
659 if(layerID == 0) offset = 116;
660 if(layerID == 1) offset = 116+15;
661 if(layerID == 2) offset = 116+15+6;
662 if(layerID == 3) offset = 116+15+6+23;
663 if(layerID == 4) offset = 116+15+6+23+6;
664 if(layerID == 5) offset = 116+15+6+23+6+11;
665 if(layerID == 6) offset = 116+15+6+23+6+11+8;
666 if(layerID == 7) offset = 116+15+6+23+6+11+8+8;
667 if(layerID == 8) offset = 116+15+6+23+6+11+8+8+9;
668 return offset + etaID;
684 temp.setPatternID(road.getPID());
685 temp.setHoughX(road.getX());
686 temp.setHoughY(road.getY());
687 temp.setQOverPt(road.getY());
689 temp.setSubRegion(road.getSubRegion());
690 temp.setHoughXBin(road.getXBin());
691 temp.setHoughYBin(road.getYBin());
694 temp.setBinIdx(road.getBinIdx());
697 std::vector<std::vector<int>> combs =
getComboIndices(road.getNHits_layer());
698 unsigned existing_size = track_cands.size();
699 track_cands.resize(existing_size + combs.size(), temp);
704 for (
size_t icomb = 0; icomb < combs.size(); icomb++)
706 if ((existing_size + icomb) >= track_cands.size())
continue;
707 track_cands[existing_size + icomb].setNLayers(pmap->
getNLogiLayers());
708 std::vector<int>
const & hit_indices = combs[icomb];
711 if (hit_indices[layer] < 0)
719 if (wcbits & (1 << layer ) ) {
724 track_cands[existing_size + icomb].setFPGATrackSimHit(layer, newhit);
728 const std::shared_ptr<const FPGATrackSimHit> hit = road.getHits(layer)[hit_indices[layer]];
733 if (hit->getHitType() ==
HitType::spacepoint && (hit->getPhysLayer() % 2) == 1 && (layer>0)) {
734 const FPGATrackSimHit inner_hit = track_cands[existing_size + icomb].getFPGATrackSimHits().at(layer - 1);
735 if ((hit->getX() != inner_hit.
getX()) || (hit->getY() != inner_hit.
getY()) || (hit->getZ() != inner_hit.
getZ())) {
736 track_cands[existing_size + icomb].setValidCand(
false);
739 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...
void findMinChi2MaxHit(const std::vector< int > &duplicates, std::vector< FPGATrackSimTrack > &RMtracks, std::vector< int > &flags_OR, const std::vector< int > &track_counter)
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)
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< 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
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.