diff --git a/DDDigi/io/DigiIO.cpp b/DDDigi/io/DigiIO.cpp index 73023c497e3b6bc33836e33fc528f70a0aa58729..42c4e8c6c5e7077df95fcb89fb4119cfa3017f8e 100644 --- a/DDDigi/io/DigiIO.cpp +++ b/DDDigi/io/DigiIO.cpp @@ -22,7 +22,6 @@ // ========================================================================= // EDM4HEP specific stuff // ========================================================================= - #ifdef DD4HEP_USE_EDM4HEP /// edm4hep include files @@ -161,12 +160,13 @@ namespace dd4hep { #endif } } - } // End namespace digi -} // End namespace dd4hep + } // End namespace digi +} // End namespace dd4hep +#endif // DD4HEP_USE_EDM4HEP -// ========================================================================= -// DDG4 specific stuff -// ========================================================================= +/// ========================================================================= +/// Conversion from DDG4 in memory to DDDigi +/// ========================================================================= #if defined(DD4HEP_USE_DDG4) #include <DDG4/Geant4Data.h> @@ -202,73 +202,6 @@ namespace dd4hep { hist.particles.emplace_back(key, hit->truth.deposit); } - /// Set all properties of the MutableMCParticle - template <> template <> - void data_io<ddg4_input>::_to_edm4hep(const particle_t& p, - edm4hep::MutableMCParticle mcp) - { - auto status = p.status; - const PropertyMask mask(status); - mcp.setPDG(p.pdgID); - - mcp.setMomentum( _toVectorF( { p.psx, p.psy, p.psz } ) ); - mcp.setMomentumAtEndpoint( _toVectorF( {p.pex, p.pey, p.pez} ) ); - mcp.setVertex( _toVectorD( { p.vsx, p.vsy, p.vsz } ) ); - mcp.setEndpoint( _toVectorD( { p.vex, p.vey, p.vez } ) ); - - mcp.setTime(p.time); - mcp.setMass(p.mass); - mcp.setCharge(3.0*float(p.charge)); - - // Set generator status - mcp.setGeneratorStatus(0); - if( p.genStatus ) { - mcp.setGeneratorStatus( p.genStatus ) ; - } else { - if ( mask.isSet(sim::G4PARTICLE_GEN_STABLE) ) mcp.setGeneratorStatus(1); - else if ( mask.isSet(sim::G4PARTICLE_GEN_DECAYED) ) mcp.setGeneratorStatus(2); - else if ( mask.isSet(sim::G4PARTICLE_GEN_DOCUMENTATION) ) mcp.setGeneratorStatus(3); - else if ( mask.isSet(sim::G4PARTICLE_GEN_BEAM) ) mcp.setGeneratorStatus(4); - else if ( mask.isSet(sim::G4PARTICLE_GEN_OTHER) ) mcp.setGeneratorStatus(9); - } - - // Set simulation status - mcp.setCreatedInSimulation( mask.isSet(sim::G4PARTICLE_SIM_CREATED) ); - mcp.setBackscatter( mask.isSet(sim::G4PARTICLE_SIM_BACKSCATTER) ); - mcp.setVertexIsNotEndpointOfParent( mask.isSet(sim::G4PARTICLE_SIM_PARENT_RADIATED) ); - mcp.setDecayedInTracker( mask.isSet(sim::G4PARTICLE_SIM_DECAY_TRACKER) ); - mcp.setDecayedInCalorimeter( mask.isSet(sim::G4PARTICLE_SIM_DECAY_CALO) ); - mcp.setHasLeftDetector( mask.isSet(sim::G4PARTICLE_SIM_LEFT_DETECTOR) ); - mcp.setStopped( mask.isSet(sim::G4PARTICLE_SIM_STOPPED) ); - mcp.setOverlay( false ); - - //fg: if simstatus !=0 we have to set the generator status to 0: - if( mcp.isCreatedInSimulation() ) - mcp.setGeneratorStatus( 0 ); - - mcp.setSpin(p.spin); - mcp.setColorFlow(p.colorFlow); - } - - template <> template <> - void data_io<ddg4_input>::_to_edm4hep(const std::vector<const particle_t*>& cont, - edm4hep::MCParticleCollection* coll) - { - std::size_t i, n = cont.size(); - _pre_create(coll, n); - /// Convert particle body - for ( i=0; i<n; ++i) { - const particle_t* p = cont[i]; - auto mcp = coll->at(i); - _to_edm4hep(*p, mcp); - /// Relationships are already resolved and kept in order: Just copy indices - for (auto idau : p->daughters) - mcp.addToDaughters(coll->at(idau)); - for (auto ipar : p->parents) - mcp.addToParents(coll->at(ipar)); - } - } - template <> template <> void data_io<ddg4_input>::_to_digi_if(const std::vector<sim::Geant4Tracker::Hit*>& data, std::map<CellID, std::shared_ptr<sim::Geant4Tracker::Hit> >& hits, @@ -356,11 +289,96 @@ namespace dd4hep { for( const auto& p : hits ) cnv_to_digi(key, p, out); } - } // End namespace digi } // End namespace dd4hep #endif // DD4HEP_USE_DDG4 +/// ====================================================================== +/// Conversion from DDG4 in memory to edm4hep +/// ====================================================================== +#if defined(DD4HEP_USE_DDG4) && defined(DD4HEP_USE_EDM4HEP) + +/// Namespace for the AIDA detector description toolkit +namespace dd4hep { + + /// Namespace for the Digitization part of the AIDA detector description toolkit + namespace digi { + + /// Set all properties of the MutableMCParticle + template <> template <> + void data_io<ddg4_input>::_to_edm4hep(const particle_t& p, + edm4hep::MutableMCParticle mcp) + { + auto status = p.status; + const PropertyMask mask(status); + mcp.setPDG(p.pdgID); + + mcp.setMomentum( _toVectorF( { p.psx, p.psy, p.psz } ) ); + mcp.setMomentumAtEndpoint( _toVectorF( {p.pex, p.pey, p.pez} ) ); + mcp.setVertex( _toVectorD( { p.vsx, p.vsy, p.vsz } ) ); + mcp.setEndpoint( _toVectorD( { p.vex, p.vey, p.vez } ) ); + + mcp.setTime(p.time); + mcp.setMass(p.mass); + mcp.setCharge(3.0*float(p.charge)); + + // Set generator status + mcp.setGeneratorStatus(0); + if( p.genStatus ) { + mcp.setGeneratorStatus( p.genStatus ) ; + } else { + if ( mask.isSet(sim::G4PARTICLE_GEN_STABLE) ) mcp.setGeneratorStatus(1); + else if ( mask.isSet(sim::G4PARTICLE_GEN_DECAYED) ) mcp.setGeneratorStatus(2); + else if ( mask.isSet(sim::G4PARTICLE_GEN_DOCUMENTATION) ) mcp.setGeneratorStatus(3); + else if ( mask.isSet(sim::G4PARTICLE_GEN_BEAM) ) mcp.setGeneratorStatus(4); + else if ( mask.isSet(sim::G4PARTICLE_GEN_OTHER) ) mcp.setGeneratorStatus(9); + } + + // Set simulation status + mcp.setCreatedInSimulation( mask.isSet(sim::G4PARTICLE_SIM_CREATED) ); + mcp.setBackscatter( mask.isSet(sim::G4PARTICLE_SIM_BACKSCATTER) ); + mcp.setVertexIsNotEndpointOfParent( mask.isSet(sim::G4PARTICLE_SIM_PARENT_RADIATED) ); + mcp.setDecayedInTracker( mask.isSet(sim::G4PARTICLE_SIM_DECAY_TRACKER) ); + mcp.setDecayedInCalorimeter( mask.isSet(sim::G4PARTICLE_SIM_DECAY_CALO) ); + mcp.setHasLeftDetector( mask.isSet(sim::G4PARTICLE_SIM_LEFT_DETECTOR) ); + mcp.setStopped( mask.isSet(sim::G4PARTICLE_SIM_STOPPED) ); + mcp.setOverlay( false ); + + //fg: if simstatus !=0 we have to set the generator status to 0: + if( mcp.isCreatedInSimulation() ) + mcp.setGeneratorStatus( 0 ); + + mcp.setSpin(p.spin); + mcp.setColorFlow(p.colorFlow); + } + + template <> template <> + void data_io<ddg4_input>::_to_edm4hep(const std::vector<const particle_t*>& cont, + edm4hep::MCParticleCollection* coll) + { + std::size_t i, n = cont.size(); + _pre_create(coll, n); + /// Convert particle body + for ( i=0; i<n; ++i) { + const particle_t* p = cont[i]; + auto mcp = coll->at(i); + _to_edm4hep(*p, mcp); + /// Relationships are already resolved and kept in order: Just copy indices + for (auto idau : p->daughters) + mcp.addToDaughters(coll->at(idau)); + for (auto ipar : p->parents) + mcp.addToParents(coll->at(ipar)); + } + } + } // End namespace digi +} // End namespace dd4hep +#endif // DD4HEP_USE_DDG4 && DD4HEP_USE_EDM4HEP + + +/// ====================================================================== +/// Conversion from DDDigi in memory to edm4hep +/// ====================================================================== +#ifdef DD4HEP_USE_EDM4HEP /// Namespace for the AIDA detector description toolkit namespace dd4hep {