/home/cern/BDSIM_new/src/BDSRunManager.cc

00001 /* BDSIM code.    Version 1.0
00002    Author: Grahame A. Blair, Royal Holloway, Univ. of London.
00003    Last modified 24.7.2002
00004    Copyright (c) 2002 by G.A.Blair.  ALL RIGHTS RESERVED. 
00005 */
00006 // G.A.Blair, Royal Holloway Univ of London. 1.07.02
00007 // This class alters one part of the default G4RunManager to
00008 // avoid closing the geometry after each event - this was a significant
00009 // time overhead. 
00010 // >>>Whether there are other effects of this needs to be checked <<<
00011 //
00012 // SPM: Altered BeamOn function to account for Placet synchronisation
00013 //
00014 
00015 #include "BDSGlobalConstants.hh"
00016 #include "G4Timer.hh"
00017 
00018 #include "BDSRunManager.hh"
00019 #include "G4StateManager.hh"
00020 #include "G4UImanager.hh"
00021 
00022 
00023 BDSRunManager* BDSRunManager::fRunManager = 0;
00024 
00025 BDSRunManager* BDSRunManager::GetRunManager()
00026 { return fRunManager; }
00027 
00028 BDSRunManager::BDSRunManager(){ fRunManager = this;}
00029 
00030 BDSRunManager::~BDSRunManager(){ G4cout << "BDSRunManager deleting..." << G4endl; }
00031 
00032 void BDSRunManager::BeamOn(G4int n_event,const char* macroFile,G4int n_select)
00033 {
00034   G4bool cond = ConfirmBeamOnCondition();
00035   G4StackManager* SM;
00036   SM = G4EventManager::GetEventManager()->GetStackManager();
00037   if(cond)
00038   {
00039     numberOfEventToBeProcessed = n_event;
00040     RunInitialization();
00041     if(n_event>0) DoEventLoop(n_event,macroFile,n_select);
00042     RunTermination();
00043     while(!BDSGlobals->holdingQueue.empty()){
00044       BDSGlobals->setReadFromStack(true);
00045       SM->ClearPostponeStack();
00046 
00047       RunInitialization();
00048 //      DoEventLoop(n_event,macroFile,n_select);
00049       DoEventLoop(BDSGlobals->holdingQueue.size(),macroFile,n_select);
00050       RunTermination();
00051 
00052       BDSGlobals->setReadFromStack(false);
00053     }
00054   }
00055 }
00056 
00057 void BDSRunManager::DoEventLoop(G4int n_event,const char* macroFile,G4int n_select)
00058 {
00059   //G4StateManager* stateManager = G4StateManager::GetStateManager();
00060 
00061   if(verboseLevel>0) 
00062   { timer->Start(); }
00063 
00064   G4String msg;
00065   if(macroFile!=0)
00066   { 
00067     if(n_select<0) n_select = n_event;
00068     msg = "/control/execute ";
00069     msg += macroFile;
00070   }
00071   else
00072   { n_select = -1; }
00073 
00074   G4int i_event;
00075   for( i_event=0; i_event<n_event; i_event++ )
00076   {
00077 
00078 
00079     //    stateManager->SetNewState(EventProc);
00080 
00081     currentEvent = GenerateEvent(i_event);
00082 
00083     if(currentEvent == NULL) G4cerr<<__FILE__<<" : "<<__LINE__<<"Event generation failed "<<G4endl;
00084 
00085     eventManager->ProcessOneEvent(currentEvent);
00086 
00087     AnalyzeEvent(currentEvent);
00088 
00089     if(i_event<n_select) G4UImanager::GetUIpointer()->ApplyCommand(msg);
00090 
00091     // gab: the following commented out - this is the only
00092     // difference between this and the normal G4 class
00093     // (significant time saving...)
00094     //stateManager->SetNewState(GeomClosed);
00095 
00096     StackPreviousEvent(currentEvent);
00097     currentEvent = 0;
00098     if(runAborted) break;
00099   }
00100 
00101   if(verboseLevel>0)
00102   {
00103     timer->Stop();
00104     G4cout << "Run terminated." << G4endl;
00105     G4cout << "Run Summary" << G4endl;
00106     if(runAborted)
00107     { G4cout << "  Run Aborted after " << i_event << " events processed." << G4endl; }
00108     else
00109     { G4cout << "  Number of events processed : " << n_event << G4endl; }
00110     G4cout << "  "  << *timer << G4endl;
00111   }
00112 }
00113 
00114 

Generated on Wed Mar 5 17:25:22 2008 for BDSIM by  doxygen 1.5.3