ATLAS Offline Software
Loading...
Searching...
No Matches
TGCOutputModifier.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5// First the corresponding header.
7
11
12namespace {
15}
16
17namespace LVL1TGCTrigger {
18
19 TGCOutputModifier::TGCOutputModifier( const std::string& name, ISvcLocator* pSvcLocator )
20 :
21 AthReentrantAlgorithm(name, pSvcLocator)
22 {
23 }
24
26
27
28
31 {
32 ATH_MSG_INFO( "=======================================" );
33 ATH_MSG_INFO( "Initialisation for TGCOutputModifier" );
34 ATH_MSG_INFO( "NSWVetoMode="<<m_nswVetoMode.value());
35 ATH_MSG_INFO( "EmulateA="<<m_emulateA.value());
36 ATH_MSG_INFO( "EmulateC="<<m_emulateC.value());
37 ATH_MSG_INFO( "EtaBoundary1="<<m_etaBoundary1.value() );
38 ATH_MSG_INFO( "DeltaEtaCut1="<<m_deltaEtaCut1.value() );
39 ATH_MSG_INFO( "DeltaPhiCut1="<<m_deltaPhiCut1.value() );
40 ATH_MSG_INFO( "DeltaThetaCut1="<<m_deltaThetaCut1.value() );
41 ATH_MSG_INFO( "EtaBoundary2="<<m_etaBoundary2.value() );
42 ATH_MSG_INFO( "DeltaEtaCut2="<<m_deltaEtaCut2.value() );
43 ATH_MSG_INFO( "DeltaPhiCut2="<<m_deltaPhiCut2.value() );
44 ATH_MSG_INFO( "DeltaThetaCut2="<<m_deltaThetaCut2.value() );
45 ATH_MSG_INFO( "InputMuctpiLocation="<<m_inputKey.key() );
46 ATH_MSG_INFO( "OutputMuctpiLocation="<<m_outputKey.key() );
47 ATH_MSG_INFO( "MuonSegmentContainer="<<m_musegKey.key() );
48 ATH_MSG_INFO( "=======================================" );
49
50 ATH_CHECK(m_inputKey.initialize());
51 ATH_CHECK(m_outputKey.initialize());
52 ATH_CHECK(m_recTGCRoiTool.retrieve());
53 ATH_CHECK(m_musegKey.initialize(m_nswVetoMode.value()));
54 return StatusCode::SUCCESS;
55 }
56
58 StatusCode TGCOutputModifier::execute(const EventContext& eventContext) const
59 {
61 if(!rh_muctpiTgc.isValid()){
62 ATH_MSG_ERROR("Cannot retrieve LVL1MUONIF::Lvl1MuCTPIInputPhase1");
63 return StatusCode::FAILURE;
64 }
65 const LVL1MUONIF::Lvl1MuCTPIInputPhase1* inTgc2Muctpi = rh_muctpiTgc.cptr();
66
67 std::vector<const xAOD::MuonSegment*> muSegDataColl;
68 if( m_nswVetoMode.value() ){
70 if(!rh_museg.isValid()){
71 ATH_MSG_ERROR("Cannot retrieve xAOD::MuonSegmentContainer");
72 return StatusCode::FAILURE;
73 }
74 const xAOD::MuonSegmentContainer* muSegContainer = rh_museg.cptr();
75 for(auto seg : *muSegContainer){
76 if(seg->chamberIndex() != ChIdx::EIS && seg->chamberIndex() != ChIdx::EIL &&
77 seg->chamberIndex() != ChIdx::CSS && seg->chamberIndex() != ChIdx::CSL ) continue;
78 muSegDataColl.push_back(seg);
79 }
80 }
81
83 ATH_CHECK(wh_muctpiTgc.record(std::make_unique<LVL1MUONIF::Lvl1MuCTPIInputPhase1>()));
84 LVL1MUONIF::Lvl1MuCTPIInputPhase1* outTgc2Muctpi = wh_muctpiTgc.ptr();
85
89 for(auto isys : tgc_systems){
90 auto data = &inTgc2Muctpi->getData(isys); // const std::vector<Lvl1MuVectWithBC>&
91 for(const auto & [bcid, muvec] : *data){ // Lvl1MuVectWithBC
92
93 for(size_t i = 0 ; i < muvec.size() ; i++){ // i = system index = MaxSectors * Side + Sectors
94 auto sectorData = muvec.at(i).get();// std::shared_ptr <Lvl1MuSectorLogicDataPhase1>
95 if(!sectorData){
96 ATH_MSG_WARNING("sectorData is null!");
97 continue;
98 }
101 size_t isub = (i<numberOfSectors)
103 size_t isec = i % numberOfSectors;
104 if(i != inTgc2Muctpi->getSystemIndex(isys,isub,isec)){
105 ATH_MSG_WARNING("System Index Mismatch!!");
106 continue;
107 }
109 Copy(sectorData,sldata);
110 Update(muSegDataColl,sldata,isys,isub,isec);
111 outTgc2Muctpi->setSectorLogicData(sldata,isys,isub,isec,bcid);
114 size_t isub = (i<numberOfSectors)
116 size_t isec = i % numberOfSectors;
117 if(i != inTgc2Muctpi->getSystemIndex(isys,isub,isec)){
118 ATH_MSG_WARNING("System Index Mismatch!!");
119 continue;
120 }
122 Copy(sectorData,sldata);
123 Update(muSegDataColl,sldata,isys,isub,isec);
124 outTgc2Muctpi->setSectorLogicData(sldata,isys,isub,isec,bcid);
125 }else{
126 ATH_MSG_WARNING("Unknown system. Barrel? isys="<<isys);
127 }
128 }
129 }
130 }
131
132 return StatusCode::SUCCESS;
133 }
134
137 {
138 sldataNew.clear2candidatesInSector();
139 if(sldataOrg->is2candidatesInSector()) sldataNew.set2candidatesInSector();
140 sldataNew.bcid(sldataOrg->bcid());
141 for (unsigned int icand=0;
143 sldataNew.roi(icand,sldataOrg->roi(icand));
144 sldataNew.pt(icand,sldataOrg->pt(icand));
145 sldataNew.ovl(icand,sldataOrg->ovl(icand));
146 sldataNew.charge(icand,sldataOrg->charge(icand));
147 sldataNew.bw2or3(icand,sldataOrg->bw2or3(icand));
148 sldataNew.goodmf(icand,sldataOrg->goodmf(icand));
149 sldataNew.innercoin(icand,sldataOrg->innercoin(icand));
150 sldataNew.clear2candidates(icand);
151 if(sldataOrg->is2candidates(icand))sldataNew.set2candidates(icand);
152 }
153 }
154 void TGCOutputModifier::Update(const std::vector<const xAOD::MuonSegment*>& muSegDataColl,
156 size_t systemId,
157 size_t subSystemId,
158 size_t sectorId) const
159 {
160 if(subSystemId==LVL1MUONIF::Lvl1MuCTPIInputPhase1::idSideA() && !m_emulateA.value()) return;
161 if(subSystemId==LVL1MUONIF::Lvl1MuCTPIInputPhase1::idSideC() && !m_emulateC.value()) return;
162 int tmpside = (subSystemId==LVL1MUONIF::Lvl1MuCTPIInputPhase1::idSideA())?(1):(0);
163 int tmpsector = sectorId;
164 int tmptype = (systemId==LVL1MUONIF::Lvl1MuCTPIInputPhase1::idForwardSystem())?(1):(2);
165 unsigned int sectorAddress = (tmpside) + (tmpsector<<1) + (tmptype<<6);
166 for (unsigned int icand=0;
168 if(sldata.pt(icand)<0)continue;
169 int roi = sldata.roi(icand);
170 unsigned long int roiWord = (roi<<2)+(sectorAddress<<14);
172 if( !m_recTGCRoiTool->roiData(roiWord,roiData).isSuccess() )continue;
173 TVector3 roiPos;
174 roiPos.SetPtEtaPhi(10,roiData.eta(),roiData.phi());
175 if( std::abs(roiPos.Eta()) < 1.3 ) continue; // only NSW region
176 ATH_MSG_DEBUG("RoI pT=" << sldata.pt(icand)
177 << " roiEta=" << roiPos.Eta()
178 << " roiPhi=" << roiPos.Phi()
179 << " flagF=" << sldata.bw2or3(icand)
180 << " flagC=" << sldata.innercoin(icand)
181 << " flagH=" << sldata.goodmf(icand) );
182 bool matched = !m_nswVetoMode.value();
183 double deltaEtaCut=0,deltaPhiCut=0,deltaThetaCut=0;
184 if( std::abs(roiPos.Eta()) < m_etaBoundary1.value() ){
185 deltaEtaCut=m_deltaEtaCut1.value();
186 deltaPhiCut=m_deltaPhiCut1.value();
187 deltaThetaCut=m_deltaThetaCut1.value();
188 }else if( std::abs(roiPos.Eta()) > m_etaBoundary2.value() ){
189 deltaEtaCut=m_deltaEtaCut2.value();
190 deltaPhiCut=m_deltaPhiCut2.value();
191 deltaThetaCut=m_deltaThetaCut2.value();
192 }else{
193 matched = true;
194 }
195 for(const auto seg : muSegDataColl){
196 TVector3 segPos(seg->x(),seg->y(),seg->z());
197 TVector3 segVec(seg->px(),seg->py(),seg->pz());
198 float deltaEta = std::abs( segPos.Eta() - roiPos.Eta() );
199 float deltaPhi = std::abs( segPos.DeltaPhi( roiPos ) );
200 float deltaTheta = std::abs( segVec.Theta() - segPos.Theta() );
201 bool tmpmatched = (deltaEta < deltaEtaCut && deltaPhi < deltaPhiCut && deltaTheta < deltaThetaCut);
202 ATH_MSG_DEBUG(" matched=" << tmpmatched
203 << " RoI pT=" << sldata.pt(icand)
204 << " roiEta=" << roiPos.Eta()
205 << " roiPhi=" << roiPos.Phi()
206 << " segEta=" << segPos.Eta()
207 << " segPhi=" << segPos.Phi()
208 << " segEtaVec=" << segVec.Eta()
209 << " segPhiVec=" << segVec.Phi()
210 << " chi2=" << seg->chiSquared()
211 << " ndof=" << seg->numberDoF()
212 << " sector=" << seg->sector()
213 << " etaIndex=" << seg->etaIndex()
214 << " technology=" << Muon::MuonStationIndex::technologyName(seg->technology())
215 << " nPrecisionHits=" << seg->nPrecisionHits()
216 << " nPhiLayers=" << seg->nPhiLayers()
217 << " nTrigEtaLayers=" << seg->nTrigEtaLayers()
218 << " deltaEta=" << deltaEta
219 << " deltaPhi=" << deltaPhi
220 << " deltaTheta=" << deltaTheta);
221 matched |= tmpmatched;
222 }
223 sldata.innercoin(icand,matched);
224 }
225 }
226
227}
228
229
Scalar deltaPhi(const MatrixBase< Derived > &vec) const
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
An algorithm that can be simultaneously executed in multiple threads.
Class representing (part of) the input data to the MuCTPI for Phase 1.
void setSectorLogicData(const Lvl1MuSectorLogicDataPhase1 &data, size_t systemAddress, size_t subSystemAddress, size_t sectorAddress, int bcid=0)
const std::vector< Lvl1MuVectWithBC > & getData(MuonSystem system) const
size_t getSystemIndex(size_t systemAddress, size_t subSystemAddress, size_t sectorAddress) const
Class representing data from an endcap SL board.
Class representing data from an forward SL board.
Base class for the data coming from one SL board.
void Copy(const LVL1MUONIF::Lvl1MuSectorLogicDataPhase1 *sldataOrg, LVL1MUONIF::Lvl1MuSectorLogicDataPhase1 &sldataNew) const
SG::ReadHandleKey< LVL1MUONIF::Lvl1MuCTPIInputPhase1 > m_inputKey
SG::ReadHandleKey< xAOD::MuonSegmentContainer > m_musegKey
virtual StatusCode execute(const EventContext &eventContext) const override
Regular Gaudi algorithm execute function.
void Update(const std::vector< const xAOD::MuonSegment * > &segs, LVL1MUONIF::Lvl1MuSectorLogicDataPhase1 &sldata, size_t systemAddress, size_t subSystemAddress, size_t sectorAddress) const
SG::WriteHandleKey< LVL1MUONIF::Lvl1MuCTPIInputPhase1 > m_outputKey
ToolHandle< LVL1::ITrigT1MuonRecRoiTool > m_recTGCRoiTool
TGCOutputModifier(const std::string &name, ISvcLocator *pSvcLocator)
virtual StatusCode initialize() override
Regular Gaudi algorithm initialization function.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
pointer_type ptr()
Dereference the pointer.
static const size_t NCAND[3]
Muon::MuonStationIndex::ChIndex ChIdx
TechnologyIndex
enum to classify the different layers in the muon spectrometer
const std::string & technologyName(TechnologyIndex index)
convert LayerIndex into a string
ChIndex
enum to classify the different chamber layers in the muon spectrometer
MuonSegmentContainer_v1 MuonSegmentContainer
Definition of the current "MuonSegment container version".