20 #include "GaudiKernel/SystemOfUnits.h"
64 return "InvalidReason";
66 return "InvalidReason";
73 if (reasons.test(
i)) {
74 if (!
str.empty())
str +=
',';
91 double const sin_phi0 =
std::sin(seed.phi0);
92 double const cos_phi0 =
std::cos(seed.phi0);
93 double const param[] = { -sin_phi0, cos_phi0, -seed.z0*sin_phi0, seed.z0*cos_phi0};
94 double d0_var = seed.d0_var + beamSize*beamSize;
95 for (
int i = 0;
i < 4; ++
i) {
96 for (
int j = 0; j < 4; ++ j) {
97 trk_param(
i, j) += param[
i]*param[j] / d0_var;
99 trk_d0(
i) += seed.d0*param[
i] / d0_var;
102 trk_d0_sq += seed.d0*seed.d0 / d0_var;
107 trk_count +=
other.trk_count;
108 trk_d0_sq +=
other.trk_d0_sq;
109 trk_param +=
other.trk_param;
110 trk_d0 +=
other.trk_d0;
116 auto solution = trk_param.inverse()*trk_d0;
124 declareProperty(
"TrackMinPt", m_minTrackPt = 0.7*
GeV );
125 declareProperty(
"TrackMaxEta", m_maxTrackEta = 2.5 );
126 declareProperty(
"TrackMaxZ0", m_maxTrackZ0 = 200.*
mm );
127 declareProperty(
"TrackMaxD0", m_maxTrackD0 = 10.*
mm );
128 declareProperty(
"TrackMaxZ0err", m_maxTrackZ0err = 2.*
mm );
129 declareProperty(
"TrackMaxD0err", m_maxTrackD0err = 2.*
mm );
130 declareProperty(
"TrackMinNDF", m_minTrackNDF = 2 );
131 declareProperty(
"TrackMinQual", m_minTrackQual = 0.2 );
132 declareProperty(
"TrackMaxQual", m_maxTrackQual = 5.0 );
133 declareProperty(
"TrackMinChi2Prob",m_minTrackChi2Prob = 0.0 );
134 declareProperty(
"TrackMinSiHits", m_minSiHits = 4 );
135 declareProperty(
"TrackMinPIXHits", m_minPIXHits = 1 );
136 declareProperty(
"TrackMinSCTHits", m_minSCTHits = 3 );
137 declareProperty(
"TrackMinTRTHits", m_minTRTHits = 0 );
140 declareProperty(
"GoalSeedTracks", m_goalSeedTracks = 500 );
141 declareProperty(
"D0Chi2Cutoff", m_chi2cutoff = 30 );
142 declareProperty(
"BeamSizeLS", m_beamSizeLS = 0.01*
mm);
143 declareProperty(
"BSLbnInterval", m_lbnInterval = 1 );
153 m_accumulators.clear();
155 return StatusCode::SUCCESS;
158 std::vector<const Trk::Track*>
161 ATH_MSG_DEBUG(
"Selecting tracks for the beamSpot algorithm" );
170 std::vector<T2Track> myTracks;
171 myTracks.reserve(tracks.size());
172 std::vector<const Trk::Track*> selectedTracks;
173 selectedTracks.reserve(tracks.size());
176 for (
auto trackIter = tracks.begin(); trackIter != tracks.end(); ++trackIter) {
186 if (rejectSet.none()) {
188 selectedTracks.push_back(*trackIter);
191 myTracks.push_back(myTrack);
198 if (rejectSet.test(bit)) {
199 ++trackRejectReasonsCounts[bit];
205 "Track " << (rejectSet.none() ?
"passed" :
"failed") <<
" selection:" <<
206 " mask: " << rejectReasonsToString(rejectSet) <<
207 " d0: " << myTrack.
D0() <<
208 " z0: " << myTrack.
Z0() <<
209 " phi0: " << myTrack.
Phi() <<
210 " eta: " << myTrack.
Eta() <<
211 " pT: " << myTrack.
Pt()*
GeV <<
212 " Z0err: " << myTrack.
Z0err() <<
213 " D0err: " << myTrack.
D0err() <<
214 " Qual: " << myTrack.
Qual() <<
215 " Chi2Prob: " << myTrack.
Chi2Prob() <<
216 " NpixSPs: " << myTrack.
PIXHits() <<
217 " NsctSPs: " << myTrack.
SCTHits() <<
218 " NstrawHits: " << myTrack.
TRTHits());
222 ATH_MSG_DEBUG(
"Total Tracks: " << nTracksInput <<
" selectedTracks: " << nTracksFilter);
233 return selectedTracks;
237 unsigned lbn,
unsigned bcid,
238 std::vector<TrackData>* bsTracks)
const
240 std::lock_guard<std::mutex> lock(
m_mutex);
242 if (m_accumulators.empty()) {
244 m_bsSeeds.reserve(m_bsSeeds.size() + tracks.size());
245 for (
auto& track: tracks) {
246 m_bsSeeds.emplace_back(*track->perigeeParameters(), lbn,
bcid);
260 if (m_accumulators.count(lbn) == 0) {
264 m_accumulators.begin(), m_accumulators.end(), 0,
265 [](
unsigned counter,
auto const& pair) { return counter + pair.second.trk_count; }
267 ATH_MSG_DEBUG(
"Currently have " << m_accumulators.size() <<
" accumulators with "
268 << accumTrackCount <<
" tracks");
273 while (m_accumulators.size() > 2) {
274 ATH_MSG_DEBUG(
"Removing accumulator for LB=" << m_accumulators.begin()->first
275 <<
" with " << m_accumulators.begin()->second.trk_count <<
" tracks");
276 m_accumulators.erase(m_accumulators.begin());
282 for (
auto&& pair: m_accumulators) {
283 acc.update(pair.second);
285 auto solution =
acc.solution();
288 for (
auto& track: tracks) {
289 auto trackPars = track->perigeeParameters();
290 if (trackPars !=
nullptr) {
309 std::vector<const Trk::Track*>
315 std::lock_guard<std::mutex> lock(
m_mutex);
317 std::vector<const Trk::Track*> selected;
318 if (m_accumulators.empty()) {
325 for (
auto&& pair: m_accumulators) {
326 acc.update(pair.second);
328 auto solution =
acc.solution();
332 std::vector<T2Track> t2Tracks;
333 t2Tracks.reserve(tracks.size());
334 for (
auto& track: tracks) {
335 auto trackPars = track->perigeeParameters();
336 if (trackPars !=
nullptr) {
343 selected.push_back(track);
344 t2Tracks.emplace_back(*track);
405 trackNDF, trackQual, trackChi2Prob, trackSiHits, trackPiHits, trackSCTHits, trackTRTHits);
415 for (
auto const& seed: m_bsSeeds) {
418 auto solution = acc0.solution();
419 ATH_MSG_DEBUG(
"Unfiltered solution=" << solution[0] <<
", " << solution[1]
420 <<
", " << solution[2] <<
", " << solution[3]);
425 for (
int c = 0;
c < Niter; ++
c) {
428 for (
auto const& seed: m_bsSeeds) {
434 solution =
acc.solution();
435 ATH_MSG_DEBUG(
"Filtered solution [iter " <<
c <<
"]=" << solution[0] <<
", " << solution[1]
436 <<
", " << solution[2] <<
", " << solution[3]);
441 m_accumulators.clear();
442 if (bsTracks !=
nullptr) {
444 bsTracks->reserve(m_bsSeeds.size());
447 for (
auto const& seed: m_bsSeeds) {
451 if (m_accumulators.count(seed.lbn) == 0) {
455 if (bsTracks !=
nullptr) {
456 bsTracks->push_back(seed);
464 for (
auto&& pair: m_accumulators) {
465 acc.update(pair.second);
467 solution =
acc.solution();
468 ATH_MSG_DEBUG(
"Final filtered solution=" << solution[0] <<
", " << solution[1]
469 <<
", " << solution[2] <<
", " << solution[3]);
482 double const sin_phi0 =
std::sin(seed.phi0);
483 double const cos_phi0 =
std::cos(seed.phi0);
484 double const param[] = {-sin_phi0, cos_phi0, -seed.z0*sin_phi0, seed.z0*cos_phi0};
485 double chi2 = seed.d0;
486 for (
int i = 0;
i < 4; ++
i) {
487 chi2 -= solution[
i]*param[
i];
494 auto&&
par = trackPars->parameters();
495 auto&&
cov = trackPars->covariance();
496 if (
cov !=
nullptr) {
503 psi_err = std::sqrt(psi_err);
505 psi_err = -std::sqrt(-psi_err);
508 << std::setprecision(15)
512 <<
" d0_err: " << d0_err
513 <<
" phi0_err: " << phi0_err
515 <<
" r_est: " << r_est
516 <<
" psi_err: " << psi_err
517 <<
" z0_err: " << z0_err
519 << std::setprecision(6));