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

1.3 Класс DetectorConstruction

Геометрические характеристики моделирования в GEANT4 задаются через класс G4VUserDetectorConstruction. Чтобы сделать это, необходимо определить класс, наследующий G4VUserDetectorConstruction и определить в нем функцию Construct(), которая будет автоматически вызвана на этапе инициализации.

Объявление класса DetectorConstruction находится в файле DetectorConstruction.hh.

В начале файла находится так называемый include guard, необходимый во всех заголовочных файлах.

#ifndef DetectorConstruction_h

#define DetectorConstruction_h 1

Подключение заголовочных файлов GEANT4. В GEANT4 используется следующее соглашение: каждый класс объявляется в отдельном файле, и имя файла совпадает с именем класса. Файл globals.hh содержит физические константы и т. п.

#include<globals.hh>

#include<G4VUserDetectorConstruction.hh>

#include<G4VSolid.hh>

#include<G4LogicalVolume.hh>

#include<G4VPhysicalVolume.hh>

#include<G4Material.hh>

Объявление класса DetectorConstruction, наследуемого от g4vUserDetectorConstruction.

class DetectorConstruction : public G4VUserDetectorConstruction

{

Открытые члены класса DetectorConstruction. В Си++ бывает три уровня доступа к членам класса:

  • public, когда любой код может обратиться к данному члену (изменить

или прочитать значение переменной или вызвать функцию-член);

  • private: когда только функции данного класса могуть обращаться

к данному члену;

  • protected: когда к данному члену могут обращаться функции

данного класса и классов, наследованных от данного.

Далее идет объявление конструктора и деструктора класса DetectorConstruction — функций, которые автоматически вызываются при создании и уничтожении объекта. В частности, если конструктор будет объявлен закрытым (private или protected), то создать объект будет невозможно.

public:

DetectorConstruction();

~DetectorConstruction();

Функция Construct заключает в себе основную функциональность класса DetectorConstruction. Она создает геометрию и материалы.

G4VPhysicalVolume* Construct();

protected:

Также объявляется защищенная переменная-указатель на World. Она будет проинициализированна позднее.

В конце объявления каждого класса по правилам синтаксиса Си++ должна стоять точка с запятой.

};

#endif

Определение объявленного в файле DetectorConstruction.hh класса DetectorConstruction находится в файле DetectorConstruction.c

DetectorConstruction.cc

Создание материалов выглядит следующим образом:

G4Element* elH = new G4Element(“Hydrogen”,”H”,1,1.01*g/mole);

G4Element* elC = new G4Element(“Carbon”,”C”,1,12.01*g/mole);

C14H12 = new G4Material(“C14H12”,1.16*g/cm3,2);

C14H12->AddElement(elC,14);

C14H12->AddElement(elH,12);

В приведённом коде создается элемент с именем Hydrogen и символом H, с атомным числом (эффективным зарядом) 1 и молярной массой 1.01 г/моль. Аналогично для углерода. Затем создается материал с именем C14H12, плотностью 1.16 г/см3, состоящий из 2-х компонент: 12-ти элементов водорода и 14-ти элемента углерода.

Но есть и другой, более простой, способ задания материалов. Geant4 уже содержит базу данных по большому количеству материалов. Получить материал из этой базы можно следующим образом:

G4Material* Water = G4NistManager::Instance() -> FindOrBuildMaterial("G4_WATER");

В начале всех материалов из базы Geant4 содержится префикс G4_

Геометрия системы описывается в Geant4 в виде иерархии тел. Наибольшее тело называется Мировым (World) и содержит все остальные тела геометрии. Тело содержащее в себе другие тела называется материнским.

Описание тела состоит из задания его типа (параллелепипед, цилиндр, сфера, ...) и размеров, материала из которого оно состоит, материнского тела и координат относительно материнского тела.

Пример описания параллелепипеда:

Параллелепипед с полуразмерами сторон вдоль осей X, Y и Z в 1 м. (Длина грани будет 2м)

G4Box* world = new G4Box("world", 1*m, 1*m, 1*m);

Заполняем его материалом “G4_Galactic” (Вакуум)

G4LogicalVolume* logicworld = new G4LogicalVolume(world, “G4_Galactic”, "world");

И помещаем в центр координат.

G4VPhysicalVolume* physicworld = new G4PVPlacement(0, G4ThreeVector(), logicworld, "world", 0, false, 0);

Создадим мишень:

G4Box *Tgt = new G4box(“Tgt”, 50*mm, 50*mm, 10*mm);

G4LogicaVolume *logicTgt = new G4LogicaVolume(Tgt, G4NistManager::Instance() -> Find0BuildMaterial(“G4_POLYETHYLENE”),”Tgt”);

G4PVPlacement *physiTgt = new G4PVPlacement(0,G4ThreeVector(0,0,0), ”Tgt”, logicworld, false, 0);

Логический объем G4LogicalVolume содержит информацию о материале и магнитных свойствах среды. В данном случае никаких магнитных свойств нет.

Физический объем G4PVPlacement содержит информации о положении объекта относительно материнского, то есть World.

Выше задана мишень в виде параллелепипеда с размерами 100мм*100мм*20мм, заполненная полиэтиленом, расположенная в центре Мирового объема.

Функция G4ThreeVector(x, y, z) задает положение в пространстве заданного тела.

Создадим объем для детектора.

G4Box *Det = new G4box(“Det”, 50*mm, 50*mm, 10*mm);

G4LogicaVolume *logicDet = new G4LogicaVolume(Det, G4NistManager::Instance() -> Find0BuildMaterial(“G4_POLYETHYLENE”),” Det”);

G4PVPlacement *physiDet = new G4PVPlacement(0, G4ThreeVector(0,0,0), ”Tgt”, logicworld, false, 0);

Первый параметр отвечает за поворот тела относительно оси вращения.

Для того чтобы детектор реагировал на пролет частиц, он должен быть назначен так называемой чувствительной областью. Для этой цели в G4LogicalVolume есть специальное поле SensitiveDetector, которое содержит указатель на объект класса G4VSensitiveDetector. Этот объект автоматически вызывается каждый раз, когда очередной шаг моделирования частицы попадает внутри данного объема. Соответствующим образом программируя класс SensitiveDetector можно получать выходные данные моделирования.

SensitiveDetector *detector = new SensitiveDetector(“detector”);

Объект SensitiveDetector должен быть зарегистрирован в G4SDManager.

G4SDManager* SDman = G4SDManager::GetSDMpointer();

SDman->AddNewDetector(detector);

Здесь SensitiveDetector сопоставляется полиэтиленовому детектору.

logicDet->SetSensitiveDetector(detector);

Стенки объекта World делаются прозрачными, чтобы не мешали на визуализации.

world->getLogic()->SetVisAttributes (G4VisAttributes::Invisible);

Чтобы закрасить цветом какой-либо объект необходимо поступить следующим образом.

G4VisAttributes* mycolor = new G4VisAttributes(G4Colour(0.0, 0.0, 0.0));

logicDet ->SetVisAttributes (mycolor);

Функция G4Colour(0.0, 0.0, 0.0) позволяет установить цвет.

0 0 0 соответствует черному цвету, 1 1 1, соответствует белому цвету.

В конце концов успешно выполнившаяся функция Construct должна возвратить указатель на физический объем объекта World.

return world->getPhysic();

}

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