geant4運行例子_Geant4--一次編譯,運行多個Run,極大提升模擬效率

文|梁佐佐

應唐光毅博士/后之約,對于Geant4模擬,我們看是否能解決這么一個問題:我現在想模擬探測器不同角度下的響應,每次模擬需要/run/beamOn 100, 可是我真的不想一遍一遍的去http://DetectorConstruction.cc中修改幾何放置角度,然后編譯完怒敲exampleB1 run1.mac;或者,我想只編譯運行一次G4就可以跑幾百次/run/beamOn 100 且需要每次Run的時候射線源的出射位置、能量等參數不同?

這么機智的事情,有助于解決做模擬會哭的問題。讓我們開始吧!

以G4中的basic/B5 例子為基礎,我們現在要模擬第一個場景:

a. 設置一個探測器,繞Y軸可設置不同的旋轉角度θ,θ范圍為0°-45°,分別 間隔5°采樣一次;

b. 射線源在每個角度下/run/beamOn 100;

c. 要求得到每個角度下探測器探測到的計數,可以認為此目的是對比探測器在不同射線入射角度下的探測效率;

d. 總共10個角度,定義一個輸出文件,總共輸出10個數值,代表不同角度下的測得計數。

11bd6f7d6b7366565276d6bc8cd34dc4.png

以G4中的basic/B5 例子為基礎,我們可以分以下幾步實現上述場景:

1.定義宏命令/B5/detector/armAngle X deg 用以在*.mac文件中設置探測器角度,B5中,這是現成的!

2.關鍵點——定義一個loop.mac 和一個angle.mac

2.1 loop.mac

/run/initialize

/gun/particle gamma

/gun/energy 611.7 keV

/control/loop angle.mac angle 0.0 45.1 5.0

## 0.0 45.1 5.0 表示從0.0°開始,每間隔5.0°賦予一次數值,到小于45.1為止,和for循環很像

2.2 angle.mac

/B5/detector/armAngle {angle} deg

/run/beamOn 100

3.在http://SteppingAciton.cc中累積每個Event的能量沉積(需要在B5例子中添加SteppingAciton函數,可仿照B1),在http://B5EventAction.cc中抽取計數信息并輸出文件。

4.運行exampleB5 loop.mac 大功告成!

那么Geant4中具體應該怎樣實現?以B5例子為依托,上代碼!

第1步:

http://B5DetectorConstruction.cc中給出了怎樣通過UI命令調整探測器臂角度的事例:

B5DetectorConstruction::B5DetectorConstruction(): G4VUserDetectorConstruction(),fMessenger(nullptr),fHodoscope1Logical(nullptr), fHodoscope2Logical(nullptr),fWirePlane1Logical(nullptr), fWirePlane2Logical(nullptr),fCellLogical(nullptr), fHadCalScintiLogical(nullptr),fMagneticLogical(nullptr),fVisAttributes(),fArmAngle(30.*deg), fArmRotation(nullptr),
fSecondArmPhys(nullptr)
// fArmAngle參數就是要改變的角度θ
{fArmRotation = new G4RotationMatrix();fArmRotation->rotateY(fArmAngle);
// fArmRotation為改變探測器角度的實際“參數”
//define commands for this class
DefineCommands();
// DefineCommands()這個函數放在初始化列表中就是為了通過UI命令直接定義初始化
//B5DetectorConstruction.cc,毫無疑問,DefineCommands()中一定是
//定義了有關fArmAngle怎樣改變探測器角度的方法
}
//~~~~~~~~~~~~~~~~~~~~////second armauto secondArmSolid    =new G4Box("secondArmBox",2.*m,2.*m,3.5*m);auto secondArmLogical  =new G4LogicalVolume(secondArmSolid,air,"secondArmLogical");auto x = -5.*m * std::sin(fArmAngle);auto z = 5.*m * std::cos(fArmAngle);fSecondArmPhys  =new G4PVPlacement(fArmRotation,G4ThreeVector(x,0.,z),secondArmLogical,"fSecondArmPhys",worldLogical,false,0,checkOverlaps);
// fSecondArmPhys就是我們要放置的“探測器”,它的旋轉角度以及三維位置都是由
//fArmAngle直接決定
//~~~~~~~~~~~~~~~~~~~~~~~~~//
void B5DetectorConstruction::SetArmAngle(G4double val)
{if(!fSecondArmPhys) {G4cerr << "Detector has not yet been constructed."<< G4endl;return;}fArmAngle = val;*fArmRotation = G4RotationMatrix(); // make it unit vector
fArmRotation->rotateY(fArmAngle);
//fArmRotation為探測器的角度設置auto x = -5.*m * std::sin(fArmAngle);auto z = 5.*m * std::cos(fArmAngle);fSecondArmPhys->SetTranslation(G4ThreeVector(x,0.,z));
//fSecondArmPhys->SetTranslation(…)為探測器的位置設置
//tell G4RunManager that we change the geometryG4RunManager::GetRunManager()->GeometryHasBeenModified();
}
//SetArmAngle()這個函數確實也應該包含在DefineCommands()中,借以實際改變探測角度及位置//~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
void B5DetectorConstruction::DefineCommands()
{//Define /B5/detector command directory using generic messenger classfMessenger = new G4GenericMessenger(this,"/B5/detector/","Detector control");//armAngle commandauto& armAngleCmd=
fMessenger->DeclareMethodWithUnit("armAngle","deg",&B5DetectorConstruction::SetArmAngle,"Set rotation angle of the second arm.");armAngleCmd.SetParameterName("angle", true);armAngleCmd.SetRange("angle>=0. && angle<180.");armAngleCmd.SetDefaultValue("30.");
}
// DefineCommands()作為調整探測器角度位置的核心函數,定義了一個可以在*.mac中調用的命令,
// /B5/detector/armAngle 10 deg 表示將fArmAngle設置為10°,相應的探測角度和位置也與之對應改變

第2步:

設置loop.mac 和angle.mac,略

第3步:

1)http://SteppingAction.cc中設置

//判斷當前step位于探測器幾何中。。。。。。

G4double edep = aStep->GetTotalEnergyDeposit();
theEvent->AddEdep(edep);

//將edep累加給fEdep,fEdep為每個Event沉積的總能量,在http://EventAction.cc中需要放在BeginOfEventAction(const G4Event* aEvent)中初始化。

2) EventAction.hh和http://EventAction.cc設置

在EventAction.hh中設置私有變量 realcounts=0 和tempcouts=0。注意這兩個變量不能放在BeginOfEventAction()中初始化。具體的用法如下:

void EventAction::EndOfEventAction(const G4Event* aEvent)
{
if(fEdep>0.0) realcounts++;
G4long event_id = aEvent->GetEventID()+1;
fstream datafile;
if((event_id) % 100 == 0) {
G4cout<<"Event"<<event_id<<" is over"<<G4endl;
datafile.open("outputcounts.xls",ios::out|ios::app);
G4int outcounts=realcounts-tempcounts;
datafile <<outcounts<<G4endl;
tempcounts = realcounts;
datafile.close();
}
//關鍵部分,每跑100個粒子輸出一次探測器計數

第4步:

make - -> exampleB5 loop.mac 即可。

總結:

通過 /control/loop 配合UI改變角度參數進而一次性運行多次Run,每次Run對應的角度參數不同,在EventAction中設置輸出參數,realcounts=0 和tempcouts=0需要放置在EventAction.hh中初始化,tempcouts總是等于上一次Run之后的realcounts數值,巧妙利用EventID識別第幾次Run完結,作為輸出計數和文件的節點。

第二個場景:

跑幾百次Run,每次Run的射線源位置或者屬性不同。

第1步:

void MYPrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent)
{
const G4Run *nowrun=G4RunManager::GetRunManager()->GetCurrentRun();
G4int runid=nowrun->GetRunID();
//此時,runid就是一個反映當前第幾個Run的變量,以每次Run100個粒子為例,也可通過設置int(eventID/100)來替代runid,二者等價
G4int posx,posy,posz;
posx=int(floor(runid/64));
posy=int(floor((runid%64)/8));
posz=int(floor((runid%64)%8));
particleGun->SetParticlePosition(G4ThreeVector((posx-3.5)*3.2*mm,(posy-3.5)*3.2*mm,(posz-3.5)*3.2*mm));
}

第2步:

定義一個loop.mac

/run/initialize

/control/loop rungun.mac 0 1 512

##總共跑512次,0-511

定義一個rungun.mac

/run/beamOn 100

第3步:

同場景1一樣,略。

第4步:

Make - -> exampleMY loop.mac 大功告成!

大總結:

/control/loop用好這個命令,助力G4模擬效率提升。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529104.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529104.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529104.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python3.7基礎教程_關于本教程 |《Python 官方文檔:入門教程 3.7.0》| Python 技術論壇...

本文檔最新版為 3.8&#xff0c;舊版本可能放棄維護&#xff0c;推薦閱讀最新版&#xff01; Python 入門教程 Python 是一門簡單易學且功能強大的編程語言。它擁有高效的高級數據結構&#xff0c;并能夠用簡單又有效的方式進行面向對象編程。Python 優雅的語法和動態類型&…

android listview countdowntimer,Android-ListView中的CountDownTimer隨機閃爍

我正在使用計時器制作列表視圖&#xff0c;每個計時器都有不同的截止日期&#xff0c;具體取決于數據庫(類似于拍賣)Time now new Time();now.setToNow();now.normalize(true);nowMillis now.toMillis(true);..String endtime a.get(position).get(TAG_ENDTIME);Integer tim…

echart實現3d地圖_3D飛線效果——讓線“飛”起來的秘密

在城市規劃、統計、交通等行業&#xff0c;地圖可視化已成為最直接也最吸引眼球的一種表達方式。例如人群遷徙、人口流動、OD出行、職住分析、客流來源等眾多場景都需要用到飛線效果呈現。2D飛線效果圖隨著可視化技術的進一步發展&#xff0c;傳統的2D飛線效果略顯單調&#xf…

ad域管理與維護_在NAS SMB卷上使用VisualSVN Server維護代碼庫

VisualSVN Server[1] 是 Windows 平臺上流行的 SVN 形式的代碼管理工具。以下我們將介紹把 NAS SMB 卷作為 VisualSVN 代碼庫存儲中心時會遇到的幾個問題以及相應的解決方法。1. 安裝錯誤的解決方法我們以 VisualSVN Server 3.3.1 版本為例&#xff0c;在安裝 VisualSVN Server…

android 開發art,Android應用開發之Android 系統啟動原理(art 虛擬機)

本文將帶你了解Android應用開發之Android 系統啟動原理(art 虛擬機)&#xff0c;希望本文對大家學Android有所幫助。Android 系統啟動原理(art 虛擬機)一、虛擬機的啟動Android 是一個 Linux 的虛擬機&#xff0c;當虛擬機啟動的時候&#xff0c;會執行手機根目錄下的 init.r…

電腦文件夾可以分屏的軟件_電腦上什么便簽軟件可以添加音頻?

提及便簽&#xff0c;很多人都會很自然地想到手機便簽。這是因為隨著智能手機和移動互聯網的發展&#xff0c;現在很多手機上都有了系統自帶的便簽app。其實&#xff0c;除了手機便簽外&#xff0c;還有電腦便簽呢&#xff01;這不&#xff0c;Win7及其以上版本的電腦上還有系統…

jsp form提交到后臺中文亂碼_JSP與servlet之間的數據傳遞

【51】Jsp與Servlet之間的傳值有兩種&#xff0c;一種是Jsp傳值給Sevlet&#xff0c;另一種是Servlet傳值給Jsp&#xff1b;使用request、response對象完成傳值&#xff0c;具體實現如下&#xff1a;Jsp與Servlet之間的傳值有兩種&#xff0c;一種是Jsp傳值給Sevlet&#xff0c…

android jni 中jnienv,android JNI中JNIEnv類型和jobject類型的解釋

JNIEXPORT void JNICALL Java_com_jni_demo_JNIDemo_sayHello (JNIEnv *env, jobject obj){cout<}對於這個方法參數中的JNIEnv* env參數的解釋:JNIEnv類型實際上代表了Java環境&#xff0c;通過這個JNIEnv* 指針&#xff0c;就可以對Java端的代碼進行操作。例如&#xff0c;…

yang模型中rpc_領域驅動模型(DDD)設計講解

一. 什么是領域驅動模型(DDD)&#xff1f;領域驅動模型一種設計思想&#xff0c;我們又稱為DDD設計思想。是一種為了解決傳統設計思想帶來的維護困難&#xff0c;溝通困難和交互困難而產生的一種新的思想。也解決了在部分公司中&#xff0c;一個項目組就是一套服務&#xff0c;…

鴻蒙系統操作界面跟蘋果很像,鴻蒙手機UI界面曝出!圖標擬物化、操作邏輯近似蘋果iOS13...

原標題&#xff1a;鴻蒙手機UI界面曝出&#xff01;圖標擬物化、操作邏輯近似蘋果iOS13?【IT爆料王-原創文章-具備版權效力】就在近日&#xff0c;筆者收到了網友的匿名私信&#xff0c;提供給筆者華為鴻蒙系統的UI界面截圖&#xff0c;以及搭載鴻蒙系統的華為手機的曝光圖片。…

python3中的int類型占64位,有沒有什么辦法來強制Python來使用64位整數的Windows?

I’ve noticed that whenever any integer surpasses 2^31-1 my number heavy code suffers a large slowdown, despite the fact I’m using a 64 bit build of Python on a 64bit version of Windows. This seems to be true on Python 2.7 and Python 3. I’ve read that Wi…

crtsiii型無砟軌道板_無砟軌道裂縫破損怎么修補

隨著高速鐵路、客運專線、城市地鐵的快速發展&#xff0c;無砟軌道軌道板&#xff08;道床板&#xff09;廣泛應用&#xff0c;但施工中和運營期都發現軌道板混凝土存在不同程度的微細裂縫&#xff0c;對無砟軌道造成了一定的病害。高鐵軌道板裂縫是不可避免的。為確保無砟軌道…

c調用python第三方庫_Python使用ctypes模塊調用DLL函數之C語言數組與numpy數組傳遞...

在Python語言中&#xff0c;可以使用ctypes模塊調用其它如C語言編寫的動態鏈接庫DLL文件中的函數&#xff0c;在提高軟件運行效率的同時&#xff0c;也可以充分利用目前市面上各種第三方的DLL庫函數&#xff0c;以擴充Python軟件的功能及應用領域&#xff0c;減少重復編寫代碼、…

妲己機器人怎么升級固件_臺灣重金設計的3D妲己,亮瞎了

大家還記得前幾天米醋分享的國內首檔二次元選秀&#xff0c;遭網友瘋狂吐槽&#xff1a;不知道怎么形容的丑&#xff01;當米醋看到了這檔綜藝的宣傳海報時瞬間被這一批選手的顏值所吸引&#xff01;太魔幻了&#xff01;沒成想看到3D人物效果時米醋卻被這盛世丑顏丑到裂開&…

go語言通道插入0_Go語言入門必知教程-通道

Golang提供了一種稱為通道的機制&#xff0c;用于在協程之間共享數據。當函數作為協程執行并發活動時&#xff0c;需要它們共享資源或數據&#xff0c;通道便充當協程之間的管道(管道)&#xff0c;提供一種確保同步交換數據的機制。需要在聲明通道時指定數據類型&#xff0c;可…

aes加密字符串c++_springboot2.2.X手冊:防抓包?快速實現API接口數據加密

溪云閣&#xff1a;專注編程教學&#xff0c;架構&#xff0c;JAVA&#xff0c;Python&#xff0c;微服務&#xff0c;機器學習等&#xff0c;歡迎關注上一篇&#xff1a;springboot2.2.X手冊&#xff1a;redis的7種類型100個方法全解析有沒有遇到這樣子的接口&#xff0c;放到…

鴻蒙系統打造完備終端,搭載鴻蒙系統的手機很快推出,華為生態更加完善

2019年的8月9日&#xff0c;在華為開發者大會上華為向大家正式的發布了一款操作系統——鴻蒙系統。這個系統備受大家的關注&#xff0c;鴻蒙2.0的發布也在時刻期待中。因為在目前的操作系統中&#xff0c;華為的鴻蒙操作系統是僅次于安卓、ios的存在&#xff0c;而今日&#xf…

curl socket 訪問_使用Curl、socket、file_get_contents三種方法POST提交數據 | 學步園

# <?php # /**# * Socket版本# * 使用方法&#xff1a;# * $post_string "appsocket&versionbeta";# * request_by_socket(facebook.cn,/restServer.php,$post_string);# */# function request_by_socket($remote_server,$remote_path,$post_string,$port …

html 標簽 r語言,從R中的字符串中刪除html標簽

我正在嘗試將網頁源代碼讀入R并將其作為字符串處理。我正在嘗試刪除段落并從段落文本中刪除html標簽。我遇到了以下問題&#xff1a;我嘗試實現一個功能來刪除html標簽&#xff1a;cleanFunfunction(fullStr){#find location of tags and citationstagLoccbind(str_locate_all(…

python給圖片加半透明水印_Python 批量加水印就這么簡單!

工作的時候&#xff0c;尤其是自媒體&#xff0c;我們必備水印添加工具以保護我們的知識產權,網上有許多的在線/下載的水印添加工具&#xff0c;但他們或多或少都存在以下問題&#xff1a; 在線工具需要將圖片上傳到對方服務器&#xff0c;信息不安全。 很多工具不具備批量處理…