18CountHelper::CountHelper(
const std::shared_ptr<ULong64_t> &resultCount,
const unsigned int nSlots)
19 : fResultCount(resultCount), fCounts(nSlots, 0)
28void CountHelper::Finalize()
31 for (
auto &
c : fCounts) {
36ULong64_t &CountHelper::PartialUpdate(
unsigned int slot)
41void BufferedFillHelper::UpdateMinMax(
unsigned int slot,
double v)
43 auto &thisMin = fMin[slot * CacheLineStep<BufEl_t>()];
44 auto &thisMax = fMax[slot * CacheLineStep<BufEl_t>()];
45 thisMin = std::min(thisMin,
v);
46 thisMax = std::max(thisMax,
v);
49BufferedFillHelper::BufferedFillHelper(
const std::shared_ptr<Hist_t> &
h,
const unsigned int nSlots)
50 : fResultHist(
h), fNSlots(nSlots), fBufSize(fgTotalBufSize / nSlots), fPartialHists(fNSlots),
51 fMin(nSlots *
CacheLineStep<BufEl_t>(), std::numeric_limits<BufEl_t>::max()),
52 fMax(nSlots *
CacheLineStep<BufEl_t>(), std::numeric_limits<BufEl_t>::lowest())
54 fBuffers.reserve(fNSlots);
55 fWBuffers.reserve(fNSlots);
56 for (
unsigned int i = 0; i < fNSlots; ++i) {
59 fBuffers.emplace_back(
v);
60 fWBuffers.emplace_back(
v);
66 UpdateMinMax(slot,
v);
67 fBuffers[slot].emplace_back(
v);
72 UpdateMinMax(slot,
v);
73 fBuffers[slot].emplace_back(
v);
74 fWBuffers[slot].emplace_back(
w);
77Hist_t &BufferedFillHelper::PartialUpdate(
unsigned int slot)
79 auto &partialHist = fPartialHists[slot];
82 partialHist = std::make_unique<Hist_t>(*fResultHist);
83 auto weights = fWBuffers[slot].empty() ? nullptr : fWBuffers[slot].data();
84 partialHist->FillN(fBuffers[slot].
size(), fBuffers[slot].
data(), weights);
88void BufferedFillHelper::Finalize()
90 for (
unsigned int i = 0; i < fNSlots; ++i) {
91 if (!fWBuffers[i].empty() && fBuffers[i].
size() != fWBuffers[i].
size()) {
92 throw std::runtime_error(
"Cannot fill weighted histogram with values in containers of different sizes.");
96 BufEl_t globalMin = *std::min_element(fMin.begin(), fMin.end());
97 BufEl_t globalMax = *std::max_element(fMax.begin(), fMax.end());
99 if (fResultHist->CanExtendAllAxes() && globalMin != std::numeric_limits<BufEl_t>::max() &&
100 globalMax != std::numeric_limits<BufEl_t>::lowest()) {
101 fResultHist->SetBins(fResultHist->GetNbinsX(), globalMin, globalMax);
104 for (
unsigned int i = 0; i < fNSlots; ++i) {
105 auto weights = fWBuffers[i].empty() ? nullptr : fWBuffers[i].data();
106 fResultHist->FillN(fBuffers[i].
size(), fBuffers[i].
data(), weights);
135MeanHelper::MeanHelper(
const std::shared_ptr<double> &meanVPtr,
const unsigned int nSlots)
136 : fResultMean(meanVPtr), fCounts(nSlots, 0), fSums(nSlots, 0), fPartialMeans(nSlots), fCompensations(nSlots)
144 double y =
v - fCompensations[slot];
145 double t = fSums[slot] +
y;
146 fCompensations[slot] = (t - fSums[slot]) -
y;
150void MeanHelper::Finalize()
152 double sumOfSums = 0;
154 double compensation(0);
157 for (
auto &
m : fSums) {
158 y =
m - compensation;
160 compensation = (t - sumOfSums) -
y;
164 for (
auto &
c : fCounts)
166 *fResultMean = sumOfSums / (sumOfCounts > 0 ? sumOfCounts : 1);
169double &MeanHelper::PartialUpdate(
unsigned int slot)
171 fPartialMeans[slot] = fSums[slot] / fCounts[slot];
172 return fPartialMeans[slot];
179template void MeanHelper::Exec(
unsigned int,
const std::vector<unsigned int> &);
181StdDevHelper::StdDevHelper(
const std::shared_ptr<double> &meanVPtr,
const unsigned int nSlots)
182 : fNSlots(nSlots), fResultStdDev(meanVPtr), fCounts(nSlots, 0), fMeans(nSlots, 0), fDistancesfromMean(nSlots, 0)
189 auto count = ++fCounts[slot];
190 auto delta =
v - fMeans[slot];
191 auto mean = fMeans[slot] + delta / count;
192 auto delta2 =
v - mean;
193 auto distance = fDistancesfromMean[slot] + delta * delta2;
195 fCounts[slot] = count;
197 fDistancesfromMean[slot] = distance;
200void StdDevHelper::Finalize()
203 double totalElements = 0;
204 for (
auto c : fCounts) {
207 if (totalElements == 0 || totalElements == 1) {
213 double overallMean = 0;
214 for (
unsigned int i = 0; i < fNSlots; ++i) {
215 overallMean += fCounts[i] * fMeans[i];
217 overallMean = overallMean / totalElements;
220 for (
unsigned int i = 0; i < fNSlots; ++i) {
221 if (fCounts[i] == 0) {
224 auto setVariance = fDistancesfromMean[i] / (fCounts[i]);
225 variance += (fCounts[i]) * (setVariance +
std::pow((fMeans[i] - overallMean), 2));
228 variance = variance / (totalElements - 1);
240template class TakeHelper<bool, bool, std::vector<bool>>;
241template class TakeHelper<unsigned int, unsigned int, std::vector<unsigned int>>;
242template class TakeHelper<unsigned long, unsigned long, std::vector<unsigned long>>;
243template class TakeHelper<unsigned long long, unsigned long long, std::vector<unsigned long long>>;
244template class TakeHelper<int, int, std::vector<int>>;
245template class TakeHelper<long, long, std::vector<long>>;
246template class TakeHelper<long long, long long, std::vector<long long>>;
247template class TakeHelper<float, float, std::vector<float>>;
248template class TakeHelper<double, double, std::vector<double>>;
255 if (fileMode !=
"update")
259 std::unique_ptr<TFile> outFile{
TFile::Open(fileName.c_str(),
"update")};
260 if (!outFile || outFile->IsZombie())
261 throw std::invalid_argument(
"Snapshot: cannot open file \"" + fileName +
"\" in update mode");
263 TObject *outTree = outFile->Get(treeName.c_str());
264 if (outTree ==
nullptr)
270 static_cast<TTree *
>(outTree)->Delete(
"all");
272 outFile->
Delete(treeName.c_str());
275 const std::string msg =
"Snapshot: tree \"" + treeName +
"\" already present in file \"" + fileName +
276 "\". If you want to delete the original tree and write another, please set "
277 "RSnapshotOptions::fOverwriteIfExists to true.";
278 throw std::invalid_argument(msg);
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
unsigned long long ULong64_t
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
static TFile * Open(const char *name, Option_t *option="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault, Int_t netopt=0)
Create / open a file.
Mother of all ROOT objects.
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
void ToLower()
Change string to lower-case.
A TTree represents a columnar dataset.
void Delete(Option_t *option="") override
Delete this tree from memory or/and disk.
RVec< PromoteTypes< T0, T1 > > pow(const T0 &x, const RVec< T1 > &v)
CPYCPPYY_EXTERN bool Exec(const std::string &cmd)
void ValidateSnapshotOutput(const RSnapshotOptions &opts, const std::string &treeName, const std::string &fileName)
constexpr std::size_t CacheLineStep()
Stepping through CacheLineStep<T> values in a vector<T> brings you to a new cache line.
VecExpr< UnaryOp< Sqrt< T >, VecExpr< A, T, D >, T >, T, D > sqrt(const VecExpr< A, T, D > &rhs)
This file contains a specialised ROOT message handler to test for diagnostic in unit tests.
A collection of options to steer the creation of the dataset on file.
std::string fMode
Mode of creation of output file.
bool fOverwriteIfExists
If fMode is "UPDATE", overwrite object in output file if it already exists.