26 parameters.
get<std::string>(
"scoring_hits_coll_name");
27 ecal_sp_coll_name_ = parameters.
get<std::string>(
"ecal_sp_coll_name");
28 sp_pass_name_ = parameters.
get<std::string>(
"sp_pass_name");
30 parameters.
get<std::string>(
"recoil_sim_hits_coll_name");
32 parameters.
get<std::string>(
"tagger_sim_hits_coll_name");
34 sim_particles_coll_name_ =
35 parameters.
get<std::string>(
"sim_particles_coll_name");
36 sim_particles_passname_ =
37 parameters.
get<std::string>(
"sim_particles_passname");
41 pdg_ids_ = parameters.
get<std::vector<int>>(
"pdg_ids", {11});
42 z_min_ = parameters.
get<
double>(
"z_min", -9999);
44 pz_cut_ = parameters.
get<
double>(
"pz_cut", -9999);
45 p_cut_ = parameters.
get<
double>(
"p_cut", 0.);
47 p_cut_ecal_ = parameters.
get<
double>(
"p_cut_ecal", -1.);
48 recoil_sp_ = parameters.
get<
double>(
"recoil_sp",
true);
49 target_sp_ = parameters.
get<
double>(
"tagger_sp",
true);
50 seed_smearing_ = parameters.
get<
bool>(
"seedSmearing",
false);
51 max_track_id_ = parameters.
get<
int>(
"max_track_id", 5);
53 ldmx_log(info) <<
"Seed Smearing is set to " << seed_smearing_;
55 d0smear_ = parameters.
get<std::vector<double>>(
"d0smear", {0.01, 0.01, 0.01});
56 z0smear_ = parameters.
get<std::vector<double>>(
"z0smear", {0.1, 0.1, 0.1});
57 phismear_ = parameters.
get<
double>(
"phismear", 0.001);
58 thetasmear_ = parameters.
get<
double>(
"thetasmear", 0.001);
59 relpsmear_ = parameters.
get<
double>(
"relpsmear", 0.1);
62 rel_smearfactors_ = parameters.
get<std::vector<double>>(
63 "rel_smearfactors", {0.1, 0.1, 0.1, 0.1, 0.1, 0.1});
64 inflate_factors_ = parameters.
get<std::vector<double>>(
65 "inflate_factors", {10., 10., 10., 10., 10., 10.});
73 beam_origin_ = parameters.
get<std::vector<double>>(
"beamOrigin",
74 {-883.0, -21.745876, 0.0});
77 skip_tagger_ = parameters.
get<
bool>(
"skip_tagger",
false);
78 skip_recoil_ = parameters.
get<
bool>(
"skip_recoil",
false);
79 particle_hypothesis_ = parameters.
get<
int>(
"particle_hypothesis");
81 beam_electrons_collection_ =
82 parameters.
get<std::string>(
"beam_electrons_collection");
83 tagger_truth_collection_ =
84 parameters.
get<std::string>(
"tagger_truth_collection");
85 recoil_truth_collection_ =
86 parameters.
get<std::string>(
"recoil_truth_collection");
87 tagger_seeds_collection_ =
88 parameters.
get<std::string>(
"tagger_seeds_collection");
89 recoil_seeds_collection_ =
90 parameters.
get<std::string>(
"recoil_seeds_collection");
116 const std::vector<double>& pos_vec,
const std::vector<double>& p_vec,
118 const std::shared_ptr<Acts::Surface>& target_surface) {
126 Acts::Vector3 pos{pos_vec[0], pos_vec[1], pos_vec[2]};
127 Acts::Vector3 mom{p_vec[0], p_vec[1], p_vec[2]};
130 pos = tracking::sim::utils::ldmx2Acts(pos);
131 mom = tracking::sim::utils::ldmx2Acts(mom);
135 double q{charge * Acts::UnitConstants::e};
143 auto free_params{tracking::sim::utils::toFreeParameters(pos, mom, q)};
148 auto gen_surface{Acts::Surface::makeShared<Acts::PerigeeSurface>(
149 Acts::Vector3(free_params[Acts::eFreePos0], free_params[Acts::eFreePos1],
150 free_params[Acts::eFreePos2]))};
157 Acts::transformFreeToBoundParameters(free_params, *gen_surface,
gctx_)
160 auto part{Acts::GenericParticleHypothesis(
161 Acts::ParticleHypothesis(Acts::PdgParticle(particle_hypothesis_)))};
162 Acts::BoundTrackParameters bound_trk_pars(gen_surface, bound_params,
167 Acts::Vector3 tgt_surf_center = target_surface->center(geometryContext());
168 Acts::Vector3 gen_surf_center = gen_surface->center(geometryContext());
172 if (abs(tgt_surf_center(0) - gen_surf_center(0)) > tol)
173 ldmx_log(error) <<
"Linear extrapolation to a far away surface in B field."
174 <<
" This will cause inaccuracies in track parameters"
175 <<
" Distance extrapolated = "
176 << (tgt_surf_center(0) - gen_surf_center(0));
178 auto prop_bound_state =
179 trk_extrap_->extrapolate(bound_trk_pars, target_surface);
182 Acts::Vector3 ref = target_surface->center(geometryContext());
187 trk.setPerigeeLocation(ref(0), ref(1), ref(2));
189 auto prop_bound_vec = (prop_bound_state.value()).parameters();
192 tracking::sim::utils::convertActsToLdmxPars(prop_bound_vec));
194 trk.setPosition(pos(0), pos(1), pos(2));
195 trk.setMomentum(mom(0), mom(1), mom(2));
259 const std::map<
int, std::vector<int>>& hit_count_map,
260 const std::shared_ptr<Acts::Surface>& origin_surface,
261 const std::shared_ptr<Acts::Surface>& target_surface) {
265 truth_track.setTrackID(trackID);
276 ldmx_log(debug) <<
"Truth parameters at beam origin";
277 for (
auto par : truth_track.getPerigeeParameters())
278 ldmx_log(debug) << par <<
" ";
290 Acts::Vector3 ref = target_surface->center(geometryContext());
291 ts_truth_target.ref_x_ = ref(0);
292 ts_truth_target.ref_y_ = ref(1);
293 ts_truth_target.ref_z_ = ref(2);
294 ts_truth_target.params_ = truth_track_target.getPerigeeParameters();
296 ts_truth_target.ts_type_ = ldmx::TrackStateType::AtTarget;
297 smeared_truth_track.addTrackState(ts_truth_target);
299 ldmx_log(debug) <<
"Truth parameters at target";
300 for (
auto par : truth_track_target.getPerigeeParameters())
301 ldmx_log(debug) << par <<
" ";
308 Acts::Vector3 ref_origin = origin_surface->center(geometryContext());
309 ts_truth_beam_origin.ref_x_ = ref_origin(0);
310 ts_truth_beam_origin.ref_y_ = ref_origin(1);
311 ts_truth_beam_origin.ref_z_ = ref_origin(2);
312 ts_truth_beam_origin.params_ = seed_truth_track.getPerigeeParameters();
314 ts_truth_beam_origin.ts_type_ = ldmx::TrackStateType::AtBeamOrigin;
315 smeared_truth_track.addTrackState(ts_truth_beam_origin);
317 ldmx_log(debug) <<
"Smeared parameters at origin";
318 for (
auto par : smeared_truth_track.getPerigeeParameters())
319 ldmx_log(debug) << par <<
" ";
328 for (
auto sim_hit_idx : hit_count_map.at(smeared_truth_track.getTrackID())) {
329 smeared_truth_track.addMeasurementIndex(sim_hit_idx);
333 smeared_truth_track.setNhits(nhits);
335 return smeared_truth_track;
339 bool seed_smearing) {
341 seed.setPerigeeLocation(tt.getPerigeeLocation()[0],
342 tt.getPerigeeLocation()[1],
343 tt.getPerigeeLocation()[2]);
345 seed.setNhits(tt.getNhits());
347 seed.setNsharedHits(0);
348 seed.setTrackID(tt.getTrackID());
349 seed.setPdgID(tt.getPdgID());
350 seed.setTruthProb(1.);
352 Acts::BoundVector bound_params;
353 Acts::BoundVector stddev;
356 ldmx_log(debug) <<
"Smear track and inflate covariance";
368 double sigma_d0 = d0smear_[0];
369 double sigma_z0 = z0smear_[0];
370 double sigma_phi = phismear_;
371 double sigma_theta = thetasmear_;
372 double sigma_p = relpsmear_ * abs(1 / tt.getQoP());
373 double sigma_t = 1. * Acts::UnitConstants::ns;
375 double smear = (*normal_)(generator_);
376 double d0smear = tt.getD0() + smear * sigma_d0;
378 smear = (*normal_)(generator_);
379 double z0smear = tt.getZ0() + smear * sigma_z0;
381 smear = (*normal_)(generator_);
382 double phismear = tt.getPhi() + smear * sigma_phi;
384 smear = (*normal_)(generator_);
385 double thetasmear = tt.getTheta() + smear * sigma_theta;
387 double p = std::abs(1. / tt.getQoP());
388 smear = (*normal_)(generator_);
389 double psmear = p + smear * sigma_p;
391 double q = tt.getQoP() < 0 ? -1. : 1.;
392 double qo_psmear = q / psmear;
394 smear = (*normal_)(generator_);
395 double tsmear = tt.getT() + smear * sigma_t;
397 bound_params << d0smear, z0smear, phismear, thetasmear, qo_psmear, tsmear;
399 stddev[Acts::eBoundLoc0] =
400 inflate_factors_[Acts::eBoundLoc0] * sigma_d0 * Acts::UnitConstants::mm;
401 stddev[Acts::eBoundLoc1] =
402 inflate_factors_[Acts::eBoundLoc1] * sigma_z0 * Acts::UnitConstants::mm;
403 stddev[Acts::eBoundPhi] = inflate_factors_[Acts::eBoundPhi] * sigma_phi;
404 stddev[Acts::eBoundTheta] =
405 inflate_factors_[Acts::eBoundTheta] * sigma_theta;
406 stddev[Acts::eBoundQOverP] =
407 inflate_factors_[Acts::eBoundQOverP] * (1. / p) * (1. / p) * sigma_p;
408 stddev[Acts::eBoundTime] =
409 inflate_factors_[Acts::eBoundTime] * sigma_t * Acts::UnitConstants::ns;
411 ldmx_log(debug) << stddev;
413 std::vector<double> v_seed_params(
414 (bound_params).data(),
415 bound_params.data() + bound_params.rows() * bound_params.cols());
417 Acts::BoundSquareMatrix bound_cov =
418 stddev.cwiseProduct(stddev).asDiagonal();
419 std::vector<double> v_seed_cov;
420 tracking::sim::utils::flatCov(bound_cov, v_seed_cov);
422 seed.setPerigeeCov(v_seed_cov);
427 bound_params << tt.getD0(), tt.getZ0(), tt.getPhi(), tt.getTheta(),
428 tt.getQoP(), tt.getT();
430 std::vector<double> v_seed_params(
431 (bound_params).data(),
432 bound_params.data() + bound_params.rows() * bound_params.cols());
434 double p = std::abs(1. / tt.getQoP());
435 double sigma_p = 0.75 * p * Acts::UnitConstants::GeV;
436 stddev[Acts::eBoundLoc0] = 2 * Acts::UnitConstants::mm;
437 stddev[Acts::eBoundLoc1] = 5 * Acts::UnitConstants::mm;
438 stddev[Acts::eBoundTime] = 1000 * Acts::UnitConstants::ns;
439 stddev[Acts::eBoundPhi] = 5 * Acts::UnitConstants::degree;
440 stddev[Acts::eBoundTheta] = 5 * Acts::UnitConstants::degree;
441 stddev[Acts::eBoundQOverP] = (1. / p) * (1. / p) * sigma_p;
443 Acts::BoundSquareMatrix bound_cov =
444 stddev.cwiseProduct(stddev).asDiagonal();
445 std::vector<double> v_seed_cov;
446 tracking::sim::utils::flatCov(bound_cov, v_seed_cov);
448 seed.setPerigeeCov(v_seed_cov);
545 sim_particles_coll_name_, sim_particles_passname_)};
551 const std::vector<ldmx::SimTrackerHit> scoring_hits{
556 const std::vector<ldmx::SimTrackerHit> scoring_hits_ecal{
561 const std::vector<ldmx::SimTrackerHit> tagger_sim_hits =
566 const std::vector<ldmx::SimTrackerHit> recoil_sim_hits =
571 if (tagger_sim_hits.size() == 0 && !skip_tagger_) {
572 ldmx_log(error) <<
"Tagger sim hits collection empty for event ";
574 if (recoil_sim_hits.size() == 0 && !skip_recoil_) {
575 ldmx_log(error) <<
"Recoil sim hits collection empty for event ";
579 std::map<int, std::vector<int>> hit_count_map_recoil;
582 std::map<int, std::vector<int>> hit_count_map_tagger;
586 std::vector<int> recoil_sh_idxs;
587 std::unordered_map<int, std::vector<int>> recoil_sh_count_map;
589 std::vector<int> tagger_sh_idxs;
590 std::unordered_map<int, std::vector<int>> tagger_sh_count_map;
594 for (
unsigned int i_sh = 0; i_sh < scoring_hits.size(); i_sh++) {
600 double tagger_p_max = 0.;
606 if (p_vec(2) < 0. || p_vec.norm() <
p_cut_)
continue;
609 if (abs(particle_map[hit.
getTrackID()].getCharge()) < 1e-8)
continue;
611 if (p_vec.norm() > tagger_p_max) {
612 tagger_sh_count_map[hit.
getTrackID()].push_back(i_sh);
620 if (p_vec(2) < 0. || p_vec.norm() <
p_cut_)
continue;
623 if (abs(particle_map[hit.
getTrackID()].getCharge()) < 1e-8)
continue;
625 recoil_sh_count_map[hit.
getTrackID()].push_back(i_sh);
630 for (std::pair<
int, std::vector<int>> element : recoil_sh_count_map) {
632 element.second.begin(), element.second.end(),
633 [&](
const int idx1,
int idx2) ->
bool {
634 const ldmx::SimTrackerHit& hit1 = scoring_hits.at(idx1);
635 const ldmx::SimTrackerHit& hit2 = scoring_hits.at(idx2);
637 Acts::Vector3 phit1{hit1.getMomentum()[0], hit1.getMomentum()[1],
638 hit1.getMomentum()[2]};
639 Acts::Vector3 phit2{hit2.getMomentum()[0], hit2.getMomentum()[1],
640 hit2.getMomentum()[2]};
642 return phit1.norm() > phit2.norm();
647 for (
auto& [_track_id, hit_indices] : tagger_sh_count_map) {
649 hit_indices.begin(), hit_indices.end(),
650 [&](
const int idx1,
int idx2) ->
bool {
651 const ldmx::SimTrackerHit& hit1 = scoring_hits.at(idx1);
652 const ldmx::SimTrackerHit& hit2 = scoring_hits.at(idx2);
654 Acts::Vector3 phit1{hit1.getMomentum()[0], hit1.getMomentum()[1],
655 hit1.getMomentum()[2]};
656 Acts::Vector3 phit2{hit2.getMomentum()[0], hit2.getMomentum()[1],
657 hit2.getMomentum()[2]};
659 return phit1.norm() > phit2.norm();
666 std::vector<ldmx::Track> tagger_truth_tracks;
667 std::vector<ldmx::Track> tagger_truth_seeds;
668 std::vector<ldmx::Track> recoil_truth_tracks;
669 std::vector<ldmx::Track> recoil_truth_seeds;
670 ldmx::Tracks beam_electrons;
674 auto target_surface{Acts::Surface::makeShared<Acts::PerigeeSurface>(
675 Acts::Vector3(0., 0., 0.))};
678 auto target_unbound_surface = tracking::sim::utils::unboundSurface(0.);
681 auto ecal_surface = tracking::sim::utils::unboundSurface(240.5);
683 auto beam_origin_surface{Acts::Surface::makeShared<Acts::PerigeeSurface>(
684 Acts::Vector3(beam_origin_[0], beam_origin_[1], beam_origin_[2]))};
687 for (
const auto& [track_id, hit_indices] : tagger_sh_count_map) {
691 if (hit_count_map_tagger[hit.
getTrackID()].size() > n_min_hits_tagger_) {
693 createTruthTrack(phit, hit, truth_tagger_track, target_surface);
694 truth_tagger_track.setNhits(
695 hit_count_map_tagger[hit.
getTrackID()].size());
696 tagger_truth_tracks.push_back(truth_tagger_track);
701 hit, hit_count_map_tagger, beam_origin_surface,
702 target_unbound_surface);
703 beam_electrons.push_back(beam_e_truth_seed);
710 std::vector<ldmx::SimTrackerHit> ecal_sp_hits =
714 std::vector<ldmx::SimTrackerHit> sel_ecal_sp_hits;
716 for (
auto sp_hit : ecal_sp_hits) {
717 if (sp_hit.getMomentum()[2] > 0 && ((sp_hit.getID() & 0xfff) == 31)) {
718 sel_ecal_sp_hits.push_back(sp_hit);
724 for (std::pair<
int, std::vector<int>> element : recoil_sh_count_map) {
732 bool found_ecal_hit =
false;
733 for (
auto ecal_sp_hit : sel_ecal_sp_hits) {
734 if (ecal_sp_hit.getTrackID() == hit.
getTrackID()) {
735 ecal_hit = ecal_sp_hit;
736 found_ecal_hit =
true;
744 if (hit_count_map_recoil[hit.
getTrackID()].size() > n_min_hits_recoil_ &&
745 found_ecal_hit && !skip_recoil_) {
748 ecal_hit, hit_count_map_recoil, target_surface,
749 target_unbound_surface, ecal_surface);
757 recoil_truth_tracks.push_back(truth_recoil_track);
778 for (
auto& tt : tagger_truth_tracks) {
779 ldmx::Track seed = seedFromTruth(tt, seed_smearing_);
781 tagger_truth_seeds.push_back(seed);
784 ldmx_log(debug) <<
"Forming seeds from truth";
785 for (
auto& tt : recoil_truth_tracks) {
786 ldmx_log(debug) <<
"Smearing truth track";
788 ldmx::Track seed = seedFromTruth(tt, seed_smearing_);
790 recoil_truth_seeds.push_back(seed);
795 event.add(beam_electrons_collection_, beam_electrons);
796 event.add(tagger_truth_collection_, tagger_truth_tracks);
797 event.add(recoil_truth_collection_, recoil_truth_tracks);
798 event.add(tagger_seeds_collection_, tagger_truth_seeds);
799 event.add(recoil_seeds_collection_, recoil_truth_seeds);
std::vector< double > getVertex() const
Get a vector containing the vertex of this particle in mm.
std::vector< double > getMomentum() const
Get a vector containing the momentum of this particle [MeV].