#include <vector>
#include "G4Types.hh"
#include "G4RunManagerFactory.hh"
#include "G4UImanager.hh"
#include "G4LogicalVolumeStore.hh"
#include "G4TransportationManager.hh"
#include "G01PrimaryGeneratorAction.hh"
#include "G01DetectorConstruction.hh"
#include "G01ActionInitialization.hh"
#include "FTFP_BERT.hh"
#include "G4VisExecutive.hh"
#include "G4UIExecutive.hh"
#include "G4GDMLParser.hh"
//该程序的运行分为以下几种情况
//当输入参数数量等于1时候会报错出现"Error! Mandatory input file is not specified!"
//当输入参数数量等于2时就会直接调用可视化并不会调用print_aux函数
//当输入参数数量等于3时调用para.write,将输入的gdml文件输出到新的gdml文件
//当输入参数数量等于4时会直接执行后面的宏文件进行粒子的入射
//当输入参数数量大于4时会报错出现"Error! Too many arguments!"
//输出GDML信息的辅助类,输出type,value,unit
void print_aux(const G4GDMLAuxListType* auxInfoList, G4String prepend="|")
{
for(std::vector<G4GDMLAuxStructType>::const_iterator
iaux = auxInfoList->begin(); iaux != auxInfoList->end(); iaux++ )
{
G4String str=iaux->type;
G4String val=iaux->value;
G4String unit=iaux->unit;
G4cout << prepend << str << " : " << val << " " << unit << G4endl;
if (iaux->auxList) print_aux(iaux->auxList, prepend + "|");
}
return;
}
// --------------------------------------------------------------
int main(int argc,char **argv)
{
G4cout << G4endl;
G4cout << "Usage: load_gdml <intput_gdml_file:mandatory>"
<< " <output_gdml_file:optional>" << G4endl;
G4cout << G4endl;
if (argc<2)
{
G4cout << "Error! Mandatory input file is not specified!" << G4endl;
G4cout << G4endl;
return -1;
}
G4GDMLParser parser;
// Uncomment the following if wish to avoid names stripping
// 如果希望避免名称剥离,请取消对以下内容的注释
// parser.SetStripFlag(false);
parser.SetOverlapCheck(true);//检查是否重复
parser.Read(argv[1]);//读取gdml文件
if (argc>4)
{
G4cout << "Error! Too many arguments!" << G4endl;
G4cout << G4endl;
return -1;
}
auto* runManager = G4RunManagerFactory::CreateRunManager();
runManager->SetUserInitialization(new G01DetectorConstruction(
parser.GetWorldVolume()));
runManager->SetUserInitialization(new FTFP_BERT);
runManager->SetUserInitialization(new G01ActionInitialization());
runManager->Initialize();
// Initialize visualization
G4VisManager* visManager = new G4VisExecutive;
visManager->Initialize();
// Get the pointer to the User Interface manager
G4UImanager* UImanager = G4UImanager::GetUIpointer();
///
//
// Example how to retrieve Auxiliary Information
//如何检索辅助信息的例子
G4cout << std::endl;
const G4LogicalVolumeStore* lvs = G4LogicalVolumeStore::GetInstance();
std::vector<G4LogicalVolume*>::const_iterator lvciter;
for( lvciter = lvs->begin(); lvciter != lvs->end(); lvciter++ )
{
G4GDMLAuxListType auxInfo = parser.GetVolumeAuxiliaryInformation(*lvciter);
if (auxInfo.size()>0)
G4cout << "Auxiliary Information is found for Logical Volume : "
<< (*lvciter)->GetName() << G4endl;
print_aux(&auxInfo);
}
// now the 'global' auxiliary info
G4cout << std::endl;
G4cout << "Global auxiliary info:" << std::endl;
G4cout << std::endl;
print_aux(parser.GetAuxList());
G4cout << std::endl;
//
// End of Auxiliary Information block
//
runManager->BeamOn(0);
// example of writing out
if (argc>=3)
{
/*
G4GDMLAuxStructType mysubaux = {"mysubtype", "mysubvalue", "mysubunit", 0};
G4GDMLAuxListType* myauxlist = new G4GDMLAuxListType();
myauxlist->push_back(mysubaux);
G4GDMLAuxStructType myaux = {"mytype", "myvalue", "myunit", myauxlist};
parser.AddAuxiliary(myaux);
// example of setting auxiliary info for world volume
// (can be set for any volume)
G4GDMLAuxStructType mylocalaux = {"sometype", "somevalue", "someunit", 0};
parser.AddVolumeAuxiliary(mylocalaux,
G4TransportationManager::GetTransportationManager()
->GetNavigatorForTracking()->GetWorldVolume()->GetLogicalVolume());
*/
parser.SetRegionExport(true);
// parser.SetEnergyCutsExport(true);
// parser.SetOutputFileOverwrite(true);
parser.Write(argv[2], G4TransportationManager::GetTransportationManager()
->GetNavigatorForTracking()->GetWorldVolume()->GetLogicalVolume());
}
//对于参数的数量等于4的情况不会调用可视化的进行,对于参数小于等于3 的情况就会调用可视化界面
if (argc==4) // batch mode
{
G4String command = "/control/execute ";
G4String fileName = argv[3];
UImanager->ApplyCommand(command+fileName);
}
else // interactive mode
{
G4UIExecutive* ui = new G4UIExecutive(argc, argv);
UImanager->ApplyCommand("/control/execute vis.mac");
ui->SessionStart();
delete ui;
}
delete visManager;
delete runManager;
return 0;
}
04-25
08-15
4539
04-24
3043
03-14
611
09-16
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交