Dear all,
- I have written a method to get data from an external file in MyDetectorConstruction() class.
#include <fstream>
void MyDetectorConstruction::ReadFile(std::string fileName)
{
G4cout << "Read file: " << fileName << G4endl;
const int SZ = 100;
char buf[SZ];
//G4int GAMMAKNIFE_SOURCES = NS;
phiAngles.clear(); // If called for the second time
thetaAngles.clear(); // we won't have 402 positions...
std::ifstream ifs;
ifs.open(fileName, std::ios::in);
for (G4int i = 0; i < NS; i++)
{
G4double phi, theta;
/* Skip the "Axx" at the beginning of the line */
for (G4int c = 0; c < 4; c++) ifs.get();
ifs >> phi >> theta;
ifs.getline(buf, SZ); // Next line
phiAngles.push_back(phi * degree);
thetaAngles.push_back(theta * degree);
}
ifs.close();
G4cout << "... done " << G4endl;
}
- For convenience, I used MyDetectorMessenger class to get the filename and invoke the ReadFile() function.
MyDetectorMessenger::MyDetectorMessenger(
MyDetectorConstruction* detector)
:GammaKnifeDetector(detector)
{
GammaKnifeDetector = detector;
calorimeterDir = new G4UIdirectory("/gammaknife/");
calorimeterDir->SetGuidance("Command to modify gamma knife simulation");
calorimeterHelmetSizeCmd = new G4UIcmdWithAnInteger("/gammaknife/helmetSize", this);
calorimeterHelmetSizeCmd->SetGuidance("Set helmet size(4, 8, 14, 18)");
calorimeterHelmetSizeCmd->SetParameterName("Size", false);
calorimeterHelmetSizeCmd->AvailableForStates(G4State_Idle, G4State_PreInit);
calorimeterNumberOfSourceCmd = new G4UIcmdWithAnInteger("/gammaknife/NumberOfChannels", this);
calorimeterNumberOfSourceCmd->SetGuidance("Set number of source (1, 30)");
calorimeterNumberOfSourceCmd->SetParameterName("Number", false);
calorimeterNumberOfSourceCmd->AvailableForStates(G4State_Idle, G4State_PreInit);
loadAnglesCommand = new G4UIcmdWithAString("/gammaknife/loadAngles", this);
loadAnglesCommand->SetParameterName("String", false);
}
MyDetectorMessenger::~MyDetectorMessenger()
{
delete calorimeterDir;
delete loadAnglesCommand;
}
void MyDetectorMessenger::SetNewValue(G4UIcommand* command, G4String newValue)
{
if (command == calorimeterHelmetSizeCmd)
{
GammaKnifeDetector->SetHelmetSize(calorimeterHelmetSizeCmd->GetNewIntValue(newValue));
}
else if (command == calorimeterNumberOfSourceCmd)
{
//GammaKnifeDetector->SetNoChanels(calorimeterNumberOfSourceCmd->GetNewIntValue(newValue));
}
else if (command == loadAnglesCommand)
{
GammaKnifeDetector->ReadFile(newValue);
}
}
- But when I compile and open the GUI the program crashes and I think it cannot call the ReadFile() function and provide the information to build the geometry.
- Can anyone help me to check my source code? Thank in advance.