ATLAS Offline Software
Loading...
Searching...
No Matches
FPGATrackSimEventSelectionSvc.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#include "TMath.h"
6
19
20using namespace asg::msgUserCode;
21
22FPGATrackSimEventSelectionSvc::FPGATrackSimEventSelectionSvc(const std::string& name, ISvcLocator* svc) :
23 base_class(name,svc)
24{}
25
27{
29
30 m_min = m_regions->getMin(m_regionID);
31 m_max = m_regions->getMax(m_regionID);
32
33 if (m_sampleType.value() == "skipTruth") m_st = SampleType::skipTruth;
34 else if (m_sampleType.value() == "singleElectrons") m_st = SampleType::singleElectrons;
35 else if (m_sampleType.value() == "singleMuons") m_st = SampleType::singleMuons;
36 else if (m_sampleType.value() == "singlePions") m_st = SampleType::singlePions;
37 else if (m_sampleType.value() == "LLPs") m_st = SampleType::LLPs;
38 else {
39 ATH_MSG_ERROR("initialize(): sampleType doesn't exist. ");
40 return StatusCode::FAILURE;
41 }
42
43 // If we are doing large-radius tracks, we want to restrict the hits entering the
44 // process as before, but we will accept any track as belonging to this region that has
45 // most of its hits within the region, regardless of eta and phi.
46 // We will also set a minimum pT of 5 GeV.
49 double pTCutVal = 1./(1000.*m_minLRTpT);
50 if (m_LRT) {
51 m_trackmin.qOverPt = -1*pTCutVal;
52 m_trackmin.d0 = -300;
53 m_trackmin.z0 = -500;
54 m_trackmax.qOverPt = pTCutVal;
55 m_trackmax.d0 = 300;
56 m_trackmax.z0 = 500;
57 }
58
59 // Should really be printing the full information, but it conflicts with
60 // the requirement that log files be identical .....
61 ATH_MSG_INFO("FPGATrackSimEventSelectionSvc::initialize(): " <<
62 "regionID = " << m_regionID << ", " <<
63 "min = {" << m_min << "}, " <<
64 "max = {" << m_max << "}, " <<
65 "sampleType = " << std::string(m_sampleType) << ", " <<
66 "withPU = " << static_cast<bool>(m_withPU));
67
68 return StatusCode::SUCCESS;
69}
70
72{
73 if (m_regions) delete m_regions;
74 ATH_MSG_INFO("FPGATrackSimEventSelectionSvc::finalize()");
75
76 return StatusCode::SUCCESS;
77}
78
80{
81 float eta = TMath::ASinH(hit.getGCotTheta());
82 float phi = hit.getGPhi();
83
84 if (eta >= m_min.eta && eta <= m_max.eta
85 && phi >= m_min.phi && phi <= m_max.phi)
86 return true;
87 else
88 return false;
89}
90
92{
93 if (track.getQOverPt() >= m_trackmin.qOverPt && track.getQOverPt() <= m_trackmax.qOverPt
94 && track.getEta() >= m_trackmin.eta && track.getEta() <= m_trackmax.eta
95 && track.getPhi() >= m_trackmin.phi && track.getPhi() <= m_trackmax.phi
96 && track.getD0() >= m_trackmin.d0 && track.getD0() <= m_trackmax.d0
97 && track.getZ0() >= m_trackmin.z0 && track.getZ0() <= m_trackmax.z0)
98 return true;
99 else
100 return false;
101}
102
104{
105 if (track.getQOverPt() >= m_trackmin.qOverPt && track.getQOverPt() <= m_trackmax.qOverPt)
106 return true;
107 else
108 return false;
109}
110
112{
113 if (track.getEta() >= m_trackmin.eta && track.getEta() <= m_trackmax.eta)
114 return true;
115 else
116 return false;
117}
118
120{
121 if (track.getPhi() >= m_trackmin.phi && track.getPhi() <= m_trackmax.phi)
122 return true;
123 else
124 return false;
125}
126
128{
129 if (track.getD0() >= m_trackmin.d0 && track.getD0() <= m_trackmax.d0)
130 return true;
131 else
132 return false;
133}
134
136{
137 if (track.getZ0() >= m_trackmin.z0 && track.getZ0() <= m_trackmax.z0)
138 return true;
139 else
140 return false;
141}
142
144{
145 if (offlineTrack.getQOverPt() >= m_trackmin.qOverPt && offlineTrack.getQOverPt() <= m_trackmax.qOverPt
146 && offlineTrack.getEta() >= m_trackmin.eta && offlineTrack.getEta() <= m_trackmax.eta
147 && offlineTrack.getPhi() >= m_trackmin.phi && offlineTrack.getPhi() <= m_trackmax.phi
148 && offlineTrack.getD0() >= m_trackmin.d0 && offlineTrack.getD0() <= m_trackmax.d0
149 && offlineTrack.getZ0() >= m_trackmin.z0 && offlineTrack.getZ0() <= m_trackmax.z0)
150 return true;
151 else
152 return false;
153}
154
156{
157 if (offlineTrack.getQOverPt() >= m_trackmin.qOverPt && offlineTrack.getQOverPt() <= m_trackmax.qOverPt)
158 return true;
159 else
160 return false;
161}
162
164{
165 if (offlineTrack.getEta() >= m_trackmin.eta && offlineTrack.getEta() <= m_trackmax.eta)
166 return true;
167 else
168 return false;
169}
170
172{
173 if (offlineTrack.getPhi() >= m_trackmin.phi && offlineTrack.getPhi() <= m_trackmax.phi)
174 return true;
175 else
176 return false;
177}
178
180{
181 if (offlineTrack.getD0() >= m_trackmin.d0 && offlineTrack.getD0() <= m_trackmax.d0)
182 return true;
183 else
184 return false;
185}
186
188{
189 if (offlineTrack.getZ0() >= m_trackmin.z0 && offlineTrack.getZ0() <= m_trackmax.z0)
190 return true;
191 else
192 return false;
193}
194
196{
197 // Want a version that allows us to modify the selection parameters here.
198 // If m_trackmin and m_trackmax are unmodified from the region definitions
199 // this should return exactly the same.
200 FPGATrackSimTrackPars cur = truthTrack.getPars();
201 for (unsigned i = 0; i < FPGATrackSimTrackPars::NPARS; i++)
202 {
203 if (cur[i] < m_trackmin[i]) {
204 return false;
205 }
206 if (cur[i] > m_trackmax[i]) {
207 return false;
208 }
209 }
210
211 ATH_MSG_DEBUG("Passing it. PDGid = " << truthTrack.getPDGCode() << "; barcode = " << truthTrack.getBarcode());
212 return true;
213}
214
216{
217 if (track.getBarcode() == 0 || track.getBarcode() == std::numeric_limits<HepMcParticleLink::barcode_type>::max()) return false;
218 if (track.getEventIndex() == std::numeric_limits<long>::max()) return false;
219 if (track.getQOverPt() == 0) return false;
220
221 return true;
222}
223
225{
226 if (truthTrack.getBarcode() == 0 || truthTrack.getQ() == 0) return false;
227 if ((!m_allowHighBarcode) && m_st != SampleType::skipTruth && HepMC::is_simulation_particle(&truthTrack)) return false;
228 if (!passCuts(truthTrack)) return false;
229
230 return true;
231}
232
234{
235 bool retval = false;
237 retval = true;
239 const auto& truthTracks = eventHeader->optional().getTruthTracks();
240 retval = checkTruthTracks(truthTracks);
241 }
242 else if (m_st == SampleType::LLPs) {
243 const auto& truthTracks = eventHeader->optional().getTruthTracks();
244 // Maybe change this later - could be we want LRT selection in all cases but I suspect not
245 if (m_LRT) retval = checkTruthTracksLRT(truthTracks);
246 else retval = checkTruthTracks(truthTracks);
247 }
248 else {
249 ATH_MSG_DEBUG("selectEvent(): Error with sampleType property");
250 }
251
252 m_selectEvent = retval;
253 return retval;
254}
255
257{
258 bool retval = false;
260 retval = true;
262 const auto& truthTracks = eventHeader->optional().getTruthTracks();
263 retval = checkTruthTracks(truthTracks);
264 }
265 else if (m_st == SampleType::LLPs) {
266 const auto& truthTracks = eventHeader->optional().getTruthTracks();
267 // Maybe change this later - could be we want LRT selection in all cases but I suspect not
268 if (m_LRT) retval = checkTruthTracksLRT(truthTracks);
269 else retval = checkTruthTracks(truthTracks);
270 }
271 else {
272 ATH_MSG_DEBUG("selectEvent(): Error with sampleType property");
273 }
274
275 m_selectEvent = retval;
276 return retval;
277
278}
279
285
287{
288 if (!m_regions)
289 {
290 ATH_MSG_INFO("Creating the slices object");
291 MsgStream cmsg(msgSvc(), "FPGATrackSimRegionSlices");
292 cmsg.setLevel(msg().level()); // cause AthMessaging is stupid and doesn't have this function
293 if (m_oldRegionDefs.value())
295 else
296 m_regions = new FPGATrackSimRegionSlices(m_mind0.value(), m_minz0.value(), m_minqOverPt.value(),
297 m_maxd0.value(), m_maxz0.value(), m_maxqOverPt.value());
298 }
299}
300
301
302bool FPGATrackSimEventSelectionSvc::checkTruthTracks(const std::vector<FPGATrackSimTruthTrack>& truthTracks) const
303{
304// find at least one track in the region
305 bool good=false;
306 for (const FPGATrackSimTruthTrack& track : truthTracks){
307 if(m_regions->inRegion(m_regionID, track) || m_skipRegionCheck){
308 good=true;
309 if (std::abs(track.getPDGCode()) != static_cast<int>(m_st)) {
310 ATH_MSG_WARNING("selectEvent(): TruthTrack PDGCode != sampleType");
311 good=false;
312 }
313 else {
314 ATH_MSG_DEBUG("selectEvent(): found one truth track, in region "
315 <<getRegionID() <<"; track pars: "<< track.getPars());
316 break;
317 }
318 }
319 else {
320 ATH_MSG_DEBUG("selectEvent(): found one truth track over "<<truthTracks.size()<<", out of region "
321 <<getRegionID() <<"; track pars: "<< track.getPars());
322 }
323 }
324 return good;
325}
326
327bool FPGATrackSimEventSelectionSvc::checkTruthTracksLRT(const std::vector<FPGATrackSimTruthTrack>& truthTracks) const
328{
329 ATH_MSG_DEBUG("selectEvent(): Checking truth tracks with LRT requirements");
330 // Ideally we would make this flexible to use either of two conditions
331 // 1) there is a truth track that passes our region criteria with our modified selections, or
332 // 2) there is a truth track that passes all but the eta and phi requirements, but has
333 // the majority of its associated hits in the region.
334
335 // Check for 1)
336 for (const auto& truthtrack : truthTracks ) {
337 // If we specified a PDG ID selection, it can go here - but by default this is false
338 if ((m_LRT_pdgID != 0) && (m_LRT_pdgID != truthtrack.getPDGCode())) {
339 if (passCuts(truthtrack)) ANA_MSG_DEBUG("Skipping an otherwise passing track due to wrong PDGID: " << truthtrack.getPDGCode());
340 continue;
341 }
342 if (passCuts(truthtrack)) return true;
343 }
344
345 // Check for 2)
346 // TODO someday.
347
348
349 // Otherwise return false
350 return false;
351}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
macros for messaging and checking status codes
#define ANA_MSG_DEBUG(xmsg)
Macro printing debug messages.
: FPGATrackSim-specific class to represent an hit in the detector.
Stores slice definitions for FPGATrackSim regions.
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
FPGATrackSimOptionalEventInfo const & optional() const
Gaudi::Property< std::string > m_sampleType
virtual bool passCuts(const FPGATrackSimHit &) const override
virtual unsigned getRegionID() const override
virtual bool passMatching(FPGATrackSimTrack const &) const override
virtual bool passQOverPt(const FPGATrackSimTrack &) const override
virtual bool passEta(const FPGATrackSimTrack &) const override
Gaudi::Property< std::string > m_regions_path
virtual bool passZ0(const FPGATrackSimTrack &) const override
virtual bool passPhi(const FPGATrackSimTrack &) const override
virtual const FPGATrackSimRegionSlices * getRegions() override
virtual bool selectEvent(const FPGATrackSimEventInputHeader *) override
Gaudi::Property< unsigned int > m_regionID
virtual bool passD0(const FPGATrackSimTrack &) const override
bool checkTruthTracksLRT(const std::vector< FPGATrackSimTruthTrack > &) const
FPGATrackSimEventSelectionSvc(const std::string &name, ISvcLocator *svc)
bool checkTruthTracks(const std::vector< FPGATrackSimTruthTrack > &) const
Gaudi::Property< unsigned int > m_skipRegionCheck
float getGPhi() const
float getGCotTheta() const
FPGATrackSimOptionalEventInfo const & optional() const
const std::vector< FPGATrackSimTruthTrack > & getTruthTracks() const
HepMcParticleLink::barcode_type getBarcode() const
FPGATrackSimTrackPars getPars() const
bool is_simulation_particle(const T &p)
Method to establish if a particle (or barcode) was created during the simulation (TODO update to be s...
MsgStream & msg
Definition testRead.cxx:32