45 #ifdef CEXMC_USE_PERSISTENCY
46 #include <boost/archive/binary_oarchive.hpp>
81 G4double CexmcSmallCircleScreenSize( 5.0 );
82 G4double CexmcBigCircleScreenSize( 10.0 );
83 G4Colour CexmcTrackPointsMarkerColour( 0.0, 1.0, 0.4 );
84 G4Colour CexmcRecTrackPointsMarkerColour( 1.0, 0.4, 0.0 );
89 return std::sqrt( momentumAmp * momentumAmp + mass * mass ) - mass;
96 physicsManager( physicsManager ), reconstructor( NULL ), opKinEnergy( 0. ),
97 verbose( verbose ), verboseDraw( 4 ), messenger( NULL )
112 delete reconstructor;
127 ( static_cast< CexmcTrackingAction * >(
128 const_cast< G4UserTrackingAction * >(
150 calorimeterEDLeftCollection(
153 calorimeterEDRightCollection(
158 vetoCounterEDRight, calorimeterEDLeft, calorimeterEDRight,
159 calorimeterEDLeftMaxX, calorimeterEDLeftMaxY,
160 calorimeterEDRightMaxX, calorimeterEDRightMaxY,
161 calorimeterEDLeftCollection, calorimeterEDRightCollection );
171 targetTPBeamParticle(
174 targetTPOutputParticle(
177 targetTPNucleusParticle(
180 targetTPOutputParticleDecayProductParticle1(
182 GetTargetTPOutputParticleDecayProductParticle( 0 ) );
184 targetTPOutputParticleDecayProductParticle2(
186 GetTargetTPOutputParticleDecayProductParticle( 1 ) );
202 targetTPOutputParticle, targetTPNucleusParticle,
203 targetTPOutputParticleDecayProductParticle1,
204 targetTPOutputParticleDecayProductParticle2,
205 vetoCounterTPLeft, vetoCounterTPRight,
206 calorimeterTPLeft, calorimeterTPRight );
214 G4cout <<
" monitor : " <<
220 G4cout <<
" cal (l) : " <<
223 G4cout <<
" cal (r) : " <<
249 G4cout <<
" angle between the " <<
251 " decay products : " <<
263 G4cout <<
" --- Triggered angular ranges: " << angularRanges;
264 G4cout <<
" --- Production model data: " << pmData;
268 void CexmcEventAction::PrintReconstructedData(
289 G4cout <<
" < mass cut passed >" << G4endl;
296 G4cout <<
" < absorbed energy cut passed >" << G4endl;
302 G4cout <<
" -- production model data: " << pmData;
303 G4cout <<
" -- triggered angular ranges: ";
304 if ( triggeredRecAngularRanges.empty() )
305 G4cout <<
"< orphan detected, gap " << angularGap <<
" >" << G4endl;
307 G4cout << triggeredRecAngularRanges;
311 #ifdef CEXMC_USE_ROOT
316 CexmcHistoManager * histoManager( CexmcHistoManager::Instance() );
318 histoManager->Add( CexmcAbsorbedEnergy_EDT_Histo, 0,
322 for ( CexmcAngularRangeList::const_iterator
323 k( triggeredAngularRanges.begin() );
324 k != triggeredAngularRanges.end(); ++k )
326 histoManager->Add( CexmcAbsEnInLeftCalorimeter_ARReal_EDT_Histo,
328 histoManager->Add( CexmcAbsEnInRightCalorimeter_ARReal_EDT_Histo,
338 CexmcHistoManager * histoManager( CexmcHistoManager::Instance() );
342 histoManager->Add( CexmcMomentumBP_TPT_Histo, 0,
344 histoManager->Add( CexmcTPInMonitor_TPT_Histo, 0,
351 histoManager->Add( CexmcTPInTarget_TPT_Histo, 0,
355 if ( histoManager->GetVerboseLevel() > 0 )
357 histoManager->Add( CexmcMomentumIP_TPT_Histo, 0,
362 for ( CexmcAngularRangeList::const_iterator
363 k( triggeredAngularRanges.begin() );
364 k != triggeredAngularRanges.end(); ++k )
370 histoManager->Add( CexmcKinEnAtLeftCalorimeter_ARReal_TPT_Histo,
371 k->index, kinEnergy );
376 histoManager->Add( CexmcKinEnAtRightCalorimeter_ARReal_TPT_Histo,
377 k->index, kinEnergy );
381 histoManager->Add( CexmcTPInTarget_ARReal_TPT_Histo, k->index,
385 histoManager->Add( CexmcKinEnOP_LAB_ARReal_TPT_Histo, k->index,
387 histoManager->Add( CexmcAngleOP_SCM_ARReal_TPT_Histo, k->index,
395 directionWorld.angle( tpStore->
396 targetTPOutputParticleDecayProductParticle2.
397 directionWorld ) /
deg );
398 histoManager->Add( CexmcOpenAngle_ARReal_TPT_Histo, k->index,
405 void CexmcEventAction::FillRTHistos(
G4bool reconstructorHasFullTrigger,
411 CexmcHistoManager * histoManager( CexmcHistoManager::Instance() );
416 histoManager->Add( CexmcRecMasses_EDT_Histo, 0, opMass, nopMass );
418 for ( CexmcAngularRangeList::const_iterator
419 k( triggeredAngularRanges.begin() );
420 k != triggeredAngularRanges.end(); ++k )
424 histoManager->Add( CexmcOPDPAtLeftCalorimeter_ARReal_EDT_Histo,
431 histoManager->Add( CexmcOPDPAtRightCalorimeter_ARReal_EDT_Histo,
436 histoManager->Add( CexmcRecOPDPAtLeftCalorimeter_ARReal_EDT_Histo,
440 histoManager->Add( CexmcRecOPDPAtRightCalorimeter_ARReal_EDT_Histo,
446 if ( ! reconstructorHasFullTrigger )
451 histoManager->Add( CexmcMomentumBP_RT_Histo, 0,
457 histoManager->Add( CexmcTPInTarget_RT_Histo, 0,
463 histoManager->Add( CexmcRecMasses_RT_Histo, 0,
467 histoManager->Add( CexmcAbsorbedEnergy_RT_Histo, 0,
472 outputParticleSCM.cosTheta());
474 for ( CexmcAngularRangeList::const_iterator
475 k( triggeredAngularRanges.begin() );
476 k != triggeredAngularRanges.end(); ++k )
478 histoManager->Add( CexmcRecMassOP_ARReal_RT_Histo, k->index, opMass );
479 histoManager->Add( CexmcRecMassNOP_ARReal_RT_Histo, k->index, nopMass );
483 histoManager->Add( CexmcKinEnAtLeftCalorimeter_ARReal_RT_Histo,
484 k->index, kinEnergy );
485 histoManager->Add( CexmcMissEnFromLeftCalorimeter_ARReal_RT_Histo,
492 histoManager->Add( CexmcKinEnAtRightCalorimeter_ARReal_RT_Histo,
493 k->index, kinEnergy );
494 histoManager->Add( CexmcMissEnFromRightCalorimeter_ARReal_RT_Histo,
500 histoManager->Add( CexmcTPInTarget_ARReal_RT_Histo, k->index,
504 histoManager->Add( CexmcKinEnOP_LAB_ARReal_RT_Histo, k->index,
506 histoManager->Add( CexmcAngleOP_SCM_ARReal_RT_Histo, k->index,
510 histoManager->Add( CexmcDiffAngleOP_SCM_ARReal_RT_Histo, k->index,
518 directionWorld.angle( tpStore->
519 targetTPOutputParticleDecayProductParticle2.
520 directionWorld ) /
deg );
521 histoManager->Add( CexmcOpenAngle_ARReal_RT_Histo, k->index,
525 histoManager->Add( CexmcDiffOpenAngle_ARReal_RT_Histo, k->index,
530 histoManager->Add( CexmcOPDPAtLeftCalorimeter_ARReal_RT_Histo,
537 histoManager->Add( CexmcOPDPAtRightCalorimeter_ARReal_RT_Histo,
542 histoManager->Add( CexmcAbsEnInLeftCalorimeter_ARReal_RT_Histo,
544 histoManager->Add( CexmcAbsEnInRightCalorimeter_ARReal_RT_Histo,
546 histoManager->Add( CexmcRecAngleOP_SCM_ARReal_RT_Histo,
547 k->index, recCosTheta );
548 histoManager->Add( CexmcRecOpenAngle_ARReal_RT_Histo,
550 histoManager->Add( CexmcRecOPDPAtLeftCalorimeter_ARReal_RT_Histo,
554 histoManager->Add( CexmcRecOPDPAtRightCalorimeter_ARReal_RT_Histo,
564 void CexmcEventAction::DrawTrajectories(
const G4Event * event )
566 G4VisManager * visManager( static_cast< G4VisManager * >(
568 if ( ! visManager || ! visManager->GetCurrentGraphicsSystem() )
574 if ( ! trajContainer )
577 nTraj = trajContainer->
entries();
579 for (
int i( 0 ); i < nTraj; ++i )
582 traj->DrawTrajectory();
587 void CexmcEventAction::DrawTrackPoints(
590 G4VisManager * visManager( static_cast< G4VisManager * >(
592 if ( ! visManager || ! visManager->GetCurrentGraphicsSystem() )
604 visManager->Draw( circle );
610 visManager->Draw( circle );
616 visManager->Draw( circle );
622 visManager->Draw( circle );
628 visManager->Draw( circle );
634 visManager->Draw( circle );
640 visManager->Draw( circle );
645 void CexmcEventAction::DrawReconstructionData(
void )
647 G4VisManager * visManager( static_cast< G4VisManager * >(
649 if ( ! visManager || ! visManager->GetCurrentGraphicsSystem() )
657 visManager->Draw( circle );
661 visManager->Draw( circle );
664 visManager->Draw( circle );
668 void CexmcEventAction::UpdateRunHits(
671 G4bool tpDigitizerHasTriggered,
672 G4bool edDigitizerHasTriggered,
673 G4bool edDigitizerMonitorHasTriggered,
674 G4bool reconstructorHasFullTrigger,
678 const CexmcRun * run( static_cast< const CexmcRun * >(
679 runManager->GetCurrentRun() ) );
680 CexmcRun * theRun( const_cast< CexmcRun * >( run ) );
682 if ( tpDigitizerHasTriggered )
684 for ( CexmcAngularRangeList::const_iterator k( aRangesReal.begin() );
685 k != aRangesReal.end(); ++k )
687 theRun->IncrementNmbOfHitsSampledFull( k->index );
688 if ( edDigitizerMonitorHasTriggered )
689 theRun->IncrementNmbOfHitsSampled( k->index );
690 if ( reconstructorHasFullTrigger )
691 theRun->IncrementNmbOfHitsTriggeredRealRange( k->index );
693 if ( reconstructorHasFullTrigger )
695 if ( aRangesRec.empty() )
697 theRun->IncrementNmbOfOrphanHits( aGap.
index );
701 for ( CexmcAngularRangeList::const_iterator
702 k( aRangesRec.begin() ); k != aRangesRec.end(); ++k )
704 theRun->IncrementNmbOfHitsTriggeredRecRange( k->index );
711 if ( edDigitizerHasTriggered )
712 theRun->IncrementNmbOfFalseHitsTriggeredEDT();
713 if ( reconstructorHasFullTrigger )
714 theRun->IncrementNmbOfFalseHitsTriggeredRec();
719 #ifdef CEXMC_USE_PERSISTENCY
721 void CexmcEventAction::SaveEvent(
const G4Event * event,
722 G4bool edDigitizerHasTriggered,
729 if ( ! runManager->ProjectIsSaved() )
735 if ( ! edDigitizerHasTriggered && runManager->GetEventDataVerboseLevel() !=
739 boost::archive::binary_oarchive * archive(
740 runManager->GetEventsArchive() );
743 CexmcEventSObject sObject = {
event->GetEventID(),
744 edDigitizerHasTriggered, edStore->
monitorED,
755 archive->operator<<( sObject );
756 const CexmcRun * run( static_cast< const CexmcRun * >(
757 runManager->GetCurrentRun() ) );
758 CexmcRun * theRun( const_cast< CexmcRun * >( run ) );
759 theRun->IncrementNmbOfSavedEvents();
764 void CexmcEventAction::SaveEventFast(
const G4Event * event,
765 G4bool tpDigitizerHasTriggered,
766 G4bool edDigitizerHasTriggered,
767 G4bool edDigitizerMonitorHasTriggered,
772 if ( ! runManager->ProjectIsSaved() )
778 boost::archive::binary_oarchive * archive(
779 runManager->GetFastEventsArchive() );
782 if ( ! tpDigitizerHasTriggered )
785 CexmcEventFastSObject sObject = {
event->GetEventID(), opCosThetaSCM,
786 edDigitizerHasTriggered,
787 edDigitizerMonitorHasTriggered };
788 archive->operator<<( sObject );
789 const CexmcRun * run( static_cast< const CexmcRun * >(
790 runManager->GetCurrentRun() ) );
791 CexmcRun * theRun( const_cast< CexmcRun * >( run ) );
792 theRun->IncrementNmbOfSavedFastEvents();
803 static_cast< CexmcEnergyDepositDigitizer * >( digiManager->
806 static_cast< CexmcTrackPointsDigitizer * >( digiManager->
812 G4bool edDigitizerMonitorHasTriggered(
814 G4bool edDigitizerHasTriggered(
false );
819 edDigitizerHasTriggered = energyDepositDigitizer->
HasTriggered();
822 G4bool reconstructorHasBasicTrigger(
false );
823 G4bool reconstructorHasFullTrigger(
false );
826 energyDepositDigitizer ) );
828 trackPointsDigitizer ) );
835 if ( ! productionModel )
839 productionModel->GetAngularRanges() );
841 productionModel->GetTriggeredAngularRanges() );
843 productionModel->GetProductionModelData() );
845 if ( edDigitizerHasTriggered )
854 if ( reconstructorHasBasicTrigger )
856 for ( CexmcAngularRangeList::const_iterator
857 k( angularRanges.begin() ); k != angularRanges.end(); ++k )
860 outputParticleSCM.cosTheta() );
861 if ( cosTheta <= k->top && cosTheta > k->bottom )
863 k->top, k->bottom, k->index ) );
868 if ( triggeredRecAngularRanges.empty() )
872 for ( CexmcAngularRangeList::const_iterator
873 k( angularGaps.begin() ); k != angularGaps.end(); ++k )
876 outputParticleSCM.cosTheta() );
877 if ( cosTheta <= k->top && cosTheta > k->bottom )
885 UpdateRunHits( triggeredAngularRanges, triggeredRecAngularRanges,
886 tpDigitizerHasTriggered, edDigitizerHasTriggered,
887 edDigitizerMonitorHasTriggered,
888 reconstructorHasFullTrigger, angularGap );
892 G4bool printMessages( verbose > 3 ||
893 ( ( verbose == 1 ) && tpDigitizerHasTriggered ) ||
894 ( ( verbose == 2 ) && edDigitizerHasTriggered ) ||
895 ( ( verbose == 3 ) && ( tpDigitizerHasTriggered ||
896 edDigitizerHasTriggered ) ) );
900 if ( tpDigitizerHasTriggered )
905 if ( reconstructorHasBasicTrigger )
906 PrintReconstructedData( triggeredRecAngularRanges,
908 if ( edDigitizerHasTriggered )
913 if ( verboseDraw > 0 )
915 G4bool drawTrajectories( verboseDraw > 3 ||
916 ( ( verboseDraw == 1 ) && tpDigitizerHasTriggered ) ||
917 ( ( verboseDraw == 2 ) && edDigitizerHasTriggered ) ||
918 ( ( verboseDraw == 3 ) && ( tpDigitizerHasTriggered ||
919 edDigitizerHasTriggered ) ) );
920 if ( drawTrajectories )
922 DrawTrajectories( event );
923 if ( tpDigitizerHasTriggered )
924 DrawTrackPoints( tpStore );
925 if ( reconstructorHasBasicTrigger )
926 DrawReconstructionData();
930 #ifdef CEXMC_USE_PERSISTENCY
931 if ( edDigitizerHasTriggered || tpDigitizerHasTriggered )
933 SaveEventFast( event, tpDigitizerHasTriggered,
934 edDigitizerHasTriggered,
935 edDigitizerMonitorHasTriggered,
937 SaveEvent( event, edDigitizerHasTriggered, edStore, tpStore,
942 #ifdef CEXMC_USE_ROOT
946 opKinEnergy = CexmcGetKinEnergy(
951 if ( edDigitizerHasTriggered )
952 FillEDTHistos( edStore, triggeredAngularRanges );
956 if ( tpDigitizerHasTriggered && edDigitizerMonitorHasTriggered )
957 FillTPTHistos( tpStore, pmData, triggeredAngularRanges );
959 if ( reconstructorHasBasicTrigger )
960 FillRTHistos( reconstructorHasFullTrigger, edStore, tpStore,
961 pmData, triggeredAngularRanges );
964 G4Event * theEvent( const_cast< G4Event * >( event ) );
971 edDigitizerHasTriggered,
972 tpDigitizerHasTriggered,
973 reconstructorHasFullTrigger ) );
G4double vetoCounterEDLeft
const G4String CexmcTPDigitizerName("TPDig")
G4double GetTheAngle(void) const
G4bool HasTriggered(void) const
const G4ThreeVector & GetTargetEPPosition(void) const
G4VUserEventInformation * GetUserInformation() const
G4bool IsMassCutUsed(void) const
void EndOfEventAction(const G4Event *event)
const G4ThreeVector & GetCalorimeterEPLeftPosition(void) const
G4double GetOutputParticleMass(void) const
G4double GetVetoCounterEDRight(void) const
static G4VVisManager * GetConcreteInstance()
G4double calorimeterEDLeft
void SetupBeamParticle(void)
const CexmcTrackPointInfo & GetVetoCounterTPRight(void) const
const CexmcEnergyDepositCalorimeterCollection & calorimeterEDLeftCollection
const CexmcTrackPointInfo & GetMonitorTP(void) const
G4ThreeVector positionLocal
G4double calorimeterEDRight
void SetFillStyle(FillStyle)
static G4DigiManager * GetDMpointer()
static G4double angle[DIM]
const CexmcTrackPointInfo & GetTargetTPNucleusParticle(void) const
static void PrintProductionModelData(const CexmcAngularRangeList &angularRanges, const CexmcProductionModelData &pmData)
G4bool IsAbsorbedEnergyCutUsed(void) const
const CexmcTrackPointInfo & GetTargetTPBeamParticle(void) const
#define G4BestUnit(a, b)
#define G4_USE_G4BESTUNIT_FOR_VERBOSE 1
G4LorentzVector incidentParticleLAB
G4double vetoCounterEDRight
virtual ~CexmcEventAction()
CexmcEventAction(CexmcPhysicsManager *physicsManager, G4int verbose=0)
G4TrajectoryContainer * GetTrajectoryContainer() const
const G4String & GetParticleName() const
G4LorentzVector outputParticleSCM
const G4String CexmcEDDigitizerName("EDDig")
G4bool MonitorHasTriggered(void) const
G4int GetCalorimeterEDRightMaxY(void) const
const CexmcTrackPointInfo & targetTPNucleusParticle
std::vector< CexmcEnergyDepositCrystalRowCollection > CexmcEnergyDepositCalorimeterCollection
void SetUserInformation(G4VUserEventInformation *anInfo)
G4GLOB_DLL std::ostream G4cout
const G4double CexmcInvalidCosTheta(2.0)
G4double GetVetoCounterEDLeft(void) const
void Reconstruct(const CexmcEnergyDepositStore *edStore)
G4bool HasBasicTrigger(void) const
static CexmcEnergyDepositStore * MakeEnergyDepositStore(const CexmcEnergyDepositDigitizer *digitizer)
G4double GetMonitorED(void) const
G4ThreeVector positionWorld
static void PrintTrackPoints(const CexmcTrackPointsStore *tpStore)
const CexmcTrackPointInfo & calorimeterTPRight
const CexmcTrackPointInfo & GetCalorimeterTPRight(void) const
const CexmcTrackPointInfo & GetCalorimeterTPLeft(void) const
const G4UserTrackingAction * GetUserTrackingAction() const
static void PrintEnergyDeposit(const CexmcEnergyDepositStore *edStore)
void BeginOfEventAction(const G4Event *event)
void AddNewModule(G4VDigitizerModule *DM)
static CexmcTrackPointsStore * MakeTrackPointsStore(const CexmcTrackPointsDigitizer *digitizer)
G4bool HasFullTrigger(void) const
const CexmcTrackPointInfo & GetTargetTPOutputParticle(void) const
void SetVisAttributes(const G4VisAttributes *)
const char * what(void) const
static G4RunManager * GetRunManager()
const CexmcProductionModelData & GetProductionModelData(void) const
G4int GetCalorimeterEDLeftMaxY(void) const
G4double GetPDGMass() const
void SetPosition(const G4Point3D &)
G4double GetCalorimeterEDRight(void) const
G4bool EdTriggerIsOk(void) const
const CexmcTrackPointInfo & vetoCounterTPRight
const CexmcTrackPointInfo & targetTPOutputParticleDecayProductParticle2
G4int GetCalorimeterEDLeftMaxX(void) const
G4bool HasAbsorbedEnergyCutTriggered(void) const
G4bool IsValid(void) const
std::vector< CexmcAngularRange > CexmcAngularRangeList
const CexmcEnergyDepositCalorimeterCollection & GetCalorimeterEDRightCollection(void) const
const CexmcTrackPointInfo & vetoCounterTPLeft
G4int GetCalorimeterEDRightMaxX(void) const
const G4ThreeVector & GetCalorimeterEPRightWorldPosition(void) const
G4bool HasMassCutTriggered(void) const
const G4ThreeVector & GetCalorimeterEPLeftWorldPosition(void) const
const CexmcEnergyDepositCalorimeterCollection & GetCalorimeterEDLeftCollection(void) const
const CexmcTrackPointInfo & GetVetoCounterTPLeft(void) const
G4double GetNucleusOutputParticleMass(void) const
void ResetNumberOfTriggeredStudiedInteractions(void)
const CexmcEnergyDepositCalorimeterCollection & calorimeterEDRightCollection
G4bool HasTriggered(void) const
const CexmcTrackPointInfo & targetTPOutputParticle
const CexmcTrackPointInfo & calorimeterTPLeft
static constexpr double deg
virtual CexmcProductionModel * GetProductionModel(void)=0
const G4ThreeVector & GetCalorimeterEPRightPosition(void) const
const G4ThreeVector & GetTargetEPWorldPosition(void) const
const CexmcTrackPointInfo & targetTPBeamParticle
void BeginOfEventAction(void)
G4double GetCalorimeterEDLeft(void) const
void GetAngularGaps(const CexmcAngularRangeList &src, CexmcAngularRangeList &dst)
const CexmcTrackPointInfo & monitorTP
void BeamParticleChangeHook(void)
void SetScreenSize(G4double)
G4ThreeVector directionWorld
const CexmcTrackPointInfo & targetTPOutputParticleDecayProductParticle1
const G4ParticleDefinition * particle