81 const EventContext& ctx,
87 CLHEP::HepRandomEngine* randomEngine = m_randomEngine->getEngine(ctx);
88 Generator generator(CLHEP::RandFlat::shoot(randomEngine->flat()));
89 ATH_MSG_VERBOSE(name() <<
" RNG seed " << CLHEP::RandFlat::shoot(randomEngine->flat()));
91 << particles.size() <<
" particles for simulation.");
95 auto bField = std::make_shared<ATLASMagneticFieldWrapper>();
114 simulator.charged.interactions = ActsFatras::makeStandardChargedElectroMagneticInteractions(
m_interact_minPt * Acts::UnitConstants::MeV);
121 ATH_MSG_VERBOSE(name() <<
" Processing particles in ISFParticleVector.");
122 for (
const auto isfp : particles) {
129 ATH_MSG_DEBUG(name() <<
" Convert ISF::Particle(mass) " << isfp->id()<<
"|" << isfp<<
"(" << isfp->mass() <<
")");
130 std::vector<ActsFatras::Particle> input = std::vector<ActsFatras::Particle>{
131 ActsFatras::Particle(ActsFatras::Barcode().withVertexPrimary(0).withParticle(isfp->id()),
static_cast<Acts::PdgParticle
>(isfp->pdgCode()),
132 isfp->charge(),isfp->mass() * Acts::UnitConstants::MeV)
133 .setDirection(Acts::makeDirectionFromPhiEta(isfp->momentum().phi(), isfp->momentum().eta()))
134 .setAbsoluteMomentum(isfp->momentum().mag() * Acts::UnitConstants::MeV)
136 ATH_MSG_DEBUG(name() <<
" Propagating ActsFatras::Particle vertex|particle|generation|subparticle, " << input[0]);
137 std::vector<ActsFatras::Particle> simulatedInitial;
138 std::vector<ActsFatras::Particle> simulatedFinal;
139 std::vector<ActsFatras::Hit> hits;
141 auto result=simulator.simulate(anygctx, mctx, generator, input, simulatedInitial, simulatedFinal, hits);
142 auto simulatedFailure=
result.value();
143 if (simulatedFailure.size()>0){
144 for (
const auto& simfail : simulatedFailure){
145 auto errCode = Acts::make_error_code(Acts::PropagatorError(simfail.error.value()));
146 ATH_MSG_WARNING(name() <<
" Particle id " <<simfail.particle.particleId()<<
": fail to be simulated during Propagation: " << errCode.message());
147 ATH_MSG_WARNING(name() <<
" Particle vertex|particle|generation|subparticle"<<simfail.particle <<
" starts from position" << Acts::toString(simfail.particle.position()) <<
" and direction " << Acts::toString(simfail.particle.direction()));
148 return StatusCode::SUCCESS;
152 ATH_MSG_DEBUG(name() <<
" initial particle " << simulatedInitial[0]);
153 ATH_MSG_DEBUG(name() <<
" ActsFatras simulator hits: " << hits.size());
155 for (
const auto& hit : hits) {
160 ATH_MSG_DEBUG(name() <<
" No. of particles after ActsFatras simulator: " << simulatedFinal.size());
161 if (!simulatedFinal.empty()){
163 auto itr = simulatedFinal.begin();
165 std::vector<ActsFatras::Hit> particle_hits;
166 if (itr->numberOfHits() > 0) {
167 std::copy(hits.begin(), hits.begin()+itr->numberOfHits(), std::back_inserter(particle_hits));
171 auto isKilled = !itr->isAlive();
172 int maxGeneration = simulatedFinal.back().particleId().generation();
174 for (
int gen = 0; gen <= maxGeneration; ++gen){
175 ATH_MSG_DEBUG(name() <<
" start with generation "<< gen <<
"|" << maxGeneration <<
": "<< *itr);
176 auto vecsecisfp = std::make_unique<ISF::ISFParticleVector>();
177 while (itr != simulatedFinal.end() &&
static_cast<int>(itr->particleId().generation()) == gen) {
178 ATH_MSG_DEBUG(name() <<
" genration "<< gen <<
"|" << maxGeneration <<
": "<< *itr);
179 if(itr->isSecondary()){
183 double mass = itr->mass() / Acts::UnitConstants::MeV;
184 double charge = itr->charge();
185 int pdgid = itr->pdg();
190 ATH_MSG_DEBUG(name() <<
" secondaries particle (ACTS): "<<*itr<<
"("<<itr->momentum()<<
")|time "<<itr->time()<<
"|process "<<
getATLASProcessCode(itr->process()));
191 ATH_MSG_DEBUG(name() <<
" secondaries particle (ISF): " << *secisfp <<
" time "<<secisfp->timeStamp());
192 vecsecisfp->push_back(secisfp);
195 ATH_MSG_DEBUG(name() <<
" primary particle found with generation "<< gen);
199 if (!vecsecisfp->empty()) {
211 for (
auto *secisfp : *vecsecisfp){
212 if (secisfp->getTruthBinding()) {
213 secondaries.push_back(secisfp);
216 ATH_MSG_WARNING(
"Secondary particle not written out to truth.\n Parent (" << isfp <<
")\n Secondary (" << *secisfp <<
")");
222 ATH_MSG_VERBOSE(name() <<
" No. of secondaries: " << secondaries.size());
225 std::vector<ActsFatras::Particle>().swap(input);
226 std::vector<ActsFatras::Particle>().swap(simulatedInitial);
227 std::vector<ActsFatras::Particle>().swap(simulatedFinal);
228 std::vector<ActsFatras::Hit>().swap(hits);
230 return StatusCode::SUCCESS;
The generic ISF particle definition,.