![]() |
GamR
0.0.0
GammaROOT
|
#include <Efficiency.hh>
Collaboration diagram for GamR::Efficiency::MultiEffFit:Public Member Functions | |
| MultiEffFit () | |
| void | AddData (const char *histFile, const char *histName, const char *gateFile, const char *mapName, const char *intensityFile) |
| void | AddData (DataSet dataSet, int ID) |
| void | SetAbsScale (double absScale, int ID) |
| void | SetData (const char *effFile, int i, int ID) |
| void | SetDetNorms (int ID, int iDataSet, std::string key) |
| void | SetNorm (int iDataSet, double factor) |
| void | SetNorm (int ID, int iDataSet, double factor) |
| void | SetParams (FitParams params) |
| void | SetParams (int ID, FitParams params) |
| void | EraseData (int ID, int iDataSet, std::string key) |
| void | EraseData (int iDataSet, std::string key) |
| void | Fit () |
| void | Fit (int ID) |
| void | WriteGraphs (std::string outDir) |
| void | Draw (const char *outFile, double xlow=-1, double xhigh=-1, bool log=false) |
| void | PrintDataSet (int i, const char *fileNameBase) |
| void | PrintDataSet (int i, int ID, const char *fileNameBase) |
| void | PrintParams (const char *outFile) |
| void | SetEqualWeights (bool eq) |
An example of how to use the Efficiency library through the MultiEffFit class to fit efficiencies for multiple detectors, using multiple data sets for each one.
First we define the MultiEffFit object - this contains everything we'll need. ~~~ {.cpp} GamR::Efficiency::MultiEffFit efffit; ~~~
Add data sets. Each Xe138_*.root file contains a 2D histogram gClean that has detector ID on the y-axis and energy on the x-axis. The *gates.root files contain a GamR::Nucleus::TransitionMap, named "transitionMap", which have gates for peaks and backgrounds for each transition of interest.
The *_intensities.txt have keys for each GamR::Nucleus::Transition in the previous map, energies, and standard relative intensities (normalised to a total of 100). ~~~ {.cpp} efffit.AddData("Xe138_eu152.root", "gClean", "eu152gates.root", "transitionMap", "eu152_intensities.txt"); efffit.AddData("Xe138_am243.root", "gClean", "am243gates.root", "transitionMap", "am243_intensities.txt"); efffit.AddData("Xe138_ta182.root", "gClean", "ta182gates.root", "transitionMap", "ta182_intensities.txt"); efffit.AddData("Xe138_co56.root", "gClean", "co56gates.root", "transitionMap", "co56_intensities.txt"); ~~~
An exerpt of a possible "eu152_intensities.txt", where the keys in transitionMap are the first column, the energies the second, and the normalised intensities the third ~~~ t122 121.7817 28.58 t126 125.69 0.016 t148 148.010 0.037 t213 212.568 0.0198 t245 244.6975 7.583 ~~~
We create FitParams objects which will contain starting guesses, limits, and information about whether we wish to fix the parameter or not. Initially, we have a general one for all detectors, but we can make individuals for unusual detectors as well.
~~~ {.cpp} GamR::Efficiency::FitParams fpar(7);
GamR::Efficiency::FitParams fpar_8(7); GamR::Efficiency::FitParams fpar_38(7); ~~~
We set the 7 parameters: starting guesses, fixing (0 for free, 1 for fixed), lower limits, and upper limits ~~~ {.cpp} fpar.SetParams({"5.0", "10.0", "0", "6.0", "-0.6", "-0.05", "15"}, {"0", "0", "1", "0", "0", "0", "1"}, {"-1e4", "0", "-1e4", "-1e4", "-1e4", "-1e4", "1"}, {"1e4", "1e4", "1e4", "1e4", "1e4", "1e4", "1e4"});
fpar_8.SetParams({"5.0", "10.0", "0", "6.0", "-0.6", "-0.05", "15"}, {"1", "1", "1", "0", "0", "0", "1"}, {"-1e4", "0", "-1e4", "-1e4", "-1e4", "-1e4", "1"}, {"1e4", "1e4", "1e4", "1e4", "1e4", "1e4", "1e4"});
fpar_38.SetParams({"10.0", "10.0", "0", "6.0", "-0.6", "-0.05", "4"}, {"0", "0", "1", "0", "0", "0", "1"}, {"-1e4", "0", "-1e4", "-1e4", "-1e4", "-1e4", "1"}, {"1e4", "1e4", "1e4", "1e4", "1e4", "1e4", "1e4"}); ~~~
We set all detectors to have the parameters in fpar ~~~ {.cpp} efffit.SetParams(fpar); ~~~
Remove some anomalous data points in detector 8, data set 2 ~~~ {.cpp} efffit.EraseData(8, 2, "t100"); efffit.EraseData(8, 2, "t179"); efffit.EraseData(8, 2, "t198"); ~~~
Remove some bad data points from data sets 1 and 2 in all detectors ~~~ {.cpp} efffit.EraseData(1, "t75"); efffit.EraseData(2, "t68"); efffit.EraseData(2, "t68"); ~~~
Set parameters for detectors 8 and 38 only ~~~ {.cpp} efffit.SetParams(8, fpar_8); efffit.SetParams(38, fpar_38); ~~~
Change normalisations for first all detectors, and data set 3, then individual detectors ~~~ {.cpp} efffit.SetNorm(3, 2.0);
efffit.SetNorm(8, 3, 0.6); efffit.SetNorm(20, 3, 1.5); efffit.SetNorm(38, 3, 1.5); efffit.SetNorm(104, 3, 1.5);
efffit.SetNorm(8, 0, 2.0); efffit.SetNorm(8, 1, 2.0); efffit.SetNorm(8, 2, 2.0); efffit.SetNorm(8, 3, 2.0); ~~~
Print the initial guesses to "InitialGuess.pdf", and carry out the fit. ~~~ {.cpp} efffit.Draw("InitialGuess.pdf", 0, 4096); efffit.Fit(); ~~~
Now we can refine the fit parameters. "x" here stands for the previously fitted value. We free the final parameter which was fixed before, and continue. ~~~ {.cpp} fpar.SetParams({"x", "x", "0", "x", "x", "x", "x"}, {"0", "0", "1", "0", "0", "0", "0"}, {"-1e4", "0", "-1e4", "-1e4", "-1e4", "-1e4", "10"}, {"1e4", "1e4", "1e4", "1e4", "1e4", "1e4", "50"});
fpar_8.SetParams({"5.0", "10.0", "0", "x", "x", "x", "x"}, {"1", "1", "1", "0", "0", "0", "1"}, {"-1e4", "0", "-1e4", "-1e4", "-1e4", "-1e4", "1"}, {"1e4", "1e4", "1e4", "1e4", "1e4", "1e4", "1e4"});
~~~
Once again, set every detector to the parameters found in fpar. Note however that each detector will retain its own previous values. Detector 8 is set to its own starting values, and we fit once more. ~~~ {.cpp} efffit.SetParams(fpar);
efffit.SetParams(8, fpar_8);
efffit.Fit(); ~~~
We might also want to know about the relative efficiencies between detectors. To do this we select a single, strong transition as a reference energy ("t847"), and a reference detector ID = 7. Then the normalisation is calculated as
\[ \frac{N_i("t847")}{N_7("t847")} = \frac{\epsilon_i(847)}{\epsilon_7(847)} \]
Draw the final results to "EffFits.pdf", and print the detector IDs, relative detector
normalisations, and 7 parameters with their errors to "EffParams.txt"
~~~ {.cpp}
efffit.Draw("EffFits.pdf", 0, 4096);
efffit.PrintParams("EffParams.txt");
~~~
Definition at line 108 of file Efficiency.hh.
|
inline |
Definition at line 113 of file Efficiency.hh.
| void GamR::Efficiency::MultiEffFit::AddData | ( | const char * | histFile, |
| const char * | histName, | ||
| const char * | gateFile, | ||
| const char * | mapName, | ||
| const char * | intensityFile ) |
Definition at line 1032 of file Efficiency.cc.
References AddData(), and GamR::Efficiency::MultiDataSet::GetDataSets().
Referenced by AddData().
Here is the call graph for this function:
Here is the caller graph for this function:| void GamR::Efficiency::MultiEffFit::AddData | ( | DataSet | dataSet, |
| int | ID ) |
Definition at line 1041 of file Efficiency.cc.
References GamR::Efficiency::DataSet::GetEfficiency(), GamR::Efficiency::DataSet::GetEnergy(), and GamR::Efficiency::DataSet::GetNData().
Here is the call graph for this function:| void GamR::Efficiency::MultiEffFit::Draw | ( | const char * | outFile, |
| double | xlow = -1, | ||
| double | xhigh = -1, | ||
| bool | log = false ) |
Definition at line 1124 of file Efficiency.cc.
References log().
Here is the call graph for this function:
|
inline |
Definition at line 123 of file Efficiency.hh.
| void GamR::Efficiency::MultiEffFit::EraseData | ( | int | iDataSet, |
| std::string | key ) |
Definition at line 1096 of file Efficiency.cc.
| void GamR::Efficiency::MultiEffFit::Fit | ( | ) |
Definition at line 1108 of file Efficiency.cc.
| void GamR::Efficiency::MultiEffFit::Fit | ( | int | ID | ) |
Definition at line 1118 of file Efficiency.cc.
| void GamR::Efficiency::MultiEffFit::PrintDataSet | ( | int | i, |
| const char * | fileNameBase ) |
Definition at line 1148 of file Efficiency.cc.
| void GamR::Efficiency::MultiEffFit::PrintDataSet | ( | int | i, |
| int | ID, | ||
| const char * | fileNameBase ) |
Definition at line 1143 of file Efficiency.cc.
| void GamR::Efficiency::MultiEffFit::PrintParams | ( | const char * | outFile | ) |
Definition at line 1156 of file Efficiency.cc.
|
inline |
Definition at line 116 of file Efficiency.hh.
| void GamR::Efficiency::MultiEffFit::SetData | ( | const char * | effFile, |
| int | i, | ||
| int | ID ) |
Definition at line 1053 of file Efficiency.cc.
| void GamR::Efficiency::MultiEffFit::SetDetNorms | ( | int | ID, |
| int | iDataSet, | ||
| std::string | key ) |
Definition at line 1071 of file Efficiency.cc.
| void GamR::Efficiency::MultiEffFit::SetEqualWeights | ( | bool | eq | ) |
Definition at line 1102 of file Efficiency.cc.
| void GamR::Efficiency::MultiEffFit::SetNorm | ( | int | ID, |
| int | iDataSet, | ||
| double | factor ) |
Definition at line 1091 of file Efficiency.cc.
| void GamR::Efficiency::MultiEffFit::SetNorm | ( | int | iDataSet, |
| double | factor ) |
Definition at line 1084 of file Efficiency.cc.
| void GamR::Efficiency::MultiEffFit::SetParams | ( | FitParams | params | ) |
Definition at line 1058 of file Efficiency.cc.
| void GamR::Efficiency::MultiEffFit::SetParams | ( | int | ID, |
| FitParams | params ) |
Definition at line 1065 of file Efficiency.cc.
| void GamR::Efficiency::MultiEffFit::WriteGraphs | ( | std::string | outDir | ) |
Definition at line 1174 of file Efficiency.cc.