58 parameters.
get<std::string>(
"input_hits_collection",
"TaggerSimHits");
62 parameters.
get<std::string>(
"tagger_trks_collection",
"TaggerTracks");
65 parameters.
get<std::vector<double>>(
"perigee_location", {-700, 0., 0.});
66 pmin_ = parameters.
get<
double>(
"pmin", 0.05 * Acts::UnitConstants::GeV);
67 pmax_ = parameters.
get<
double>(
"pmax", 8 * Acts::UnitConstants::GeV);
68 d0max_ = parameters.
get<
double>(
"d0max", -15. * Acts::UnitConstants::mm);
69 d0min_ = parameters.
get<
double>(
"d0min", -45. * Acts::UnitConstants::mm);
70 z0max_ = parameters.
get<
double>(
"z0max", 60. * Acts::UnitConstants::mm);
71 phicut_ = parameters.
get<
double>(
"phicut", 0.1);
74 loc1cut_ = parameters.
get<
double>(
"loc1cut", 0.3);
76 parameters.
get<std::vector<std::string>>(
"strategies", {
"0,1,2,3,4"});
79 parameters.
get<
bool>(
"use_beamspot_constraint",
false);
81 parameters.
get<std::vector<double>>(
"beamspot_sigma", {5.77, 23.1});
84 EXCEPTION_RAISE(
"BadConf",
85 "use_target_constraint needs a tagger_trks_collection");
89 const size_t min_layers =
95 std::vector<int> layers;
96 std::stringstream ss(strategy);
98 while (std::getline(ss, token,
',')) {
99 if (!token.empty()) layers.push_back(std::stoi(token));
101 std::set<int> distinct(layers.begin(), layers.end());
102 if (distinct.size() < min_layers) {
103 EXCEPTION_RAISE(
"BadConf",
104 "Seeding strategy '" + strategy +
"' has fewer than " +
105 std::to_string(min_layers) +
" distinct layers");
109 inflate_factors_ = parameters.
get<std::vector<double>>(
110 "inflate_factors", {10., 10., 10., 10., 10., 10.});
111 bfield_ = parameters.
get<
double>(
"bfield", 1.5);
112 input_pass_name_ = parameters.
get<std::string>(
"input_pass_name");
113 sim_particles_coll_name_ =
114 parameters.
get<std::string>(
"sim_particles_coll_name");
115 sim_particles_passname_ =
116 parameters.
get<std::string>(
"sim_particles_passname");
117 tagger_trks_event_collection_passname_ =
118 parameters.
get<std::string>(
"tagger_trks_event_collection_passname");
119 sim_particles_event_passname_ =
120 parameters.
get<std::string>(
"sim_particles_event_passname");
128 auto start = std::chrono::high_resolution_clock::now();
129 std::vector<ldmx::Track> seed_tracks;
134 std::map<int, ldmx::SimParticle> particle_map;
140 std::vector<ldmx::Track> tagger_tracks;
143 std::string pass = tagger_trks_event_collection_passname_;
146 pass =
event.getPassName();
154 <<
"' collections found, set "
155 "tagger_trks_event_collection_passname to pick one";
164 ldmx::Measurements target_pseudo_meas;
166 for (
auto tagtrk : tagger_tracks) {
176 const auto& perigee_cov = tagtrk.getPerigeeCov();
177 if (!perigee_cov.empty()) {
178 Acts::BoundMatrix cov = tracking::sim::utils::unpackCov(perigee_cov);
179 double locu = tagtrk.getD0();
180 double locv = tagtrk.getZ0();
182 cov(Acts::BoundIndices::eBoundLoc0, Acts::BoundIndices::eBoundLoc0);
184 cov(Acts::BoundIndices::eBoundLoc1, Acts::BoundIndices::eBoundLoc1);
188 Acts::Vector3 dummy{0., 0., 0.};
189 Acts::Vector2 local_pos{locu, locv};
190 Acts::Vector3 global_pos =
191 tgt_surf->localToGlobal(geometryContext(), local_pos, dummy);
198 target_pseudo_meas.push_back(pseudo_meas);
203 ldmx::Measurements fit_constraints;
208 Acts::Vector3 global_pos = tgt_surf->localToGlobal(
209 geometryContext(), Acts::Vector2{0., 0.}, Acts::Vector3{0., 0., 0.});
214 fit_constraints.push_back(beamspot);
217 if (event.
exists(sim_particles_coll_name_, sim_particles_event_passname_)) {
219 sim_particles_coll_name_, sim_particles_passname_);
220 truth_matching_tool_->setup(particle_map, measurements);
223 ldmx_log(debug) <<
"Preparing the strategies";
229 if (groupStrips(measurements, strategy))
230 findSeedsFromMap(seed_tracks, target_pseudo_meas, fit_constraints);
235 ntracks_ += seed_tracks.size();
238 auto end = std::chrono::high_resolution_clock::now();
243 auto diff = end - start;
244 processing_time_ += std::chrono::duration<double, std::milli>(diff).count();
280 const ldmx::Measurements& vmeas,
double xOrigin,
281 const Acts::Vector3& perigee_location,
291 Acts::Matrix<5, 5> a = Acts::Matrix<5, 5>::Zero();
292 Acts::Vector<5> y = Acts::Vector<5>::Zero();
295 auto add_point = [&](
const Acts::Surface& surface,
const Acts::Vector2& loc,
296 double xmeas,
double var_u,
double var_v) {
297 auto rot = surface.localToGlobalTransform(geometryContext()).rotation();
298 auto tr = surface.localToGlobalTransform(geometryContext()).translation();
299 auto rotl2g = rot.transpose();
301 Acts::Matrix<2, 5> a_i;
302 a_i(0, 0) = rotl2g(0, 1);
303 a_i(0, 1) = rotl2g(0, 1) * xmeas;
304 a_i(0, 2) = rotl2g(0, 1) * xmeas * xmeas;
305 a_i(0, 3) = rotl2g(0, 2);
306 a_i(0, 4) = rotl2g(0, 2) * xmeas;
308 a_i(1, 0) = rotl2g(1, 1);
309 a_i(1, 1) = rotl2g(1, 1) * xmeas;
310 a_i(1, 2) = rotl2g(1, 1) * xmeas * xmeas;
311 a_i(1, 3) = rotl2g(1, 2);
312 a_i(1, 4) = rotl2g(1, 2) * xmeas;
314 Acts::Vector2 offset = (rot.transpose() * tr).topRows<2>();
315 Acts::Vector2 xoffset = {rotl2g(0, 0) * xmeas, rotl2g(1, 0) * xmeas};
317 Acts::Matrix<2, 2> w_i = Acts::Matrix<2, 2>::Zero();
318 w_i(0, 0) = 1. / var_u;
319 w_i(1, 1) = 1. / var_v;
321 Acts::Vector2 yprime_i = loc + offset - xoffset;
322 y += (a_i.transpose()) * w_i * yprime_i;
323 a += a_i.transpose() * (w_i * a_i);
326 for (
auto meas : vmeas) {
327 double xmeas = meas.getGlobalPosition()[0] - xOrigin;
328 const Acts::Surface* hit_surface = geometry().getSurface(meas.getLayerID());
330 xhit_.push_back(xmeas);
331 yhit_.push_back(meas.getGlobalPosition()[1]);
332 zhit_.push_back(meas.getGlobalPosition()[2]);
335 Acts::Vector2 loc{meas.getLocalPosition()[0], 0.};
346 add_point(*
target_surface_, loc, xmeas, std::max<double>(cov[0], 1e-6),
347 std::max<double>(cov[1], 1e-6));
360 Acts::Vector<3> ref{0., 0., 0.};
366 double relative_perigee_x = perigee_location(0) - xOrigin;
368 std::shared_ptr<const Acts::PerigeeSurface> seed_perigee =
369 Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3(
370 perigee_location(0), perigee_location(1), perigee_location(2)));
374 Acts::Vector3 seed_pos{perigee_location(0),
375 b(0) + b(1) * relative_perigee_x +
376 b(2) * relative_perigee_x * relative_perigee_x,
377 b(3) + b(4) * relative_perigee_x};
378 Acts::Vector3 dir{1, b(1) + 2 * b(2) * relative_perigee_x, b(4)};
383 double p = 0.3 * bfield_ * (1. / (2. * abs(b(2)))) * 0.001;
387 Acts::Vector3 seed_mom = p * dir / Acts::UnitConstants::MeV;
389 b(2) < 0 ? -1 * Acts::UnitConstants::e : +1 * Acts::UnitConstants::e;
405 (*seed_perigee).intersect(geometryContext(), seed_pos, dir);
407 Acts::FreeVector seed_free = tracking::sim::utils::toFreeParameters(
408 intersection[0].position(), seed_mom, q);
410 auto bound_params = Acts::transformFreeToBoundParameters(
411 seed_free, *seed_perigee, geometryContext())
414 ldmx_log(trace) <<
"bound parameters at perigee location" << bound_params;
416 Acts::BoundVector stddev;
418 double sigma_p = 0.75 * p * Acts::UnitConstants::GeV;
419 stddev[Acts::eBoundLoc0] =
420 inflate_factors_[Acts::eBoundLoc0] * 2 * Acts::UnitConstants::mm;
421 stddev[Acts::eBoundLoc1] =
422 inflate_factors_[Acts::eBoundLoc1] * 5 * Acts::UnitConstants::mm;
423 stddev[Acts::eBoundPhi] =
424 inflate_factors_[Acts::eBoundPhi] * 5 * Acts::UnitConstants::degree;
425 stddev[Acts::eBoundTheta] =
426 inflate_factors_[Acts::eBoundTheta] * 5 * Acts::UnitConstants::degree;
427 stddev[Acts::eBoundQOverP] =
428 inflate_factors_[Acts::eBoundQOverP] * (1. / p) * (1. / p) * sigma_p;
429 stddev[Acts::eBoundTime] =
430 inflate_factors_[Acts::eBoundTime] * 1000 * Acts::UnitConstants::ns;
433 <<
"Making covariance matrix as diagonal matrix with inflated terms";
434 Acts::BoundMatrix bound_cov = stddev.cwiseProduct(stddev).asDiagonal();
436 ldmx_log(debug) <<
"...now putting together the seed track ...";
441 Acts::Vector3 perigee_ldmx =
442 tracking::sim::utils::acts2Ldmx(perigee_location);
443 trk.setPerigeeLocation(perigee_ldmx(0), perigee_ldmx(1), perigee_ldmx(2));
445 trk.setNhits(vmeas.size());
447 trk.setNsharedHits(0);
448 trk.setCharge(q < 0 ? -1 : 1);
449 std::vector<double> v_seed_params(
450 (bound_params).data(),
451 bound_params.data() + bound_params.rows() * bound_params.cols());
452 std::vector<double> v_seed_cov;
453 tracking::sim::utils::flatCov(bound_cov, v_seed_cov);
454 trk.setPerigeeParameters(v_seed_params);
455 trk.setPerigeeCov(v_seed_cov);
458 <<
"...making the ParticleHypothesis ...assume electron for now";
459 auto part_hypo{Acts::ParticleHypothesis::electron()};
461 ldmx_log(debug) <<
"Making BoundTrackParameters seedParameters";
462 Acts::BoundTrackParameters seed_parameters(
463 seed_perigee, std::move(bound_params), bound_cov, part_hypo);
465 ldmx_log(debug) <<
"Returning seed track";