EICd
EIC data model
|
A podio based data model.
The entire data model is defined with a single YAML file. Here is the current definition:
--- options : # should getters / setters be prefixed with get / set? getSyntax: False # should POD members be exposed with getters/setters in classes that have them as members? exposePODMembers: False includeSubfolder: True ## right now we rigurously enforce: ## - No breaking of PODness: ## - No use of relations and vectors ## - Use special Relation structures where needed, indexing by ID (index) ## - IDs are stored as eic::Index, which is a thin layer of an signed integer ## where -1 relates to "no index". ## - For 1-to-many relations: Use many-to-1 IDs instead --> use forward links ## This puts the burden on the reconstruction algorithm and keeps the data 2D! ## - Use float most of the time except for 4-vectors where ppm precision is important. ## - Data alignment: ## - data should be aligned with a 64-bit structure where possible. ## - when using 32 bit values, use them in pairs (or after all 64-bit variables are defined). ## - same goes for 16-bit values (keep them aligned with the largest following component) ## - Explicitly specify the integer length (use the typedefs from <cstdint>, ## such as int32_t etc) components: ## Unique field identifier. Has 2 components: source and ID where ## source identifies the originating collection (or algorithm) and ID ## the ID of the entry within this collection. ## Defaults to -1 for an unset index. eic::Index: Members: - int32_t value - int32_t source ExtraCode: declaration: " Index() : source{0}, value{-1} {}\n Index(int32_t id, int32_t src) : value{id}, source{src} {}\n Index(Index rhs, int32_t new_src) : Index(rhs.value, new_src) {} \n bool empty() const {return value < 0;}\n bool valid() const {return value >= 0 && source != 0;}\n bool equals(const eic::Index& rhs) const {return rhs.source == source && rhs.value == value;}\n bool operator==(const eic::Index& rhs) const {return equals(rhs);}\n bool operator!=(const eic::Index& rhs) const {return !equals(rhs);}\n explicit operator bool() const {return valid();} " ## simple weight that defaults to 1 if not set eic::Weight: Members: - float value ExtraCode: declaration: " Weight() : value{1.} {}\n Weight(double w) : value {static_cast<float>(w)} {}\n Weight& operator=(double w) {value = static_cast<float>(w); return *this;}\n operator float() const {return value;} " ## first-second pair of float s eic::FloatPair: Members: - float first - float second ExtraCode: includes: "#include <tuple>" declaration: " FloatPair() : first{0}, second{0} {}\n FloatPair(double a, double b) : first{static_cast<float>(a)}, second{static_cast<float>(b)} {}\n FloatPair(const std::pair<float, float>& p) : first{p.first}, second{p.second} {}\n FloatPair& operator=(const std::pair<float, float>& p) {first = p.first; second = p.second; return *this;}\n float& operator[](unsigned i) {return *(&first + i);}\n const float& operator[](unsigned i) const {return *(&first + i);}\n operator std::pair<float, float>() const {return {first, second};}\n " eic::VectorXY: Members: - float x // [mm] or [GeV] - float y // ExtraCode: includes: "#include <cmath>\n" declaration: " VectorXY() : x{0}, y{0} {}\n VectorXY(double xx, double yy) : x{static_cast<float>(xx)}, y{static_cast<float>(yy)} {}\n float& operator[](unsigned i) {return *(&x + i);}\n const float& operator[](unsigned i) const {return *(&x + i);}\n float mag() const {return std::hypot(x, y);}\n float r() const {return mag();}\n float phi() const {return atan2(y, x);}\n operator std::pair<float, float>() const {return {x, y};}\n float dot(const VectorXY& rhs) const {return x*rhs.x + y*rhs.y;}\n VectorXY add(const VectorXY& rhs) const {return {x+rhs.x, y+rhs.y};}\n VectorXY subtract(const VectorXY& rhs) const {return {x-rhs.x, y-rhs.y};}\n VectorXY scale(double f) const {return {f*x, f*y};}\n " eic::Direction: Members: - float theta // [rad, 0->pi] - float phi // [rad, -pi->pi] ExtraCode: includes: "#include <cmath>\n#include <tuple>" declaration: " Direction() : theta{0}, phi{0} {}\n Direction(double th, double ph) : theta{static_cast<float>(th)}, phi{static_cast<float>(ph)} {}\n Direction(double x, double y, double z)\n : theta{static_cast<float>(acos(z/std::hypot(x,y,z)))}\n , phi{static_cast<float>(atan2(y,x))} {}\n template <class VectorType> Direction(const VectorType& v) : Direction(v.theta(), v.phi()) {}\n operator std::pair<float, float>() const {return {theta, phi};}\n float eta() const {return -log(tan(0.5*theta));}\n Direction add(const Direction& rhs) const {return {theta+rhs.theta, phi+rhs.phi};}\n Direction subtract(const Direction& rhs) const {return {theta-rhs.theta, phi-rhs.phi};}\n " eic::VectorXYZ: Members: - float x // [mm] or [GeV] - float y // - float z // ExtraCode: includes: "#include <cmath>\n#include<tuple>" declaration: " VectorXYZ() : x{0}, y{0}, z{0} {}\n VectorXYZ(double xx, double yy, double zz) : x{static_cast<float>(xx)}, y{static_cast<float>(yy)}, z{static_cast<float>(zz)} {}\n template<class VectorPolarType> VectorXYZ(const VectorPolarType& v) : VectorXYZ(v.x(), v.y(), v.z()) {}\n float& operator[](unsigned i) {return *(&x + i);}\n const float& operator[](unsigned i) const {return *(&x + i);}\n float mag() const {return std::hypot(x, y, z);}\n float r() const {return mag();}\n float theta() const {return acos(z/mag());}\n float phi() const {return atan2(y,x);}\n float eta() const {return -log(tan(0.5*theta()));}\n operator std::tuple<float, float, float>() {return {x, y, z};}\n float dot(const VectorXYZ& rhs) const {return x*rhs.x + y*rhs.y + z*rhs.z;}\n VectorXYZ add(const VectorXYZ& rhs) const {return {x+rhs.x, y+rhs.y, z+rhs.z};}\n VectorXYZ subtract(const VectorXYZ& rhs) const {return {x-rhs.x, y-rhs.y, z-rhs.z};}\n VectorXYZ scale(double f) const {return {f*x, f*y, f*z};}\n " eic::VectorPolar: Members: - float r // [mm] or [GeV] - float theta // [rad, 0->pi] - float phi // [rad, -pi->pi] ExtraCode: includes: "#include <cmath>\n#include<tuple>" declaration: " VectorPolar() : r{0}, theta{0}, phi{0} {}\n VectorPolar(double rr, double th, double ph) : r{static_cast<float>(rr)}, theta{static_cast<float>(th)}, phi{static_cast<float>(ph)} {}\n template<class VectorXYZType> VectorPolar(const VectorXYZType& v) : VectorPolar(v.r(), v.theta(), v.phi()) {}\n float mag() const {return r;}\n float x() const {return r * cos(phi) * sin(theta);}\n float y() const {return r * sin(phi) * sin(theta);}\n float z() const {return r * cos(theta);}\n float eta() const {return -log(tan(0.5*theta));}\n operator std::tuple<float, float, float>() {return {r, theta, phi};}\n " eic::VectorXYZT: Members: - double x // [mm] or [GeV] - double y // - double z // - double t // [ns] or [GeV] ExtraCode: includes: "#include <cmath>\n#include <tuple>" declaration: " VectorXYZT() : x{0}, y{0}, z{0}, t{0} {}\n VectorXYZT(double xx, double yy, double zz, double tt) : x{xx}, y{yy}, z{zz}, t{tt} {}\n double& operator[](unsigned i) {return *(&x + i);}\n const double& operator[](unsigned i) const {return *(&x + i);}\n double mag() const {return std::hypot(x, y, z);}\n double r() const {return mag();}\n double theta() const {return acos(z/mag());}\n double phi() const {return atan2(y,x);}\n double eta() const {return -log(tan(0.5*theta()));} double energy() const {return t;}\n double mass() const {return sqrt(t*t - x*x - y*y - z*z);}\n operator std::tuple<double, double, double, double>() {return {x, y, z, t};}\n double dot(const VectorXYZT& rhs) const {return t*rhs.t - x*rhs.x - y*rhs.y - z*rhs.z;}\n VectorXYZT add(const VectorXYZT& rhs) const {return {x+rhs.x, y+rhs.y, z+rhs.z, t+rhs.t};}\n VectorXYZT subtract(const VectorXYZT& rhs) const {return {x-rhs.x, y-rhs.y, z-rhs.z, t-rhs.t};}\n VectorXYZT scale(double f) const {return {f*x, f*y, f*z, f*t};}\n " eic::CovDiagXYZ: Members: - float xx - float yy - float zz ExtraCode: declaration: " CovDiagXYZ() : xx{0}, yy{0}, zz{0} {}\n CovDiagXYZ(double x, double y, double z) : xx{static_cast<float>(x)}, yy{static_cast<float>(y)}, zz{static_cast<float>(z)} {}\n float operator()(unsigned i, unsigned j) const {return (i == j) ? *(&xx + i) : 0.;}\n " eic::CovDiagXYZT: Members: - double xx - double yy - double zz - double tt ExtraCode: declaration: " CovDiagXYZT() : xx{0}, yy{0}, zz{0}, tt{0} {}\n CovDiagXYZT(double x, double y, double z, double t) : xx{x}, yy{y}, zz{z}, tt{t} {}\n double operator()(unsigned i, unsigned j) const {return (i == j) ? *(&xx + i) : 0.;}\n " eic::CovXYZ: Members: - float xx - float yy - float zz - float xy - float xz - float yz ExtraCode: declaration: " CovXYZ() : xx{0}, yy{0}, zz{0}, xy{0}, xz{0}, yz{0} {}\n CovXYZ(double vx, double vy, double vz, double vxy, double vxz, double vyz)\n : xx{static_cast<float>(vx)}, yy{static_cast<float>(vy)}, zz{static_cast<float>(vz)},\n xy{static_cast<float>(vxy)}, xz{static_cast<float>(vxz)}, yz{static_cast<float>(vyz)} {}\n float operator()(unsigned i, unsigned j) const {\n // diagonal\n if (i == j) {\n return *(&xx + i);\n }\n // off-diagonal\n // we have as options (0, 1), (0, 2) and (1, 2) (and mirrored)\n // note that, starting from xy, we find the correct element at (i+j-1)\n return *(&xy + i + j - 1);\n }\n " datatypes: ## ========================================================================== ## Event info ## ========================================================================== eic::EventInfo: Description: "Event Info" Author: "W. Armstrong, S. Joosten" Members: - uint64_t run // Run number. - uint64_t number // Event number. - int32_t type // event type identifier (TBD). - int32_t proc // Process identifier (TBD). - int32_t source // Source/identifier (TBD) - eic::Weight weight // Optional event weight (useful for MC) ## ========================================================================== ## Particle info ## ========================================================================== eic::BasicParticle: Description: "Basic particle used internally to communicate basic particle properties." Author: "W. Armstrong, S. Joosten" Members: - eic::Index ID // Unique particle index - eic::VectorXYZ p // momentum [GeV] - eic::VectorXYZ v // vertex [mm] - float time // Time in [ns] - int32_t pid // particle PDG code - int16_t status // Status code - int16_t charge // Particle charge (or sign) - eic::Weight weight // Particle weight, e.g. from PID algorithm [0-1] eic::ReconstructedParticle: Description: "EIC Reconstructed Particle" Author: "W. Armstrong, S. Joosten" Members: - eic::Index ID // Unique particle index - eic::VectorXYZ p // momentum vector [GeV] - eic::VectorXYZ v // vertex [mm] - float time // Time in [ns] - int32_t pid // PID of reconstructed particle. - int16_t status // Status code - int16_t charge // Particle charge (or sign) - eic::Weight weight // Particle weight, e.g. from PID algorithm [0-1] - eic::Direction direction // Direction (theta/phi of this particle [mrad]) - float momentum // particle 3-momentum magnitude [GeV] - float energy // Particle energy, consistent with PID assigment [GeV] - float mass // The mass of the particle in [GeV] eic::ReconstructedParticleRelations: Description: "Relational info associated with our reconstructed particle" Author: "S. Joosten" Members: - eic::Index recID // ReconstructedParticle index - eic::Index vertexID // Start vertex for this particle - eic::Index trackID // Index of the associated track, if any - eic::Index ecalID // Index of associated pos/barrel/neg ECAL cluster, if any - eic::Index hcalID // Index of associated pos/barrel/neg HCAL cluster, if any - eic::Index cherID // Index of associated pos/barrel/neg Cherenkov info, if any - eic::Index tofID // Index of the associated TOF info, if any - eic::Index mcID // Index of the associated MC particle, if any ## ========================================================================== ## Calorimetry ## ========================================================================== eic::RawCalorimeterHit: Description: "Raw (digitized) calorimeter hit" Author: "W. Armstrong, S. Joosten" Members: - eic::Index ID // unique ID for this hit - int64_t cellID // The detector specific (geometrical) cell id. - int64_t amplitude // The amplitude of the hit in ADC counts. - int64_t time // Timing in TDC eic::CalorimeterHit: Description: "Calorimeter hit" Author: "W. Armstrong, S. Joosten" Members: - eic::Index ID // unique ID for this hit - int64_t cellID // The detector specific (geometrical) cell id. - int32_t layer // layer for this hit - int32_t sector // sector for this hit - float energy // The energy for this hit in [GeV]. - float energyError // Error on energy [GeV]. - float time // The time of the hit in [ns]. - eic::VectorXYZ position // The global position of the hit in world coordinates [mm]. - eic::VectorXYZ local // The local position of the hit in detector coordinates [mm]. - eic::VectorXYZ dimension // The dimension information of the cell [mm]. ## ========================================================================== ## Clustering ## ========================================================================== eic::ProtoCluster: Description: "Relational info linking hits to their associated cluster" Author: "S. Joosten" Members: - eic::Index hitID // Hit ID - eic::Index clusterID // ID of the cluster associated with this hit (-1 if none) - eic::Weight weight // How much of this hit belongs to the cluster? [0->1] eic::Cluster: Description: "EIC cluster" Author: "W. Armstrong, S. Joosten, C.Peng" Members: - eic::Index ID // unique ID for this cluster - float energy // Reconstructed energy of the cluster [GeV]. - float energyError // Error on the cluster energy [GeV] - float time // [ns] - uint32_t nhits // Number of hits in the cluster. - eic::VectorXYZ position // Global position of the cluster [mm]. - eic::CovXYZ positionError // Covariance matrix of the position (6 Parameters). - float radius // shower radius [mm] - float skewness // shower skewness [unitless] eic::Cluster2DInfo: Description: "Additional info for 3D clusters" Author: "S. Joosten" Members: - eic::Index clusterID // Primary cluster ID - eic::VectorPolar polar // Cluster position polar information - float eta // Cluster pseudorapidity eic::Cluster3DInfo: Description: "Additional info for 3D clusters" Author: "S. Joosten" Members: - eic::Index clusterID // Primary cluster ID - eic::VectorPolar polar // Cluster position polar information - float eta // Cluster pseudorapidity - eic::Direction direction // Intrinsic direction of the cluster at the central position [rad, 0->pi and -pi->pi] eic::ClusterLayer: Description: "2D Cluster in a single layer for a multi-layer detector" Author: "S. Joosten, C. Peng" Members: - eic::Index ID // unique layer ID - eic::Index clusterID // associated full 3D cluster, -1 if none - int32_t layer // layer number for this cluster layer - uint32_t nhits // Number of hits - float energy // Energy in this cluster layer [GeV] - float energyError // Error on energy [GeV] - float radius // Shower radius [mm] - float skewness // Skewness of hits distribution - eic::VectorXYZ position // Global center position. [mm] eic::MergedClusterRelations: Description: "Relational info between a merged cluster and its parents" Author: "S. Joosten" Members: - eic::Index clusterID // associated cluster ID - uint32_t size // number of valid parents - std::array<eic::Index, 4> parent // (up to 4) parents for this cluster ## ========================================================================== ## RICH/Cherenkov data structures ## ========================================================================== eic::RawPMTHit: Description: "EIC Raw PMT hit" Author: "S. Joosten, C. Peng" Members: - eic::Index ID // unique hit ID - int64_t cellID // The detector specific (geometrical) cell id. - uint32_t amplitude // PMT signal amplitude [ADC] - uint32_t time // PMT signal time [TDC] eic::PMTHit: Description: "EIC PMT hit" Author: "S. Joosten, C. Peng" Members: - eic::Index ID // Unique hit ID - int64_t cellID // The detector specific (geometrical) cell id. - float npe // estimated number of photo-electrons [#] - float time // Time [ns] - float timeError // Error on the time [ns] - eic::VectorXYZ position // PMT hit position [mm] - eic::VectorXYZ local // The local position of the hit in detector coordinates [mm] - eic::VectorXYZ dimension // The dimension information of the pixel [mm]. eic::RingImage: Description: "EIC Ring Image Cluster" Author: "S. Joosten, C. Peng" Members: - eic::Index ID // Unique cluster ID - float npe // number of photo-electrons [#] - eic::VectorXYZ position // Global position of the cluster [mm] - eic::VectorXYZ positionError // Error on the position - float theta // opening angle of the ring [rad, 0->pi] - float thetaError // error on the opening angle - float radius // radius of the best fit ring [mm] - float radiusError // estimated error from the fit [mm] ## ========================================================================== ## Tracking ## ========================================================================== eic::RawTrackerHit: Description: "Raw (digitized) tracker hit" Author: "W. Armstrong, S. Joosten" Members: - eic::Index ID // unique ID for this hit - int64_t cellID // The detector specific (geometrical) cell id. - int32_t time // tdc value. - int32_t charge // adc value eic::TrackerHit: Description: "Tracker hit (reconstructed from Raw)" Author: "W. Armstrong, S. Joosten" Members: - eic::Index ID // unique ID for this hit - int64_t cellID // The detector specific (geometrical) cell id. - eic::VectorXYZT position // Hit (cell) position and time [mm, ns] - eic::CovDiagXYZT covMatrix // Covariance Matrix - float edep // Energy deposit in this hit [GeV] - float edepError // Error on the energy deposit [GeV] ConstExtraCode: declaration: " double time() const {return position().t;}\n " ## Here's a stub for a prototrack setup. If this is all we use we should ## probably just use protocluster instead, but I assume there will be other ## members we'll need to communicate ## eic::ProtoTrack: ## Description: "Proto track info" ## Author: "S. Joosten" ## Members: ## eic::Index hitID // Unique hit identifier ## eic::Index trackID // link to the associated track ## eic::Weight weight // prototrack weight, in case we share pixels [0-1] eic::TrackParameters: Description: "ACTS Bound Track parameters" Author: "W. Armstrong, S. Joosten" Members: - eic::Index ID // unique ID for this track - eic::FloatPair loc // tracking location - eic::FloatPair locError // error on the location - eic::Direction direction // track direction (theta, phi) [rad, 0-pi and -pi->pi] - eic::Direction directionError // error on the direction [rad] - float qOverP // [e/GeV] - float qOverPError // error on qOverP - float time // track time [ns] - float timeError // error on the time ## ========================================================================== ## Vertexing ## ========================================================================== eic::Vertex: Description: "EIC vertex" Author: "W. Armstrong, S. Joosten" Members: - eic::Index ID // unique vertex ID - eic::VectorXYZ position // postion of vertex [mm] - float time // time of vertex [ns] - float chi2 // Chi squared of the vertex fit. - float probability // Probability of the vertex fit - bool primary // Whether it is the primary vertex of the event