- •1.Теоретические положения
- •1.1. Описание экспериментальной установки
- •1.3. Описание проекта Geant4
- •1.3.1 Описание файла проекта Example_lab.Сс
- •1.3 Класс DetectorConstruction
- •Объявление класса DetectorConstruction, наследуемого от g4vUserDetectorConstruction.
- •1.4 Класс SenstiveDetector
- •1.5 Класс PhysicsList
- •1.6 Класс PrimaryGeneratorAction
- •Задания
- •3. Контрольные вопросы
- •4. Содержание отчета
- •Приложение Материалы доступные в Geant4
- •1.Простые материалы
- •2. Nist (National Institute Standarts and Technology) соединения
- •10.3. Hep материалы
1.4 Класс SenstiveDetector
Объекты SensitiveDetector обрабатывают информацию о каждом шаге моделирования внутри области геометрии, которой они назначены.
SensitiveDetector.hh
-
#ifndef SENSITIVEDETECTOR
#define SENSITIVEDETECTOR
#include<G4VSensitiveDetector.hh>
class G4Step;
class G4TouchableHistory;
Здесь объявляется класс SensitiveDetector. В данном случае он должен строить распределение выделенной энергии в детекторе. Рассчитывается гистограмма, а затем значения из ее столбцов записываются в текстовый файл, чтобы затем с ними работать в программе построения графиков вроде gnuplot, Excel или Origin.
-
class SensitiveDetector: public G4VSensitiveDetector
{
private:
Число каналов
-
static const int channel = 1000
Максимальный и минимальный пределы графика. Значения этих констант задаются в файле SensitiveDetector.cc.
-
const double HIST_MAX;
const double HIST_MIN;
Гистограмма будет записываться в массив. Массив counts – число отсчетов, массив Eng – энергии.
-
float Eng[channel];
int counts[channel];
public:
SensitiveDetector(G4String name);
~SensitiveDetector();
G4bool ProcessHits(G4Step *step, G4TouchableHistory *hist);
void EndOfEvent(int nEvent);
};
#endif /* SENSITIVEDETECTOR */
SensitiveDetector.cc
В начале все как обычно: подключаются используемые библиотечные классы.
-
#include<G4Step.hh>
#include<fstream>
#include<iostream>
#include"SensitiveDetector.hh"
using namespace std;
Конструктор и деструктор
Среди методов класса есть два специальных, которые называются конструктором и деструктором. Имя конструктора всегда совпадает с именем класса, а имя деструктора - это тильда (~) плюс имя класса. Конструктор вызывается автоматически при создании экземпляра класса, деструктор - при его уничтожении.
Основные свойства:
Конструктор представляет собой метод класса, который облегчает вашим программам инициализацию элементов данных класса.
Конструктор имеет такое же имя, как и класс.
Конструктор не имеет возвращаемого значения.
Каждый раз, когда ваша программа создает переменную класса, C++ вызывает конструктор класса, если конструктор существует.
Многие объекты могут распределять память для хранения информации; когда вы уничтожаете такой объект, C++ будет вызывать специальный деструктор, который может освобождать эту память, очищая ее после объекта.
Деструктор имеет такое же имя, как и класс, за исключением того, что вы должны предварять его имя символом тильды (~).
Деструктор не имеет возвращаемого значения.
Конструктор класса SensitiveDetector. Он принимает в качестве параметра имя, которое имеет тип G4String. При создании объекта это записывается так: new SensitiveDetector(«a name»). Кроме того здесь же инициализируются константы, задающие верхний и нижний предел на графике.
-
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<channel; 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<channel; i++)
{
file << std::setw(1) << Eng[i] << “;” << counts[i] << std::endl;
}
}