SiPM/src/SiPMParameters.cc

205 lines
7.2 KiB
C++

//
// Parameters.cc
// Parameters
//
// Created by Baranyai David on 2018. 06. 30..
// Modified for SiPM Simulation on 2018. 08. 23..
// Copyright © 2018. Baranyai David. All rights reserved.
//
#include "SiPMParameters.hh"
SiPMParameters& SiPMParameters::GetInstance(const std::string& config_file_name)
{
static SiPMParameters instance(config_file_name);
instance.PrintUsedFilename();
return instance;
}
SiPMParameters::SiPMParameters(const std::string& config_file_name) : config_file(config_file_name)
{
ResetToDefaults();
}
SiPMParameters::~SiPMParameters()
{
}
void SiPMParameters::PrintUsedFilename()
{
std::cout << config_file << (conf_loaded ? " loaded." : " will be loaded. Call ParseConfigFile().") << std::endl;
}
void SiPMParameters::ResetToDefaults()
{
particleGun_position = G4ThreeVector(50, -5, 0);
particleGun_MomentumDirection = G4ThreeVector(0.5, 1, 0);
particleGun_energy = 1; //in GeV
sipm_Dimension = G4ThreeVector(1, 1, 1); //applies to both (in cm)
scintillator_length = 40; //the size same as sipm
x_division = 10;
y_division = 10;
scint_radius = 0.25; //in cm
numberofevents = 10;
}
void SiPMParameters::ParseConfigFile()
{
std::string line;
try
{
std::ifstream configfile(config_file);
if(configfile.is_open())
{
while (getline(configfile, line))
{
std::istringstream is_line(line);
std::string key;
if (std::getline(is_line, key, '='))
{
std::string value;
if(std::getline(is_line, value))
{
StoreConfigValues(key, value);
}
}
}
}
CheckValues();
}
catch (char param)
{
std::cout << param << std::endl;
}
}
void SiPMParameters::ParseConfigFile(std::string config_file1)
{
config_file = config_file1;
ParseConfigFile();
}
void SiPMParameters::StoreConfigValues(std::string key1, std::string value1)
{
//---Particle gun position---------------------------------------------------------------------------------------------------
if(key1.compare("pgpositionx") == 0)
{
particleGun_position.setX(std::stod(value1));
std::cout << "Particle Gun X position parsed from config file! Value = " << particleGun_position.getX() << std::endl;
}
else if(key1.compare("pgpositiony") == 0)
{
particleGun_position.setY(std::stod(value1));
std::cout << "Particle Gun Y position parsed from config file! Value = " << particleGun_position.getY() << std::endl;
}
else if(key1.compare("pgpositionz") == 0)
{
particleGun_position.setZ(std::stod(value1));
std::cout << "Particle Gun Z position parsed from config file! Value = " << particleGun_position.getZ() << std::endl;
}
//---Particle gun momentum----------------------------------------------------------------------------------------------------
else if(key1.compare("pgmomentumx") == 0)
{
particleGun_MomentumDirection.setX(std::stod(value1));
std::cout << "Particle Gun X momentum parsed from config file! Value = " << particleGun_MomentumDirection.getX() << std::endl;
}
else if(key1.compare("pgmomentumy") == 0)
{
particleGun_MomentumDirection.setY(std::stod(value1));
std::cout << "Particle Gun Y momentum parsed from config file! Value = " << particleGun_MomentumDirection.getY() << std::endl;
}
else if(key1.compare("pgmomentumz") == 0)
{
particleGun_MomentumDirection.setZ(std::stod(value1));
std::cout << "Particle Gun Z momentum parsed from config file! Value = " << particleGun_MomentumDirection.getZ() << std::endl;
}
//---Particle gun energy------------------------------------------------------------------------------------------------------
else if(key1.compare("pgenergy") == 0)
{
particleGun_energy = std::stod(value1);
std::cout << "Particle Gun energy parsed from config file! Value = " << particleGun_energy << std::endl;
}
//---SiPM dimensions----------------------------------------------------------------------------------------------------------
else if(key1.compare("sipmsizex") == 0)
{
sipm_Dimension.setX(std::stod(value1));
std::cout << "SiPM X size parsed from config file! Value = " << sipm_Dimension.getX() << std::endl;
}
else if(key1.compare("sipmsizey") == 0)
{
sipm_Dimension.setY(std::stod(value1));
std::cout << "SiPM Y size parsed from config file! Value = " << sipm_Dimension.getY() << std::endl;
}
else if(key1.compare("sipmsizez") == 0)
{
sipm_Dimension.setZ(std::stod(value1));
std::cout << "SiPM Z size parsed from config file! Value = " << sipm_Dimension.getZ() << std::endl;
}
//---Sscintillator------------------------------------------------------------------------------------------------------------
else if(key1.compare("scintillatorlength") == 0)
{
scintillator_length = std::stod(value1);
std::cout << "Scintillator length parsed from config file! Value = " << scintillator_length << std::endl;
}
else if(key1.compare("scintillatorradius") == 0)
{
scint_radius = std::stod(value1);
std::cout << "Scintillator radius parsed from config file! Value = " << scint_radius << std::endl;
}
//---Sscintillator------------------------------------------------------------------------------------------------------------
else if(key1.compare("xdivision") == 0)
{
x_division = std::stod(value1);
std::cout << "X division parsed from config file! Value = " << x_division << std::endl;
}
else if(key1.compare("ydivision") == 0)
{
y_division = std::stod(value1);
std::cout << "Y division parsed from config file! Value = " << y_division << std::endl;
}
//---Number of events---------------------------------------------------------------------------------------------------------
else if(key1.compare("numberofevents") == 0)
{
numberofevents = std::stod(value1);
std::cout << "Number of events parsed from config file! Value = " << numberofevents << std::endl;
}
}
void SiPMParameters::CheckValues()
{
if(x_division <= 0)
{
std::cout << "X division is at least 1, setting back the default value." << std::endl;
x_division = 1;
}
if(y_division <= 0)
{
std::cout << "Y division is at least 1, setting back the default value." << std::endl;
y_division = 1;
}
if(scint_radius*2 > sipm_Dimension.getX() || scint_radius*2 > sipm_Dimension.getY())
{
std::cout << "Scintillator diameter can not be larger than the SiPM, ";
if(sipm_Dimension.getX() < sipm_Dimension.getY())
{
scint_radius = sipm_Dimension.getX() / 2;
std::cout << "changed to " << scint_radius * 2 << std::endl;
}
else
{
scint_radius = sipm_Dimension.getY() / 2;
std::cout << "changed to " << scint_radius * 2 << std::endl;
}
}
}