ATLAS Offline Software
BSFilter.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include <sstream>
6 
7 #include "BSFilter.h"
8 
10 
11 BSFilter::BSFilter( const std::string& name,ISvcLocator* pSvcLocator ) :
12  AthAlgorithm (name, pSvcLocator)
13 {
14 }
15 
17 {
19  if (!m_filterfile.empty() && m_l1ZB.empty()){
20  FILE *vfile = fopen(m_filterfile.value().c_str(),"r");
21  if (vfile){
22  ATH_MSG_INFO("Opened filter file:" << m_filterfile);
23  int vrun=0, vtrig=0, vnvtx=0; double vdt=0.0; int ne=0; uint64_t vevent=0;
24  while (true){
25  int r = fscanf(vfile, "%i %lu %i %i %lf\n", &vrun, &vevent, &vtrig, &vnvtx, &vdt);
26  if (r>0){
27  ATH_MSG_DEBUG("Read "<<r<<" filter values: "<<vrun<<"/"<<vevent<<" "<<vtrig<<","<<vnvtx<<","<<vdt);
28  if (m_filtermap[vrun][vevent].magic==777){
29  ATH_MSG_WARNING("Already filter info for run/event "<<vrun<<"/"<<vevent<<", magic="
30  <<m_filtermap[vrun][vevent].magic);
31  }
32  m_filtermap[vrun][vevent].trig=vtrig;
33  m_filtermap[vrun][vevent].nvtx=vnvtx;
34  m_filtermap[vrun][vevent].dt=vdt;
35  m_filtermap[vrun][vevent].magic=777;
36  ++ne;
37  }
38  else{
39  ATH_MSG_INFO("Got "<<r<<" from fscanf, stopping");
40  break;
41  }
42  }
43  fclose(vfile);
44  ATH_MSG_INFO("Read "<<ne<<" filter entries from file.");
45  }
46  else{
47  ATH_MSG_ERROR("Could not open filter file: "<<m_filterfile);
48  }
49  }
50 
51  //If we have trigbit>0 and a filterfile, write the trigger info out to the filterfile
52  if ( !m_filterfile.empty() ) {
53  ATH_CHECK( m_trigConf.retrieve() );
54  ATH_CHECK( m_trigDecTool.retrieve() );
55  ATH_CHECK( (m_ffile = fopen(m_filterfile.value().c_str(),"w"))!=nullptr );
56  ATH_MSG_INFO("Writing trigger decision for" << m_noalg << m_j40 << "to" << m_filterfile);
57  }
58  else {
59  m_trigDecTool.disable(); // disable auto-retrieval
60  }
61 
63  if ( !m_EventIdFile.empty() ) {
64  ATH_CHECK( (m_efile = fopen(m_EventIdFile.value().c_str(),"w"))!=nullptr );
65  ATH_MSG_INFO("Opened" << m_EventIdFile);
66  }
67 
68  return StatusCode::SUCCESS;
69 }
70 
72 {
73  if (m_efile) fclose(m_efile);
74  if (m_ffile) fclose(m_ffile);
75 
76  ATH_MSG_INFO("BS Filter PASSED "<< m_pass<<"/"<< m_All << " events");
77  return StatusCode::SUCCESS;
78 }
79 
80 void BSFilter::writeEventIdFile(const EventIDBase& evt) const
81 {
82  if (m_efile) {
83  //"%ld" for evt_nbr since it's 64 bit, but need fix for https://its.cern.ch/jira/browse/ATEAM-286 first!
84  fprintf(m_efile,
85  "svcMgr.EvtIdModifierSvc.add_modifier(run_nbr=%d, evt_nbr=%ld, time_stamp=%d, lbk_nbr=%d, nevts=1)\n",
86  evt.run_number(), evt.event_number(), evt.time_stamp(), evt.lumi_block());
87  }
88 }
89 
91 {
92  m_All++;
93 
94  // Get event information from EventContext
95  const EventContext& ctx{Gaudi::Hive::currentContext()};
96  const EventIDBase& evt{ctx.eventID()};
97 
98  if (!m_l1ZB.empty()){
99  const bool item_fired_after_veto = m_trigDecTool->isPassed(m_l1ZB);
100  ATH_MSG_INFO(m_l1ZB<<" fired after veto? " << item_fired_after_veto);
101 
102  if (m_ffile) {
103  const TrigConf::HLTPrescalesSet& hltps = m_trigConf->hltPrescalesSet(ctx);
104  std::ostringstream oss;
105  oss << "noalg=" << m_trigDecTool->isPassed(m_noalg)
106  << ", j40=" << m_trigDecTool->isPassed(m_j40)
107  << ", noalgps=" << hltps.prescale(m_noalg).prescale
108  << ", j40ps=" << hltps.prescale(m_j40).prescale;
109 
110  ATH_MSG_INFO(oss.str());
111 
112  fprintf(m_ffile,"run_nbr=%d, evt_nbr=%ld, time_stamp=%d, lbk_nbr=%d, %s\n",
113  evt.run_number(), evt.event_number(), evt.time_stamp(), evt.lumi_block(), oss.str().c_str());
114  }
115 
116  if(item_fired_after_veto && m_filterfile.empty()) {//don't bother to write out RAW if we're only running to make the trigs.txt file
117  ATH_MSG_INFO("Filter Passed");
118  setFilterPassed(true);
119  m_pass++;
121  }
122  else {
123  ATH_MSG_INFO("Filter Failed");
124  setFilterPassed(false);
125  }
126 
127  }
128  else { // m_l1ZB not set -> filter based on filterfile
129  const auto run = evt.run_number();
130  const auto event = evt.event_number();
131  bool passed = true;
132  //Here is where you'd check for TAG info of some kind...
133  if (!m_filterfile.empty()) {
134  passed = false;
135  if (m_filtermap[run][event].magic!=777) {
136  ATH_MSG_WARNING("Dont have info in filtermap for "<<run<<" "<<event);
137  }
138  else {
139  if (m_filtermap[run][event].nvtx==1 && m_filtermap[run][event].trig==1 &&
140  fabs(m_filtermap[run][event].dt) <3.0) {
141  passed = true;
142  }
143  ATH_MSG_INFO((passed ? "Passing" : "Not passing") << " filter event "<<
144  run<<" "<<event<<", trig run dt magic: "<<
145  m_filtermap[run][event].trig<<" "<<m_filtermap[run][event].nvtx<<" "<<
146  m_filtermap[run][event].dt<<" "<<m_filtermap[run][event].magic);
147  }
148  }
149 
150  if (passed) {
151  ATH_MSG_DEBUG("Filter Passed");
152  setFilterPassed(true);
153  m_pass++;
155  }
156  else {
157  ATH_MSG_DEBUG("Filter Failed");
158  setFilterPassed(false);
159  }
160  }
161  return StatusCode::SUCCESS;
162 }
TrigConf::HLTPrescalesSet::HLTPrescale::prescale
double prescale
Definition: HLTPrescalesSet.h:24
beamspotman.r
def r
Definition: beamspotman.py:676
HLTPrescalesSet.h
BSFilter::m_pass
int m_pass
Definition: BSFilter.h:46
TrigCompositeUtils::passed
bool passed(DecisionID id, const DecisionIDContainer &idSet)
checks if required decision ID is in the set of IDs in the container
Definition: TrigCompositeUtilsRoot.cxx:117
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
BSFilter::m_j40
Gaudi::Property< std::string > m_j40
Definition: BSFilter.h:33
BSFilter.h
BSFilter::m_trigConf
ServiceHandle< TrigConf::ITrigConfigSvc > m_trigConf
Definition: BSFilter.h:40
BSFilter::m_ffile
FILE * m_ffile
Definition: BSFilter.h:57
BSFilter::execute
virtual StatusCode execute() override
Definition: BSFilter.cxx:90
BSFilter::m_filterfile
Gaudi::Property< std::string > m_filterfile
Definition: BSFilter.h:35
LArG4FSStartPointFilter.evt
evt
Definition: LArG4FSStartPointFilter.py:42
BSFilter::finalize
virtual StatusCode finalize() override
Definition: BSFilter.cxx:71
BSFilter::m_filtermap
std::map< int, std::map< uint64_t, filterinfo > > m_filtermap
Definition: BSFilter.h:54
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
event
POOL::TEvent event(POOL::TEvent::kClassAccess)
BSFilter::m_l1ZB
Gaudi::Property< std::string > m_l1ZB
Definition: BSFilter.h:29
TrigConf::HLTPrescalesSet::prescale
const HLTPrescale & prescale(const std::string &chainName) const
HLT prescales by chain names.
Definition: HLTPrescalesSet.cxx:85
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
CaloNoise_fillDB.dt
dt
Definition: CaloNoise_fillDB.py:58
xAOD::uint64_t
uint64_t
Definition: EventInfo_v1.cxx:123
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
run
Definition: run.py:1
AthAlgorithm
Definition: AthAlgorithm.h:47
BSFilter::BSFilter
BSFilter(const std::string &name, ISvcLocator *pSvcLocator)
Definition: BSFilter.cxx:11
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
BSFilter::m_efile
FILE * m_efile
Definition: BSFilter.h:56
BSFilter::m_trigDecTool
PublicToolHandle< Trig::TrigDecisionTool > m_trigDecTool
Definition: BSFilter.h:42
BSFilter::m_noalg
Gaudi::Property< std::string > m_noalg
Definition: BSFilter.h:31
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
BSFilter::writeEventIdFile
void writeEventIdFile(const EventIDBase &evt) const
Definition: BSFilter.cxx:80
TrigConf::HLTPrescalesSet
HLT menu configuration.
Definition: HLTPrescalesSet.h:19
BSFilter::m_All
int m_All
Definition: BSFilter.h:45
BSFilter::initialize
virtual StatusCode initialize() override
Definition: BSFilter.cxx:16
BSFilter::m_EventIdFile
Gaudi::Property< std::string > m_EventIdFile
Definition: BSFilter.h:37