48 #ifdef CEXMC_USE_PERSISTENCY
49 #include <boost/archive/binary_iarchive.hpp>
50 #include <boost/archive/binary_oarchive.hpp>
100 G4String gdmlFileExtension(
".gdml" );
101 G4String gdmlbz2FileExtension(
".gdml.bz2" );
107 G4bool overrideExistingProject ) :
110 gdmlFileName(
"default.gdml" ), shouldGdmlFileBeValidated( true ),
111 zipGdmlFile( false ), projectsDir(
"." ), projectId( projectId ),
112 rProject( rProject ), guiMacroName(
"" ), cfFileName(
"" ),
114 skipInteractionsWithoutEDTonWrite( true ),
117 numberOfEventsProcessedEffective( 0 ), curEventRead( 0 ),
118 #ifdef CEXMC_USE_PERSISTENCY
119 eventsArchive( NULL ), fastEventsArchive( NULL ),
120 #ifdef CEXMC_USE_CUSTOM_FILTER
121 customFilter( NULL ),
124 physicsManager( NULL ), messenger( NULL )
127 if ( rProject !=
"" && rProject == projectId )
130 const char * projectsDirEnv( getenv(
"CEXMC_PROJECTS_DIR" ) );
132 if ( projectsDirEnv )
133 projectsDir = projectsDirEnv;
137 stat( ( projectsDir +
"/" + projectId +
".rdb" ).c_str(), &tmp ) == 0
138 && ! overrideExistingProject )
143 #ifdef CEXMC_USE_PERSISTENCY
145 ReadPreinitProjectData();
152 #ifdef CEXMC_USE_CUSTOM_FILTER
159 #ifdef CEXMC_USE_PERSISTENCY
161 void CexmcRunManager::ReadPreinitProjectData(
void )
167 std::ifstream runDataFile( ( projectsDir +
"/" + rProject +
".rdb" ).
173 boost::archive::binary_iarchive archive( runDataFile );
177 basePhysicsUsed = sObject.basePhysicsUsed;
179 productionModelType = sObject.productionModelType;
185 G4String fileExtension( zipGdmlFile ? gdmlbz2FileExtension :
187 cmd =
G4String(
"cp " ) + projectsDir +
"/" + rProject + fileExtension +
188 " " + projectsDir +
"/" + projectId + fileExtension;
189 if ( system( cmd ) != 0 )
195 cmd =
G4String(
"bunzip2 " ) + projectsDir +
"/" + rProject +
196 gdmlbz2FileExtension;
197 if ( system( cmd ) != 0 )
201 gdmlFileName = projectsDir +
"/" + rProject + gdmlFileExtension;
205 void CexmcRunManager::ReadProject(
void )
210 if ( ! physicsManager )
214 sObject.angularRanges );
216 for ( CexmcDecayBranchesStore::const_iterator
217 k( sObject.etaDecayTable.GetDecayBranches().begin() );
218 k != sObject.etaDecayTable.GetDecayBranches().end(); ++k )
220 etaDecayTable->GetDecayChannel( k->first )->SetBR( k->second );
224 sObject.fermiMotionIsOn,
false );
225 eventCountPolicy = sObject.eventCountPolicy;
232 region->GetProductionCuts()->SetProductionCuts(
233 sObject.calorimeterRegCuts );
236 static_cast< const CexmcPrimaryGeneratorAction * >(
239 const_cast< CexmcPrimaryGeneratorAction * >(
240 primaryGeneratorAction ) );
242 thePrimaryGeneratorAction->GetParticleGun() );
245 sObject.beamParticle ) );
246 if ( ! particleDefinition )
249 particleGun->SetParticleDefinition( particleDefinition );
250 particleGun->SetOrigPosition( sObject.beamPos,
false );
251 particleGun->SetOrigDirection( sObject.beamDir,
false );
252 particleGun->SetOrigMomentumAmp( sObject.beamMomentumAmp,
false );
254 thePrimaryGeneratorAction->SetFwhmPosX( sObject.beamFwhmPosX,
false );
255 thePrimaryGeneratorAction->SetFwhmPosY( sObject.beamFwhmPosY,
false );
256 thePrimaryGeneratorAction->SetFwhmDirX( sObject.beamFwhmDirX,
false );
257 thePrimaryGeneratorAction->SetFwhmDirY( sObject.beamFwhmDirY,
false );
258 thePrimaryGeneratorAction->SetFwhmMomentumAmp(
259 sObject.beamFwhmMomentumAmp,
false );
263 static_cast< CexmcEnergyDepositDigitizer * >(
268 edDigitizer->SetMonitorThreshold( sObject.monitorEDThreshold,
false );
269 edDigitizer->SetVetoCounterLeftThreshold(
270 sObject.vetoCounterEDLeftThreshold,
false );
271 edDigitizer->SetVetoCounterRightThreshold(
272 sObject.vetoCounterEDRightThreshold,
false );
273 edDigitizer->SetCalorimeterLeftThreshold(
274 sObject.calorimeterEDLeftThreshold,
false );
275 edDigitizer->SetCalorimeterRightThreshold(
276 sObject.calorimeterEDRightThreshold,
false );
277 edDigitizer->SetCalorimeterTriggerAlgorithm(
278 sObject.calorimeterTriggerAlgorithm,
false );
279 edDigitizer->SetOuterCrystalsVetoAlgorithm(
280 sObject.outerCrystalsVetoAlgorithm,
false );
281 edDigitizer->SetOuterCrystalsVetoFraction(
282 sObject.outerCrystalsVetoFraction,
false );
283 edDigitizer->ApplyFiniteCrystalResolution(
284 sObject.applyFiniteCrystalResolution,
false );
285 edDigitizer->SetCrystalResolutionData( sObject.crystalResolutionData );
295 theEventAction->GetReconstructor() );
296 if ( ! reconstructor )
299 reconstructor->SetCalorimeterEntryPointDefinitionAlgorithm(
300 sObject.epDefinitionAlgorithm );
301 reconstructor->SetCalorimeterEntryPointDepthDefinitionAlgorithm(
302 sObject.epDepthDefinitionAlgorithm );
303 reconstructor->SetCrystalSelectionAlgorithm( sObject.csAlgorithm );
304 reconstructor->UseInnerRefCrystal( sObject.useInnerRefCrystal );
305 reconstructor->SetCalorimeterEntryPointDepth( sObject.epDepth );
306 reconstructor->UseTableMass( sObject.useTableMass );
307 reconstructor->UseMassCut( sObject.useMassCut );
308 reconstructor->SetMassCutOPCenter( sObject.mCutOPCenter );
309 reconstructor->SetMassCutNOPCenter( sObject.mCutNOPCenter );
310 reconstructor->SetMassCutOPWidth( sObject.mCutOPWidth );
311 reconstructor->SetMassCutNOPWidth( sObject.mCutNOPWidth );
312 reconstructor->SetMassCutEllipseAngle( sObject.mCutAngle );
313 reconstructor->UseAbsorbedEnergyCut( sObject.useAbsorbedEnergyCut );
314 reconstructor->SetAbsorbedEnergyCutCLCenter( sObject.aeCutCLCenter );
315 reconstructor->SetAbsorbedEnergyCutCRCenter( sObject.aeCutCRCenter );
316 reconstructor->SetAbsorbedEnergyCutCLWidth( sObject.aeCutCLWidth );
317 reconstructor->SetAbsorbedEnergyCutCRWidth( sObject.aeCutCRWidth );
318 reconstructor->SetAbsorbedEnergyCutEllipseAngle( sObject.aeCutAngle );
319 reconstructor->SetExpectedMomentumAmp( sObject.expectedMomentumAmp );
320 reconstructor->SetEDCollectionAlgorithm( sObject.edCollectionAlgorithm );
324 rEvDataVerboseLevel = sObject.evDataVerboseLevel;
325 evDataVerboseLevel = rEvDataVerboseLevel;
329 void CexmcRunManager::SaveProject(
void )
335 if ( ! physicsManager )
338 CexmcSimpleDecayTableStore etaDecayTable(
341 static_cast< const CexmcPrimaryGeneratorAction * >(
344 const_cast< CexmcPrimaryGeneratorAction * >(
345 primaryGeneratorAction ) );
347 thePrimaryGeneratorAction->GetParticleGun() );
351 static_cast< CexmcEnergyDepositDigitizer * >(
361 theEventAction->GetReconstructor() );
363 std::vector< G4double > calorimeterRegCuts( 4 );
366 calorimeterRegCuts = sObject.calorimeterRegCuts;
375 calorimeterRegCuts = region->GetProductionCuts()->GetProductionCuts();
383 G4int nmbOfFalseHitsTriggeredEDT( 0 );
384 G4int nmbOfFalseHitsTriggeredRec( 0 );
385 G4int nmbOfSavedEvents( 0 );
386 G4int nmbOfSavedFastEvents( 0 );
391 nmbOfHitsSampled = run->GetNmbOfHitsSampled();
392 nmbOfHitsSampledFull = run->GetNmbOfHitsSampledFull();
393 nmbOfHitsTriggeredRealRange = run->GetNmbOfHitsTriggeredRealRange();
394 nmbOfHitsTriggeredRecRange = run->GetNmbOfHitsTriggeredRecRange();
395 nmbOfOrphanHits = run->GetNmbOfOrphanHits();
396 nmbOfFalseHitsTriggeredEDT = run->GetNmbOfFalseHitsTriggeredEDT();
397 nmbOfFalseHitsTriggeredRec = run->GetNmbOfFalseHitsTriggeredRec();
398 nmbOfSavedEvents = run->GetNmbOfSavedEvents();
399 nmbOfSavedFastEvents = run->GetNmbOfSavedFastEvents();
402 CexmcRunSObject sObjectToWrite = {
403 basePhysicsUsed, productionModelType, gdmlFileName, etaDecayTable,
406 calorimeterRegCuts, eventCountPolicy,
407 particleGun->GetParticleDefinition()->GetParticleName(),
408 particleGun->GetOrigPosition(), particleGun->GetOrigDirection(),
409 particleGun->GetOrigMomentumAmp(),
410 primaryGeneratorAction->GetFwhmPosX(),
411 primaryGeneratorAction->GetFwhmPosY(),
412 primaryGeneratorAction->GetFwhmDirX(),
413 primaryGeneratorAction->GetFwhmDirY(),
414 primaryGeneratorAction->GetFwhmMomentumAmp(),
415 edDigitizer->GetMonitorThreshold(),
416 edDigitizer->GetVetoCounterLeftThreshold(),
417 edDigitizer->GetVetoCounterRightThreshold(),
418 edDigitizer->GetCalorimeterLeftThreshold(),
419 edDigitizer->GetCalorimeterRightThreshold(),
420 edDigitizer->GetCalorimeterTriggerAlgorithm(),
421 edDigitizer->GetOuterCrystalsVetoAlgorithm(),
422 edDigitizer->GetOuterCrystalsVetoFraction(),
423 edDigitizer->IsFiniteCrystalResolutionApplied(),
424 edDigitizer->GetCrystalResolutionData(),
425 reconstructor->GetCalorimeterEntryPointDefinitionAlgorithm(),
426 reconstructor->GetCalorimeterEntryPointDepthDefinitionAlgorithm(),
427 reconstructor->GetCrystalSelectionAlgorithm(),
428 reconstructor->IsInnerRefCrystalUsed(),
429 reconstructor->GetCalorimeterEntryPointDepth(),
430 reconstructor->IsTableMassUsed(), reconstructor->IsMassCutUsed(),
431 reconstructor->GetMassCutOPCenter(),
432 reconstructor->GetMassCutNOPCenter(),
433 reconstructor->GetMassCutOPWidth(), reconstructor->GetMassCutNOPWidth(),
434 reconstructor->GetMassCutEllipseAngle(),
435 reconstructor->IsAbsorbedEnergyCutUsed(),
436 reconstructor->GetAbsorbedEnergyCutCLCenter(),
437 reconstructor->GetAbsorbedEnergyCutCRCenter(),
438 reconstructor->GetAbsorbedEnergyCutCLWidth(),
439 reconstructor->GetAbsorbedEnergyCutCRWidth(),
440 reconstructor->GetAbsorbedEnergyCutEllipseAngle(),
441 nmbOfHitsSampled, nmbOfHitsSampledFull, nmbOfHitsTriggeredRealRange,
442 nmbOfHitsTriggeredRecRange, nmbOfOrphanHits, nmbOfFalseHitsTriggeredEDT,
443 nmbOfFalseHitsTriggeredRec, nmbOfSavedEvents, nmbOfSavedFastEvents,
444 numberOfEventsProcessed, numberOfEventsProcessedEffective,
447 reconstructor->GetExpectedMomentumAmp(),
448 reconstructor->GetEDCollectionAlgorithm(), 0 };
450 std::ofstream runDataFile( ( projectsDir +
"/" + projectId +
".rdb" ).
454 boost::archive::binary_oarchive archive( runDataFile );
455 archive << sObjectToWrite;
462 void CexmcRunManager::DoCommonEventLoop(
G4int nEvent,
const G4String & cmd,
466 G4int iEventEffective( 0 );
468 for ( iEvent = 0; iEventEffective < nEvent; ++iEvent )
474 switch ( eventCountPolicy )
480 if ( eventInfo->TpTriggerIsOk() )
484 if ( eventInfo->EdTriggerIsOk() )
493 if ( iEvent < nSelect )
501 numberOfEventsProcessed = iEvent;
502 numberOfEventsProcessedEffective = iEventEffective;
506 #ifdef CEXMC_USE_PERSISTENCY
508 void CexmcRunManager::DoReadEventLoop(
G4int nEvent )
511 G4int iEventEffective( 0 );
512 G4int nEventCount( 0 );
517 if ( ! physicsManager )
522 if ( ! productionModel )
529 CexmcEventSObject evSObject;
530 CexmcEventFastSObject evFastSObject;
533 std::ifstream eventsDataFile(
534 ( projectsDir +
"/" + rProject +
".edb" ).c_str() );
535 if ( ! eventsDataFile )
538 boost::archive::binary_iarchive evArchive( eventsDataFile );
540 std::ifstream eventsFastDataFile(
541 ( projectsDir +
"/" + rProject +
".fdb" ).c_str() );
542 if ( ! eventsFastDataFile )
545 boost::archive::binary_iarchive evFastArchive( eventsFastDataFile );
550 event.SetHCofThisEvent( sdManager->PrepareNewEvent() );
555 G4int hcId( digiManager->GetHitsCollectionID(
560 hcOfThisEvent->AddHitsCollection( hcId, monitorED );
561 hcId = digiManager->GetHitsCollectionID(
566 hcOfThisEvent->AddHitsCollection( hcId, vetoCounterED );
567 hcId = digiManager->GetHitsCollectionID(
572 hcOfThisEvent->AddHitsCollection( hcId, calorimeterED );
573 hcId = digiManager->GetHitsCollectionID(
577 hcOfThisEvent->AddHitsCollection( hcId, monitorTP );
578 hcId = digiManager->GetHitsCollectionID(
583 hcOfThisEvent->AddHitsCollection( hcId, vetoCounterTP );
584 hcId = digiManager->GetHitsCollectionID(
589 hcOfThisEvent->AddHitsCollection( hcId, calorimeterTP );
590 hcId = digiManager->GetHitsCollectionID(
594 hcOfThisEvent->AddHitsCollection( hcId, targetTP );
596 #ifdef CEXMC_USE_CUSTOM_FILTER
598 customFilter->SetAddressedData( &evFastSObject, &evSObject );
602 sObject.nmbOfSavedFastEvents );
603 G4bool eventDataWrittenOnEveryTPT( rEvDataVerboseLevel ==
606 for (
int i( 0 ); i < nmbOfSavedEvents; ++i )
608 evFastArchive >> evFastSObject;
610 if ( nEventCount < curEventRead )
612 if ( eventDataWrittenOnEveryTPT ||
613 evFastSObject.edDigitizerHasTriggered )
615 evArchive >> evSObject;
616 if ( evFastSObject.edDigitizerHasTriggered )
624 productionModel->SetTriggeredAngularRanges(
625 evFastSObject.opCosThetaSCM );
627 productionModel->GetTriggeredAngularRanges() );
629 if ( ! eventDataWrittenOnEveryTPT &&
630 ! evFastSObject.edDigitizerHasTriggered )
632 #ifdef CEXMC_USE_CUSTOM_FILTER
638 if ( customFilter && ! customFilter->EvalTPT() )
641 SaveCurrentTPTEvent( evFastSObject, triggeredAngularRanges,
646 evArchive >> evSObject;
648 G4bool skipEDTOnThisEvent(
false );
650 #ifdef CEXMC_USE_CUSTOM_FILTER
651 if ( customFilter && ! customFilter->EvalTPT() )
653 if ( customFilter && ! customFilter->EvalEDT() )
655 if ( ! eventDataWrittenOnEveryTPT )
657 SaveCurrentTPTEvent( evFastSObject, triggeredAngularRanges,
661 skipEDTOnThisEvent =
true;
665 event.SetEventID( evSObject.eventId );
672 monitorED->GetMap()->operator[]( 0 ) = &evSObject.monitorED;
673 vetoCounterED->GetMap()->operator[]( 0 ) = &evSObject.vetoCounterEDLeft;
674 vetoCounterED->GetMap()->operator[]( 1 <<
676 &evSObject.vetoCounterEDRight;
679 for ( CexmcEnergyDepositCalorimeterCollection::iterator
680 k( evSObject.calorimeterEDLeftCollection.begin() );
681 k != evSObject.calorimeterEDLeftCollection.end(); ++k )
686 for ( CexmcEnergyDepositCrystalRowCollection::iterator
687 l( k->begin() ); l != k->end(); ++l )
689 calorimeterED->GetMap()->operator[]( index | column ) = &*l;
695 for ( CexmcEnergyDepositCalorimeterCollection::iterator
696 k( evSObject.calorimeterEDRightCollection.begin() );
697 k != evSObject.calorimeterEDRightCollection.end(); ++k )
704 for ( CexmcEnergyDepositCrystalRowCollection::iterator
705 l( k->begin() ); l != k->end(); ++l )
707 calorimeterED->GetMap()->operator[]( index | column ) = &*l;
715 evSObject.targetTPBeamParticle );
717 evSObject.targetTPOutputParticle );
719 evSObject.targetTPNucleusParticle );
721 evSObject.targetTPOutputParticleDecayProductParticle1 );
723 evSObject.targetTPOutputParticleDecayProductParticle2 );
725 evSObject.vetoCounterTPLeft );
727 evSObject.vetoCounterTPRight );
729 evSObject.calorimeterTPLeft );
731 evSObject.calorimeterTPRight );
733 if ( monitorTPInfo.IsValid() )
734 monitorTP->GetMap()->operator[]( monitorTPInfo.trackId ) =
736 if ( targetTPBeamParticleInfo.IsValid() )
737 targetTP->GetMap()->operator[](
738 targetTPBeamParticleInfo.trackId ) =
739 &targetTPBeamParticleInfo;
740 if ( targetTPOutputParticleInfo.IsValid() )
741 targetTP->GetMap()->operator[](
742 targetTPOutputParticleInfo.trackId ) =
743 &targetTPOutputParticleInfo;
744 if ( targetTPNucleusParticleInfo.IsValid() )
745 targetTP->GetMap()->operator[](
746 targetTPNucleusParticleInfo.trackId ) =
747 &targetTPNucleusParticleInfo;
748 if ( targetTPOutputParticleDecayProductParticle1Info.IsValid() )
749 targetTP->GetMap()->operator[](
750 targetTPOutputParticleDecayProductParticle1Info.trackId ) =
751 &targetTPOutputParticleDecayProductParticle1Info;
752 if ( targetTPOutputParticleDecayProductParticle2Info.IsValid() )
753 targetTP->GetMap()->operator[](
754 targetTPOutputParticleDecayProductParticle2Info.trackId ) =
755 &targetTPOutputParticleDecayProductParticle2Info;
756 if ( vetoCounterTPLeftInfo.IsValid() )
757 vetoCounterTP->GetMap()->operator[](
758 vetoCounterTPLeftInfo.trackId ) = &vetoCounterTPLeftInfo;
759 if ( vetoCounterTPRightInfo.IsValid() )
760 vetoCounterTP->GetMap()->operator[](
762 vetoCounterTPRightInfo.trackId ) = &vetoCounterTPRightInfo;
765 if ( calorimeterTPLeftInfo.IsValid() )
767 pos = calorimeterTPLeftInfo.positionLocal;
768 setup->ConvertToCrystalGeometry(
769 calorimeterTPLeftInfo.positionLocal, row, column, pos );
770 calorimeterTPLeftInfo.positionLocal = pos;
771 calorimeterTP->GetMap()->operator[](
776 calorimeterTPLeftInfo.trackId ) = &calorimeterTPLeftInfo;
778 if ( calorimeterTPRightInfo.IsValid() )
780 pos = calorimeterTPRightInfo.positionLocal;
781 setup->ConvertToCrystalGeometry(
782 calorimeterTPRightInfo.positionLocal, row, column, pos );
783 calorimeterTPRightInfo.positionLocal = pos;
784 calorimeterTP->GetMap()->operator[](
790 calorimeterTPRightInfo.trackId ) = &calorimeterTPRightInfo;
793 productionModel->SetProductionModelData(
794 evSObject.productionModelData );
803 monitorED->GetMap()->clear();
804 vetoCounterED->GetMap()->clear();
805 calorimeterED->GetMap()->clear();
806 monitorTP->GetMap()->clear();
807 targetTP->GetMap()->clear();
808 vetoCounterTP->GetMap()->clear();
809 calorimeterTP->GetMap()->clear();
813 if ( skipEDTOnThisEvent )
819 theEventAction->EndOfEventAction( &event );
824 if ( eventInfo->EdTriggerIsOk() )
828 event.SetUserInformation( NULL );
830 monitorED->GetMap()->clear();
831 vetoCounterED->GetMap()->clear();
832 calorimeterED->GetMap()->clear();
833 monitorTP->GetMap()->clear();
834 targetTP->GetMap()->clear();
835 vetoCounterTP->GetMap()->clear();
836 calorimeterTP->GetMap()->clear();
840 if ( nEvent > 0 && iEventEffective == nEvent )
844 curEventRead = nEventCount + iEventEffective;
846 numberOfEventsProcessed = iEvent;
847 numberOfEventsProcessedEffective = iEventEffective;
849 #ifdef CEXMC_USE_CUSTOM_FILTER
851 customFilter->SetAddressedData( NULL, NULL );
856 void CexmcRunManager::SaveCurrentTPTEvent(
857 const CexmcEventFastSObject & evFastSObject,
866 for ( CexmcAngularRangeList::const_iterator k( angularRanges.begin() );
867 k != angularRanges.end(); ++k )
869 run->IncrementNmbOfHitsSampledFull( k->index );
870 if ( evFastSObject.edDigitizerMonitorHasTriggered )
871 run->IncrementNmbOfHitsSampled( k->index );
874 if ( writeToDatabase )
876 fastEventsArchive->operator<<( evFastSObject );
877 run->IncrementNmbOfSavedFastEvents();
892 if ( macroFile != 0 )
896 cmd =
"/control/execute ";
904 numberOfEventsProcessed = 0;
905 numberOfEventsProcessedEffective = 0;
907 #ifdef CEXMC_USE_PERSISTENCY
908 eventsArchive = NULL;
909 fastEventsArchive = NULL;
914 std::ofstream eventsDataFile(
915 ( projectsDir +
"/" + projectId +
".edb" ).c_str() );
916 boost::archive::binary_oarchive eventsArchive_( eventsDataFile );
917 std::ofstream fastEventsDataFile(
918 ( projectsDir +
"/" + projectId +
".fdb" ).c_str() );
919 boost::archive::binary_oarchive fastEventsArchive_(
920 fastEventsDataFile );
921 eventsArchive = &eventsArchive_;
922 fastEventsArchive = &fastEventsArchive_;
923 DoReadEventLoop( nEvent );
927 DoReadEventLoop( nEvent );
934 std::ofstream eventsDataFile(
935 ( projectsDir +
"/" + projectId +
".edb" ).c_str() );
936 boost::archive::binary_oarchive eventsArchive_( eventsDataFile );
937 std::ofstream fastEventsDataFile(
938 ( projectsDir +
"/" + projectId +
".fdb" ).c_str() );
939 boost::archive::binary_oarchive fastEventsArchive_(
940 fastEventsDataFile );
941 eventsArchive = &eventsArchive_;
942 fastEventsArchive = &fastEventsArchive_;
943 DoCommonEventLoop( nEvent, cmd, nSelect );
947 DoCommonEventLoop( nEvent, cmd, nSelect );
950 eventsArchive = NULL;
951 fastEventsArchive = NULL;
953 DoCommonEventLoop( nEvent, cmd, nSelect );
963 G4cout <<
" Run Aborted after " << numberOfEventsProcessed <<
964 " events processed." <<
G4endl;
968 G4cout <<
" Number of events processed : " <<
969 numberOfEventsProcessed <<
", effectively: " <<
970 numberOfEventsProcessedEffective <<
G4endl;
977 #ifdef CEXMC_USE_PERSISTENCY
979 void CexmcRunManager::PrintReadRunData(
void )
const
984 G4bool refCrystalInfoPrinted(
false );
988 G4cout <<
" (archive class version " <<
989 sObject.actualVersion <<
")" <<
G4endl;
990 if ( ! sObject.rProject.empty() )
992 G4cout <<
" -- Based on project '" << sObject.rProject <<
"'" <<
994 if ( ! sObject.cfFileName.empty() )
995 G4cout <<
" -- Custom filter script '" << sObject.cfFileName <<
996 "' was used" << G4endl;
998 G4cout <<
" -- Event data verbose level (0 - not saved, 1 - triggers, "
999 "2 - interactions): " << sObject.evDataVerboseLevel <<
G4endl;
1000 if ( ! sObject.rProject.empty() )
1004 G4cout <<
" -- (fdb file contains " <<
1005 ( sObject.interactionsWithoutEDTWereSkipped ?
1006 "only interactions when an event was triggered" :
1007 "all interactions" ) <<
")" << std::endl;
1010 G4cout <<
" -- Base physics used"
1011 "(1 - QGSP_BERT, 2 - QGSP_BIC_EMY, 3 - FTFP_BERT): " <<
1012 sObject.basePhysicsUsed <<
G4endl;
1013 G4cout <<
" -- Production model (1 - pi0, 2 - eta): " <<
1014 sObject.productionModelType <<
G4endl;
1015 G4cout <<
" -- Geometry definition file: " << sObject.gdmlFileName <<
1017 G4cout <<
" -- Angular ranges: " << sObject.angularRanges <<
G4endl;
1020 G4cout <<
" -- Fermi motion status (0 - disabled, 1 - enabled): " <<
1021 sObject.fermiMotionIsOn <<
G4endl;
1022 if ( sObject.calorimeterRegCuts.size() < 4 )
1024 G4cout <<
" -- Production cuts in calorimeter (gamma, e-, e+, p): " <<
1025 G4BestUnit( sObject.calorimeterRegCuts[ 0 ],
"Length" ) <<
", " <<
1026 G4BestUnit( sObject.calorimeterRegCuts[ 1 ],
"Length" ) <<
", " <<
1027 G4BestUnit( sObject.calorimeterRegCuts[ 2 ],
"Length" ) <<
", " <<
1029 G4cout <<
" -- Proposed max interaction length in the target: " <<
1031 G4cout <<
" -- Event count policy (0 - all, 1 - interaction, 2 - trigger)"
1032 ": " << sObject.eventCountPolicy <<
G4endl;
1033 G4cout <<
" -- Number of events (processed / effective / ordered): " <<
1034 sObject.numberOfEventsProcessed <<
" / " <<
1035 sObject.numberOfEventsProcessedEffective <<
" / " <<
1036 sObject.numberOfEventsToBeProcessed <<
G4endl;
1037 G4cout <<
" -- Incident beam particle: " << sObject.beamParticle <<
G4endl;
1038 G4cout <<
" position: " <<
1040 G4cout <<
" direction: " <<
1042 G4cout <<
" momentum: " <<
1044 G4cout <<
" momentum fwhm: " << sObject.beamFwhmMomentumAmp <<
1046 G4cout <<
" pos fwhm (x): " <<
1048 G4cout <<
" pos fwhm (y): " <<
1050 G4cout <<
" dir fwhm (x): " << sObject.beamFwhmDirX /
deg <<
1052 G4cout <<
" dir fwhm (y): " << sObject.beamFwhmDirY /
deg <<
1054 G4cout <<
" -- Monitor ED threshold: " <<
1056 G4cout <<
" -- Veto counter (l/r) ED threshold: " <<
1057 G4BestUnit( sObject.vetoCounterEDLeftThreshold,
"Energy" ) <<
1059 G4BestUnit( sObject.vetoCounterEDRightThreshold,
"Energy" ) <<
1061 G4cout <<
" -- Calorimeter (l/r) ED threshold: " <<
1062 G4BestUnit( sObject.calorimeterEDLeftThreshold,
"Energy" ) <<
1064 G4BestUnit( sObject.calorimeterEDRightThreshold,
"Energy" ) <<
1066 G4cout <<
" -- Calorimeter trigger algorithm (0 - all, 1 - inner): " <<
1067 sObject.calorimeterTriggerAlgorithm <<
G4endl;
1068 G4cout <<
" -- Outer crystals veto algorithm "
1069 "(0 - none, 1 - max, 2 - fraction): " <<
1070 sObject.outerCrystalsVetoAlgorithm <<
G4endl;
1071 if ( sObject.outerCrystalsVetoAlgorithm ==
1074 G4cout <<
" -- Outer crystals veto fraction: " <<
1075 sObject.outerCrystalsVetoFraction <<
G4endl;
1077 G4cout <<
" -- Finite crystal resolution applied (0 - no, 1 - yes): " <<
1078 sObject.applyFiniteCrystalResolution <<
G4endl;
1079 if ( sObject.applyFiniteCrystalResolution )
1081 G4cout <<
" -- Crystal resolution data: " <<
1082 sObject.crystalResolutionData;
1085 if ( sObject.expectedMomentumAmp > 0 )
1087 G4cout <<
" -- expected momentum in the target: " <<
1090 G4cout <<
" -- ed collection algorithm (0 - all, 1 - adjacent): " <<
1091 sObject.edCollectionAlgorithm <<
G4endl;
1095 " -- inner crystal used as reference (0 - no, 1 - yes): " <<
1096 sObject.useInnerRefCrystal <<
G4endl;
1097 refCrystalInfoPrinted =
true;
1099 G4cout <<
" -- entry point definition algorithm " <<
G4endl;
1100 G4cout <<
" (0 - center of calorimeter, 1 - center of crystal with "
1102 G4cout <<
" 2 - linear, 3 - square): " <<
1103 sObject.epDefinitionAlgorithm <<
G4endl;
1104 G4cout <<
" -- entry point depth definition algorithm "
1105 "(0 - plain, 1 - sphere): " <<
1106 sObject.epDepthDefinitionAlgorithm <<
G4endl;
1107 G4cout <<
" -- entry point depth: " <<
1113 " -- crystal selection algorithm (0 - all, 1 - adjacent): " <<
1114 sObject.csAlgorithm <<
G4endl;
1116 if ( ! refCrystalInfoPrinted &&
1117 ( sObject.epDefinitionAlgorithm ==
1120 sObject.epDefinitionAlgorithm ==
1125 " -- inner crystal used as reference (0 - no, 1 - yes): " <<
1126 sObject.useInnerRefCrystal <<
G4endl;
1128 G4cout <<
" -- table mass of output particle used "
1129 "(0 - no, 1 - yes): " << sObject.useTableMass <<
G4endl;
1130 G4cout <<
" -- mass cut is enabled (0 - no, 1 - yes): " <<
1131 sObject.useMassCut <<
G4endl;
1132 if ( sObject.useMassCut )
1134 G4cout <<
" -- mass cut output particle center: " <<
1136 G4cout <<
" -- mass cut nucleus output particle center: " <<
1138 G4cout <<
" -- mass cut output particle width of the ellipse: " <<
1140 G4cout <<
" -- mass cut nucleus output particle width of the "
1143 G4cout <<
" -- mass cut angle of the ellipse: " <<
1144 sObject.mCutAngle /
deg <<
" deg" <<
G4endl;
1146 G4cout <<
" -- absorbed energy cut is enabled (0 - no, 1 - yes): " <<
1147 sObject.useAbsorbedEnergyCut <<
G4endl;
1148 if ( sObject.useAbsorbedEnergyCut )
1150 G4cout <<
" -- absorbed energy cut left calorimeter center: " <<
1152 G4cout <<
" -- absorbed energy cut right calorimeter center: " <<
1154 G4cout <<
" -- absorbed energy cut left calorimeter width of the "
1157 G4cout <<
" -- absorbed energy cut right calorimeter width of the "
1160 G4cout <<
" -- absorbed energy cut angle of the ellipse: " <<
1161 sObject.aeCutAngle /
deg <<
" deg" <<
G4endl;
1165 sObject.nmbOfHitsSampledFull,
1166 sObject.nmbOfHitsTriggeredRealRange,
1167 sObject.nmbOfHitsTriggeredRecRange,
1168 sObject.nmbOfOrphanHits,
1169 sObject.angularRanges,
1170 sObject.nmbOfFalseHitsTriggeredEDT,
1171 sObject.nmbOfFalseHitsTriggeredRec );
1176 void CexmcRunManager::ReadAndPrintEventsData(
void )
const
1181 CexmcEventSObject evSObject;
1184 std::ifstream eventsDataFile(
1185 ( projectsDir +
"/" + rProject +
".edb" ).c_str() );
1186 if ( ! eventsDataFile )
1189 boost::archive::binary_iarchive evArchive( eventsDataFile );
1191 for (
int i( 0 ); i < sObject.nmbOfSavedEvents; ++i )
1193 evArchive >> evSObject;
1195 if ( ! evSObject.edDigitizerMonitorHasTriggered )
1199 evSObject.vetoCounterEDLeft, evSObject.vetoCounterEDRight,
1200 evSObject.calorimeterEDLeft, evSObject.calorimeterEDRight,
1201 0, 0, 0, 0, evSObject.calorimeterEDLeftCollection,
1202 evSObject.calorimeterEDRightCollection );
1205 evSObject.targetTPBeamParticle, evSObject.targetTPOutputParticle,
1206 evSObject.targetTPNucleusParticle,
1207 evSObject.targetTPOutputParticleDecayProductParticle1,
1208 evSObject.targetTPOutputParticleDecayProductParticle2,
1209 evSObject.vetoCounterTPLeft, evSObject.vetoCounterTPRight,
1210 evSObject.calorimeterTPLeft, evSObject.calorimeterTPRight );
1213 evSObject.productionModelData );
1217 G4cout <<
" --- Production model data: " << pmData;
1223 void CexmcRunManager::PrintReadData(
1229 G4bool addSpace(
false );
1231 CexmcOutputDataTypeSet::const_iterator found(
1233 if ( found != outputData.end() )
1236 gdmlFileExtension );
1237 if ( system( cmd ) != 0 )
1242 cmd =
G4String(
"bzip2 " ) + projectsDir +
"/" + rProject +
1244 if ( system( cmd ) != 0 )
1252 if ( found != outputData.end() )
1257 ReadAndPrintEventsData();
1263 if ( found != outputData.end() )
1269 for ( CexmcDecayBranchesStore::const_iterator
1270 k( sObject.etaDecayTable.GetDecayBranches().begin() );
1271 k != sObject.etaDecayTable.GetDecayBranches().end(); ++k )
1273 etaDecayTable->GetDecayChannel( k->first )->SetBR( k->second );
1281 #ifdef CEXMC_USE_CUSTOM_FILTER
1283 void CexmcRunManager::SetCustomFilter(
const G4String & cfFileName_ )
1287 delete customFilter;
1288 customFilter = NULL;
1291 if ( cfFileName_.empty() )
1298 cfFileName = cfFileName_;
1300 customFilter =
new CexmcCustomFilterEval( cfFileName );
1310 G4VisManager * visManager( static_cast< G4VisManager * >(
1320 #if G4VERSION_NUMBER < 960
1321 typedef std::vector< G4VModel * > MList;
1323 typedef std::vector< G4Scene::Model > MList;
1325 const MList & mList( curScene->GetRunDurationModelList() );
1327 for ( MList::const_iterator k( mList.begin() ); k != mList.end(); ++k )
1329 #if G4VERSION_NUMBER < 960
1330 const G4String & modelDesc( ( *k )->GetGlobalDescription() );
1332 const G4String & modelDesc( k->fpModel->GetGlobalDescription() );
1352 if ( ! eventAction )
1363 #ifdef CEXMC_USE_PERSISTENCY
1372 cmd =
G4String(
"bzip2 " ) + projectsDir +
"/" + rProject +
1378 cmd =
G4String(
"bzip2 -c " ) + gdmlFileName +
" > " +
1379 projectsDir +
"/" + projectId + gdmlbz2FileExtension;
1386 cmd =
G4String(
"cp " ) + gdmlFileName +
" " + projectsDir +
"/" +
1387 projectId + gdmlFileExtension;
1391 if ( ! cmd.empty() && system( cmd ) != 0 )
G4int numberOfEventToBeProcessed
G4VUserEventInformation * GetUserInformation() const
G4double GetProposedMaxIL(void) const
CLHEP::Hep3Vector G4ThreeVector
const G4String CexmcScenePrimitivesDescription("CexmcScenePrimitives")
static G4VVisManager * GetConcreteInstance()
G4bool IsFermiMotionOn(void) const
void SetupConstructionHook(void)
static G4int GetCopyDepth1BitsOffset(void)
const G4String CexmcDetectorTypeName[CexmcNumberOfDetectorTypes]
static G4DigiManager * GetDMpointer()
#define G4BestUnit(a, b)
#define G4_USE_G4BESTUNIT_FOR_VERBOSE 1
static G4int GetLeftRightBitsOffset(void)
void DoEventLoop(G4int nEvent, const char *macroFile, G4int nSelect)
virtual ~CexmcRunManager()
const G4String CexmcEDDigitizerName("EDDig")
G4bool ProjectIsRead(void) const
static G4UImanager * GetUIpointer()
static G4RegionStore * GetInstance()
G4DecayTable * GetDecayTable() const
G4VUserPrimaryGeneratorAction * userPrimaryGeneratorAction
virtual G4Event * GenerateEvent(G4int i_event)
G4GLOB_DLL std::ostream G4cout
virtual void AnalyzeEvent(G4Event *anEvent)
static G4int GetCopyDepth0BitsOffset(void)
G4UserEventAction * userEventAction
static G4Eta * Definition()
static void PrintTrackPoints(const CexmcTrackPointsStore *tpStore)
const G4String CexmcDetectorRoleName[CexmcNumberOfDetectorRoles]
static void PrintEnergyDeposit(const CexmcEnergyDepositStore *edStore)
void BeamParticleChangeHook(void)
void RegisterScenePrimitives(void)
static G4int GetCopyDepth1BitsOffset(void)
static void PrintResults(const CexmcNmbOfHitsInRanges &nmbOfHitsSampled, const CexmcNmbOfHitsInRanges &nmbOfHitsSampledFull, const CexmcNmbOfHitsInRanges &nmbOfHitsTriggeredRealRange, const CexmcNmbOfHitsInRanges &nmbOfHitsTriggeredRecRange, const CexmcNmbOfHitsInRanges &nmbOfOrphanHits, const CexmcAngularRangeList &angularRanges, G4int nmbOfFalseHitsTriggeredEDT, G4int nmbOfFalseHitsTriggeredRec)
const G4String CexmcCalorimeterRegionName("Calorimeter")
static G4ParticleTable * GetParticleTable()
static G4SDManager * GetSDMpointer()
std::vector< CexmcAngularRange > CexmcAngularRangeList
void StackPreviousEvent(G4Event *anEvent)
void ProcessOneEvent(G4Event *anEvent)
G4HCofThisEvent * GetHCofThisEvent() const
CexmcRunManager(const G4String &projectId="", const G4String &rProject="", G4bool overrideExistingProject=false)
std::set< CexmcOutputDataType > CexmcOutputDataTypeSet
G4EventManager * eventManager
G4bool ProjectIsSaved(void) const
void ApplyFermiMotion(G4bool on, G4bool fromMessenger=true)
virtual CexmcProductionModel * GetProductionModel(void)=0
G4VUserDetectorConstruction * userDetector
static G4int GetLeftRightBitsOffset(void)
void SetAngularRanges(const CexmcAngularRangeList &angularRanges_)
void SetProposedMaxIL(G4double value)
const CexmcAngularRangeList & GetAngularRanges(void) const
std::map< G4int, G4int > CexmcNmbOfHitsInRanges
G4int ApplyCommand(const char *aCommand)
G4Scene * GetCurrentScene() const
void BeamParticleChangeHook(void)