From ba023b48ddbc4faec0f3c99a47cf1d31f3b21e31 Mon Sep 17 00:00:00 2001 From: Gordon McCann Date: Sat, 20 Aug 2022 09:05:34 -0700 Subject: [PATCH 1/2] Now passes intial testing, seems fully functional. Need to do some optimization tests against old way to see if actually improved anything. --- src/Mask/MassLookup.cpp | 4 ++-- src/Mask/MassLookup.h | 6 +++--- src/Mask/Nucleus.cpp | 2 +- src/Mask/Nucleus.h | 6 +++--- src/Plotters/RootPlotter.cpp | 25 ++++++++++++++----------- 5 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/Mask/MassLookup.cpp b/src/Mask/MassLookup.cpp index 4bd1e7c..ad26256 100644 --- a/src/Mask/MassLookup.cpp +++ b/src/Mask/MassLookup.cpp @@ -41,7 +41,7 @@ namespace Mask { MassLookup::~MassLookup() {} //Returns nuclear mass in MeV - double MassLookup::FindMass(int Z, int A) + double MassLookup::FindMass(uint32_t Z, uint32_t A) { KeyPair key({Z, A}); auto data = massTable.find(key.GetID()); @@ -52,7 +52,7 @@ namespace Mask { } //returns element symbol - std::string MassLookup::FindSymbol(int Z, int A) + std::string MassLookup::FindSymbol(uint32_t Z, uint32_t A) { KeyPair key({Z, A}); auto data = elementTable.find(key.GetID()); diff --git a/src/Mask/MassLookup.h b/src/Mask/MassLookup.h index 61220cf..fac5e9e 100644 --- a/src/Mask/MassLookup.h +++ b/src/Mask/MassLookup.h @@ -35,9 +35,9 @@ namespace Mask { }; ~MassLookup(); - double FindMass(int Z, int A); - double FindMassU(int Z, int A) { return FindMass(Z, A)/u_to_mev; } - std::string FindSymbol(int Z, int A); + double FindMass(uint32_t Z, uint32_t A); + double FindMassU(uint32_t Z, uint32_t A) { return FindMass(Z, A)/u_to_mev; } + std::string FindSymbol(uint32_t Z, uint32_t A); static MassLookup& GetInstance() { return *s_instance; } diff --git a/src/Mask/Nucleus.cpp b/src/Mask/Nucleus.cpp index d375fb3..c82b7f5 100644 --- a/src/Mask/Nucleus.cpp +++ b/src/Mask/Nucleus.cpp @@ -2,7 +2,7 @@ namespace Mask { - Nucleus CreateNucleus(int z, int a) + Nucleus CreateNucleus(uint32_t z, uint32_t a) { Nucleus nuc; nuc.Z = z; diff --git a/src/Mask/Nucleus.h b/src/Mask/Nucleus.h index d5b4b47..2769cf6 100644 --- a/src/Mask/Nucleus.h +++ b/src/Mask/Nucleus.h @@ -37,8 +37,8 @@ namespace Mask { return vec4.M() - groundStateMass; } - int Z = 0; - int A = 0; + uint32_t Z = 0; + uint32_t A = 0; double groundStateMass = 0.0; std::string isotopicSymbol = ""; double thetaCM = 0.0; @@ -50,7 +50,7 @@ namespace Mask { double detectedPhi = 0.0; }; - Nucleus CreateNucleus(int z, int a); + Nucleus CreateNucleus(uint32_t z, uint32_t a); bool EnforceDictionaryLinked(); diff --git a/src/Plotters/RootPlotter.cpp b/src/Plotters/RootPlotter.cpp index 6bb7310..81918d9 100644 --- a/src/Plotters/RootPlotter.cpp +++ b/src/Plotters/RootPlotter.cpp @@ -5,6 +5,11 @@ #include +static double FullPhi(double phi) +{ + return phi < 0.0 ? 2.0*M_PI + phi : phi; +} + RootPlotter::RootPlotter() { TH1::AddDirectory(kFALSE); @@ -46,7 +51,7 @@ void RootPlotter::Run(const std::string& inputname, const std::string& outputnam output->cd(); for(auto& obj : m_map) - obj.second->Write(obj.second->GetName(), TObject::kOverwrite); + obj.second->Write(); output->Close(); } @@ -68,19 +73,17 @@ void RootPlotter::FillData(const Mask::Nucleus& nuc) std::string angdist_name = sym + modifier +"_angDist"; std::string angdist_title = angdist_name+";cos#right(#theta_{CM}#left);counts"; + + MyFill(ke_vs_th_name.c_str(), ke_vs_th_title.c_str(), nuc.vec4.Theta()*s_rad2deg, nuc.GetKE(), 2); + MyFill(ke_vs_ph_name.c_str(), ke_vs_ph_title.c_str(), FullPhi(nuc.vec4.Phi())*s_rad2deg, nuc.GetKE(), 4); + MyFill(th_vs_ph_name.c_str(), th_vs_ph_title.c_str(), nuc.vec4.Theta()*s_rad2deg, FullPhi(nuc.vec4.Phi())*s_rad2deg, 2); + MyFill(ex_name.c_str(),ex_title.c_str(),260,-1.0,25,nuc.GetExcitationEnergy()); + MyFill(angdist_name.c_str(), angdist_title.c_str(),20,-1.0,1.0,std::cos(nuc.thetaCM)); if(nuc.isDetected) - { - MyFill(ke_vs_th_name.c_str(), ke_vs_th_title.c_str(), nuc.vec4.Theta()*s_rad2deg, nuc.GetKE(), 2); - MyFill(ke_vs_ph_name.c_str(), ke_vs_ph_title.c_str(), nuc.vec4.Phi()*s_rad2deg, nuc.GetKE(), 4); - MyFill(th_vs_ph_name.c_str(), th_vs_ph_title.c_str(), nuc.vec4.Theta()*s_rad2deg, nuc.vec4.Phi()*s_rad2deg, 2); - MyFill(ex_name.c_str(),ex_title.c_str(),260,-1.0,25,nuc.GetExcitationEnergy()); - MyFill(angdist_name.c_str(), angdist_title.c_str(),20,-1.0,1.0,std::cos(nuc.thetaCM)); - } - else { MyFill(ke_vs_th_name.c_str(), ke_vs_th_title.c_str(), nuc.vec4.Theta()*s_rad2deg, nuc.detectedKE, 2); - MyFill(ke_vs_ph_name.c_str(), ke_vs_ph_title.c_str(), nuc.vec4.Phi()*s_rad2deg, nuc.detectedKE, 4); - MyFill(th_vs_ph_name.c_str(), th_vs_ph_title.c_str(), nuc.vec4.Theta()*s_rad2deg, nuc.vec4.Phi()*s_rad2deg, 2); + MyFill(ke_vs_ph_name.c_str(), ke_vs_ph_title.c_str(), FullPhi(nuc.vec4.Phi())*s_rad2deg, nuc.detectedKE, 4); + MyFill(th_vs_ph_name.c_str(), th_vs_ph_title.c_str(), nuc.vec4.Theta()*s_rad2deg, FullPhi(nuc.vec4.Phi())*s_rad2deg, 2); MyFill(ex_name.c_str(),ex_title.c_str(),260,-1.0,25,nuc.GetExcitationEnergy()); MyFill(angdist_name.c_str(), angdist_title.c_str(),20,-1.0,1.0,std::cos(nuc.thetaCM)); } From 322e09188424237f69bab581974acdebdd4ecf45 Mon Sep 17 00:00:00 2001 From: Gordon McCann Date: Sat, 20 Aug 2022 09:13:08 -0700 Subject: [PATCH 2/2] Update README --- README.md | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index ec05426..602d887 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,15 @@ # MASK: Monte cArlo Simulation of Kinematics MASK is a Monte Carlo simulation of reaction kinematics for use detector systems at Florida State University. -MASK is capable of simulating multi-step kinematic reaction-decay sequences, storing data in a lightweight binary format, after which the kinematic data can be fed to a detector geometry for efficiency testing. Currently geometries for ANASEN and SABRE are included in the code. +MASK is capable of simulating multi-step kinematic reaction-decay sequences, storing data in ROOT Trees, after which the kinematic data can be fed to a detector geometry for efficiency testing. Currently geometries for ANASEN and SABRE are included in the code. ## Building MASK -Dowload the repository from github. The code is to be built using Premake5, an open source and free project building software. To build on Linux and MacOSX run -`premake5 gmake2` -to generate the makefiles. Then execute -`make` -to build the program. To build on Windows run -`premake5 vs20xx` -where xx should be replaced with your version of Visual Studio, and then build as a normal Visual Studio project. For more documentation see the Premake wiki. By default `make` runs in Debug mode. For release mode use `make config=release` +Dowload the repository from github. CMake is use to build the project; in most environments you can build Mask using the following methods: +- `mkdir build` +- `cd build` +- `cmake ..` +- `make` -### Building RootPlot -One of the executables, RootPlot, requires linking against external libraries from the ROOT cern analysis package. Path to the necessary header files and libraries must be set by the user on a machine-by-machine basis in the premake5.lua file. Set the ROOTIncludepath and ROOTLibpath to match your install. An easy way to check for the paths on a unix system is through the root-config tool. root-config --cflags has the include path (the path after -I) and root-config --glibs has the lib path (after -L). If you do not have ROOT installed, you will not be able to compile RootPlot, and you will not be able to use the generic `make` command, which will try to build all executables. Instead use `make Mask` or `make DetectEff` (or `make config=release Mask`, etc). +Executables will be installed to the repostiory's `bin` directory. Libraries will be installed to the `lib` directory. ## Running MASK By default MASK is capable of simulating reactions of up to three steps. Here is a brief outline of each type: @@ -22,7 +19,7 @@ By default MASK is capable of simulating reactions of up to three steps. Here is 2. A reaction of type 2 is a reaction followed by a subsequent decay of the residual nucleus. Again, all sampling is allowed. 3. A reaction of type 3 is a reaction followed by a subsequent decay of the residual, followed by a decay of one of the products. Again, all sampling is allowed -For decays, a specific angular distribution can be given as input as a text file with values of coefficiencts of a Legendre polynomial series. Examples can be found in the `./etc` directory, including an isotropic case. It is assumed that the decays in the center-of-mass frame are isotropic in phi (i.e. m=0). Decay1 corresponds to the first decay, if there are multiple steps, Decay2 to the second. If there are no decays, these parameters are not used (or if only one decay, Decay2_AngularMomentum is not used). The input file requires that the user include target information, which will be used to calculate energy loss for all of the reactants and reaction products. The target can contain layers, and each layer can be composed of a compound of elements with a given stoichiometry. If the user wishes to not include energy loss in the kinematics, simply give all target layers a thickness of 0. Note that more layers and more thickness = more time spent calculating energy loss. These energy loss methods are only applicable for solid targets, and should not be applied to gas or liquid targets. Energy loss calculations have a stated uncertainty of approximately five percent. +For decays, a specific angular distribution can be given as input as a text file with values of coefficiencts of a Legendre polynomial series. Examples can be found in the `./etc` directory, including an isotropic case. It is assumed that the decays in the center-of-mass frame are isotropic in phi (i.e. m=0). Decay1 corresponds to the first decay, if there are multiple steps, Decay2 to the second. If there are no decays, these parameters are not used (or if only one decay, Decay2_AngularMomentum is not used). The input file requires that the user include target information, which will be used to calculate energy loss for all of the reactants and reaction products. The energy loss through materials is calculated using the `catima` library (found in `src/vendor`), which is a C/C++ interface to the `atima` library (the same energy loss methods used by LISE). The target can contain layers, and each layer can be composed of a compound of elements with a given stoichiometry. If the user wishes to not include energy loss in the kinematics, simply give all target layers a thickness of 0. Note that more layers and more thickness = more time spent calculating energy loss. These energy loss methods are only applicable for solid targets, and should not be applied to gas or liquid targets. Energy loss calculations have a stated uncertainty of approximately five percent. To choose which detector scheme is run, modify the main function in DetectorEfficiency.cpp. The included geometries also have options to do an internal geometry consistency check and print out coordinates for drawing the detector arrays. @@ -36,7 +33,7 @@ To run DetEff use the format `./bin/DetEff ` -where the detection datafile contains all of the kinematics data as well as information about which particles are detected (this is in the mask file format) and the statsfile is a text file containing efficiency statistics. +where the detection datafile contains all of the kinematics data as well as information about which particles are detected and the statsfile is a text file containing efficiency statistics. RootPlot is run as @@ -44,12 +41,6 @@ RootPlot is run as where the datafile can be either the datafile from Mask or the datafile from DetEff. The outputfile is saved in the ROOT file format. -PyPlotter is run as - -`./bin/PyPlotter ` - -where again datafile can come from either Mask or DetEff. The outputfile is saved in the Python pickle file format. Pickled files can be reopened using the PyPlotViewer script run as -`./bin/PyPlotViewer ` - ## Requirements -MASK, the kinematics simulation, and DetEff, the detection efficiency simulation, require no external dependancies. The RootPlot plotting tool requires the ROOT cern data analysis package, and the PyPlotter tool requires Python3 and the matplotlib and numpy packages. \ No newline at end of file +ROOT version 6.22 or greater is required +CMake version 3.0 or greater is required \ No newline at end of file