aboutsummaryrefslogtreecommitdiffstats
path: root/src/G4BeamTestRunManager.cxx
blob: 5ed2e0505c4f92dca0ef4ef4e44f38f6a2329ab5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// On Sun, to prevent conflict with ObjectSpace, G4Timer.hh has to be
// loaded *before* globals.hh...
#include "G4Timer.hh"

#include "G4BeamTestRunManager.h"
#include <G4ParticleGun.hh>
#include <G4Run.hh>


G4BeamTestRunManager::G4BeamTestRunManager(): G4RunManager()
{
  
}


void G4BeamTestRunManager::BeamOn(G4int n_event,const char* macroFile,G4int n_select)
{
  G4String text = "BeamOn method is not supported in G4BeamTestRunManager!";
  G4Exception("G4BeamTestRunManager::BeamOn()", "G4BeamTestRunManager001", FatalException, text);
}


void G4BeamTestRunManager::InitializeRun()
{
  G4bool cond = ConfirmBeamOnCondition();
  if(cond)
  {
    // Reset the event counter 
    numberOfEventToBeProcessed = 0;
    ConstructScoringWorlds();
    RunInitialization();
    
    if(verboseLevel>0) timer->Start();
  }
}


void G4BeamTestRunManager::InjectParticle(G4ParticleGun* particleGun)
{
  if(!currentRun)
  {
    G4String text = "Run needs to be initialized before injecting a particle.";
    G4Exception("G4BeamTestRunManager::InjectParticle()", "G4BeamTestRunManager002", FatalException, text);
  }
  assert(currentRun); // the G4Exception() above calls abort(). This assert() silences the clang static analyzer
  
  numberOfEventToBeProcessed++;
  currentRun->SetNumberOfEventToBeProcessed(numberOfEventToBeProcessed);
  
  currentEvent = GenerateEvent(numberOfEventToBeProcessed);
  particleGun->GeneratePrimaryVertex(currentEvent);
  
  eventManager->ProcessOneEvent(currentEvent);
  AnalyzeEvent(currentEvent);
  Update_Scoring();
  StackPreviousEvent(currentEvent);
  currentEvent = 0;
  
  if(runAborted) TerminateRun();
}


G4Event* G4BeamTestRunManager::GenerateEvent(G4int i_event)
{
  G4Event* anEvent = new G4Event(i_event);
  
  if(storeRandomNumberStatusToG4Event==1 || storeRandomNumberStatusToG4Event==3)
  {
    std::ostringstream oss;
    CLHEP::HepRandom::saveFullState(oss);
    randomNumberStatusForThisEvent = oss.str();
    anEvent->SetRandomNumberStatus(randomNumberStatusForThisEvent);
  }
  
  if(storeRandomNumberStatus)
  {
    G4String fileN = randomNumberStatusDir + "currentEvent.rndm"; 
    CLHEP::HepRandom::saveEngineStatus(fileN);
  }
  
  return anEvent;
}


void G4BeamTestRunManager::TerminateRun()
{
  if(verboseLevel>0)
  {
    timer->Stop();
    G4cout << "Run terminated." << G4endl;
    G4cout << "Run Summary" << G4endl;
    if(runAborted)
    {
      G4cout << "  Run Aborted after " << numberOfEventToBeProcessed << " events processed." << G4endl;
    }
    else
    {
      G4cout << "  Number of events processed : " << numberOfEventToBeProcessed << G4endl;
    }
    G4cout << "  "  << *timer << G4endl;
  }
  
  RunTermination();
}


//
// The following method is an exact copy of 
// UpdateScoring which is private in the G4RunManager
//

#include <G4ScoringManager.hh>
#include <G4HCofThisEvent.hh>
#include <G4VHitsCollection.hh>

void G4BeamTestRunManager::Update_Scoring()
{
  G4ScoringManager* ScM = G4ScoringManager::GetScoringManagerIfExist();
  if(!ScM) return;
  G4int nPar = ScM->GetNumberOfMesh();
  if(nPar<1) return;
  
  G4HCofThisEvent* HCE = currentEvent->GetHCofThisEvent();
  if(!HCE) return;
  G4int nColl = HCE->GetCapacity();
  for(G4int i=0;i<nColl;i++)
  {
    G4VHitsCollection* HC = HCE->GetHC(i);
    if(HC) ScM->Accumulate(HC);
  }
}