12#ifndef O2_ITS3_ALIGNMENT_HIERARCHY_H
13#define O2_ITS3_ALIGNMENT_HIERARCHY_H
25#include <TGeoMatrix.h>
26#include <TGeoPhysicalNode.h>
40 void add(uint32_t lab,
double coeff)
42 mLabels.push_back(lab);
43 mCoeff.push_back(coeff);
45 void write(std::ostream& os)
const;
46 auto getSize() const noexcept {
return mLabels.size(); }
51 std::vector<uint32_t> mLabels;
52 std::vector<double> mCoeff;
58 using Ptr = std::unique_ptr<AlignableVolume>;
74 void writeTree(std::ostream& os,
int indent = 0)
const;
77 auto getLevel() const noexcept {
return mLevel; }
79 bool isLeaf() const noexcept {
return mChildren.empty(); }
80 template <
class T = AlignableVolume>
81 requires std::derived_from<T, AlignableVolume>
84 auto c = std::make_unique<T>(symName,
label, det, sens);
85 return setParent(std::move(
c));
87 template <
class T = AlignableVolume>
88 requires std::derived_from<T, AlignableVolume>
91 auto c = std::make_unique<T>(symName, lbl);
92 return setParent(std::move(
c));
99 for (
auto&
c : mChildren) {
100 c->traverse(visitor);
110 void setRigidBody(std::unique_ptr<DOFSet> rb) { mRigidBody = std::move(rb); }
111 void setCalib(std::unique_ptr<DOFSet> cal) { mCalib = std::move(cal); }
115 bool isPseudo() const noexcept {
return mIsPseudo; }
119 bool isActive() const noexcept {
return mRigidBody !=
nullptr || mIsPseudo; }
134 TGeoPhysicalNode*
mPN{
nullptr};
142 std::string mSymName;
145 bool mIsPseudo{
false};
147 std::unique_ptr<DOFSet> mRigidBody;
148 std::unique_ptr<DOFSet> mCalib;
150 AlignableVolume* setParent(
Ptr c)
153 mChildren.push_back(std::move(
c));
154 return mChildren.back().get();
156 std::vector<Ptr> mChildren;
162void applyDOFConfig(AlignableVolume* root,
const std::string& jsonPath);
165void writeMillepedeResults(AlignableVolume* root,
const std::string& milleResPath,
const std::string& outJsonPath,
const std::string& injectedJsonPath =
"");
auto getLevel() const noexcept
AlignableVolume * addChild(const char *symName, GlobalLabel lbl)
bool isActive() const noexcept
bool isLeaf() const noexcept
virtual void computeJacobianL2T(const double *pos, Matrix66 &jac) const
void setSensorId(int id) noexcept
size_t getNChildren() const noexcept
AlignableVolume * addChild(const char *symName, uint32_t label, uint32_t det, bool sens)
AlignableVolume * getParent() const
void traverse(const std::function< void(AlignableVolume *)> &visitor)
virtual ~AlignableVolume()=default
DOFSet * getRigidBody() const
DOFSet * getCalib() const
std::unique_ptr< AlignableVolume > Ptr
void writeParameters(std::ostream &os) const
int getSensorId() const noexcept
virtual void defineMatrixT2L()
const Matrix66 & getJP2L() const
AlignableVolume & operator=(AlignableVolume &&)=delete
GlobalLabel getLabel() const noexcept
void finalise(uint8_t level=0)
const TGeoHMatrix & getT2L() const
AlignableVolume(AlignableVolume &&)=delete
const Matrix66 & getJL2P() const
void setPseudo(bool p) noexcept
bool isPseudo() const noexcept
bool isRoot() const noexcept
AlignableVolume * mParent
matrices
const TGeoHMatrix & getL2P() const
void setRigidBody(std::unique_ptr< DOFSet > rb)
AlignableVolume & operator=(const AlignableVolume &)=delete
virtual void defineMatrixL2G()
std::map< GlobalLabel, AlignableVolume * > SensorMapping
void writeTree(std::ostream &os, int indent=0) const
std::string getSymName() const noexcept
void writeRigidBodyConstraints(std::ostream &os) const
AlignableVolume(const AlignableVolume &)=delete
void setCalib(std::unique_ptr< DOFSet > cal)
void add(uint32_t lab, double coeff)
auto getSize() const noexcept
HierarchyConstraint(std::string name, double value)
void write(std::ostream &os) const
GLuint const GLchar * name
GLsizei const GLfloat * value
GLuint GLsizei const GLchar * label
Eigen::Matrix< double, 3, 6 > Matrix36
Eigen::Matrix< double, 6, 6 > Matrix66
void writeMillepedeResults(AlignableVolume *root, const std::string &milleResPath, const std::string &outJsonPath, const std::string &injectedJsonPath="")
void applyDOFConfig(AlignableVolume *root, const std::string &jsonPath)