#ifndef __TQ_GRIDSCANPOINT__
#define __TQ_GRIDSCANPOINT__
#include <iostream>
#include "TH1.h"
#include "TString.h"
class TQGridScanNormalObservable;
class TQGridScanSplitObservable;
class TQGridScanPoint : public TObject {
public:
using NormalBounds = std::vector<std::pair<int, int>>;
using SplitBounds = std::vector<int>;
using NormalVals = std::vector<std::pair<double, double>>;
using SplitVals = std::vector<double>;
constexpr static double kValNotSet = std::numeric_limits<double>::quiet_NaN();
TQGridScanPoint() = default;
TQGridScanPoint(
NormalBounds normalBounds,
SplitBounds splitBounds,
double significance,
TString info
);
TQGridScanPoint(
NormalBounds normalBounds,
double significance,
TString info
);
TQGridScanPoint(
NormalBounds normalBounds,
SplitBounds splitBounds,
std::vector<double> foms,
TString info
);
TQGridScanPoint(
NormalBounds normalBounds,
std::vector<double> foms,
TString info
);
double significance() const { return m_significance; }
std::vector<double> foms() const {
if (!m_foms.empty()) {return m_foms;}
else {return {m_significance};}
}
const NormalBounds& normalBounds() const { return m_normalBounds; }
const SplitBounds& splitBounds() const { return m_splitBounds; }
const NormalVals& normalVals(const std::vector<TQGridScanNormalObservable*>& obsVec);
const SplitVals& splitVals(const std::vector<TQGridScanSplitObservable*>& obsVec);
void print();
const TString& info() const { return m_info; }
friend bool operator < (const TQGridScanPoint& lhs, const TQGridScanPoint& rhs) { return lhs.significance() < rhs.significance(); }
friend bool operator > (const TQGridScanPoint& lhs, const TQGridScanPoint& rhs) { return lhs.significance() > rhs.significance(); }
ClassDefOverride(TQGridScanPoint,2)
protected:
double m_significance = 0.0;
std::vector<double> m_foms;
TString m_info;
NormalBounds m_normalBounds;
SplitBounds m_splitBounds;
NormalVals m_normalVals;
SplitVals m_splitVals;
};
#endif