Методические указания к выполнению лабораторной работы Микроскопический метод расчёта прохождения ионизирующих излучений через вещество (метод МонтеКарло, библиотека программ geant 4 )
Скачать 266 Kb.
|
) плюс имя класса. Конструктор вызывается автоматически при создании экземпляра класса, деструктор - при его уничтожении. |
#ifndef SENSITIVEDETECTOR #define SENSITIVEDETECTOR #include class G4Step; class G4TouchableHistory; |
class SensitiveDetector: public G4VSensitiveDetector { private: |
static const int channel = 1000 |
const double HIST_MAX; const double HIST_MIN; |
float Eng[channel]; int counts[channel]; public: SensitiveDetector(G4String name); SensitiveDetector(); G4bool ProcessHits(G4Step *step, G4TouchableHistory *hist); void EndOfEvent(int nEvent); }; #endif /* SENSITIVEDETECTOR */ |
#include #include #include #include"SensitiveDetector.hh" using namespace std; |
Основные свойства:
Конструктор представляет собой метод класса, который облегчает вашим программам инициализацию элементов данных класса.
Конструктор имеет такое же имя, как и класс.
Конструктор не имеет возвращаемого значения.
Каждый раз, когда ваша программа создает переменную класса, C++ вызывает конструктор класса, если конструктор существует.
Многие объекты могут распределять память для хранения информации; когда вы уничтожаете такой объект, C++ будет вызывать специальный деструктор, который может освобождать эту память, очищая ее после объекта.
Деструктор имеет такое же имя, как и класс, за исключением того, что вы должны предварять его имя символом тильды (
SensitiveDetector::SensitiveDetector(G4String name): G4VSensitiveDetector(name), HIST_MAX(25*MeV), HIST_MIN(0.025 *eV) { for(int i = 0; i<1000; i++) counts[i] = 0; } |
Основная функция этого класса — ProcessHits(). Всякий раз, когда очередной шаг моделирования попадает в объем, которому принадлежит данный SensitiveDetector, вызывается эта функция.
-
G4bool SensitiveDetector::ProcessHits(G4Step *step, G4TouchableHistory *hist)
{
Получаем кинетическую энергию частицы
-
double energy = step->GetTrack()->GetKineticEnergy();
Теперь заносим полученное значение в гистограмму. Эта задача сводится к увеличению на 1 столбца гистограммы, соответствующего данной энергии. В данном случае шкала логарифмическая
-
double bin_width = log10(HIST_MAX/HIST_MIN) / 1000;
int index = int(floor(log10(energy/HIST_MIN)/bin_width));
if(index >= 0 && index < 1000 && particleName == "neutron")
{
counts[index]++;
}
Для линейной шкалы заменятся две первые строки на
-
double bin_width = (HIST_MAX-HIST_MIN) / 1000;
int index = int(floor((energy-HIST_MIN) / bin_width));
В последнюю очередь уничтожаем данную частицу, чтобы не регистрировать ее дважды.
-
step->GetTrack()->SetTrackStatus(fStopAndKill);
return true;
}
Деструктор SensitiveDetector. Эта функция вызывается автоматически при удалении объекта, поэтому здесь удобно разместить вывод результатов в файл.
-
SensitiveDetector::SensitiveDetector()
{
В Си++ работа с файлами происходит так же, как и с экраном, через потоки. Создаем поток, вывод которого направляется в файл spectrum.csv.
-
std::ofstream file("spectrum.csv ");
Записываем в файл данные в следующем формате:
«энергия;число отсчетов»
-
int i;
double bin_width;
for (i=0;i
bin_width = log10(25000000/0.025) / (channel+1);
Eng[i] = pow(10,bin_width*i)*0.025;
file << std::setw(1) << “Energy” << “;” << “Counts” << std::endl;
for (i=0; i
{
file << std::setw(1) << Eng[i] << “;” << counts[i] << std::endl;
}
}