آموزش صفر تا صد تعریف هندسه در geant4

  • صفحه اول
  • آموزش صفر تا صد تعریف هندسه در geant4
image

آموزش صفر تا صد تعریف هندسه در geant4

هندسه در ابزار شی گرای Geant4 از تعدادی حجم تشکیل شده است که بزرگترین حجم، حجم جهانی نام میگیرد. این حجم باید همه ی حجم های تعریف شده را در بر گیرد. حجم های دیگر نیز ساخته می شوند و داخل حجم مادر قرار می گیرند. به علت سادگی، عموما حجم جهانی با استفاده از یک مکعب ساخته می شود که البته در نسخه های جدیدتر با دستورات کمتری، کره نیز به صورت ساده ای قابل تعریف است.. هر حجم با توصیف شکل و خواص فیزیکی اش تعریف شده و سپس داخل حجم در بر گیرنده اش قرار داده می شود. حجم در بر گیرنده را حجم مادر و حجم قرار داده شده در حجم مادر را حجم دختر مینامند.

مختصات دختر نسبت به مبدأ مختصات مادر سنجیده میشود. به منظور توصیف شکل یک حجم، از مفهوم solid استفاده میشود که یک شیء هندسی با شکل مشخص و ابعاد معین می باشد. یک مکعب و یا یک کره نمونه هایی از یک solid هستند. به منظور توصیف خواص کامل یک حجم مشخص از مفهوم حجم منطقی استفاده می نماییم. این حجم شامل اطلاعاتی از جمله خواص هندسی شکل ها و خواص فیزیکی مانند ماده ی تشکیل دهنده ی حجم، میدان مغناطیسی، حجم حساس آشکارساز و ... می باشد. در نهایت با استفاده از مفهوم حجم فیزیکی، میتوان این حجم منطقی ساخته شده را نسبت به حجم دربردارنده موقعیت داد.

ساخت یک حجم ساده

برای ساخت یک حجم ساده باید، یک شکل هندسی تعریف شود. سپس یک حجم منطقی با استفاده از این شکل ساخته شده و به آن ویژگی هایی نسبت داده شود. با استفاده از حجم فیزیکی به این حجم منطقی ساخته شده مختصات نسبت داده شود.

انتخاب یک شکل ساده برای توضیح ، یک مکعب به عنوان مثال تعریف می شود. برای تعریف یک مکعب باید ابتدا یک نام برای آن مشخص شده و سپس ابعاد آن معین شود:

1.       G۴double box_x = ۰۱.*cm;

2.       G۴double box_y = ۰۱.*cm;

3.       G۴double box_z = ۰۱.*cm;

4.       G۴Box* SolidBox = new G۴Box(“Box”, box_x, box_y, box_z);

5.        

 در خطوط ۱تا ۳، سه متغیر برای تعریف ابعاد مکعب تعریف و مقداردهی شده اند. بدین ترتیب که طول مکعب در هر یک از سه راستا از ۱۰- تا ۱۰ سانتی متر گسترش یافته، لذا مکعبی به طول ضلع ۲۰ سانتی متر ساخته می شود. پس از تعریف متغیر های فوق شیای به نام SolidBox از روی کلاس Box4G و با

تخصيص حافظه ی پویا ساخته می شود. در ادامه، سازنده ی این کلاس فراخوانی می شود. آرگومان های تابع سازنده به ترتیب عبارتند از نام انتخاب شده برای شکل مورد نظر و نصف ابعاد مکعب در هریک از راستاها بر اساس مختصات کارتزین.

برای تعریف یک استوانه (به صورت استوانه ی کامل و یا برشی از آن نیز باید به این صورت عمل کرد:

 

1.      G۴double innerRadius = ۰.*cm;

2.      G۴double outerRadius = ۰۶.*cm;

3.      G۴double hz = ۵۲.*cm;

4.      G۴double startAngle = ۰.*deg;

5.      G۴double spanningAngle = ۰۶۳.*deg;

6.      G۴Tubs* SolidTube = new G۴Tubs(“Tube”, innerRadius, outerRadius, hz, startAngle, spanningAngle);

 

در خطوط اول تا پنجم، ۵ متغیر به ترتیب برای تعریف شعاع داخلی، شعاع خارجی، ارتفاع، زاویه ی اولیه و زاویه ی نهایی تعریف شده است. در خط ۶ شی ای به نام SollidTube از روی کلاس پایه ی Tubs4G ساخته می شود. در ادامه، سازنده ی کلاس Tubs4G فراخوانی شده و آرگومان های آن که عبارتند از نام، شعاع داخلی، شعاع خارجی، ارتفاع، زاویه ی اولیه و زاویهی خمش قرار داده میشوند.

تعریف حجم منطقی

برای تعریف یک حجم منطقی باید برای شکل ساخته شده، ماده ای مشخص کرد. به عنوان مثال در بخش قبل، شکل مکعب ساخته شد. با استفاده از این شکل و تخصیص ماده ای به نام آرگون به آن می توان به صورت زیر یک حجم منطقی را تعریف نمود:

G۴LogicalVolume* LogicBox = new G۴LogicalVolume(SolidBox, Ar, “Box(;

در ابتدا شی ای به نام LogicBox، از روی کلاس LogicalVolume4G ساخته می شود و با فراخوانی تابع سازنده، به این شیه مقداردهی می شود. آرگومان های تابع سازنده عبارتند از شیهای از شکل مورد نظر که در قسمت قبل از روی Box4G ساخته شد، ماده ای که به آن تخصیص داده شده و آرگومان آخر نیز نامی است که برای حجم منطقی مورد نظر تعریف می شود.

موقعیت دادن به حجم ها

برای موقعیت دادن به یک حجم، از حجم منطقی شروع کرده و سپس باید مشخص کرد که این حجم داخل کدام حجم قرار می گیرد. پس از آن مرکز این حجم نسبت به موقعیت حجم مادر مشخص شده و در صورت نیاز به چرخش، آن را چرخاند. حال بر اساس این مفروضات، یک حجم فیزیکی تعریف خواهد شد.

تعریف حجم فیزیکی

پس از ساخت یک حجم منطقی باید یک حجم فیزیکی تعریف نمایید. حجم فیزیکی به طور ساده عبارت است از حجم منطقی موقعیت داده شده. این حجم فیزیکی باید داخل حجم منطقی مادر قرار بگیرد.

G۴VPhysicalVolume* PhysBox = new G۴PVPlacement (۰, G۴ThreeVector(),

LogicBox, “Box”, WorldLog, false,(; ۰

 

همانطور که نشان داده شده است، ابتدا شی ای به نام PhysBox از روی کلاس VphysicalVolume4G ساخته می شود و با استفاده از PVPlacement4G به این شیء موقعیت داده می شود.

 آرگومان های PVPlacement4G عبارتند از:

آرگومان اول: به منظور تعریف چرخش لحاظ شده است که در صورت عدم چرخش صفر منظور می شود.

آرگومان دوم ()ThreeVector4G: به منظور انتقال حجم مورد نظر نسبت به مبدأ مختصات حجم مادر تعریف می شود. در صورتی که انتقال نداشته باشیم، ThreeVector4G آرگومان نخواهد داشت.

آرگومان سوم: نام حجم منطقی که باید به آن موقعیت داده شود، میباشد.

آرگومان چهارم: نام حجم فیزیکی حاصل می باشد.

آرگومان پنجم: نام حجم منطقی مادر حجم مورد نظر می باشد.

آرگومان ششم: در صورتی مقدار می گیرد که از اعمال بولی استفاده شود و در غیر این صورت false خواهد بود. اعمال بولی در ادامه بحث خواهند شد.

آرگومان آخر: شماره ی کپی حجم منطقی می باشد. در صورتی که فقط یک کپی از روی حجم منطقی ساخته شود، این آرگومان صفر خواهد بود.

تعريف چرخش در ابزار شیء گرای 4Geant

ماتریس چرخش که به حجم فیزیکی نسبت داده می شود، نمایشی از چرخش سیستم مرجع دختر نسبت به سیستم مختصات مادر می باشد. برای چرخش یک حجم نسبت به سیستم مختصات مادر باید به این صورت عمل کرد:

1.       G۴RotationMatrix* rot = new G۴RotationMatrix();

2.       rot->rotateX(۰۲.*deg);

3.       rot->rotateY(۵۴.*deg);

4.       rot->rotateZ(۰۹.*deg);

 

در خط اول ابتدا شی ای به نام rot از روی کلاس RotationMatrix4G و به صورت اشاره گر ساخته می شود. در خطوط بعدی با استفاده از این شی، توابع rotateY rotateX و rotateZ فراخوانی می شوند که آرگومان های این توابع، زاویه چرخش سیستم مختصات دختر نسبت به سیستم مختصات مادر می باشد. در نهایت شیء rotساخته شده، آرگومان اول PVPlacement4G خواهد بود که در قسمت قبل توضیح داده شد.

تعریف انتقال

برای تعریف انتقال یک حجم نسبت به حجم مادر آن، باید از تابع کلاسی () ThreeVector4G استفاده نموده و آرگومان های آن را مقداردهی کرد. به عنوان مثال، برای قراردادن حجم دختر در موقعیت ۲۰ سانتیمتری محور Z، از ThreeVector4G به این صورت استفاده می شود:

G۴ThreeVector(۰.*cm, ۰.*cm, ۰۲.*cm(;

 

راه دیگر این است که شی،ای از روی کلاس ThreeVector4G ساخته شده و این شیء به عنوان آرگومان دوم PVPlacement4G در نظر گرفته شود:

G۴double x, y, z;

G۴ThreeVector pos = G۴ThreeVector(x = ۵.*cm, y = ۰۱.*cm, z = ۵۱.*cm(;

 

بدین ترتیب شی، pos ساخته میشود. با فراخوانی تابع سازنده، به حجم دختر نسبت به حجم مادر موقعیت داده می شود.

برنامه ی ساخت یک مکعب داخل حجم جهانی

با استفاده از مفاهیمی که تاکنون بررسی شده است به پیاده سازی هندسه ی یک مکعب داخل حجم جهانی میپردازیم. در قسمت include برنامه یک سند به نام EXDetectorConstruction.hh با محتوای زیر ساخته میشود:

1.      #ifndef EXDetectorConstruction_h

2.      #define EXDetectorConstruction_h

3.      #include “G۴VUserDetectorConstruction.hh

4.      class G۴LogicalVolume;

5.      class G۴VPhysicalVolume;

6.      class EXDetectorConstruction : public G۴VUserDetectorConstruction

7. {

8.      public:

9.      EXDetectorConstruction();

10.   virtual ~EXDetectorConstruction();

11.   G۴VPhysicalVolume* Construct()

12. };

13. #endif

توضیح محتويات EXDetectorConstruction.hh به این شرح است:

کلاسی به نام EXDetectorConstruction ساخته شده است. در خطوط او ۲، هسته ی 4Geant بررسی میکند که آیا این کلاس هم نام کلاس پایه هست یا نه. در صورتی که همنام نباشند این کلاس قابل تعریف خواهد بود. در خط ۳، فایل سرآیند VUserDetectorConstruction ۴G تعریف شده است که کلاس های مورد نیاز برای ساخت آشکارساز از این کلاس پایه مشتق میشوند. در خط ۴، کلاسی برای تعریف حجم منطقی و در خط ۵، کلاسی برای تعریف حجم فیزیکی بیان شده اند. خط ۶ نشان دهنده ی مفهوم توارث می باشد.

کلاس تعریف شده  XDetectorConstruction با کنترل دستیابی public از کلاس پایه ی VuserDetectorConstruction4G ارث بری میکند و یا از آن مشتق شده است. در خط ۹، تابع ()EXDetectorConstruction به عنوان سازندهی کلاس مورد نظر، اعلان شده و در خط ۱۰، تابع مخرب اعلان شده است که هر دو به صورت عمومی اعلان شده اند. در خط ۱۱ نیز تابع () Construct اعلان شده است که وظیفه ی آن ساخت هندسه ی آشکارساز و مواد آن میباشد. همانطور که مشخص شده است این تابع شی ای را برمیگرداند که به حجم منطقی اشاره میکند و از نوع آن می باشد. سپس در قسمت Src برنامه باید سندی، به نام EXDetectorConstruction.cc با محتویات زیر ساخته شود:

1.       “include “EXDetectorConstruction.hh”

2.       “include “G۴NistManager.hh"

3.       “include “G۴LogicalVolume.hh"

4.       “include “G۴PVPlacement.hh"

5.       “include “G۴VPhysicalVolume.hh"

6.       “include “G۴Box.hh"

7.       nclude “G۴SystemOfUnits.hh"

8.       EXDetectorConstruction::EXDetectorConstruction()                                             : G۴VUserDetectorConstruction()

9. {}

10. EXDetectorConstruction::~EXDetectorConstruction()

11. {}

12. G۴VPhysicalVolume* EXDetectorConstruction::Construct()

13. {

14.   G۴NistManager* nist = G۴NistManager::Instance();

15.   G۴Material* mat = nist->FindOrBuildMaterial(“G۴_Ni");

16.   G۴Box* SolidWorld = new G۴Box(“World”, ۱.*m, ۱.*m, ۱.*m);

17.   G۴LogicalVolume* LogicWorld = new G۴LogicalVolume(SolidWorld, mat, “World");

18.   G۴VPhysicalVolume*           PhysWorld        =       new        G۴PVPlacement(۰,

G۴ThreeVector(), LogicWorld, “World”,۰,false, ۰);

19.   G۴Box* SolidBox = new G۴Box(“Box”, ۰.۵*m, ۰.۵*m, ۰.۵*m);

20.   G۴LogicalVolume* LogicBox = new G۴LogicalVolume(SolidBox, mat, “Box");

21.   G۴VPhysicalVolume*            PhysBox          =         new         G۴PVPlacement(۰,

G۴ThreeVector(), LogicBox, “Box”, LogicWorld,false, ۰);

22.   return PhysWorld;

23. }

 

در خطوط ۱ تا ۷، فایلهای سرآیند مورد نیاز برای ساخت آشکارساز بیان شده اند. سرآیند اول نام سندی است که در قسمت include ساخته شده بود و اسم آن EXDetectorConstruction.hh میباشد. سرآیند بعدی (خط ۲ NistManager۴G می باشد. علت استفاده از این سرآیند تعریف مواد مورد نیاز برای شبیه سازی با استفاده از پایگاه دادهی داخلی 4Geant است (اختیاری است).

در خطوط ۳ و ۴ و ۵ به منظور استفاده از ویژگی های حجم منطقی و حجم فیزیکی باید از سرآیندهای مشخص شده، استفاده نمود. در صورت استفاده از هر شکلی در ابزار شی گرای 4Geant، باید سرآیند آن مشخص شود. به عنوان مثال، در خط ۶، چون باید مکعب ساخته شود، سرآیند BoxfG مشخص شده است. در صورت استفاده از یکاهایی مثل متر، سانتی متر، ثانیه و غیره باید سرآیند خط ۷ نیز مشخص شود. در خط ۸، تابع مشتق فراخوانی شده است و در خط ۹ سازندهی کلاس پایه بیان شده است.

همانطور که در خط ۱۰ نشان داده شده است، بدنه ی تابع سازنده خالی می باشد. در خط ۱۱، تابع مخرب فراخوانی شده که بدنه ی این تابع نیز خالی میباشد (خط ۱۲). در خط ۱۳ ، تابع() Construct با استفاده از نام کلاس فراخوانی میشود که وظیفه ی این تابع ساخت هندسه ی آشکار ساز و مواد مورد نیاز برای شبیه سازی میباشد. در خطوط ۱۵ و ۱۶، ماده ی نیکل با استفاده از پایگاه دادهای داخلی 4Geant ساخته شده است. خطوط ۱۷، ۱۸ و ۱۹ به ترتیب مربوط به تعریف شکل، حجم منطقی و حجم فیزیکی میباشند. در خط ۱۷ شی ای به نام SolidWorld از روی کلاس Box4G ساخته شده است که نشان دهنده ی مکعبی با ابعاد ۲ متر می باشد. در خط ۱۸ نیز شیء LogicWorld ساخته میشود که نشاندهنده ی حجم منطقی ای می باشد که اکنون دارای شکلی مکعبی بوده و از ماده ی نیکل تعریف شده است و نام آن Box است. در خط ۱۹ نیز شیء PhysWorld ساخته میشود که از نوع حجم فیزیکی میباشد و همانطور که از آرگومانهای سازنده برمی آید هیچ چرخش و انتقالی برای این حجم تعریف نشده است. آرگومان پنجم PhysWorld صفر است که نشان میدهد این حجم، حجم مادر ندارد و لذا حجم جهانی میباشد. خطوط ۲۰ تا ۲۲ نیز برای تعریف یک مکعب داخل حجم جهانی تعریف میشوند. در خط ۲۰، مکعبی به ابعاد یک متر تعریف شده است و در خط ۲۲ نیز شیء PhysBox تعریف شده است که آرگومان پنجم PVPlacement4G شیء PhysWorld میباشد که نشان میدهد این شی، حجم مادر مکعبی میباشد که تعریف نمودیم. در خط ۲۳ نیز این تابع شی، PhysWorld که از نوع حجم فیزیکی میباشد را برمیگرداند.