diff --git a/Trigger/TrigT1/TrigT1NSWSimTools/src/MMT_Diamond.cxx b/Trigger/TrigT1/TrigT1NSWSimTools/src/MMT_Diamond.cxx index 67f9f09e16400801e694b4aa43731dfa57665a45..66f507c266a612c480c50b44edfec04576c4b124 100644 --- a/Trigger/TrigT1/TrigT1NSWSimTools/src/MMT_Diamond.cxx +++ b/Trigger/TrigT1/TrigT1NSWSimTools/src/MMT_Diamond.cxx @@ -131,6 +131,7 @@ void MMT_Diamond::findDiamonds(const unsigned int iterator, const int event) { std::vector< std::pair<int, int> > addc_same = {}; std::vector<int> to_erase = {}; int n_addc = 4; + int n_vmm = 128; // each road makes independent triggers, evaluated on each BC for (int bc = m_diamonds[iterator].ev_hits.front()->getBC(); bc < bc_end; bc++) { @@ -145,13 +146,38 @@ void MMT_Diamond::findDiamonds(const unsigned int iterator, const int event) { } } - // Implement ADDC-like filter + // Simulate harware filters: ART hits + ADDC filter for (unsigned int ib = 0; ib < 8; ib++) { //loop on plane from 0 to 7 + // VMM-ART-hit filter + for (int j = 0; j < n_vmm; j++) { + vmm_same.clear(); + unsigned int k = 0; + for (auto hit_pointer: hits_now) { + if (static_cast<unsigned int>(hit_pointer->getPlane()) != ib) continue; + if (hit_pointer->getVMM() == j){ + vmm_same.push_back( std::make_pair(k, hit_pointer->getTime()) ); + } + k++; + } + if (vmm_same.size() > 1) { + to_erase.clear(); + std::sort(vmm_same.begin(), vmm_same.end(), [](const std::pair<int, float>& p1, const std::pair<int, float>& p2) { return p1.second < p2.second; }); + for (auto pair: vmm_same) to_erase.push_back(pair.first); + // reverse and erase + std::sort(to_erase.rbegin(), to_erase.rend()); + to_erase.pop_back(); //removes the hit with the earliest time + for (auto l : to_erase) { + hits_now.erase(hits_now.begin() + l); + } + } + } + // ADDC-like filter for (int ia = 0; ia < n_addc; ia++) { // From 0 to 3 (local index of the ART ASIC in the layer) addc_same.clear(); for (unsigned int k = 0; k < hits_now.size(); k++) { if ((unsigned int)(hits_now[k]->getPlane()) != ib) continue; - if (hits_now[k]->getART() == ia) addc_same.push_back( std::make_pair(k, hits_now[k]->getChannel()) ); + int istrip = (std::abs(hits_now[k]->getStationEta())-1) * (64*8*10) + hits_now[k]->getChannel(); //needed the global strip index on the sector layer (getChannel returns chamber's local strip index) + if (hits_now[k]->getART() == ia) addc_same.emplace_back(k, istrip); } if (addc_same.size() > 8) { @@ -242,7 +268,7 @@ void MMT_Diamond::findDiamonds(const unsigned int iterator, const int event) { } double MMT_Diamond::phiShift(const int n, const double phi, const char side) const { - double Phi = (side == 'A') ? phi : -phi; + double Phi = (side == 'A') ? -phi : phi; double shift = (n > 8) ? (16-n)*M_PI/8. : n*M_PI/8.; if (n < 8) return (Phi + shift); else if (n == 8) return (Phi + ((Phi > 0.) ? -1. : 1.)*shift); diff --git a/Trigger/TrigT1/TrigT1NSWSimTools/src/MMT_Hit.cxx b/Trigger/TrigT1/TrigT1NSWSimTools/src/MMT_Hit.cxx index 93462ac9c46c229b5f3701180f57836c2af6f720..25e8ec0e9e77d15cac732d006285e687cf701a6b 100644 --- a/Trigger/TrigT1/TrigT1NSWSimTools/src/MMT_Hit.cxx +++ b/Trigger/TrigT1/TrigT1NSWSimTools/src/MMT_Hit.cxx @@ -45,9 +45,10 @@ MMT_Hit::MMT_Hit(const hitData_entry &entry, const MuonGM::MuonDetectorManager* if(m_strip > 8191 || m_strip<0){ m_strip = 0; } + int istrip = (std::abs(m_station_eta)-1) * (64*8*10) + m_strip; //here needed the absolute index of the strip on the sector layer (m_strip is only up to 5119) // region represent the index of the mmfe8 in the plane - int region = int(float(m_strip)/(64*8)); + int region = int(float(istrip)/(64*8)); // map of mmfe8s layer,radius(MMFE8 index on sector) unsigned int mmfe8s[8][16]; // loop on layers @@ -61,6 +62,9 @@ MMT_Hit::MMT_Hit(const hitData_entry &entry, const MuonGM::MuonDetectorManager* } } } + // re-assigning as seems not to work with new stand-alone run with RecoTf from HITS samples + m_MMFE_VMM = region; // index of the MMFE8 board on the layer + m_VMM_chip = int(1. *istrip /64.); // index of the VMM chip on the layer // art asic id if(!int(m_plane/2.)%2){ if (mmfe8s[m_plane][region]==1){ //Right