From 9e3a4c42bd23a988c792032601f7b99d11c04520 Mon Sep 17 00:00:00 2001 From: felix314159 Date: Wed, 20 Nov 2024 17:03:58 +0100 Subject: [PATCH] improved simscript and tutorial for cbmroot env setup --- simdata/runSim.C | 100 +++++++----------- ...msoft-cbmroot_installationInstructions.pdf | Bin 50040 -> 48877 bytes 2 files changed, 36 insertions(+), 64 deletions(-) diff --git a/simdata/runSim.C b/simdata/runSim.C index c140e21..1aa0cc1 100644 --- a/simdata/runSim.C +++ b/simdata/runSim.C @@ -1,71 +1,39 @@ -// How to run example: -// root -l -q -b 'runSim.C(123, 14, 100, 0, 2., 0., "abcdef")' -// This allows passing parameters e.g. randomSeed 123, nEvents 14, runID 100, chosenPart 0 (pions), momentum 2., theta 0 and subproblem hash abcdef. - -void runSim( // default values that can be overwritten by passing arguments like shown above +void runSim( UInt_t randomSeed = 1234, Int_t nEvents = 10, Int_t runID = 1337, - Int_t chosenPart = 0, // 0=pions, 1=eplus, 2=proton - Double_t momentum = 2., + Int_t chosenPart = 0, // not used, but kept here for compatibility with existing code + Double_t momentum = 2., // beam energy Double_t theta = 0., - const char* subProblemHash = "abcdef", // must be const, otherwise you get "ISO C++11 does not allow conversion from string literal to 'char *'" warnings - TString mcEngine = "TGeant4", // you could also use TGeant3 + const char* subProblemHash = "abcdef", + TString mcEngine = "TGeant4", // use geant4 Bool_t isMT = true, Bool_t loadPostInitConfig = false) { - TString dir = getenv("VMCWORKDIR"); - TString tutdir = dir + "/simulation/Tutorial1"; - - TString tut_geomdir = dir + "/common/geometry"; - gSystem->Setenv("GEOMPATH", tut_geomdir.Data()); - - TString tut_configdir = dir + "/common/gconfig"; - gSystem->Setenv("CONFIG_DIR", tut_configdir.Data()); - - TString partName[] = {"pions", "eplus", "proton"}; - Int_t partPdgC[] = {211, 11, 2212}; - + // output resulting files in same folder as this script TString outDir = "./"; - - // you must use ?reproducible= to have a reproducible hash (note that changing also affects hash!) TString outFile = Form("%s/mc_%s.root?reproducible=mc", outDir.Data(), subProblemHash); - - // you must use ?reproducible= TString geoFile = Form("geofile_%s.root?reproducible=geofile", subProblemHash); - // Configure Simulation - // ======================================================================== - - // ---- Debug option ------------------------------------------------- + // configure simulation gDebug = 0; - // ------------------------------------------------------------------------ - - // ----- Timer -------------------------------------------------------- TStopwatch timer; timer.Start(); - // ------------------------------------------------------------------------ - // ----- Create simulation run ---------------------------------------- FairRunSim* run = new FairRunSim(); - // you need to set the same run ID if you want reproducible hash! line below makes tutorial1_TGeant3_pions.mc.. file hash consistent - run->SetRunId(runID); - run->SetName(mcEngine); // Transport engine + run->SetRunId(runID); // use passed runID (line 102 of https://fairrootgroup.github.io/FairRoot/html/df/d06/FairRun_8h_source.html) + run->SetName(mcEngine); FairGenericVMCConfig* config = new FairGenericVMCConfig(); if (loadPostInitConfig) config->UsePostInitConfig(); run->SetSimulationConfig(config); - run->SetIsMT(isMT); // Multi-threading mode (Geant4 only) - run->SetSink(new FairRootFileSink(outFile)); // Output file + run->SetIsMT(isMT); // multithreading is enabled + run->SetSink(new FairRootFileSink(outFile)); FairRuntimeDb* rtdb = run->GetRuntimeDb(); - // ------------------------------------------------------------------------ - // ----- Create media ------------------------------------------------- - run->SetMaterials("media.geo"); // Materials - // ------------------------------------------------------------------------ - - // ----- Create geometry ---------------------------------------------- + // use some fair tutorial geometries as PoC + run->SetMaterials("media.geo"); FairModule* cave = new FairCave("CAVE"); cave->SetGeometryFileName("cave_vacuum.geo"); @@ -74,36 +42,42 @@ void runSim( // default values that can be overwritten by passing arguments like FairDetector* tutdet = new FairTutorialDet1("TUTDET", kTRUE); tutdet->SetGeometryFileName("double_sector.geo"); run->AddModule(tutdet); - // ------------------------------------------------------------------------ - // ----- Create PrimaryGenerator -------------------------------------- FairPrimaryGenerator* primGen = new FairPrimaryGenerator(); - FairBoxGenerator* boxGen = new FairBoxGenerator(partPdgC[chosenPart], 1); - - boxGen->SetThetaRange(theta, theta + 0.01); - boxGen->SetPRange(momentum, momentum + 0.01); - boxGen->SetPhiRange(0., 360.); - boxGen->SetDebug(kTRUE); + // set particle type that is generated (here 2212=proton, but this should in the future be passed as parameter to the script for more flexibility) + FairBoxGenerator* boxGen = new FairBoxGenerator(2212, 1); // first parameter is PDG encoding of particle type (2212 = proton), 1 = multiplicity (https://fairrootgroup.github.io/FairRoot/html/db/dfe/FairBoxGenerator_8cxx_source.html line 69) + // in-depth publication about the MC PDG codes at https://pdg.lbl.gov/2024/mcdata/mc_particle_id_contents.html , or just download the database that contains all the codes at https://pdg.lbl.gov/2024/api/index.html and in it check table 'pdgdata' + // e.g fluka uses its own mapping to the existing pdg numbers: http://www.fluka.org/content/manuals/online/5.1.html + // PDG Code Examples: + // 11 = Electron + // 2212 = Proton + // 22 = Photon + // 2112 = Neutron + boxGen->SetThetaRange(0., theta); // set passed theta range + boxGen->SetPRange(0., momentum); // set passed momentum range + boxGen->SetPhiRange(0., 360.); // set phi range (currently not passed) + // as shown in https://fairrootgroup.github.io/FairRoot/html/d1/dbd/FairBoxGenerator_8h_source.html more parameters could be specified like e.g.: + // - SetPtRange + // - SetEkinRange + // - SetEtaRange + // - SetYRange primGen->AddGenerator(boxGen); - run->SetGenerator(primGen); - // ------------------------------------------------------------------------ - // ----- Initialize simulation run ------------------------------------ + // use pythia6 as external decayer (https://fairroot.gsi.de/index.html%3Fq=node%252F57.html) + run->SetPythiaDecayer(kTRUE); + + // set passed custom RNG seed TRandom3 random(randomSeed); gRandom = &random; + // run simtask run->Init(); - // ------------------------------------------------------------------------ - - // ----- Start run ---------------------------------------------------- run->Run(nEvents); run->CreateGeometryFile(geoFile); - // ------------------------------------------------------------------------ - - // ----- Measure execution time --------------------------------------- + // measure execution time cout << endl << endl; FairSystemInfo sysInfo; @@ -125,6 +99,4 @@ void runSim( // default values that can be overwritten by passing arguments like cout << "Output file is " << outFile << endl; cout << "Real time " << rtime << " s, CPU time " << ctime << "s" << endl << endl; cout << "Macro finished successfully." << endl; - } - diff --git a/tutorials/ubuntu24.04_cbmsoft-cbmroot_installationInstructions.pdf b/tutorials/ubuntu24.04_cbmsoft-cbmroot_installationInstructions.pdf index 6936eb789c10699983152102cf89a52b6813e2dd..713522e3d1a614aed7c98779515641ecf5267a3c 100644 GIT binary patch delta 8605 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 Y_40;Zco2@9cp{F1=aiJxFwo@uKQt|lSO5S3 delta 9251 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