Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab4.doc
Скачиваний:
31
Добавлен:
12.04.2015
Размер:
272.38 Кб
Скачать

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;

Конструктор и деструктор

Среди методов класса есть два специальных, которые называются конструктором и деструктором. Имя конструктора всегда совпадает с именем класса, а имя деструктора - это тильда (~) плюс имя класса. Конструктор вызывается автоматически при создании экземпляра класса, деструктор - при его уничтожении. 

Основные свойства:

  1. Конструктор представляет собой метод класса, который облегчает вашим программам инициализацию элементов данных класса.

  2. Конструктор имеет такое же имя, как и класс.

  3. Конструктор не имеет возвращаемого значения.

  4. Каждый раз, когда ваша программа создает переменную класса, C++ вызывает конструктор класса, если конструктор существует.

  5. Многие объекты могут распределять память для хранения информации; когда вы уничтожаете такой объект, C++ будет вызывать специальный деструктор, который может освобождать эту память, очищая ее после объекта.

  6. Деструктор имеет такое же имя, как и класс, за исключением того, что вы должны предварять его имя символом тильды (~).

  7. Деструктор не имеет возвращаемого значения.

Конструктор класса 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;

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]