Skip to content
Snippets Groups Projects

Major overhaul

Merged Christian Holm Christensen requested to merge json_output into master
137 files
+ 7631
8201
Compare changes
  • Side-by-side
  • Inline
Files
137
+ 69
69
@@ -25,9 +25,7 @@
#ifndef ANA_ANALYZER_HH
#define ANA_ANALYZER_HH
#include <correlations/ana/Profile.hh>
#include <correlations/ana/IOGuard.hh>
#include <correlations/ana/Reader.hh>
#include <correlations/ana/Writer.hh>
#include <correlations/gen/Generator.hh>
#include <correlations/ana/Progress.hh>
@@ -45,6 +43,7 @@ namespace ana
using Real = gen::Generator::Real;
using EtaPtPhiW = gen::Generator::EtaPtPhiW;
using ParticleVector = gen::Generator::ParticleVector;
using Header = gen::Header;
/**
* Before event processing
@@ -65,7 +64,12 @@ namespace ana
*
* @param fini finalize
*/
virtual void end(bool fini=true) = 0;
virtual json::JSON end(bool fini=true)
{
if (!fini) return toJson();
return result();
}
/**
* Run the test using in-memory generation of particle data
@@ -74,12 +78,11 @@ namespace ana
* @param g Generator of events
* @param fini If true, finalize, otherwise dump
*/
virtual void run(gen::Generator& g,
size_t nev,
bool fini=true)
virtual json::JSON run(gen::Generator& g,
size_t nev,
bool fini=true)
{
gen::Header h = g.header(nev);
dump_header(h);
_header = g.header(nev);
ParticleVector p;
Progress pm(std::cerr,nev);
@@ -91,7 +94,7 @@ namespace ana
post();
}
end(fini);
return end(fini);
}
/**
@@ -102,30 +105,28 @@ namespace ana
* @param read If true, load state
* @param fini If true, finalize, otherwise dump
*/
virtual void run(std::istream& in,
size_t maxEv=0,
bool read=false,
bool fini=true)
virtual json::JSON run(std::istream& in,
size_t maxEv=0,
bool read=false,
bool fini=true)
{
if (!in.good())
throw std::runtime_error("Bad input stream for reading data");
if (read) {
merge(in);
end(fini);
return;
return end(fini);
}
gen::Header h = gen::Header::read(in);
size_t nev = h._nev;
maxEv = maxEv > 0 ? std::min(maxEv,nev) : nev;
h._nev = maxEv;
dump_header(h);
_header = Header::read(in);
size_t nev = _header._nev;
maxEv = maxEv > 0 ? std::min(maxEv,nev) : nev;
_header._nev = maxEv;
Reader r;
ParticleVector p;
size_t i = 0;
Progress pm(std::cout,maxEv);
Progress pm(std::cerr,maxEv);
while (r.event(in,p) > 0 && (maxEv == 0 || i < maxEv)) {
pm.print(i+1);
pre();
@@ -133,7 +134,7 @@ namespace ana
post();
i++;
}
end(fini);
return end(fini);
}
/**
@@ -144,14 +145,15 @@ namespace ana
* @param read If true, load state
* @param fini If true, finalize, otherwise dump
*/
void run(const std::string& filename,
size_t maxEv=0,
bool read=false,
bool fini=true)
json::JSON run(const std::string& filename,
size_t maxEv=0,
bool read=false,
bool fini=true)
{
std::ifstream in(filename);
run(in, maxEv, read, fini);
auto json = run(in, maxEv, read, fini);
in.close();
return json;
}
/** Destructor */
virtual ~Analyzer() = default;
@@ -159,22 +161,12 @@ namespace ana
Analyzer(const Analyzer&) = delete;
/** Assignment operator */
Analyzer& operator=(const Analyzer&) = delete;
/**
* Load from input stream
*
*/
virtual void load(std::istream&) {}
virtual void merge(std::istream&) {}
protected:
/**
* Constructor
*/
Analyzer()
: _aphi(30, 0, 2*M_PI),
_hphi(_aphi),
_aeta(20, -1, 1),
_heta(_aeta),
_header()
: _header()
{}
/**
* Move copy constructor
@@ -182,57 +174,65 @@ namespace ana
* @param o Object to move from
*/
Analyzer(Analyzer&& o)
: _aphi(std::move(o._aphi)),
_hphi(std::move(o._hphi)),
_aeta(std::move(o._aeta)),
_heta(std::move(o._heta)),
_header(std::move(o._header))
: _header(std::move(o._header))
{}
/**
* Fill in @f$ \varphi@f$ observation
* Get results. Default implementation returns the header only
*
* @param phi @f$\varphi@f$
*/
void fillPhi(Real phi) { _hphi.fill(phi); }
virtual json::JSON result() const
{
json::JSON json = { "header", _header.toJson() };
return json;
}
/**
* Fill in @f$ \eta@f$ observation
*
* @param eta @f$\eta@f$
* Other stuff to add
*/
void fillEta(Real eta) { _heta.fill(eta); }
virtual json::JSON other() const { return json::JSON(); }
/**
* Fill in @f$\varphi@f$ observations
* Get state as JSON
*/
void fillPhis() { _hphi.update(); }
virtual json::JSON toJson() const
{
json::JSON json = { "header", _header.toJson(),
"analyzer", toJson() };
return json;
}
/**
* Fill in @f$\eta@f$ observations
* Decode state from JSON
*/
void fillEtas() { _heta.update(); }
virtual void fromJson(const json::JSON& json)
{
_header.fromJson(json["header"]);
}
/**
* Write out @f$\varphi@f$ histogram
* Merge state from JSON
*/
void writePhis(const std::string& filename="phi.dat",size_t ws=12)
virtual void mergeJson(const json::JSON& json)
{
_hphi.write(filename, ws);
_header.mergeJson(json["header"]);
}
/**
* Write out @f$\varphi@f$ histogram
* Merge from other object
*/
void writeEtas(const std::string& filename="eta.dat",size_t ws=12)
virtual void merge(const Analyzer& o)
{
_heta.write(filename, ws);
_header.merge(o._header);
}
virtual void dump_header(gen::Header&)
/**
* Merge states from stream
*/
void merge(std::istream& in)
{
size_t cnt = 0;
while (!in.eof()) {
json::JSON json;
in >> json;
mergeJson(json);
cnt++;
}
}
/** Axis for azimuthal angle */
Equidistant _aphi;
/** Azimuthal angle profile */
Profile _hphi;
/** Axis for psuedorapidity */
Equidistant _aeta;
/** Psuedorapidity profile */
Profile _heta;
/** Header */
gen::Header _header;
};
Loading