REST-for-Physics  v2.3
Rare Event Searches ToolKit for Physics
Loading...
Searching...
No Matches
TRestResponse.cxx
1/*************************************************************************
2 * This file is part of the REST software framework. *
3 * *
4 * Copyright (C) 2016 GIFNA/TREX (University of Zaragoza) *
5 * For more information see https://gifna.unizar.es/trex *
6 * *
7 * REST is free software: you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation, either version 3 of the License, or *
10 * (at your option) any later version. *
11 * *
12 * REST is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
16 * *
17 * You should have a copy of the GNU General Public License along with *
18 * REST in $REST_PATH/LICENSE. *
19 * If not, see https://www.gnu.org/licenses/. *
20 * For the list of contributors see $REST_PATH/CREDITS. *
21 *************************************************************************/
22
41#include "TRestResponse.h"
42
43ClassImp(TRestResponse);
44
49
64TRestResponse::TRestResponse(const char* cfgFileName, const std::string& name) : TRestMetadata(cfgFileName) {
65 Initialize();
66
68
70}
71
76
81void TRestResponse::Initialize() { SetSectionName(this->ClassName()); }
82
102void TRestResponse::LoadResponse(Bool_t transpose) {
103 if (fFilename == "") {
104 RESTError << "TRestResponse::LoadResponse. The response filename was not defined" << RESTendl;
105 return;
106 }
107
108 std::string fullFilename = SearchFile(fFilename);
109 if (fullFilename.empty()) {
110 RESTError << "TRestResponse::LoadResponse. The response filename was not found!" << RESTendl;
111 RESTError << "Filename : " << fFilename << RESTendl;
112 RESTError << "You may want to define <seachPath inside <globals> definition" << RESTendl;
113 return;
114 }
115
116 std::string extension = TRestTools::GetFileNameExtension(fFilename);
117 if (!extension.empty() && extension[0] == 'N' && extension.back() == 'f') {
119
120 fTransposed = false;
121 if (transpose) {
122 fTransposed = transpose;
124 }
125
126 return;
127 }
128
129 RESTError << "Extension format - " << extension << " - not recognized!" << RESTendl;
130}
131
140std::vector<std::pair<Double_t, Double_t>> TRestResponse::GetResponse(Double_t input) {
141 std::vector<std::pair<Double_t, Double_t>> response;
142
143 if (fResponseMatrix.empty()) {
144 RESTError << "TRestResponse::GetResponse. Response matrix has not been loaded yet!" << RESTendl;
145 return response;
146 }
147
148 if (input < GetInputRange().X() || input > GetInputRange().Y()) {
149 RESTError << "TRestResponse::GetResponse. The input value " << input << " is outside range!"
150 << RESTendl;
151 return response;
152 }
153
154 if (!fInterpolation) {
155 Int_t bin = (Int_t)((input - fOrigin.X()) / fBinSize);
156
157 for (std::size_t n = 0; n < fResponseMatrix[bin].size(); n++) {
158 Double_t output = fOrigin.Y() + ((double)n + 0.5) * fBinSize;
159 Double_t value = fResponseMatrix[bin][n];
160
161 std::pair<Double_t, Double_t> outp{output, value};
162
163 response.push_back(outp);
164 }
165
166 return response;
167 }
168
169 Int_t binLeft = (Int_t)((input - fBinSize / 2. - fOrigin.X()) / fBinSize);
170 Int_t binRight = binLeft + 1;
171
172 Double_t distLeft = (input - fBinSize / 2. + fOrigin.X()) - binLeft * fBinSize;
173
174 if (input <= GetInputRange().X() + fBinSize / 2. || input >= GetInputRange().Y() - fBinSize / 2.)
175 binRight = binLeft;
176
177 /*
178 std::cout << "Top : " << GetInputRange().Y() - fBinSize/2. << std::endl;
179 std::cout << "binLeft : " << binLeft << std::endl;
180 std::cout << "binRight : " << binRight << std::endl;
181 std::cout << "dLeft : " << distLeft << std::endl;
182 std::cout << "dLeft/fBinSize : " << distLeft/fBinSize << std::endl;
183 std::cout << "1 - distLeft/fBinSize : " << 1 - distLeft/fBinSize << std::endl;
184 */
185
186 for (std::size_t n = 0; n < fResponseMatrix[binLeft].size(); n++) {
187 Double_t output = fOrigin.Y() + ((double)n + 0.5) * fBinSize;
188
189 Double_t value = fResponseMatrix[binLeft][n] * (1 - distLeft / fBinSize) +
190 fResponseMatrix[binRight][n] * distLeft / fBinSize;
191
192 std::pair<Double_t, Double_t> outp{output, value};
193
194 response.push_back(outp);
195
196 /*
197 std::cout << "n: " << n << " output : " << output << std::endl;
198 std::cout << "response: " << response << std::endl;
199 */
200 }
201
202 return response;
203}
204
208void TRestResponse::PrintResponseMatrix(Int_t fromRow = 0, Int_t toRow = 0) {
210}
211
217
218 RESTMetadata << "Response file : " << fFilename << RESTendl;
219 RESTMetadata << "Variable : " << fVariable << RESTendl;
220 RESTMetadata << "Bin size : " << fBinSize << RESTendl;
221 RESTMetadata << " " << RESTendl;
222
223 if (!fResponseMatrix.empty()) {
224 RESTMetadata << "Response matrix has been loaded" << RESTendl;
225 RESTMetadata << " - Number of columns: " << fResponseMatrix[0].size() << RESTendl;
226 RESTMetadata << " - Number of rows : " << fResponseMatrix.size() << RESTendl;
227 RESTMetadata << " - Input range : " << GetInputRange().X() << " - " << GetInputRange().Y()
228 << RESTendl;
229 RESTMetadata << " - Output range : " << GetOutputRange().X() << " - " << GetOutputRange().Y()
230 << RESTendl;
231
232 if (fTransposed) {
233 RESTMetadata << " " << RESTendl;
234 RESTMetadata << "Original matrix was transposed" << RESTendl;
235 }
236 } else {
237 RESTMetadata << "Response matrix has NOT been loaded" << RESTendl;
238 RESTMetadata << "Try calling TRestResponse::LoadResponse()" << RESTendl;
239 }
240 if (fInterpolation) {
241 RESTMetadata << " " << RESTendl;
242 RESTMetadata << "Interpolation is enabled" << RESTendl;
243 } else {
244 RESTMetadata << " " << RESTendl;
245 RESTMetadata << "Interpolation is disabled" << RESTendl;
246 }
247 RESTMetadata << "----" << RESTendl;
248}
A base class for any REST metadata class.
virtual void PrintMetadata()
Implemented it in the derived metadata class to print out specific metadata information.
endl_t RESTendl
Termination flag object for TRestStringOutput.
Int_t LoadConfigFromFile(const std::string &configFilename, const std::string &sectionName="")
Give the file name, find out the corresponding section. Then call the main starter.
TRestStringOutput::REST_Verbose_Level GetVerboseLevel()
returns the verboselevel in type of REST_Verbose_Level enumerator
void SetSectionName(std::string sName)
set the section name, clear the section content
std::string SearchFile(std::string filename)
Search files in current directory and directories specified in "searchPath" section.
std::string fConfigFileName
Full name of the rml file.
A response matrix that might be applied to a given component inside a TRestComponent.
Double_t fBinSize
The resolution of the response matrix (binning)
std::vector< std::vector< Float_t > > fResponseMatrix
The response matrix.
Bool_t fTransposed
Determines if the response matrix has been transposed.
void Initialize() override
It will initialize the data frame with the filelist and column names (or observables) that have been ...
void LoadResponse(Bool_t transpose=true)
It loads into the fResponseMatrix data member the response from a file.
~TRestResponse()
Default destructor.
Bool_t fInterpolation
It allows to decide if the returned response should be interpolated (default:false)
std::string fVariable
It defines the variable name for which the response should be applied to.
std::vector< std::pair< Double_t, Double_t > > GetResponse(Double_t input)
This method will return a vector of std::pair, each pair will contain the output energy together with...
TVector2 fOrigin
First element of the response matrix (input/incident, output/detected)
TRestResponse()
Default constructor.
void PrintMetadata() override
Prints on screen the information about the metadata members of TRestAxionSolarFlux.
std::string fFilename
The filename used to import the response matrix.
void PrintResponseMatrix(Int_t fromRow, Int_t toRow)
Prints on screen the information about the metadata members of TRestAxionSolarFlux.
@ REST_Info
+show most of the information for each steps
static std::string GetFileNameExtension(const std::string &fullname)
Gets the file extension as the substring found after the latest ".".
static int ReadBinaryTable(std::string fName, std::vector< std::vector< T > > &data, Int_t columns=-1)
Reads a binary file containing a fixed-columns table with values.
static int PrintTable(std::vector< std::vector< T > > data, Int_t start=0, Int_t end=0)
Prints the contents of the vector table given as argument in screen. Allowed types are Int_t,...
static void TransposeTable(std::vector< std::vector< T > > &data)
It transposes the std::vector<std::vector> table given in the argument. It will transform rows in col...