ATLAS Offline Software
Loading...
Searching...
No Matches
TrigBStoxAODTool.cxx
Go to the documentation of this file.
1// Dear emacs, this is -*- c++ -*-
2
3/*
4 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
5*/
6
8
12
14#include "GaudiKernel/ClassID.h"
15
17
19
21
22
26
30
33
37
40
41
44
47
50
53
56
59
64
69
70
73
76
79
82
85
88
92
93#include "CaloEvent/CaloClusterContainer.h"
95
99
102
103template<typename element,typename list,int index> struct get_strictly_feat{
105};
106
107template<class T, class EDMLIST = TypeInfo_EDM> struct known{
108 typedef typename master_search<typename EDMLIST::map,
109 get_strictly_feat,T>::result::search_result search_result;
110 static const bool value = !std::is_same<HLT::TypeInformation::ERROR_THE_FOLLOWING_TYPE_IS_NOT_KNOWN_TO_THE_EDM<T>,search_result>::value;
111};
112
113
114template<typename T, bool = known<T>::value> struct getCLID;
115template<typename T> struct getCLID<T,true>{static int ID(){return ClassID_traits<T>::ID();}};
116template<typename T> struct getCLID<T,false>{static int ID(){return -1;}};
117
118
120
121 //Helper class providing interface for conversion and some convenient access to SG and Msg Services
122 class IHelper{
123 public:
124 virtual ~IHelper(){;}
125 virtual StatusCode initialize(MsgStream& m, StoreGateSvc& s){
126 m_msg = &m;
127 m_sg = &s;
128 return StatusCode::SUCCESS;
129 };
130
131 virtual StatusCode help(const std::string& label, const std::string& newLabel) = 0;
132
133 //we need this method, because for creating converted xAOD::TrigPassBits, one needs access to the corresponding xaod container
134 //with physics objects. This leads to a partial duplication of the code for the muon helper
135 virtual StatusCode help_fillTrigPassBits(const std::string& label, const std::string& newLabel, const TrigPassBits* tpb_aod, xAOD::TrigPassBits*& tpb_xaod) = 0;
136
137 virtual CLID AODContainerClid() = 0;
138 virtual CLID xAODContainerClid() = 0;
139 virtual CLID AODElementClid() = 0;
140 virtual CLID xAODElementClid() = 0;
141
142 MsgStream& msg(MSG::Level l){return *m_msg << l;}
143 bool msgLvl (const MSG::Level l){
144 if(m_msg->level() <= l){
145 *m_msg << l; return true;
146 } else {
147 return false;
148 };
149 }
150
151 template<typename T>
152 std::string format(const std::string& label){
154 }
155 protected:
156 MsgStream* m_msg{nullptr};
158 const std::string m_AODprefix = "HLT";
159 };
160
161 //class holding a tool, since this is what all helpers will need to do.
162 template<typename T>
163 class ToolHolder : public IHelper {
164 protected:
165 const ToolHandle<T>& m_tool;
166 ToolHandle<T>& tool(){return m_tool;}
167 public:
168 ToolHolder(const ToolHandle<T>& tool) : m_tool(tool){;}
169 virtual ~ToolHolder(){;}
170 virtual StatusCode initialize(MsgStream& m, StoreGateSvc& s){
172 CHECK(m_tool.retrieve());
173 return StatusCode::SUCCESS;
174 }
175 };
176
177 //this is the most vanilla case
178 template<typename AOD,typename XAOD, typename CnvTool>
179 struct DefaultHelper : public ToolHolder<CnvTool> {
181
182 DefaultHelper(const ToolHandle<CnvTool>& tool) : ToolHolder<CnvTool>(tool){;}
183
186
189
190 virtual StatusCode help(const std::string& label, const std::string& newLabel){
191 typedef IHelper IH;
192 std::string fmtkey_AOD = IH::template format<AOD>(label);
193 std::string fmtkey_xAOD = IH::template format<XAOD>(newLabel);
194 std::string fmtkey_xAODAux = IH::template format<xAODAux>(newLabel+"Aux.");
195
196 const AOD* aod = this->m_sg->template tryConstRetrieve<AOD>(fmtkey_AOD);
197 if(!aod){
198 ATH_MSG_WARNING("AOD key: " << fmtkey_AOD << " not found for xAOD conversion");
199 return StatusCode::SUCCESS;
200 }
201
202 ATH_MSG_DEBUG("attempting to convert " << fmtkey_AOD << " of size " << aod->size() << " to " << fmtkey_xAOD);
203
204 XAOD* xaod = this->m_sg->template tryRetrieve<XAOD>(fmtkey_xAOD);
205 if(!xaod){
206 ATH_MSG_WARNING("xAOD key: " << fmtkey_xAOD << " not found for xAOD conversion");
207 return StatusCode::SUCCESS;
208 }
209 CHECK( this->m_tool->convert(aod,xaod));
210 ATH_MSG_DEBUG("AOD container has size: " << aod->size());
211 ATH_MSG_DEBUG("xAOD container has size: " << xaod->size());
212 if(aod->size() != xaod->size()){
213 ATH_MSG_ERROR("conversion resulted in differently sized containers");
214 return StatusCode::FAILURE;
215 }
216 return StatusCode::SUCCESS;
217 }
218
219 virtual StatusCode help_fillTrigPassBits(const std::string& label, const std::string& newLabel, const TrigPassBits* tpb_aod, xAOD::TrigPassBits*& tpb_xaod){
220 typedef IHelper IH;
221 std::string fmtkey_AOD = IH::template format<AOD>(label);
222 std::string fmtkey_xAOD = IH::template format<XAOD>(newLabel);
223 std::string fmtkey_xAODAux = IH::template format<xAODAux>(newLabel+"Aux.");
224
225 const AOD* aod = this->m_sg->template tryConstRetrieve<AOD>(fmtkey_AOD);
226 if(!aod){
227 ATH_MSG_WARNING("AOD key: " << fmtkey_AOD << " not found");
228 return StatusCode::SUCCESS;
229 }
230 ATH_MSG_DEBUG( "AOD container " << fmtkey_AOD << " extracted of size " << aod->size() );
231 // it was found out that in Run 1 data for some containers the size of the TrigPassBits object differs from
232 // the size of the corresponding container. It was decided to not convert TrigPassBits->xAOD::TrigPassBits for such cases,
233 // so xAOD::TrigPassBits will be nullptr
234 if( aod->size() != tpb_aod->size() ) {
235 ATH_MSG_WARNING( "sizes of the container " << fmtkey_AOD << " and the corresponding (?) trigpassbits object are different: "
236 << aod->size() << " vs " << tpb_aod->size() << ", will not convert TrigPassBits for this container" );
237 return StatusCode::SUCCESS;
238 }
239
240 XAOD* xaod = this->m_sg->template tryRetrieve<XAOD>(fmtkey_xAOD);
241 if(!xaod){
242 ATH_MSG_WARNING("xAOD key: " << fmtkey_xAOD << " not found");
243 return StatusCode::SUCCESS;
244 }
245 ATH_MSG_DEBUG("xAOD container " << fmtkey_xAOD << " extracted of size " << xaod->size());
246
247 if(aod->size() != xaod->size()) {
248 ATH_MSG_ERROR("containers before and after the conversion are of different sizes");
249 return StatusCode::FAILURE;
250 }
251
252 ATH_MSG_DEBUG( "setting xaod passbits size to " << tpb_aod->size() );
253 std::unique_ptr<xAOD::TrigPassBits> xBits = xAOD::makeTrigPassBits(xaod);
254
255 for(uint i=0; i<aod->size(); i++) {
256 // if(i < tpb_aod->size() ){
257 ATH_MSG_DEBUG( "looking at object " << i+1 << " of " << aod->size() );
258 bool passed = HLT::isPassing( tpb_aod, aod->at(i), aod );
259 ATH_MSG_DEBUG( "aod ispassing = " << passed );
260 ATH_MSG_DEBUG( "xaod ispassing = " << xBits->isPassing( i ) );
261 if(passed)
262 xBits->markPassing( i );
263 ATH_MSG_DEBUG( "xaod ispassing (after update) = " << xBits->isPassing( i ) );
264 /* } else {
265 ATH_MSG_DEBUG( "skipping object " << i+1 << " as it is outside of the array range of the corresponding aod TrigPassBits object" );
266 }*/
267 }
268 tpb_xaod = xBits.release();
269 return StatusCode::SUCCESS;
270 }
271 };
272
273 struct MuonHelper : public ToolHolder<ITrigMuonEFInfoToMuonCnvTool> {
274 MuonHelper(const ToolHandle<ITrigMuonEFInfoToMuonCnvTool>& tool) : ToolHolder(tool){;}
275
278
281
282 virtual StatusCode help(const std::string& label, const std::string& newLabel){
283 xAOD::MuonContainer* xaodMuon = this->m_sg->tryRetrieve<xAOD::MuonContainer>(format<xAOD::MuonContainer>(newLabel));
284 if(!xaodMuon){
285 ATH_MSG_WARNING("muon label: " << format<xAOD::MuonContainer>(newLabel) << " not found for xAOD conversion");
286 return StatusCode::SUCCESS;
287 }
288
289 xAOD::TrackParticleContainer* xaodCombTrackParticles = this->m_sg->tryRetrieve<xAOD::TrackParticleContainer>(format<xAOD::TrackParticleContainer>(newLabel+"_CombTrackParticles"));
290 if(!xaodCombTrackParticles){
291 ATH_MSG_WARNING("muon label: " << format<xAOD::TrackParticleContainer>(newLabel+"_CombTrackParticles") << " not found for xAOD conversion");
292 return StatusCode::SUCCESS;
293 }
294
295 xAOD::TrackParticleContainer* xaodExtrapTrackParticles = this->m_sg->tryRetrieve<xAOD::TrackParticleContainer>(format<xAOD::TrackParticleContainer>(newLabel+"_ExtrapTrackParticles"));
296 if(!xaodCombTrackParticles){
297 ATH_MSG_WARNING("muon label: " << format<xAOD::TrackParticleContainer>(newLabel+"_ExtrapTrackParticles") << " not found for xAOD conversion");
298 return StatusCode::SUCCESS;
299 }
300
301 const TrigMuonEFInfoContainer* aod =
303 if(!aod){
304 ATH_MSG_WARNING("muon label: " << format<TrigMuonEFInfoContainer>(label) << " not found for xAOD conversion");
305 return StatusCode::SUCCESS;
306 }
307
308 CHECK(this->m_tool->convertTrigMuonEFInfoContainer( *aod, *xaodMuon, xaodCombTrackParticles, xaodExtrapTrackParticles));
309
310 ATH_MSG_DEBUG("Muon AOD container has size: " << aod->size());
311 ATH_MSG_DEBUG("Muon xAOD container has size: " << xaodMuon->size());
312
313 return StatusCode::SUCCESS;
314 }
315
316 virtual StatusCode help_fillTrigPassBits(const std::string& label, const std::string& newLabel, const TrigPassBits* tpb_aod, xAOD::TrigPassBits*& tpb_xaod){
317
318 const TrigMuonEFInfoContainer* aod = this->m_sg->template tryConstRetrieve<TrigMuonEFInfoContainer>(label);
319 if(!aod){
320 ATH_MSG_WARNING("AOD key: " << label << " not found");
321 return StatusCode::SUCCESS;
322 }
323 ATH_MSG_DEBUG( "AOD muon container " << label << " extracted of size " << aod->size() );
324 if( aod->size() != tpb_aod->size() ) {
325 ATH_MSG_WARNING( "sizes of the muon container " << label << " and the corresponding (?) trigpassbits object are different: "
326 << aod->size() << " vs " << tpb_aod->size() << ", will not convert TrigPassBits for this container" );
327 }
328 xAOD::MuonContainer* xaodMuon = this->m_sg->template tryRetrieve<xAOD::MuonContainer>(format<xAOD::MuonContainer>(newLabel));
329 if(!xaodMuon){
330 ATH_MSG_WARNING("xAOD key: " << format<xAOD::MuonContainer>(newLabel) << " not found");
331 return StatusCode::SUCCESS;
332 }
333 ATH_MSG_DEBUG("xAOD muon container " << format<xAOD::MuonContainer>(newLabel) << " extracted of size " << xaodMuon->size());
334
335 if(aod->size() != xaodMuon->size()) {
336 ATH_MSG_ERROR("containers before and after the conversion are of different sizes");
337 return StatusCode::FAILURE;
338 }
339
340 ATH_MSG_DEBUG( "setting muon xaod passbits size to " << tpb_aod->size() );
341 std::unique_ptr<xAOD::TrigPassBits> xBits = xAOD::makeTrigPassBits(xaodMuon);
342
343 for(uint i=0; i<aod->size(); i++) {
344 // if(i < tpb_aod->size() ){
345 ATH_MSG_DEBUG( "looking at muon object " << i+1 << " of " << aod->size() );
346 bool passed = HLT::isPassing( tpb_aod, aod->at(i), aod );
347 ATH_MSG_DEBUG( "muon aod ispassing = " << passed );
348 ATH_MSG_DEBUG( "muon xaod ispassing = " << xBits->isPassing( i ) );
349 if(passed)
350 xBits->markPassing( i );
351 ATH_MSG_DEBUG( "muon xaod ispassing (after update) = " << xBits->isPassing( i ) );
352 /* } else {
353 ATH_MSG_DEBUG( "skipping object " << i+1 << " as it is outside of the array range of the corresponding aod TrigPassBits object" );
354 }*/
355 }
356 tpb_xaod = xBits.release();
357 return StatusCode::SUCCESS;
358 }
359 };
360
361} // namespace BStoXAODHelper
362
363TrigBStoxAODTool::TrigBStoxAODTool(const std::string& type, const std::string& name, const IInterface* parent)
364 : AthAlgTool(type,name,parent),
365 m_tauJetTool( "xAODMaker::TauJetCnvTool/TauJetCnvTool",this),
366 m_combMuonTool( "xAODMaker::CombinedMuonFeatureContainerCnvTool/CombinedMuonFeatureContainerCnvTool",this),
367 m_isoMuonTool( "xAODMaker::IsoMuonFeatureContainerCnvTool/IsoMuonFeatureContainerCnvTool",this),
368 m_trigMuonTool( "TrigMuonEFInfoToMuonCnvTool/TrigMuonEFInfoToMuonCnvTool",this),
369 m_jetCnvTool( "xAODMaker::JetCnvTool/JetCnvTool",this),
370 m_trigCaloClusterTool( "xAODMaker::TrigCaloClusterCnvTool/TrigCaloClusterCnvTool",this),
371 m_emClusterTool( "xAODMaker::TrigEMClusterCnvTool/TrigEMClusterCnvTool",this),
372 m_bjetTool( "xAODMaker::TrigBjetCnvTool/TrigBjetCnvTool",this),
373 m_efBphysTool( "xAODMaker::TrigEFBphysContainerCnvTool/TrigEFBphysContainerCnvTool",this),
374 m_l2BphysTool( "xAODMaker::TrigL2BphysContainerCnvTool/TrigL2BphysContainerCnvTool",this),
375 m_trigMetTool( "xAODMaker::TrigMissingETCnvTool/TrigMissingETCnvTool",this),
376 m_trigSpacePtsTool("xAODMaker::TrigSpacePointCountsCnvTool/TrigSpacePointCountsCnvTool",this),
377 m_trigMbtsBitsTool("xAODMaker::TrigT2MbtsBitsCnvTool/TrigT2MbtsBitsCnvTool",this),
378 m_trigTrackCtsTool("xAODMaker::TrigTrackCountsCnvTool/TrigTrackCountsCnvTool",this),
379 m_trigVtxCtsTool( "xAODMaker::TrigVertexCountsCnvTool/TrigVertexCountsCnvTool",this),
380 m_electronTool( "xAODMaker::ElectronCnvTool/ElectronCnvTool", this ),
381 m_photonTool( "xAODMaker::PhotonCnvTool/PhotonCnvTool", this ),
382 m_caloClusterTool( "xAODMaker::CaloClusterCnvTool/CaloClusterCnvTool", this),
383 m_trigPassBitsTool( "xAODMaker::TrigPassBitsCnvTool/TrigPassBitsCnvTool", this )
384{
385 declareInterface<ITrigBStoxAODTool>( this );
386 declareProperty("ContainersToConvert",m_containersToConvert);
387 declareProperty("NewContainers", m_newContainers);
388
389 declareProperty("tauJetTool", m_tauJetTool);
390 declareProperty("combMuonTool", m_combMuonTool);
391 declareProperty("isoMuonTool", m_isoMuonTool);
392 declareProperty("trigMuonTool", m_trigMuonTool);
393 declareProperty("jetCnvTool", m_jetCnvTool);
394
395 declareProperty("trigCaloClusterTool", m_trigCaloClusterTool);
396 declareProperty("emClusterTool", m_emClusterTool);
397 declareProperty("bjetTool", m_bjetTool);
398 declareProperty("efBphysTool", m_efBphysTool);
399 declareProperty("l2BphysTool", m_l2BphysTool);
400
401 declareProperty("trigMetTool", m_trigMetTool);
402 declareProperty("trigSpacePtsTool", m_trigSpacePtsTool);
403 declareProperty("trigMbtsBitsTool", m_trigMbtsBitsTool);
404 declareProperty("trigTrackCtsTool", m_trigTrackCtsTool);
405 declareProperty("trigVtxCtsTool", m_trigVtxCtsTool);
406 declareProperty("electronTool", m_electronTool);
407 declareProperty("photonTool", m_photonTool);
408 declareProperty("caloClusterTool", m_caloClusterTool);
409 declareProperty("trigPassBitsTool", m_trigPassBitsTool);
410
413}
414
416 std::map<CLID,BStoXAODHelper::IHelper*>::iterator it;
417 for(it = m_helpers.begin();it!=m_helpers.end();++it){
418 delete it->second;
419 }
420}
421
423
433
434 m_helpers.insert( std::pair<CLID,BStoXAODHelper::MuonHelper*>
437
447
457
467
473
479
485
491
497
503
509
515
521
527
533
539
545
551
557
558
559 std::multimap<CLID,BStoXAODHelper::IHelper*>::iterator it;
560 for(it = m_helpers.begin();it!=m_helpers.end();++it){
561 CHECK(it->second->initialize(this->msg(),*(evtStore())));
562 }
563
564 ATH_MSG_DEBUG("containers to convert: " << m_containersToConvert);
565 ATH_MSG_DEBUG("containers will be converted to: " << m_newContainers);
567 ATH_MSG_DEBUG("extracted class IDs (" << m_clid_labels.size() << " in total): " << m_clid_labels);
568
569 if(m_clid_labels.size() != m_clid_newLabels.size()) {
570 ATH_MSG_ERROR("number of new containers names (" << m_clid_newLabels.size()
571 << ") is not the same as the number of old containers names ("
572 << m_clid_newLabels.size() << ")");
573 return StatusCode::FAILURE;
574 }
575 ATH_MSG_DEBUG("CLID CLID, old label, new label:");
576 for(uint i=0; i<m_clid_labels.size(); i++) {
577 ATH_MSG_DEBUG(m_clid_labels[i].first << " " << m_clid_newLabels[i].first << ", "
578 << m_clid_labels[i].second << ", " << m_clid_newLabels[i].second );
579 if(m_clid_labels[i].second != m_clid_newLabels[i].second) {
580 ATH_MSG_VERBOSE("Run-1 " << m_clid_labels[i].first << " label " <<
581 m_clid_labels[i].second << " differs from the equivalent Run-2 label: "
582 << m_clid_newLabels[i].second);
583 }
584 }
585
586 return StatusCode::SUCCESS;
587}
588
590 std::vector<std::pair<CLID,std::string> >::const_iterator clidlabel;
591 std::vector<std::pair<CLID,std::string> >::const_iterator clidNewLabel = m_clid_newLabels.begin();
592 for(clidlabel =m_clid_labels.begin();clidlabel!=m_clid_labels.end();++clidlabel, ++clidNewLabel){
593
594 HLTNavDetails::IHolder* holder = nav->getHolder(clidlabel->first,clidlabel->second);
595
596 if(!holder){
597 ATH_MSG_WARNING("couldn't find holder for " << clidlabel->first << " " << clidlabel->second);
598 continue;
599 }
600
601 ATH_MSG_VERBOSE("container corresponding to feature CLID " << clidlabel->first << " has CLID " << holder->containerClid());
602
603 std::multimap<CLID,BStoXAODHelper::IHelper*>::const_iterator hit;
604 hit = m_helpers.end();//find(holder->containerClid());
605
606 std::string clabel = clidlabel->second;
607 CHECK(findHelper( m_helpers, holder->containerClid(), clabel, hit ));
608
609 if(hit!=m_helpers.end()){
610 ATH_MSG_DEBUG("attempting convertion of clid " << holder->containerClid()
611 << " for label " << clidlabel->second << ", new label " << clidNewLabel->second);
612 CHECK(hit->second->help(clidlabel->second,clidNewLabel->second));//get aod container and convert
613 ATH_MSG_DEBUG("converted clid " << holder->containerClid() << " for label " << clidlabel->second);
614 }
615 else{
616 ATH_MSG_DEBUG("couldn't find converters for clid: " << clidlabel->first);
617 }
618 }
619 return StatusCode::SUCCESS;
620}
621
623 //we need to loop over all features of all TEs
624 //find the ones pointing to a AOD container that has been converted
625 //and change the holder they use to access the feature, i.e. changes CLID and subTypeIndex
626
627 std::vector<HLT::TriggerElement*>& allTEs = nav->getAllTEs();
628 //nav->getAll(allTEs,false); //false: also get inactive TEs
629 ATH_MSG_DEBUG("rewiring Navigation for xAOD. working on " << allTEs.size() << " TEs");
630 for(auto te : allTEs){
631 std::vector<HLT::TriggerElement::FeatureAccessHelper>& feats = te->getFeatureAccessHelpers();
632 for(auto& featacchelp : feats){
633 ATH_MSG_VERBOSE("this feature has CLID: " << featacchelp.getCLID());
634
635 HLTNavDetails::IHolder* oldholder = nav->getHolder(featacchelp.getCLID(),featacchelp.getIndex().subTypeIndex());
636
637 if(!oldholder){
638 ATH_MSG_WARNING("could not find old holder for CLID " << featacchelp.getCLID() << " and subTypeIndex: " << featacchelp.getIndex());
639 continue;
640 }
641
642 std::multimap<CLID,BStoXAODHelper::IHelper*>::const_iterator it = m_helpers.end();//find(oldholder->containerClid());
643 std::string old_label = oldholder->label();
644 CHECK(findHelper( m_helpers, oldholder->containerClid(), old_label, it));
645 if(it != m_helpers.end()){
646 ATH_MSG_VERBOSE("need to rewire this CLID from " << oldholder->typeClid() << "/"<< oldholder->containerClid() << " to " << it->second->xAODContainerClid());
647
648 bool iselement = (oldholder->typeClid()==it->second->AODElementClid());
649 bool iscontainer = (oldholder->typeClid()==it->second->AODContainerClid());
650
651 ATH_MSG_VERBOSE("old is element feature " << iselement << " or container feature: " << iscontainer);
652
653 if(!(iselement || iscontainer)){
654 ATH_MSG_WARNING("not clear what kind of feature we're dealing with. Skipping. Old holder is:" << *oldholder);
655 }
656
657 CLID newTypeClid = CLID_NULL;
658 if(iselement) newTypeClid = it->second->xAODElementClid();
659 if(iscontainer) newTypeClid = it->second->xAODContainerClid();
660
661 std::lock_guard<std::recursive_mutex> lock(nav->getMutex());
662 HLT::TrigHolderStructure& holderstorage = nav->getHolderStorage();
663
664 HLTNavDetails::IHolder* newholder = holderstorage.getHolder<HLTNavDetails::IHolder>(newTypeClid,oldholder->label());
665
666 if(!newholder){
667 ATH_MSG_WARNING("could not find new holder for xAOD clid " << newTypeClid << " and label " << oldholder->label());
668 continue;
669 }
670
671 ATH_MSG_VERBOSE("old holder: " << *oldholder);
672 ATH_MSG_VERBOSE("new holder: " << *newholder);
673 ATH_MSG_VERBOSE("changing CLID: " << featacchelp.getCLID() << " to " << newTypeClid);
674 ATH_MSG_VERBOSE("changing STI: " << featacchelp.getIndex().subTypeIndex() << " to " << newholder->subTypeIndex());
675
676 featacchelp.setCLIDandIndex(newTypeClid,newholder->subTypeIndex());
677 ATH_MSG_VERBOSE("clid is now: " << featacchelp.getCLID() << " sti: " << featacchelp.getIndex().subTypeIndex());
678 ATH_MSG_VERBOSE("TE is: " << *te);
679 } // end if(helper was found)
680 }//end feature loop
681 }//end TE loop
682
683
684 return StatusCode::SUCCESS;
685}
686
687
688
689//blatantly stolen from navigation code
690StatusCode TrigBStoxAODTool::classLabel2CLIDLabel(const std::vector<std::string>& property,
691 const std::vector<std::string>& newProperty,
692 std::vector<std::pair<CLID,std::string> >& decoded,
693 std::vector<std::pair<CLID,std::string> >& decodedNewNames) {
694 // translate Class names into CLID numbers
695 SmartIF<IClassIDSvc> clidSvc{service("ClassIDSvc")};
696 ATH_CHECK( clidSvc.isValid() );
697
698 if( property.size() != newProperty.size() ) {
699 ATH_MSG_ERROR("vector sizes of new and old SG labels are different: "
700 << newProperty.size() << " vs " << property.size() );
701 return StatusCode::FAILURE;
702 }
703
704 std::vector<std::string>::const_iterator it;
705 std::vector<std::string>::const_iterator itNew = newProperty.begin();
706 for ( it = property.begin(); it != property.end(); ++it, ++itNew ) {
707 CLID clid{0};
708 std::string label;
709 std::string label_new;
710 std::string type;
711
712 if ( it->find('#') != std::string::npos ) {
713 type = it->substr(0, it->find('#') );
714 label = it->substr(it->find('#')+1 );
715 } else {
716 type = *it;
717 label = "";
718 }
719
720 if ( itNew->find('#') != std::string::npos ) {
721 label_new = itNew->substr(itNew->find('#')+1 );
722 } else {
723 label_new = "";
724 }
725
726 if ( clidSvc->getIDOfTypeName(type, clid).isFailure() ) {
727 ATH_MSG_FATAL("Unable to get CLID for class: " << *it
728 << " check property");
729 return StatusCode::FAILURE;
730 }
731
732 ATH_MSG_DEBUG("Recognized CLID : " << type << " and label: " << label << ", new label will be: " << label_new);
733 decoded.push_back(std::make_pair(clid, label));
734 decodedNewNames.push_back(std::make_pair(clid, label_new));
735 }
736 return StatusCode::SUCCESS;
737}
738
740 //we need to loop over all features of all TEs
741 //find the ones pointing to a AOD container that has been converted
742 //extract the corresponding aod TrigPassBits container and set the same
743 //bits in xAOD::TrigPassBits
744
745 std::vector<HLT::TriggerElement*>& allTEs = nav->getAllTEs();
746
747 ATH_MSG_DEBUG("setting xAOD TrigPassBits. Working on " << allTEs.size() << " TEs");
748
749 for(auto te : allTEs){
750 std::vector<HLT::TriggerElement::FeatureAccessHelper>& feats = te->getFeatureAccessHelpers();
751 for(auto& featacchelp : feats){
752 ATH_MSG_VERBOSE("this feature has CLID: " << featacchelp.getCLID());
753
754 HLTNavDetails::IHolder* holder = nav->getHolder(featacchelp.getCLID(),featacchelp.getIndex().subTypeIndex());
755
756 if(!holder){
757 ATH_MSG_WARNING("could not find holder for CLID " << featacchelp.getCLID() << " and subTypeIndex: " << featacchelp.getIndex());
758 continue;
759 }
760
761 if(holder->label() == "passbits") {
762 ATH_MSG_VERBOSE( "skipping this feature, as this is the passbits object itself" );
763 continue;
764 }
765
766 std::multimap<CLID,BStoXAODHelper::IHelper*>::const_iterator it = m_helpers.end();//find(holder->containerClid());
767 std::string hlabel = holder->label();
768 CHECK(findHelper( m_helpers, holder->containerClid(), hlabel, it ));
769 if(it != m_helpers.end()){
770
771 ATH_MSG_DEBUG( "need to extract TrigPassBits for this AOD object " << holder->typeClid() << "/"<< holder->containerClid()
772 << ", label " << holder->label() << " corresponding to xAOD CLID " << it->second->xAODContainerClid() );
773
774 bool iselement = (holder->typeClid()==it->second->AODElementClid());
775 bool iscontainer = (holder->typeClid()==it->second->AODContainerClid());
776
777 ATH_MSG_VERBOSE("is element feature " << iselement << " or container feature: " << iscontainer);
778
779 if(!(iselement || iscontainer)){
780 ATH_MSG_WARNING("not clear what kind of feature we're dealing with. Skipping. The holder is:" << *holder);
781 }
782
783 ATH_MSG_VERBOSE("holder: " << *holder);
784
785 const TrigPassBitsCollection* bits_collection = evtStore()->template tryConstRetrieve<TrigPassBitsCollection>("HLT_TrigPassBitsCollection_passbits");
786 if(bits_collection != nullptr) {
787 ATH_MSG_DEBUG( "aod bits collection extracted of size " << bits_collection->size() );
788 //dump this to compare with the results from release 17
789 // for(uint i=0; i<bits_collection->size(); i++ ) {
790 // std::cout << "size of the TrigPassBits object " << i << " is " << bits_collection->at(i)->size() << std::endl;
791 // }
792 } else {
793 ATH_MSG_WARNING( "aod bits collection cannot be extracted" );
794 continue;
795 }
796
797
798 xAOD::TrigPassBitsContainer* xaod_bits_collection = evtStore()->template tryRetrieve<xAOD::TrigPassBitsContainer>("HLT_xAOD__TrigPassBitsContainer_passbits");
799 if(xaod_bits_collection != nullptr)
800 ATH_MSG_DEBUG( "xaod bits container extracted of size " << xaod_bits_collection->size() );
801 else {
802 ATH_MSG_WARNING( "xaod bits container cannot be extracted" );
803 continue;
804 }
805
806 const TrigPassBits* bits(0);
807 if ( nav->getFeature(te, bits, "passbits" ) ){
808 ATH_MSG_DEBUG( "TrigPassBits extracted for the container " << holder->label() );
809 if(bits!=nullptr) {
810 ATH_MSG_DEBUG( "it's size is " << bits->size() );
811 } else {
812 ATH_MSG_DEBUG( "it is nullptr" );
813 continue;
814 }
815 } else {
816 ATH_MSG_WARNING( "this TE has no associated TrigPassBits object" );
817 continue;
818 }
819 if(bits_collection != nullptr && xaod_bits_collection != nullptr && bits != nullptr) {
820 int bits_nr = -1;
821 for(uint i=0; i<bits_collection->size(); i++) {
822 if(bits == bits_collection->at(i)) {
823 bits_nr = i;
824 ATH_MSG_VERBOSE( "this is bits # " << bits_nr );
825 break;
826 }
827 }
828 if(bits_nr >= 0) {
829 xAOD::TrigPassBits* xaod_tpb = nullptr;
830 std::pair<CLID,std::string> pair = std::make_pair( featacchelp.getCLID(), holder->label() );
831 std::vector<std::pair<CLID,std::string> >::const_iterator it_new_label;
832 it_new_label = std::find(m_clid_newLabels.begin(), m_clid_newLabels.end(), pair);
833 std::string new_label = "";
834 if(it_new_label != m_clid_newLabels.end()) {
835 new_label = (*it_new_label).second;
836 ATH_MSG_DEBUG( "calling help_fillTrigPassBits for TE " << te << ", feature CLID " << featacchelp.getCLID()
837 << ", aod container " << holder->label() << ", new container name: " << new_label );
838 CHECK( it->second->help_fillTrigPassBits( holder->label(), new_label, bits_collection->at(bits_nr), xaod_tpb ) );
839 } else {
840 ATH_MSG_DEBUG( "new label was not found, presumably this container was not converted. Will not look for TrigPassBits" );
841 }
842
843 if(xaod_tpb != nullptr) {
844 xaod_bits_collection->at(bits_nr) = xaod_tpb;
845 ATH_MSG_VERBOSE( "after the conversion, size of xAOD::TrigPassBits is " << xaod_bits_collection->at(bits_nr)->size() );
846 }
847
848 } else {
849 ATH_MSG_WARNING( "TrigPassBits object was not identified within container!" );
850 }
851 }// if good aod and xaod passbits are available
852 } // if helper was found
853 }// feature loop
854 }// TE loop
855
856
857 return StatusCode::SUCCESS;
858}
859
860// the following function returns iterator pointing to the desired converter, based on the clid of the AOD type and label
861StatusCode TrigBStoxAODTool::findHelper( MM_CLID_IHELPER& helpers, CLID clid, std::string& label, MM_CLID_IHELPER::const_iterator& it ) {
862 auto myrange = helpers.equal_range(clid);
863 it = myrange.first;
864 //let's see how many there are converters corresponding to the same AOD input type
865 int distance = std::distance(myrange.first, myrange.second);
866 if (distance == 1) {
867 //default case, one-to-one relation of AOD and xAOD types
868 ATH_MSG_VERBOSE("helper to convert AOD CLID " << clid << " and label " << label << " found");
869 return StatusCode::SUCCESS;
870 } else if (distance == 2) {
871 //this is for the case when there is single AOD type converted to two different xAOD types,
872 //will treat this here separately. So far this only happens for egammaContainer->xAOD::ElectronContainer and
873 //egammaContainer->xAOD::PhotonContainer
874 for(;it!=myrange.second;++it) {
875 CLID myHelperxAODCLID = (*it).second->xAODContainerClid();
876 if((label == "egamma_Electrons" && myHelperxAODCLID == m_CLID_xAODElectronContainer) ||
877 (label == "egamma_Photons" && myHelperxAODCLID == m_CLID_xAODPhotonContainer)) {
878 ATH_MSG_VERBOSE("helper to convert AOD CLID " << clid << " and label " << label << " found");
879 return StatusCode::SUCCESS;
880 }
881 }
882 } else if( distance == 0) {
883 ATH_MSG_WARNING("there is no helper to convert AOD CLID " << clid << ", label " << label);
884 it = helpers.end();
885 return StatusCode::SUCCESS;
886 } else {
887 //this should not happen...
888 ATH_MSG_ERROR("found " << distance << " helpers to convert AOD type " << clid << " and label " << label
889 << ", probably you should accomodate for this change in the code above" );
890 return StatusCode::FAILURE;
891 }
892
893 //this point is not reached if everything is OK
894 return StatusCode::SUCCESS;
895
896} // MM_CLID_IHELPER::const_iterator findHelper( ... )
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
std::vector< Identifier > ID
#define CHECK(...)
Evaluate an expression and check for errors.
uint32_t CLID
The Class ID type.
bool passed(DecisionID id, const DecisionIDContainer &)
checks if required decision ID is in the set of IDs in the container
unsigned int uint
DataVector< Trk::Track > TrackCollection
This typedef represents a collection of Trk::Track objects.
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
ServiceHandle< StoreGateSvc > & evtStore()
const std::string m_AODprefix
bool msgLvl(const MSG::Level l)
virtual CLID xAODElementClid()=0
virtual CLID AODContainerClid()=0
virtual CLID xAODContainerClid()=0
virtual CLID AODElementClid()=0
std::string format(const std::string &label)
virtual StatusCode help_fillTrigPassBits(const std::string &label, const std::string &newLabel, const TrigPassBits *tpb_aod, xAOD::TrigPassBits *&tpb_xaod)=0
virtual StatusCode help(const std::string &label, const std::string &newLabel)=0
MsgStream & msg(MSG::Level l)
virtual StatusCode initialize(MsgStream &m, StoreGateSvc &s)
virtual StatusCode initialize(MsgStream &m, StoreGateSvc &s)
ToolHolder(const ToolHandle< T > &tool)
const ToolHandle< T > & m_tool
const T * at(size_type n) const
Access an element, as an rvalue.
size_type size() const noexcept
Returns the number of elements in the collection.
virtual CLID containerClid() const =0
const std::string & label() const
returns the label of objects stores by this holder
Definition Holder.h:85
virtual CLID typeClid() const =0
returns the CLID of objects stores by this holder
uint16_t subTypeIndex() const
returns the index (short number used when linking object to the TE) of objects stores by this holder
Definition Holder.h:111
HLTNavDetails::Holder< T > * getHolder(uint16_t subTypeIndex) const
as above but does not create holder on demand (return 0 if not found)
bool getFeature(const TriggerElement *te, const T *&features, const std::string &label="", std::string &sourcelabel=::HLT::TrigNavStructure::m_unspecifiedLabel) const
The Navigation class, organizes TriggerElements into the tree structure.
Definition Navigation.h:100
HolderType * getHolder(class_id_type clid, const std::variant< sub_index_type, std::string > &stiOrLabel) const
std::vector< TriggerElement * > & getAllTEs()
access needed by slimming tools.
std::recursive_mutex & getMutex()
TrigHolderStructure & getHolderStorage()
The Athena Transient Store API.
std::multimap< CLID, BStoXAODHelper::IHelper * > MM_CLID_IHELPER
StatusCode setTrigPassBits(HLT::Navigation *nav)
std::vector< std::pair< CLID, std::string > > m_clid_newLabels
StatusCode findHelper(MM_CLID_IHELPER &helpers, CLID clid, std::string &label, MM_CLID_IHELPER::const_iterator &it)
ToolHandle< xAODMaker::ITrigBjetCnvTool > m_bjetTool
std::vector< std::pair< CLID, std::string > > m_clid_labels
virtual StatusCode initialize()
ToolHandle< xAODMaker::IIsoMuonFeatureContainerCnvTool > m_isoMuonTool
ToolHandle< xAODMaker::ITrigEFBphysContainerCnvTool > m_efBphysTool
ToolHandle< xAODMaker::IElectronCnvTool > m_electronTool
ToolHandle< xAODMaker::ITrigL2BphysContainerCnvTool > m_l2BphysTool
ToolHandle< xAODMaker::ITrigT2MbtsBitsCnvTool > m_trigMbtsBitsTool
ToolHandle< ITrigMuonEFInfoToMuonCnvTool > m_trigMuonTool
ToolHandle< xAODMaker::ITrigCaloClusterCnvTool > m_trigCaloClusterTool
ToolHandle< xAODMaker::ITrigSpacePointCountsCnvTool > m_trigSpacePtsTool
StatusCode classLabel2CLIDLabel(const std::vector< std::string > &property, const std::vector< std::string > &newProperty, std::vector< std::pair< CLID, std::string > > &decoded, std::vector< std::pair< CLID, std::string > > &decodedNewNames)
std::vector< std::string > m_newContainers
ToolHandle< xAODMaker::ICombinedMuonFeatureContainerCnvTool > m_combMuonTool
ToolHandle< xAODMaker::ITrigTrackCountsCnvTool > m_trigTrackCtsTool
ToolHandle< xAODMaker::ITrackCollectionCnvTool > m_trackCollectionTool
StatusCode rewireNavigation(HLT::Navigation *nav)
ToolHandle< xAODMaker::IJetCnvTool > m_jetCnvTool
ToolHandle< xAODMaker::ITrigMissingETCnvTool > m_trigMetTool
ToolHandle< xAODMaker::ITrigEMClusterCnvTool > m_emClusterTool
ToolHandle< xAODMaker::IPhotonCnvTool > m_photonTool
ToolHandle< xAODMaker::IRecTrackParticleContainerCnvTool > m_recTrackParticleContTool
ToolHandle< xAODMaker::ICaloClusterCnvTool > m_caloClusterTool
ToolHandle< xAODMaker::ITrigPassBitsCnvTool > m_trigPassBitsTool
TrigBStoxAODTool(const std::string &type, const std::string &name, const IInterface *parent)
std::multimap< CLID, BStoXAODHelper::IHelper * > m_helpers
ToolHandle< xAODMaker::ITrigVertexCountsCnvTool > m_trigVtxCtsTool
StatusCode convert(HLT::Navigation *nav)
std::vector< std::string > m_containersToConvert
ToolHandle< xAODMaker::ITauJetCnvTool > m_tauJetTool
Container of TrigEFBjet objects to be stored in POOL.
unsigned int size() const
gets size of the bits array
This is a data object, containing a collection of egamma Objects.
STL class.
Interface for the tool doing AOD->xAOD conversion for clusters.
Interface for the tool creating CombinedMuonFeatureContainer from an AOD.
Interface for the tool creating ElectronContainer from an AOD.
Interface for the tool creating JetContainer from an AOD.
Definition IJetCnvTool.h:38
Interface for the tool creating PhotonContainer from an AOD.
Interface for the tool creating TauJetContainer from an AOD.
Interface for the tool creating TrigBjetContainer from an AOD.
Interface for the tool creating TrigCaloCluster from an AOD.
Interface for the tool creating TrigBphysContainer from an AOD.
Interface for the tool creating TrigEMCluster from an AOD.
Interface for the tool creating TrigBphysContainer from an AOD.
Interface for the tool creating TrigMissingETContainer from an AOD.
Interface for the tool creating TrigPassBitsContainer from an AOD.
Interface for the tool creating TrigSpacePointCountsContainer from an AOD.
Interface for the tool creating TrigT2MbtsBitsContainer from an AOD.
Interface for the tool creating TrigTrackCountsContainer from an AOD.
Interface for the tool creating TrigVertexCountsContainer from an AOD.
std::string label(const std::string &format, int i)
Definition label.h:19
Tool used by TrigBSExtraction to convert to xAOD.
std::string formatSGkey(const std::string &prefix, const std::string &containername, const std::string &label)
declaration of formatting function.
Definition Holder.cxx:122
bool isPassing(const TrigPassBits *bits, const T *obj, const CONTAINER *container)
Check the bit for the object in the associated bits object.
TrigVertexCountsContainer_v1 TrigVertexCountsContainer
PhotonContainer_v1 PhotonContainer
Definition of the current "photon container version".
BTaggingContainer_v1 BTaggingContainer
Definition of the current "BTagging container version".
TrigPassBitsContainer_v1 TrigPassBitsContainer
Define the latest version of the trig pass bits container class.
TrigMissingETContainer_v1 TrigMissingETContainer
DataVector of TrigMissingET - the current version.
ElectronContainer_v1 ElectronContainer
Definition of the current "electron container version".
TrigCaloClusterContainer_v1 TrigCaloClusterContainer
Define the latest version of the trigger calorimeter cluster container.
TrigSpacePointCountsContainer_v1 TrigSpacePointCountsContainer
TrigEMClusterContainer_v1 TrigEMClusterContainer
Define the latest version of the trigger EM cluster container.
TrigTrackCountsContainer_v1 TrigTrackCountsContainer
L2CombinedMuonContainer_v1 L2CombinedMuonContainer
Define the latest version of the muon CB container.
TrigPassBits_v1 TrigPassBits
Define the latest version of the trigger pass bits class.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
CaloClusterContainer_v1 CaloClusterContainer
Define the latest version of the calorimeter cluster container.
JetContainer_v1 JetContainer
Definition of the current "jet container version".
TauJetContainer_v3 TauJetContainer
Definition of the current "taujet container version".
MuonContainer_v1 MuonContainer
Definition of the current "Muon container version".
TrigBphysContainer_v1 TrigBphysContainer
std::unique_ptr< TrigPassBits_v1 > makeTrigPassBits(const CONT *container, uint32_t containerKey=xAOD::TrigPassBits_v1::DEFAULT_KEY)
Helper function creating a new object to describe a target container.
Container2Aux< XAOD >::type xAODAux
virtual StatusCode help_fillTrigPassBits(const std::string &label, const std::string &newLabel, const TrigPassBits *tpb_aod, xAOD::TrigPassBits *&tpb_xaod)
virtual StatusCode help(const std::string &label, const std::string &newLabel)
DefaultHelper(const ToolHandle< CnvTool > &tool)
virtual StatusCode help(const std::string &label, const std::string &newLabel)
MuonHelper(const ToolHandle< ITrigMuonEFInfoToMuonCnvTool > &tool)
virtual StatusCode help_fillTrigPassBits(const std::string &label, const std::string &newLabel, const TrigPassBits *tpb_aod, xAOD::TrigPassBits *&tpb_xaod)
master_search< typenameEDMLIST::map, HLT::TypeInformation::get_cont, CONTAINER >::result::search_result::aux type
static const bool result
master_search< typenameEDMLIST::map, get_strictly_feat, T >::result::search_result search_result
static const bool value