38 #include "RtypesCore.h"
43 #include "TDirectory.h"
44 #include "TGraphErrors.h"
60 std::pair<std::string, std::string> rsplit
61 (std::string
const&
s, std::string
const& sep)
63 auto iSep = s.rfind(sep);
64 if (iSep == std::string::npos)
68 { s.substr(0, iSep), s.substr(iSep + sep.length(), s.length()) };
74 TDirectory* CreateROOTdir(std::string
path) {
76 const std::string suffix =
".root";
78 std::string filePath, rootDirPath;
81 std::string::size_type iSuffix = std::string::npos;
83 iSuffix = path.rfind(suffix, iSuffix);
84 if (iSuffix == std::string::npos)
return nullptr;
87 auto iAfter = iSuffix + suffix.length();
88 if ((iAfter < path.length())
89 && (path[iAfter] !=
'/')
90 && (path[iAfter] !=
':')
93 if (iSuffix == 0)
return nullptr;
98 filePath = path.substr(0U, iAfter);
99 if (iAfter < path.length())
100 rootDirPath = path.substr(iAfter + 1, path.length());
107 std::tie(fileDir, fileName) = rsplit(filePath,
"/");
109 std::cout <<
"Writing to output file: '" << filePath <<
"'";
110 if (!rootDirPath.empty())
111 std::cout <<
" (directory: '" << rootDirPath <<
"')";
117 if (!fileDir.empty()) gSystem->mkdir(fileDir.c_str(),
true);
121 auto pFile = std::make_unique<TFile>(filePath.c_str(),
"UPDATE");
123 if (pFile->IsZombie() || !pFile->IsOpen())
return nullptr;
124 if (rootDirPath.empty())
return pFile.release();
126 if (!pFile->mkdir(rootDirPath.c_str()))
return nullptr;
128 TDirectory* pOutputDir = pFile->GetDirectory(rootDirPath.c_str());
129 if (!pOutputDir)
return nullptr;
138 void WriteCalibrationObject
139 (TObject* pObj, std::string title =
"calibration object")
141 if (!pObj)
throw std::runtime_error(
"Can't write " + title);
143 auto written = pObj->Write();
145 throw std::runtime_error(
"Writing of " + title +
" "
146 + pObj->IsA()->GetName() +
"[\"" + pObj->GetName() +
"\"] failed!");
148 std::cout <<
"Written " << title <<
" \"" << pObj->GetName()
149 <<
"\" (" << pObj->IsA()->GetName() <<
") [" << written <<
" bytes]"
155 TObject* CreateNeutralPionCalibration(std::string
name =
"Pi0") {
157 constexpr Int_t NPoints = 21;
158 constexpr Double_t MinE = 0.0;
159 constexpr Double_t MaxE = 2.0;
161 constexpr Double_t ERange = MaxE - MinE;
162 constexpr Double_t BinWidth = ERange / (NPoints - 1);
165 TGraphErrors* pGCorr =
new TGraphErrors(NPoints);
166 pGCorr->SetNameTitle(
168 "#pi^{0} energy calibration"
169 ";reconstructed energy [ GeV ]"
173 for (Int_t i = 0; i < NPoints; ++i) {
174 Double_t
const E = MinE + BinWidth * i;
177 = 1.1 - 0.2 * std::sin((E - MinE) / ERange * TMath::Pi() * 2.);
179 pGCorr->SetPoint(i, E, f);
181 pGCorr->SetPointError(i, BinWidth / 2., f * 0.1);
190 TObject* CreatePhotonCalibration(std::string
name =
"Photon") {
192 constexpr Int_t NPoints = 21;
193 constexpr Double_t MinE = 0.0;
194 constexpr Double_t MaxE = 2.0;
196 constexpr Double_t ERange = MaxE - MinE;
197 constexpr Double_t BinWidth = ERange / (NPoints - 1);
200 TGraphErrors* pGCorr =
new TGraphErrors(NPoints);
201 pGCorr->SetNameTitle(
203 "#gamma energy calibration"
204 ";reconstructed energy [ GeV ]"
208 for (Int_t i = 0; i < NPoints; ++i) {
209 Double_t
const E = MinE + BinWidth * i;
212 = 1.1 + 0.1 * std::sin((E - MinE) / ERange * TMath::Pi() / 2.);
214 pGCorr->SetPoint(i, E, f);
216 pGCorr->SetPointError(i, BinWidth / 2., f * 0.1);
225 TObject* CreateElectronCalibration(std::string
name =
"Electron") {
227 constexpr Int_t NPoints = 21;
228 constexpr Double_t MinE = 0.0;
229 constexpr Double_t MaxE = 2.0;
231 constexpr Double_t ERange = MaxE - MinE;
232 constexpr Double_t BinWidth = ERange / (NPoints - 1);
235 TGraphErrors* pGCorr =
new TGraphErrors(NPoints);
236 pGCorr->SetNameTitle(
238 "e^{#pm} energy calibration"
239 ";reconstructed energy [ GeV ]"
243 for (Int_t i = 0; i < NPoints; ++i) {
244 Double_t
const E = MinE + BinWidth * i;
247 = 1.15 + 0.1 * std::sin((E - MinE) / ERange * TMath::Pi());
249 pGCorr->SetPoint(i, E, f);
251 pGCorr->SetPointError(i, BinWidth / 2., f * 0.1);
260 TObject* CreateMuonCalibration(std::string
name =
"Muon") {
262 constexpr Int_t NPoints = 21;
263 constexpr Double_t MinE = 0.0;
264 constexpr Double_t MaxE = 2.0;
266 constexpr Double_t ERange = MaxE - MinE;
267 constexpr Double_t BinWidth = ERange / (NPoints - 1);
270 TGraphErrors* pGCorr =
new TGraphErrors(NPoints);
271 pGCorr->SetNameTitle(
273 "#mu^{#pm} energy calibration"
274 ";reconstructed energy [ GeV ]"
278 for (Int_t i = 0; i < NPoints; ++i) {
279 Double_t
const E = MinE + BinWidth * i;
282 = 1.05 + 0.02 * std::sin((E - MinE) / ERange * TMath::Pi() * 1.5);
284 pGCorr->SetPoint(i, E, f);
286 pGCorr->SetPointError(i, BinWidth / 2., f * 0.1);
295 TObject* CreateGeneralCalibration(std::string
name =
"Default") {
297 constexpr Double_t MinE = 0.0;
298 constexpr Double_t MaxE = 2.2;
300 constexpr Double_t ERange = MaxE - MinE;
302 TGraphErrors* pGCorr =
new TGraphErrors(1);
303 pGCorr->SetNameTitle(
305 "Generic energy calibration"
306 ";reconstructed energy [ GeV ]"
311 Double_t
const E = MinE + ERange / 2.;
312 Double_t
const f = 1.10;
314 pGCorr->SetPoint(0, E, f);
316 pGCorr->SetPointError(0, ERange / 2., f * 0.1);
328 (std::string outputPath)
334 TDirectory* pOutputDir = CreateROOTdir(outputPath);
336 std::cerr <<
"Can't create ROOT directory '" << outputPath <<
"'"
340 TFile* pOutputFile = pOutputDir->GetFile();
347 WriteCalibrationObject
348 (CreateNeutralPionCalibration(),
"pion calibration");
349 WriteCalibrationObject(CreatePhotonCalibration(),
"photon calibration");
350 WriteCalibrationObject
351 (CreateElectronCalibration(),
"electron calibration");
352 WriteCalibrationObject(CreateMuonCalibration(),
"muon calibration");
353 WriteCalibrationObject(CreateGeneralCalibration(),
"generic calibration");
355 catch (std::runtime_error
const&
e) {
356 std::cerr <<
"An error occurred: " << e.what() << std::endl;
364 pOutputFile->Write();
BEGIN_PROLOG could also be cerr
BEGIN_PROLOG triggeremu_data_config_icarus settings PMTADCthresholds sequence::icarus_stage0_multiTPC_TPC physics sequence::icarus_stage0_EastHits_TPC physics sequence::icarus_stage0_WestHits_TPC physics producers purityana0 caloskimCalorimetryCryoE physics caloskimCalorimetryCryoW physics path
int CreateTestShowerCalibrationFromPID(std::string outputPath)
Creates a test calibration file for ShowerCalibrationGaloreFromPID.
Creates a test calibration file for ShowerCalibrationGaloreFromPID.
then echo File list $list not found else cat $list while read file do echo $file sed s
services TFileService fileName
BEGIN_PROLOG could also be cout