56#include "MFTBase/GeometryTGeo.h"
67#include <TClonesArray.h>
68#include <TGeoMatrix.h>
69#include <TMatrixDSym.h>
75#include <TGeoManager.h>
76#include <TGeoMatrix.h>
77#include <TGeoOverlap.h>
78#include <TGeoPhysicalNode.h>
79#include <fmt/format.h>
90 fXYAngMisAligFactor(0.0),
91 fZCartMisAligFactor(0.0)
94 for (Int_t
i = 0;
i < 6;
i++) {
95 for (Int_t
j = 0;
j < 2;
j++) {
96 fLadderMisAlig[
i][
j] = 0.0;
97 fDiskMisAlig[
i][
j] = 0.0;
98 fSensorMisAlig[
i][
j] = 0.0;
99 fHalfMisAlig[
i][
j] = 0.0;
102 fLadderMisAlig[0][0] = cartXMisAligM;
103 fLadderMisAlig[0][1] = cartXMisAligW;
104 fLadderMisAlig[1][0] = cartYMisAligM;
105 fLadderMisAlig[1][1] = cartYMisAligW;
106 fLadderMisAlig[5][0] = angMisAligM;
107 fLadderMisAlig[5][1] = angMisAligW;
113 fXYAngMisAligFactor(0.0),
114 fZCartMisAligFactor(0.0)
117 for (Int_t
i = 0;
i < 6;
i++) {
118 for (Int_t
j = 0;
j < 2;
j++) {
119 fLadderMisAlig[
i][
j] = 0.0;
120 fDiskMisAlig[
i][
j] = 0.0;
121 fSensorMisAlig[
i][
j] = 0.0;
122 fHalfMisAlig[
i][
j] = 0.0;
125 fLadderMisAlig[0][0] = cartMisAligM;
126 fLadderMisAlig[0][1] = cartMisAligW;
127 fLadderMisAlig[1][0] = cartMisAligM;
128 fLadderMisAlig[1][1] = cartMisAligW;
129 fLadderMisAlig[5][0] = angMisAligM;
130 fLadderMisAlig[5][1] = angMisAligW;
136 fXYAngMisAligFactor(0.0),
137 fZCartMisAligFactor(0.0)
140 for (Int_t
i = 0;
i < 6;
i++) {
141 for (Int_t
j = 0;
j < 2;
j++) {
142 fLadderMisAlig[
i][
j] = 0.0;
143 fDiskMisAlig[
i][
j] = 0.0;
144 fSensorMisAlig[
i][
j] = 0.0;
145 fHalfMisAlig[
i][
j] = 0.0;
148 fLadderMisAlig[0][1] = cartMisAlig;
149 fLadderMisAlig[1][1] = cartMisAlig;
150 fLadderMisAlig[5][1] = angMisAlig;
156 fXYAngMisAligFactor(0.0),
157 fZCartMisAligFactor(0.0)
160 for (Int_t
i = 0;
i < 6;
i++) {
161 for (Int_t
j = 0;
j < 2;
j++) {
162 fLadderMisAlig[
i][
j] = 0.0;
163 fDiskMisAlig[
i][
j] = 0.0;
164 fSensorMisAlig[
i][
j] = 0.0;
165 fHalfMisAlig[
i][
j] = 0.0;
175 if (TMath::Abs(factor) > 1.0 && factor > 0.) {
176 fXYAngMisAligFactor = factor;
177 fLadderMisAlig[3][0] = fLadderMisAlig[5][0] * factor;
178 fLadderMisAlig[3][1] = fLadderMisAlig[5][1] * factor;
179 fLadderMisAlig[4][0] = fLadderMisAlig[5][0] * factor;
180 fLadderMisAlig[4][1] = fLadderMisAlig[5][1] * factor;
182 LOG(error) <<
"Invalid XY angular misalign factor, " << factor;
190 if (TMath::Abs(factor) < 1.0 && factor > 0.) {
191 fZCartMisAligFactor = factor;
192 fLadderMisAlig[2][0] = fLadderMisAlig[0][0];
193 fLadderMisAlig[2][1] = fLadderMisAlig[0][1] * factor;
195 LOG(error) <<
"Invalid Z cartesian misalign factor, " << factor;
200void GeometryMisAligner::GetUniMisAlign(
double cartMisAlig[3],
double angMisAlig[3],
const double lParMisAlig[6][2])
const
212 cartMisAlig[0] = gRandom->Uniform(-lParMisAlig[0][1] + lParMisAlig[0][0], lParMisAlig[0][0] + lParMisAlig[0][1]);
213 cartMisAlig[1] = gRandom->Uniform(-lParMisAlig[1][1] + lParMisAlig[1][0], lParMisAlig[1][0] + lParMisAlig[1][1]);
214 cartMisAlig[2] = gRandom->Uniform(-lParMisAlig[2][1] + lParMisAlig[2][0], lParMisAlig[2][0] + lParMisAlig[2][1]);
216 angMisAlig[0] = gRandom->Uniform(-lParMisAlig[3][1] + lParMisAlig[3][0], lParMisAlig[3][0] + lParMisAlig[3][1]);
217 angMisAlig[1] = gRandom->Uniform(-lParMisAlig[4][1] + lParMisAlig[4][0], lParMisAlig[4][0] + lParMisAlig[4][1]);
218 angMisAlig[2] = gRandom->Uniform(-lParMisAlig[5][1] + lParMisAlig[5][0], lParMisAlig[5][0] + lParMisAlig[5][1]);
222void GeometryMisAligner::GetGausMisAlign(
double cartMisAlig[3],
double angMisAlig[3],
const double lParMisAlig[6][2])
const
234 cartMisAlig[0] = gRandom->Gaus(lParMisAlig[0][0], lParMisAlig[0][1]);
235 cartMisAlig[1] = gRandom->Gaus(lParMisAlig[1][0], lParMisAlig[1][1]);
236 cartMisAlig[2] = gRandom->Gaus(lParMisAlig[2][0], lParMisAlig[2][1]);
238 angMisAlig[0] = gRandom->Gaus(lParMisAlig[3][0], lParMisAlig[3][1]);
239 angMisAlig[1] = gRandom->Gaus(lParMisAlig[4][0], lParMisAlig[4][1]);
240 angMisAlig[2] = gRandom->Gaus(lParMisAlig[5][0], lParMisAlig[5][1]);
244TGeoCombiTrans GeometryMisAligner::MisAlignSensor()
const
255 Double_t cartMisAlig[3] = {0, 0, 0};
256 Double_t angMisAlig[3] = {0, 0, 0};
259 GetUniMisAlign(cartMisAlig, angMisAlig, fSensorMisAlig);
262 LOG(info) <<
"Neither uniform nor gausian distribution is set! Will use gausian...";
264 GetGausMisAlign(cartMisAlig, angMisAlig, fSensorMisAlig);
267 TGeoTranslation deltaTrans(cartMisAlig[0], cartMisAlig[1], cartMisAlig[2]);
268 TGeoRotation deltaRot;
269 deltaRot.RotateX(angMisAlig[0]);
270 deltaRot.RotateY(angMisAlig[1]);
271 deltaRot.RotateZ(angMisAlig[2]);
273 TGeoCombiTrans deltaTransf(deltaTrans, deltaRot);
275 return TGeoCombiTrans(deltaTransf);
279TGeoCombiTrans GeometryMisAligner::MisAlignLadder()
const
290 Double_t cartMisAlig[3] = {0, 0, 0};
291 Double_t angMisAlig[3] = {0, 0, 0};
294 GetUniMisAlign(cartMisAlig, angMisAlig, fLadderMisAlig);
297 LOG(info) <<
"Neither uniform nor gausian distribution is set! Will use gausian...";
299 GetGausMisAlign(cartMisAlig, angMisAlig, fLadderMisAlig);
302 TGeoTranslation deltaTrans(cartMisAlig[0], cartMisAlig[1], cartMisAlig[2]);
303 TGeoRotation deltaRot;
304 deltaRot.RotateX(angMisAlig[0]);
305 deltaRot.RotateY(angMisAlig[1]);
306 deltaRot.RotateZ(angMisAlig[2]);
308 TGeoCombiTrans deltaTransf(deltaTrans, deltaRot);
310 return TGeoCombiTrans(deltaTransf);
315 GeometryMisAligner::MisAlignHalf()
const
326 Double_t cartMisAlig[3] = {0, 0, 0};
327 Double_t angMisAlig[3] = {0, 0, 0};
330 GetUniMisAlign(cartMisAlig, angMisAlig, fHalfMisAlig);
333 LOG(info) <<
"Neither uniform nor gausian distribution is set! Will use gausian...";
335 GetGausMisAlign(cartMisAlig, angMisAlig, fHalfMisAlig);
338 TGeoTranslation deltaTrans(cartMisAlig[0], cartMisAlig[1], cartMisAlig[2]);
339 TGeoRotation deltaRot;
340 deltaRot.RotateX(angMisAlig[0]);
341 deltaRot.RotateY(angMisAlig[1]);
342 deltaRot.RotateZ(angMisAlig[2]);
344 TGeoCombiTrans deltaTransf(deltaTrans, deltaRot);
346 return TGeoCombiTrans(deltaTransf);
351 GeometryMisAligner::MisAlignDisk()
const
362 Double_t cartMisAlig[3] = {0, 0, 0};
363 Double_t angMisAlig[3] = {0, 0, 0};
366 GetUniMisAlign(cartMisAlig, angMisAlig, fDiskMisAlig);
369 LOG(info) <<
"Neither uniform nor gausian distribution is set! Will use gausian...";
371 GetGausMisAlign(cartMisAlig, angMisAlig, fDiskMisAlig);
374 TGeoTranslation deltaTrans(cartMisAlig[0], cartMisAlig[1], cartMisAlig[2]);
375 TGeoRotation deltaRot;
376 deltaRot.RotateX(angMisAlig[0]);
377 deltaRot.RotateY(angMisAlig[1]);
378 deltaRot.RotateZ(angMisAlig[2]);
380 TGeoCombiTrans deltaTransf(deltaTrans, deltaRot);
382 return TGeoCombiTrans(deltaTransf);
393 if (std::abs(rot[0]) < 1e-7 || std::abs(rot[8]) < 1e-7) {
394 LOG(error) <<
"Failed to extract roll-pitch-yall angles!";
397 psi = std::atan2(-rot[5], rot[8]);
398 theta = std::asin(rot[2]);
399 phi = std::atan2(-rot[1], rot[0]);
404void GeometryMisAligner::MisAlign(Bool_t verbose,
const std::string& ccdbHost,
long tmin,
long tmax,
const std::string& objectPath,
const std::string& fileName)
428 std::vector<o2::detectors::AlignParam> lAPvec;
429 LOG(info) <<
"GeometryMisAligner::MisAlign ";
431 double lPsi, lTheta, lPhi = 0.;
436 for (Int_t hf = 0; hf < nHalf; hf++) {
439 TGeoCombiTrans localDeltaTransform = MisAlignHalf();
445 lAPvec.emplace_back(lAP);
447 for (Int_t dk = 0; dk < nDisks; dk++) {
448 localDeltaTransform = MisAlignDisk();
452 LOG(
debug) <<
"**** LocalDeltaTransform Disk: " << fmt::format(
"{} : {} | X: {:+f} Y: {:+f} Z: {:+f} | pitch: {:+f} roll: {:+f} yaw: {:+f}\n", lAP.
getSymName(), lAP.
getAlignableID(), localDeltaTransform.GetTranslation()[0], localDeltaTransform.GetTranslation()[1], localDeltaTransform.GetTranslation()[2], localDeltaTransform.GetRotationMatrix()[0], localDeltaTransform.GetRotationMatrix()[1], localDeltaTransform.GetRotationMatrix()[2]);
456 lAPvec.emplace_back(lAP);
463 for (Int_t lr = 0; lr < nLadders; lr++) {
464 localDeltaTransform = MisAlignLadder();
467 TString
path =
"/cave_1/barrel_1/" + sname;
472 lAPvec.emplace_back(lAP);
474 for (Int_t sr = 0; sr < nSensorsPerLadder; sr++) {
475 localDeltaTransform = MisAlignSensor();
477 if (!
matrixToAngles(localDeltaTransform.GetRotationMatrix(), lPsi, lTheta, lPhi)) {
478 LOG(error) <<
"Problem extracting angles from sensor";
486 lAPvec.emplace_back(lAP);
488 LOG(info) << sname <<
", nChip: " << nChip <<
", uid: " << uid;
496 if (!ccdbHost.empty()) {
498 path =
"MFT/test_CCDB/MFT";
499 LOGP(info,
"Storing alignment object on {}/{}", ccdbHost,
path);
501 std::map<std::string, std::string> metadata;
503 api.
init(ccdbHost.c_str());
508 if (!fileName.empty()) {
509 LOGP(info,
"Storing MFT alignment in local file {}", fileName);
510 TFile algFile(fileName.c_str(),
"recreate");
511 algFile.WriteObjectAny(&lAPvec,
"std::vector<o2::detectors::AlignParam>",
"alignment");
519 Int_t chIdMin = (rChId < 0) ? 0 : rChId;
520 Int_t chIdMax = (rChId < 0) ? 9 : rChId;
521 Double_t chResX = (rChResX < 0) ? fDiskMisAlig[0][1] : rChResX;
522 Double_t chResY = (rChResY < 0) ? fDiskMisAlig[1][1] : rChResY;
523 Double_t deResX = (rDeResX < 0) ? fLadderMisAlig[0][1] : rDeResX;
524 Double_t deResY = (rDeResY < 0) ? fLadderMisAlig[1][1] : rDeResY;
526 TMatrixDSym mChCorrMatrix(6);
527 mChCorrMatrix[0][0] = chResX * chResX;
528 mChCorrMatrix[1][1] = chResY * chResY;
530 TMatrixDSym mDECorrMatrix(6);
531 mDECorrMatrix[0][0] = deResX * deResX;
532 mDECorrMatrix[1][1] = deResY * deResY;
Definition of the base alignment parameters class.
Definition of the Names Generator class.
Definition of the GeometryManager class.
Class describing MFT Geometry Builder.
ClassImp(o2::mft::GeometryMisAligner)
This macro is used to misalign the existing MFT geometry.
Class handling both virtual segmentation and real volumes.
Definition of the Detector class.
static std::string getAlignmentPath(DId d)
static int getSensID(o2::detectors::DetID detid, int sensid)
int storeAsTFileAny(const T *obj, std::string const &path, std::map< std::string, std::string > const &metadata, long startValidityTimestamp=-1, long endValidityTimestamp=-1, std::vector< char >::size_type maxSize=0) const
void init(std::string const &hosts)
int getAlignableID() const
return alignable entry ID
void setSymName(const char *m)
set symbolic name of the volume
const std::string & getSymName() const
return symbolic name of the volume
bool setLocalParams(double x, double y, double z, double psi, double theta, double phi)
================ methods for setting global delta params from local delta
bool applyToGeometry() const
apply object to geoemetry
void setAlignableID(int id)
set alignable entry ID
static constexpr std::array< int, NChips > mChipIDGeoToRO
void SetAlignmentResolution(const TClonesArray *misAlignArray, Int_t chId=-1, Double_t chResX=-1., Double_t chResY=-1., Double_t deResX=-1., Double_t deResY=-1.)
Set alignment resolution to misalign objects to be stored in CCDB.
GeometryTGeo * mGeometryTGeo
void SetXYAngMisAligFactor(Double_t factor)
void MisAlign(bool verbose=false, const std::string &ccdbHost="http://ccdb-test.cern.ch:8080", long tmin=0, long tmax=-1, const std::string &objectPath="", const std::string &fileName="MFTAlignment.root")
bool matrixToAngles(const double *rot, double &psi, double &theta, double &phi)
access to geometry details
void SetZCartMisAligFactor(Double_t factor)
static const char * composeSymNameHalf(int hf)
sym name of the half
Int_t getMaxSensorsPerLadder()
Returns the max number of sensors per ladder.
static const char * composeSymNameChip(int hf, int dk, int lr, int chip)
Sym name of the chip in the given half/disk/ladder.
Int_t getNumberOfLaddersPerDisk(Int_t half, Int_t disk, Int_t sensors) const
Returns the number of ladders in each disk of each half.
Int_t getMinSensorsPerLadder()
Returns the min number of sensors per ladder.
Int_t getNumberOfHalfs()
Returns the number of halfs MFT.
Int_t getNumberOfDisksPerHalf(Int_t half) const
Returns the number of disks in each half.
static const char * composeSymNameLadder(int hf, int dk, int lr)
Sym name of the ladder at given half/disk.
static GeometryTGeo * Instance()
Int_t getNumberOfSensorsPerLadder(Int_t half, Int_t disk, Int_t ladder) const
static const char * composeSymNameDisk(int hf, int dk)
Sym name of the disk at given half.
GLsizei const GLchar *const * path
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"