Files
geant4/examples/advanced/Tiara/source/tiara/src/TiaraSim.cc
T
2016-06-09 14:36:02 +02:00

165 lines
4.5 KiB
C++

//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. *
// * *
// * This code implementation is the intellectual property of the *
// * GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
// $Id: TiaraSim.cc,v 1.8 2005/12/15 16:24:36 ahoward Exp $
// GEANT4 tag $Name: geant4-08-00 $
//
#include "TiaraSim.hh"
#include <iostream>
#include "CLHEP/Random/Random.h"
#include "G4RunManager.hh"
#include "G4VPhysicalVolume.hh"
#include "G4VUserPhysicsList.hh"
#include "G4VUserDetectorConstruction.hh"
#include "TiaraPrimaryGeneratorAction.hh"
#include "G4VisExecutive.hh"
#include "G4UItcsh.hh"
#include "TiaraVisEventAction.hh"
#include "TiaraVisRunAction.hh"
#include "G4VUserPrimaryGeneratorAction.hh"
#include "TiaraEnergyCutProcess.hh"
#include "G4UserStackingAction.hh"
#include "G4UserEventAction.hh"
#include "TiaraStackingAction.hh"
TiaraSim *TiaraSim::fTiaraSim = 0;
TiaraSim &TiaraSim::GetTiaraSim() {
if (!fTiaraSim) {
fTiaraSim = new TiaraSim;
}
return *fTiaraSim;
}
TiaraSim::TiaraSim():
fVisManager(0),
fSession(new G4UItcsh),
fGeometry(0),
fPrimary(0),
fPhysics(0),
fCutProcessVector(),
fPlacers(),
fStackingAction(0),
fUserEventAction(0)
{
frunMgr = new G4RunManager;
}
void TiaraSim::SetGeometry(G4VUserDetectorConstruction *geo){
fGeometry = geo;
}
void TiaraSim::AddTiaraEventAction(G4UserEventAction *eventAction) {
fUserEventAction = eventAction;
}
void TiaraSim::
SetPhysicsList(G4VUserPhysicsList *physicsList) {
fPhysics = physicsList;
frunMgr->SetUserInitialization(fPhysics);
}
void TiaraSim::
SetPrimaryGenerator(G4VUserPrimaryGeneratorAction *primGen){
fPrimary = primGen;
}
void TiaraSim::AddParticleCut(const std::string &particle,
G4double cut) {
if (!fStackingAction) {
fStackingAction = new TiaraStackingAction;
frunMgr->SetUserAction(fStackingAction);
}
TiaraEnergyCutProcess *cutProcess = new TiaraEnergyCutProcess(cut);
fCutProcessVector.push_back(cutProcess);
fPlacers.push_back(G4ProcessPlacer(particle));
fPlacers[fPlacers.size() - 1].
AddProcessAsLastDoIt(cutProcess);
fStackingAction->AddParticleCut(particle, cut);
}
void TiaraSim::AddVisRunAction() {
fVisManager = new G4VisExecutive;
frunMgr->SetUserAction(new TiaraVisRunAction);
}
void TiaraSim::initializeVisManager() {
if (fVisManager) {
fVisManager->Initialize();
}else {
G4cout << "TiaraSim::initializeVisManager(): no VisManager!" << G4endl;
}
};
void TiaraSim::initialize(){
G4bool ready(true);
if (!fPrimary) {
G4cout << "TiaraSim::initialize: no primary generator set" << G4endl;
ready = false;
}
if (ready) {
frunMgr->SetUserInitialization(fGeometry);
frunMgr->SetUserAction(fPrimary);
if (fUserEventAction) {
frunMgr->SetUserAction(fUserEventAction);
}
if (fVisManager) {
fVisManager->Initialize();
}
frunMgr->Initialize();
}
}
void TiaraSim::startSession(){
fSession.SessionStart();
}
void TiaraSim::BeamOn(G4int nEvents){
frunMgr->BeamOn(nEvents);
}
TiaraSim::~TiaraSim(){
for (size_t i = 0; i < fCutProcessVector.size(); i++) {
fPlacers[i].RemoveProcess(fCutProcessVector[i]);
delete fCutProcessVector[i];
}
if (fStackingAction) {
delete fStackingAction;
}
if (fVisManager) {
delete fVisManager;
}
delete frunMgr;
}