آشنایی با مثال B1 در جینت4
در این پست از وب سایت پرتویار و در ادامه آموزش های تولکیت جینت4 به بحث و بررسی در مورد مثال های مختلف جینت4 می پردازیم. در صورتی که با مثال های جینت4 آشنا نیستید مطلب "آشنایی با مثال های مختلف در Geant4" را بخوانید. شما میتوانید مطالب این پست را به صورت فیلم آموزشی آشنایی با مثال B1 در کتابخوان اناره مشاهده کنید.
Table of Contents
1) آشنایی با ساختار مثال B1
پوشه مثال B1 را باز کنید . در این پوشه فایل های مختلف و دو پوشه به نام src و include وجود دارد. به ازای هر کلاسی در فولدر src نیاز به مکمل آن در فولدر Include است. در فولدر اصلی یک فایل با عنوان exampleB1.cc قرار دارد که از این به بعد به عنوان main برنامه نامیده میشود. این فایل با پسوند cc. فایل اصلیاس است که ارتباط بین اجرای برنامه را نشان خواهد داد. فولدر src و include شامل اجزای سازنده برنامه هستند. میتوان گفت اکثر تغییرات باید در کلاسهای فولدر src رخ بدهد.به ازای هر کلاسی که در فولدر src با پسوند cc وجود دارد، کلاس مشابه آن در فولدر include و با پسوند hh باید وجود داشته باشد. به این معنا که اگر در برنامهای نیاز بود کلاسی به برنامهتان اضافه کنید باید هر دو بخش در فولدرها کپی کنید.
حال به فولدر src بروید.
- اولین کلاس که B1ActionInitialization نام دارد، کلاسی است که به شما کمک خواهد کرد برنامه را به روش موازی یعنی درگیر کردن همه coreهای سیستم اجرا کنید. این روش در نسخههای 4.10 به بالا به برنامه اضافه شده است و روش MULTITHREADED مالتی ترد نام دارد.
- دومین کلاس B1DetectorConstruction نام دارد. در این کلاس اجزای سازنده شبیهسازیتان را وارد خواهید کرد. ابتدا باید یک فضا به نام جهان بسازید. سپس همه اجزای دیگر در آن قرار خواهند گرفت. به عبارت دیگر مختصات اجزای اصلی نسبت به مبدأ جهان تعریف خواهد شد. برای هر هندسهای که تعریف میکنید ابتدا باید تعیین کنید که شکل هندسی آن چیست مانند اینکه کره هست یا مکعب یا .... سپس جنس آن را باید تعیین کنید یعنی از آب ساخته شده است یا سرب یا .... سپس محل قرارگیری و جهت آن را باید نسبت به مادرش مشخص کنید.
- سومین کلاسی که در همه مثالها مشاهده خواهید کرد کلاس B1PrimaryGeneratorAction است. در این کلاس کیفیت و کمیت تابش وارد شده به هندسه مساله باید تعیین کنید. یعنی چه ذره تابشی، با چه انرژی، در چه جهتی و از کجا و چگونه بتابد.
- با تعیین هندسه مساله و نوع تابش، نیاز هست که فیزیک رخدادها نیز تعیین گردد. به این معنی که آن ذره تابشی به چه طریقی در محیط یا همان هندسه مساله ردیابی بشود. به این کلاس Physicslist میگویند. در نسخههای جدید Geant4 یعنی بالای 10 این امکان وجود دارد که شما در main برنامه بسته فیزیک لیست را معرفی کنید. در مثال B1 از یک بسته خاص فیزیک استفاده شده است. اگر به فولدر اصلی برنامه برگردید و main آن را باز کنید میتوانید فیزیک لیست تعیین شده را ببینید "QBBC". با ctrl+F به راحتی کلمات یا دستورات دلخواه را در برنامه پیدا کنید.
با تعیین شدن این سه کلاس اصلی یعنی Physicslist، PrimaryGeneratorAction و DetectorConstruction برنامه شبیهسازی شما تکمیل شده است به این معنا که با اجرای برنامه، با توجه به فیزیک تعریف شده، تابش تعریف شده در هندسه تعیین شده ردیابی خواهد شد تا جایی که با توجه به انرژی تابشی ذره و فیزیک و هندسه مساله امکان ردیابی آن باشد و همچنین تابش از محیط خارج نشده باشد.
اما یک تعداد فایل مشخص باید وجود داشته باشد که ابتدا یک به یک آنها توضیح داده می شود:
#include "B1DetectorConstruction.hh"
همان کلاس مکمل فایلتان است که در فولدر Include قرار دارد و گاهی نیاز هست تغییراتی در آن انجام داد.
#include "G4NistManager.hh"
#include "G4Material.hh"
تعریف هندسه
نیاز هست که سه بخش اصلی برای تک تک بخشهای سیستم تعریف کنید.
- هندسه و ابعاد شکل: مکعب، کره و ..
- جنس ماده سازنده: آب، هوا و...
- موقعیت هندسه در فضا: مکان و جهت هندسه در محیط
تعریف هندسه مساله
اولین بخش تعریف هندسه است. به این معنا که باید مشخص کنید حجم مورد نظرتان چه هندسه ای است و چه ابعادی دارد. برای مثال کره هست یا مکعب یا .... و اندازه ابعادش چقدر است.
با کمک دستورات زیر هندسه تعریف خواهد شد:
G4Box* solidWorld = new G4Box("World", 0.5*world_sizeXY, 0.5*world_sizeXY, 0.5*world_sizeZ);
یا
G4Trd* solidShape2 = new G4Trd("Shape2", 0.5*shape2_dxa, 0.5*shape2_dxb, 0.5*shape2_dya, 0.5*shape2_dyb, 0.5*shape2_dz);
G4Box* solidWorld یعنی از کلاس G4Box یک هندسه به نام solidWorld ساخته خواهد شد. گاهی برای برون کشی داده فقط نیاز به نام solidهندسه هست.
یا
G4Trd* solidShape2 یعنی از کلاس G4Trd یک هندسه به نام solidShape2 ساخته خواهد شد.
در خط دوم مشخصات هر هندسه تعریف میشود:
اسم کلی آن: "world" یا "Shape2"
ابعاد "world" یعنی طول و عرض و ارتفاع آن:
0.5*world_sizeXY, 0.5*world_sizeXY, 0.5*world_sizeZ
- توجه داشته باشید که معمولاْ ابعاد از مرکز هندسی شکل تعریف می شود. در اینجا شما هر کمیتی را به عنوان ابعاد وارد کنید, مکعب ساخته شده ابعاد دو برابر آن خواهد داشت.
ابعاد "Shape2" یعنی طول (کمترین و بیشترین مقدار آن) و عرض (کمترین و بیشترین مقدار آن) و ارتفاع: 0.5*shape2_dxa, 0.5*shape2_dxb, 0.5*shape2_dya, 0.5*shape2_dyb, 0.5*shape2_dz
۴ نوع هندسه می توان تعریف کرد:
- CSG (Constructed Solid Geometry) solids: G4Box, G4Tubs, G4Cons, G4Trd, …
- Specific solids (CSG like) : G4Polycone, G4Polyhedra, G4Hype, … • G4TwistedTubs, G4TwistedTrap, …
- BREP (Boundary REPresented) solids: G4BREPSolidPolycone, G4BSplineSurface, ... & Any order surface …
- Boolean solids • G4UnionSolid, G4SubtractionSolid,...
تعریف جنس ماده سازنده
ابتدا باید ماده مورد نظر را تعریف کرد و سپس مشخص کرد که آن مکعب تعریف شده از آن ماده پر شده است.
برای تعریف ماده در جینت۴ چندین روش وجود دارد. برای مثال در این روش از کتابخانه nist -در ابتدای این کلاس فرخوانی شد- موادی که قبلاْ با پیشوند G4 تعریف شده اند فراخوانی می شوند. در این مثال ماده جهان هوا در نظر گرفته شده است.
G4NistManager* nist = G4NistManager::Instance();
G4Material* world_mat = nist->FindOrBuildMaterial("G4_AIR");
G4Material* env_mat = nist->FindOrBuildMaterial("G4_WATER");
G4Material* shape2_mat = nist->FindOrBuildMaterial("G4_BONE_COMPACT_ICRU");
سپس در قسمت logic آن ماده را به هندسه ساخته شده نسبت می دهیم.
G4LogicalVolume* logicWorld = new G4LogicalVolume(solidWorld, world_mat, "World");
در این قسمت می توان حساسیت ماده و میدان الکتریکی و مغناطیسی را برای آن تعریف کرد.
به عنوان مثال دیگر B3a را ببینید که مولکولی ساخته شده است:
G4Element* O = man->FindOrBuildElement("O" , isotopes);
G4Element* Si = man->FindOrBuildElement("Si", isotopes);
G4Element* Lu = man->FindOrBuildElement("Lu", isotopes);
G4Material* LSO = new G4Material("Lu2SiO5", 7.4*g/cm3, 3);
LSO->AddElement(Lu, 2);
LSO->AddElement(Si, 1);
LSO->AddElement(O , 5);
سپس صدا زده می شود
G4Material* cryst_mat = nist->FindOrBuildMaterial("Lu2SiO5");
یا مثال B4a را ببنید که اتمی ساخته شده است که با کتابخانه nist متفاوت است:
// Liquid argon material
G4double a; // mass of a mole;
G4double z; // z=mean number of protons;
G4double density;
new G4Material("liquidArgon", z=18., a= 39.95*g/mole, density= 1.390*g/cm3);
سپس در هندسه صدا زده می شود:
G4Material* gapMaterial = G4Material::GetMaterial("liquidArgon");
تعریف موقعیت هندسه
حال باید موقعیت هندسه ساخته شده را تعیین کرد. مرکز جهان مرکز محور مختصات است و جهت خاصی را هم به آن نسبت نمی دهند زیرا معنایی ندارد. در مورد هندسه های بعدی که اجزای سازنده خواهند بود باید دقت کرد که محل شان و دروان شان (اگر وجود داشته باشد) باید نسبت به مرکز جهان و محورهای مختصات تعریف شده اولیه مشخص شود. هنگامی که هندسه ای درون هندسه ی دیگری قرار می گیرد باید دقت کرد که برای آن باید مادری تعریف کرد که آن را در بر گرفته است.
G4VPhysicalVolume* physWorld = new G4PVPlacement(0, G4ThreeVector(), logicWorld, volume "World", 0, false, 0, checkOverlaps);
برای تعریف فیزیک به ترتیب دوران، محل مرکز جسم، نام logic آن، نام کلی آن، نام مادر (اولین هندسه در بردارنده آن هندسه)، استفاده از متغیرهای بولین برای تعاریف هندسه های پیچیده تر، عدد کپی هندسه و در نهایت بررسی روی هم افتادگی تعربف خواهد شد. برای هندسه جهان دروان آن معنایی ندارد زیرا هندسه ی غیر از آن وجود ندارد. محل مرکز آن هم مرکز محور مختصات خواهد بود. اما برای هندسه های بعدی موقعیت شان باید با توجه به مرکز هندسی مادرشان تعریف شود. برای مثال شکل ۲ در هندسه دیگری به نام logicEnv قرار دارد. دقت کنید که نام logic مادر باید نوشته شود نه نام کلی آن!
new G4PVPlacement(0, pos2, logicShape2, "Shape2", logicEnv, volume false, 0, checkOverlaps);
در انتهای کلاس دتکتور باید return physWorld; وجود داشته باشد.