Главная страница
Навигация по странице:

  • SensitiveDetector.hh

  • SensitiveDetector.cc

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

  • Методические указания к выполнению лабораторной работы Микроскопический метод расчёта прохождения ионизирующих излучений через вещество (метод МонтеКарло, библиотека программ geant 4 )


    Скачать 266 Kb.
    НазваниеМетодические указания к выполнению лабораторной работы Микроскопический метод расчёта прохождения ионизирующих излучений через вещество (метод МонтеКарло, библиотека программ geant 4 )
    Анкорlab4.doc
    Дата29.08.2018
    Размер266 Kb.
    Формат файлаdoc
    Имя файлаlab4.doc
    ТипМетодические указания
    #23757
    страница3 из 4
    1   2   3   4

    1.4 Класс SenstiveDetector


    Объекты SensitiveDetector обрабатывают информацию о каждом шаге моделирования внутри области геометрии, которой они назначены.

    SensitiveDetector.hh

    #ifndef SENSITIVEDETECTOR

    #define SENSITIVEDETECTOR

    #include

    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

    #include

    #include

    #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
    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;

    }

    }



    1   2   3   4


    написать администратору сайта