Paris.cc 5.10 KiB
/*****************************************************************************
* Copyright (C) 2009-2013 this file is part of the NPTool Project *
* *
* For the licensing terms see $NPTOOL/Licence/NPTool_Licence *
* For the list of contributors see $NPTOOL/Licence/Contributors *
*****************************************************************************/
/*****************************************************************************
* Original Author: M. Labiche contact address: marc.labiche@stfc.ac.uk *
* *
* Creation Date : 04/12/09 *
* Last update : *
*---------------------------------------------------------------------------*
* Decription: This class manages different shapes of module for the Paris *
* detector. It allows to have Paris geometries with an *
* heterogeneous set of modules *
*---------------------------------------------------------------------------*
* Comment: *
* *
* *
*****************************************************************************/
// C++ headers
#include <fstream>
#include <sstream>
#include <string>
#include <cmath>
// NPTool headers
#include "Paris.hh"
#include "ParisPhoswich.hh"
#include "ParisCluster.hh"
using namespace std;
Paris::Paris()
{
}
Paris::~Paris()
{
}
// Read stream at Configfile to pick-up parameters of detector (Position,...)
// Called in DetecorConstruction::ReadDetextorConfiguration Method
void Paris::ReadConfiguration(string Path)
{
// open configuration file
ifstream ConfigFile;
ConfigFile.open(Path.c_str());
bool bParisPhoswich = false;
bool bParisCluster = false;
string LineBuffer;
while (!ConfigFile.eof()) {
getline(ConfigFile, LineBuffer);
if (LineBuffer.compare(0, 14, "ParisPhoswich") == 0 && bParisPhoswich == false) {
bParisPhoswich = true;
// instantiate a new "detector" corresponding to the Square elements
ParisModule* myDetector = new ParisPhoswich();
// read part of the configuration file corresponding to square elements
ConfigFile.close();
myDetector->ReadConfiguration(Path);
ConfigFile.open(Path.c_str());
// ms_InterCoord comes from VDetector
myDetector->SetInterCoordPointer(ms_InterCoord);
// store ParisPhoswich "detector"
m_Modules.push_back(myDetector);
}
else if (LineBuffer.compare(0, 12, "ParisCluster") == 0 && bParisCluster == false) {
bParisCluster = true;
// instantiate a new "detector" corresponding to the Trapezoid elements
ParisModule* myDetector = new ParisCluster();
// read part of the configuration file corresponding to trapezoid elements
ConfigFile.close();
myDetector->ReadConfiguration(Path);
ConfigFile.open(Path.c_str());
// ms_InterCoord comes from VDetector
myDetector->SetInterCoordPointer(ms_InterCoord);
// store ParisCluster "detector"
m_Modules.push_back(myDetector);
}
}
}
// Construct detector and initialize sensitive part.
// Called After DetectorConstruction::AddDetector Method
void Paris::ConstructDetector(G4LogicalVolume* world)
{
// loop on sub-detectors belonging to Paris
int nbDetectors = m_Modules.size();
for (int i = 0; i < nbDetectors; i++) m_Modules[i]->ConstructDetector(world);
}
// Connect the ParisData class to the output TTree
// of the simulation
void Paris::InitializeRootOutput()
{
// loop on sub-detectors belonging to Paris
int nbDetectors = m_Modules.size();
for (int i = 0; i < nbDetectors; i++) m_Modules[i]->InitializeRootOutput();
}
// Initialize all scorers necessary for each detector
void Paris::InitializeScorers()
{
// loop on sub-detectors belonging to Paris
int nbDetectors = m_Modules.size();
for (int i = 0; i < nbDetectors; i++) m_Modules[i]->InitializeScorers();
}
// Read sensitive part and fill the Root tree.
// Called at in the EventAction::EndOfEventAction
void Paris::ReadSensitive(const G4Event* event)
{
// Before looping on each sub-detector, clear the static variable
// ms_InterCoord
// This is done on the first element of the m_Modules vector.
// This should be done here since this variable (of type TIneractionCoordinates)
// deals with multiplicity of events > 1.
m_Modules[0]->GetInterCoordPointer()->Clear();
// We do the same for the static variable ms_Event
m_Modules[0]->GetEventPointer()->Clear();
// loop on sub-detectors belonging to Paris
int nbDetectors = m_Modules.size();
for (int i = 0; i < nbDetectors; i++) m_Modules[i]->ReadSensitive(event);
}