diff --git a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/CMakeLists.txt b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/CMakeLists.txt index 70c1c4590fc656549f4d433ea6541ffdc2ecd5ab..a0c7cd55653d92c4231e5fe4d2a059711400d344 100644 --- a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/CMakeLists.txt +++ b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/CMakeLists.txt @@ -17,6 +17,7 @@ atlas_depends_on_subdirs( PUBLIC DetectorDescription/AtlasDetDescr DetectorDescription/GeoPrimitives Generators/GeneratorObjects + Simulation/Barcode/BarcodeEvent Simulation/Barcode/BarcodeInterfaces Simulation/G4Atlas/G4AtlasTools Simulation/G4Sim/MCTruth diff --git a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/cmt/requirements b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/cmt/requirements index 000ca5454a0d9f4c8c6dea8b354794ddc41dcce2..2cc0515c23121c06f69a21856692f4bd39b59cc0 100644 --- a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/cmt/requirements +++ b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/cmt/requirements @@ -15,6 +15,7 @@ use AtlasDetDescr AtlasDetDescr-* DetectorDescription use GeoPrimitives GeoPrimitives-* DetectorDescription use AtlasHepMC AtlasHepMC-* External use AtlasROOT AtlasROOT-* External +use BarcodeEvent BarcodeEvent-* Simulation/Barcode use BarcodeInterfaces BarcodeInterfaces-* Simulation/Barcode use G4AtlasTools G4AtlasTools-* Simulation/G4Atlas use GeneratorObjects GeneratorObjects-* Generators diff --git a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/python/ISF_Geant4ToolsConfig.py b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/python/ISF_Geant4ToolsConfig.py index 5cf4d28446574f7463f1797fcf72c691e954ece5..1d41cd086d9d60044ffd97600fc8efa5ae6c89ac 100644 --- a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/python/ISF_Geant4ToolsConfig.py +++ b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/python/ISF_Geant4ToolsConfig.py @@ -127,6 +127,8 @@ def getG4TransportTool(name='ISFG4TransportTool', **kwargs): else: kwargs.setdefault('UserActionSvc','ISFUserActionSvc') kwargs.setdefault('UserActionSvcV2', '') + if hasattr(simFlags, 'RecordFlux') and simFlags.RecordFlux.statusOn: + kwargs.setdefault('RecordFlux',simFlags.RecordFlux()) # Multi-threading settinggs from AthenaCommon.ConcurrencyFlags import jobproperties as concurrencyProps if concurrencyProps.ConcurrencyFlags.NumThreads() > 0: @@ -134,8 +136,6 @@ def getG4TransportTool(name='ISFG4TransportTool', **kwargs): else: is_hive = False kwargs.setdefault('MultiThreading', is_hive) - # Set commands for the G4AtlasAlg - kwargs.setdefault("G4Commands", simFlags.G4Commands.get_Value()) from ISF_Geant4Tools.ISF_Geant4ToolsConf import iGeant4__G4TransportTool return iGeant4__G4TransportTool(name, **kwargs) ### Specialized Versions diff --git a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/G4AtlasRunManager.cxx b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/G4AtlasRunManager.cxx index 98ad23bec797866f76ee57d525bf087cd420eb6f..83c60aceeb12980c8aaa533ae2047225b120e060 100644 --- a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/G4AtlasRunManager.cxx +++ b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/G4AtlasRunManager.cxx @@ -134,6 +134,7 @@ void iGeant4::G4AtlasRunManager::InitializeGeometry() void iGeant4::G4AtlasRunManager::EndEvent() { ATH_MSG_DEBUG( "G4AtlasRunManager::EndEvent" ); + // ZLM Note 1.12.2016: This function is not called } //________________________________________________________________________ @@ -277,6 +278,22 @@ bool iGeant4::G4AtlasRunManager::ProcessEvent(G4Event* event) return true; } + if (m_recordFlux){ + G4ScoringManager* ScM = G4ScoringManager::GetScoringManagerIfExist(); + if(ScM){ + G4int nPar = ScM->GetNumberOfMesh(); + G4HCofThisEvent* HCE = currentEvent->GetHCofThisEvent(); + if(HCE && nPar>0){; + G4int nColl = HCE->GetCapacity(); + for(G4int i=0;i<nColl;i++) + { + G4VHitsCollection* HC = HCE->GetHC(i); + if(HC) ScM->Accumulate(HC); + } + } + } + } + // stateManager->SetNewState(G4State_GeomClosed); StackPreviousEvent(currentEvent); bool abort=currentEvent->IsAborted(); @@ -289,6 +306,15 @@ bool iGeant4::G4AtlasRunManager::ProcessEvent(G4Event* event) //________________________________________________________________________ void iGeant4::G4AtlasRunManager::RunTermination() { + if (m_recordFlux){ + G4UImanager *ui=G4UImanager::GetUIpointer(); + ui->ApplyCommand("/score/dumpQuantityToFile cylMesh_1 eDep edep.txt"); + ui->ApplyCommand("/score/dumpQuantityToFile cylMesh_1 CF_neutron neutron.txt"); + ui->ApplyCommand("/score/dumpQuantityToFile cylMesh_1 CF_HEneutron HEneutron.txt"); + ui->ApplyCommand("/score/dumpQuantityToFile cylMesh_1 CF_photon photon.txt"); + ui->ApplyCommand("/score/dumpQuantityToFile cylMesh_1 dose dose.txt"); + } + // std::cout<<" this is G4AtlasRunManager::RunTermination() "<<std::endl; #if G4VERSION_NUMBER < 1010 for (size_t itr=0;itr<previousEvents->size();itr++) { delete (*previousEvents)[itr]; } diff --git a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/Geant4TruthIncident.cxx b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/Geant4TruthIncident.cxx index e9423a38b2276b385b4ca6b3b9313c1da4969fa3..df3f46eaf7895bb36e5609ea115d8c9e00c882b0 100644 --- a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/Geant4TruthIncident.cxx +++ b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/Geant4TruthIncident.cxx @@ -17,7 +17,6 @@ #include "MCTruth/TrackBarcodeInfo.h" #include "MCTruth/TrackHelper.h" #include "MCTruth/TrackInformation.h" -#include "MCTruth/PrimaryParticleInformation.h" #include "SimHelpers/SecondaryTracksHelper.h" // Units @@ -41,6 +40,9 @@ #include "G4EventManager.hh" #include "G4Event.hh" +// ISF includes +#include "ISF_Event/ISFParticle.h" + /* Comments: what about parent particle surviving (e.g. bremstrahlung) @@ -67,6 +69,7 @@ iGeant4::Geant4TruthIncident::Geant4TruthIncident( const G4Step *step, + const ISF::ISFParticle& baseISP, AtlasDetDescr::AtlasRegion geoID, int numChildren, SecondaryTracksHelper &sHelper, @@ -75,6 +78,7 @@ iGeant4::Geant4TruthIncident::Geant4TruthIncident( const G4Step *step, m_positionSet(false), m_position(), m_step(step), + m_baseISP(baseISP), m_sHelper( sHelper), m_eventInfo(eventInfo), m_childrenPrepared(false), @@ -138,6 +142,11 @@ HepMC::GenParticle* iGeant4::Geant4TruthIncident::parentParticle() const { return hepParticle; } +int iGeant4::Geant4TruthIncident::parentBCID() const { + return m_baseISP.getBCID(); +} + + bool iGeant4::Geant4TruthIncident::parentSurvivesIncident() const { const G4Track *track = m_step->GetTrack(); @@ -162,10 +171,12 @@ HepMC::GenParticle* iGeant4::Geant4TruthIncident::parentParticleAfterIncident(Ba if ( !m_parentParticleAfterIncident ) { // create new HepMC particle, using momentum and energy // from G4DynamicParticle (which should be equivalent to postStep) - m_parentParticleAfterIncident = convert(track, newBarcode, false); + m_parentParticleAfterIncident = convert(track); m_eventInfo->SetCurrentlyTraced( m_parentParticleAfterIncident ); + m_parentParticleAfterIncident->suggest_barcode( newBarcode ); + // store (new) hepmc particle in track's UserInformation TrackHelper tHelper(track); TrackInformation *tInfo = tHelper.GetTrackInformation(); @@ -259,7 +270,8 @@ HepMC::GenParticle* iGeant4::Geant4TruthIncident::childParticle(unsigned short i // secondary could decay right away and create further particles which pass the // truth strategies. - HepMC::GenParticle* hepParticle = convert( thisChildTrack , newBarcode , true ); + HepMC::GenParticle* hepParticle = convert( thisChildTrack ); + hepParticle->suggest_barcode( newBarcode ); TrackHelper tHelper(thisChildTrack); TrackInformation *trackInfo = tHelper.GetTrackInformation(); @@ -290,7 +302,7 @@ bool iGeant4::Geant4TruthIncident::particleAlive(const G4Track *track) const { } -HepMC::GenParticle* iGeant4::Geant4TruthIncident::convert(const G4Track *track, const int barcode, const bool secondary) const { +HepMC::GenParticle* iGeant4::Geant4TruthIncident::convert(const G4Track *track) const { const G4ThreeVector & mom = track->GetMomentum(); const double energy = track->GetTotalEnergy(); @@ -300,21 +312,6 @@ HepMC::GenParticle* iGeant4::Geant4TruthIncident::convert(const G4Track *track, int status = 1; // stable particle not decayed by EventGenerator HepMC::GenParticle* newParticle = new HepMC::GenParticle(fourMomentum, pdgCode, status); - // This should be a *secondary* track. If it has a primary, it was a decay and - // we are running with quasi-stable particle simulation. Note that if the primary - // track is passed in as a secondary that survived the interaction, then this was - // *not* a decay and we should not treat it in this way - if (secondary && - track->GetDynamicParticle() && - track->GetDynamicParticle()->GetPrimaryParticle() && - track->GetDynamicParticle()->GetPrimaryParticle()->GetUserInformation()){ - // Then the new particle should use the same barcode as the old one!! - PrimaryParticleInformation* ppi = dynamic_cast<PrimaryParticleInformation*>( track->GetDynamicParticle()->GetPrimaryParticle()->GetUserInformation() ); - newParticle->suggest_barcode( ppi->GetParticleBarcode() ); - } else { - newParticle->suggest_barcode( barcode ); - } - return newParticle; } diff --git a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/Geant4TruthIncident.h b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/Geant4TruthIncident.h index 9379e9931de674a05e373db841046f486dd027dc..a32aaab9a9dd644e5c95c8a522506c98f146b9fd 100644 --- a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/Geant4TruthIncident.h +++ b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/Geant4TruthIncident.h @@ -21,13 +21,19 @@ // HepMC includes #include "HepMC/SimpleVector.h" + +// forward declarations class G4Step; class G4Track; class EventInformation; -namespace iGeant4 { +namespace ISF { + class ISFParticle; +} +namespace iGeant4 { + /** @class Geant4TruthIncident ISF_Geant4 specific implementation of the ISF::ITruthIncident @@ -43,6 +49,7 @@ namespace iGeant4 { class Geant4TruthIncident : public ISF::ITruthIncident { public: Geant4TruthIncident( const G4Step*, + const ISF::ISFParticle& baseISP, AtlasDetDescr::AtlasRegion geoID, int numChildren, SecondaryTracksHelper& sHelper, @@ -67,6 +74,8 @@ namespace iGeant4 { int parentPdgCode() const override final; /** Return the barcode of the parent particle */ Barcode::ParticleBarcode parentBarcode() const override final; + /** Return the bunch-crossing identifier of the parent particle */ + int parentBCID() const override final; /** Return a boolean whether or not the parent particle survives the incident */ bool parentSurvivesIncident() const override final; /** Return the parent particle after the TruthIncident vertex (and give @@ -103,11 +112,12 @@ namespace iGeant4 { /** check if the given G4Track represents a particle that is alive in ISF or ISF-G4 */ inline bool particleAlive(const G4Track *track) const; - HepMC::GenParticle* convert(const G4Track *particle, const int barcode, const bool secondary) const; //*AS* might be put static + HepMC::GenParticle* convert(const G4Track *particle) const; //*AS* might be put static mutable bool m_positionSet; mutable HepMC::FourVector m_position; const G4Step* m_step; + const ISF::ISFParticle& m_baseISP; SecondaryTracksHelper& m_sHelper; EventInformation* m_eventInfo; diff --git a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/ISFG4Helpers.cxx b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/ISFG4Helpers.cxx index 23dc8941205f09244daff616dd4ef08a11d005ed..94ab5875d476acb817ffd6d9812b3e1c01646bd9 100644 --- a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/ISFG4Helpers.cxx +++ b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/ISFG4Helpers.cxx @@ -44,18 +44,6 @@ ISF::ISFParticle* iGeant4::ISFG4Helpers::convertG4TrackToISFParticle(const G4Track& aTrack, const ISF::ISFParticle& parent, ISF::TruthBinding* truth) -{ - const ISF::DetRegionSvcIDPair regionSimSvcPair( parent.nextGeoID(), parent.nextSimID() ); - return ISFG4Helpers::convertG4TrackToISFParticle( aTrack, - regionSimSvcPair, - truth ); -} - -/** convert the given G4Track into an ISFParticle */ -ISF::ISFParticle* -iGeant4::ISFG4Helpers::convertG4TrackToISFParticle(const G4Track& aTrack, - const ISF::DetRegionSvcIDPair& regionSimSvcPair, - ISF::TruthBinding* truth) { const G4ThreeVector& g4pos = aTrack.GetPosition(); const double gTime = aTrack.GetGlobalTime(); @@ -78,7 +66,7 @@ iGeant4::ISFG4Helpers::convertG4TrackToISFParticle(const G4Track& aTrack, charge, pdgID, gTime, - regionSimSvcPair, + parent, barcode, truth ); diff --git a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/ISFG4Helpers.h b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/ISFG4Helpers.h index ace5404e032f585488fb8a3a5d3cf66110815ede..14c4add800967c278983c79a00616b564788c1e4 100644 --- a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/ISFG4Helpers.h +++ b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/ISFG4Helpers.h @@ -6,7 +6,7 @@ #define ISF_GEANT4TOOLS_ISFG4HELPERS_H // Barcode includes -#include "BarcodeInterfaces/Barcode.h" +#include "BarcodeEvent/Barcode.h" // ISF Includes #include "ISF_Event/ISFParticle.h" @@ -41,11 +41,6 @@ namespace iGeant4 { const ISF::ISFParticle& parent, ISF::TruthBinding* truth = nullptr); - /** convert the given G4Track into an ISFParticle */ - static ISF::ISFParticle* convertG4TrackToISFParticle(const G4Track& aTrack, - const ISF::DetRegionSvcIDPair& regionSimSvcPair, - ISF::TruthBinding* truth = nullptr); - /** return a valid UserInformation object of the G4Track for use within the ISF */ static VTrackInformation* getISFTrackInfo(const G4Track& aTrack); diff --git a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/ISFTrajectory.cxx b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/ISFTrajectory.cxx index 511ce7d3f36709af524f93c0cff629b2233c926e..3e64d72e4ef2f1f5d0b582387cb782da4c93a436 100755 --- a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/ISFTrajectory.cxx +++ b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/ISFTrajectory.cxx @@ -102,7 +102,7 @@ void iGeant4::ISFTrajectory::AppendStep(const G4Step* aStep) AtlasDetDescr::AtlasRegion geoID = baseIsp->nextGeoID(); auto* eventInfo = ISFG4Helpers::getEventInformation(); - iGeant4::Geant4TruthIncident truth(aStep, geoID, numSecondaries, m_sHelper, eventInfo); + iGeant4::Geant4TruthIncident truth(aStep, *baseIsp, geoID, numSecondaries, m_sHelper, eventInfo); if (m_truthRecordSvcQuick) { m_truthRecordSvcQuick->registerTruthIncident(truth); diff --git a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/PhysicsValidationUserAction.cxx b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/PhysicsValidationUserAction.cxx index e7608fa721fbcf666784bb1b67418dae6e439b31..8eacfbe62ae5c0b2afbe155bebdcde7bbbaaba51 100644 --- a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/PhysicsValidationUserAction.cxx +++ b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/PhysicsValidationUserAction.cxx @@ -365,7 +365,9 @@ void iGeant4::PhysicsValidationUserAction::Step(const G4Step* aStep) if (process->GetProcessSubType()==3 ) m_radloss+=eloss; EventInformation* eventInfo = static_cast<EventInformation*> (G4EventManager::GetEventManager()->GetConstCurrentEvent()->GetUserInformation()); - iGeant4::Geant4TruthIncident truth( aStep, geoID, m_sHelper.NrOfNewSecondaries(), m_sHelper, eventInfo); + VTrackInformation * trackInfo = static_cast<VTrackInformation*>(track->GetUserInformation()); + const auto baseISP = const_cast<ISF::ISFParticle*>( trackInfo->GetBaseISFParticle() ); + iGeant4::Geant4TruthIncident truth( aStep, *baseISP, geoID, m_sHelper.NrOfNewSecondaries(), m_sHelper, eventInfo); unsigned int nSec = truth.numberOfChildren(); if (nSec>0 || track->GetTrackStatus()!=fAlive ) { // save interaction info //std::cout <<"interaction:"<< process->GetProcessSubType() <<":"<<nSec<< std::endl; diff --git a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/TrackProcessorUserActionFullG4.cxx b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/TrackProcessorUserActionFullG4.cxx index d38fb36a681f8c1136a832a13343fb07e4d81ca1..a18f6f7a91e32d8fd2de2cd398888dd05e55f9f7 100644 --- a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/TrackProcessorUserActionFullG4.cxx +++ b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/TrackProcessorUserActionFullG4.cxx @@ -144,12 +144,13 @@ void iGeant4::TrackProcessorUserActionFullG4::ISFSteppingAction(const G4Step* aS AtlasDetDescr::AtlasRegion nextGeoID = nextGeoId(aStep); - const ISF::DetRegionSvcIDPair detRegionSimSvcPair(nextGeoID, ISF::fUndefinedSimID ); - ISF::ISFParticle *tmpISP = ::iGeant4::ISFG4Helpers::convertG4TrackToISFParticle( *aTrack, - detRegionSimSvcPair, + *curISP, nullptr // truthBinding ); + tmpISP->setNextGeoID(nextGeoID); + tmpISP->setNextSimID(ISF::fUndefinedSimID); + auto generationZeroBarcode = tHelp.GetBarcode(); tmpISP->setBarcode(generationZeroBarcode); @@ -456,12 +457,13 @@ namespace G4UA{ AtlasDetDescr::AtlasRegion nextGeoID = nextGeoId(aStep); - const ISF::DetRegionSvcIDPair detRegionSimSvcPair(nextGeoID, ISF::fUndefinedSimID ); - ISF::ISFParticle *tmpISP = ::iGeant4::ISFG4Helpers::convertG4TrackToISFParticle( *aTrack, - detRegionSimSvcPair, + *curISP, nullptr // truthBinding ); + tmpISP->setNextGeoID(nextGeoID); + tmpISP->setNextSimID(ISF::fUndefinedSimID); + auto generationZeroBarcode = tHelp.GetBarcode(); tmpISP->setBarcode(generationZeroBarcode); diff --git a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/TransportTool.cxx b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/TransportTool.cxx index 61b643a5752fb7d438afd076d8bf3256217d25ab..b057bb45447766f4fd19ee1e40d0b174dbb5f4cd 100644 --- a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/TransportTool.cxx +++ b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/TransportTool.cxx @@ -436,10 +436,6 @@ G4PrimaryParticle* iGeant4::G4TransportTool::getPrimaryParticle(const HepMC::Gen particle->SetProperTime( (lv1-lv0).mag()/CLHEP::c_light ); } - // Set the user information for this primary to point to the HepMcParticleLink... - PrimaryParticleInformation* ppi = new PrimaryParticleInformation(&gp); - particle->SetUserInformation(ppi); - return particle; } diff --git a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/TransportTool.h b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/TransportTool.h index 3ed8f6a42ede8997fb8b06cae2b96266207519d4..6f46f5377c72c61299f78adf4218d5597d4b2bd0 100644 --- a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/TransportTool.h +++ b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/TransportTool.h @@ -15,7 +15,7 @@ #include "GaudiKernel/ServiceHandle.h" #include "AthenaKernel/IAtRndmGenSvc.h" -#include "BarcodeInterfaces/Barcode.h" +#include "BarcodeEvent/Barcode.h" #include "ISF_Geant4Interfaces/ITransportTool.h" #include "ISF_Geant4Tools/IG4RunManagerHelper.h"