Project
Loading...
Searching...
No Matches
AlignSensorHelper.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
13
14#include <iomanip>
15#include <iostream>
16#include <sstream>
17#include <string>
18#include <algorithm>
19
20#include <Rtypes.h>
21#include "Framework/Logger.h"
23
24using namespace o2::mft;
25
27
28//__________________________________________________________________________
30 : mChipIndexOnLadder(0),
31 mChipIndexInMft(0),
32 mConnector(0),
33 mTransceiver(0),
34 mLayer(0),
35 mZone(0),
36 mDisk(0),
37 mHalf(0),
38 mChipUniqueId(0),
39 mTranslation(0, 0, 0),
40 mRx(0),
41 mRy(0),
42 mRz(0),
43 mSinRx(0),
44 mCosRx(0),
45 mSinRy(0),
46 mCosRy(0),
47 mSinRz(0),
48 mCosRz(0),
49 mIsTransformExtracted(false)
50{
53 LOGF(debug, "AlignSensorHelper instantiated");
54}
55
56//__________________________________________________________________________
68
69//__________________________________________________________________________
70void AlignSensorHelper::setSensorOnlyInfo(const int chipIndex)
71{
72 if (chipIndex < mNumberOfSensors) {
74 o2::itsmft::MFTChipMappingData chipMappingData = (chipMapping.getChipMappingData())[chipIndex];
75 mChipIndexOnLadder = (UShort_t)chipMappingData.chipOnModule;
76 mChipIndexInMft = chipMappingData.globalChipSWID;
77 mConnector = (UShort_t)chipMappingData.connector;
78 mTransceiver = (UShort_t)chipMappingData.cable;
79 mZone = (UShort_t)chipMappingData.zone;
80 mLayer = (UShort_t)chipMappingData.layer;
81 mDisk = (UShort_t)chipMappingData.disk;
82 mHalf = (UShort_t)chipMappingData.half;
83 } else {
84 LOGF(error, "AlignSensorHelper::setSensorOnlyInfo() - chip index %d >= %d",
85 chipIndex, mNumberOfSensors);
86 }
87
88 setSensorUid(chipIndex);
89 setSymName();
90}
91
92//__________________________________________________________________________
93std::stringstream AlignSensorHelper::getSensorFullName(bool wSymName)
94{
95 std::stringstream name;
96 if (mGeometry == nullptr) {
97 wSymName = false;
98 }
99 name << "h " << mHalf << " d " << mDisk << " layer " << mLayer
100 << " z " << mZone
101 << " con " << std::setw(1) << mConnector
102 << " tr " << std::setw(2) << mTransceiver
103 << " sr " << std::setw(1) << mChipIndexOnLadder
104 << " iChip " << std::setw(3) << mChipIndexInMft
105 << " uid " << mChipUniqueId;
106 if (wSymName) {
107 name << " " << mGeoSymbolicName;
108 }
109 return name;
110}
111
112//__________________________________________________________________________
113bool AlignSensorHelper::setSensor(const int chipIndex)
114{
116 setSensorOnlyInfo(chipIndex);
119}
120
121//__________________________________________________________________________
123{
124 if (mGeometry) {
125 Int_t iChip = 0;
126 Int_t nHalf = mGeometry->getNumberOfHalfs();
127 TString sname = mGeometry->composeSymNameMFT();
128
129 for (Int_t hf = 0; hf < nHalf; hf++) {
130 Int_t nDisks = mGeometry->getNumberOfDisksPerHalf(hf);
131 sname = mGeometry->composeSymNameHalf(hf);
132
133 for (Int_t dk = 0; dk < nDisks; dk++) {
134 sname = mGeometry->composeSymNameDisk(hf, dk);
135
136 Int_t nLadders = 0;
137 for (Int_t sensor = mGeometry->getMinSensorsPerLadder();
138 sensor < mGeometry->getMaxSensorsPerLadder() + 1; sensor++) {
139 nLadders += mGeometry->getNumberOfLaddersPerDisk(hf, dk, sensor);
140 }
141
142 for (Int_t lr = 0; lr < nLadders; lr++) { // nLadders
143 sname = mGeometry->composeSymNameLadder(hf, dk, lr);
144 Int_t nSensorsPerLadder = mGeometry->getNumberOfSensorsPerLadder(hf, dk, lr);
145
146 for (Int_t sr = 0; sr < nSensorsPerLadder; sr++) {
147 sname = mGeometry->composeSymNameChip(hf, dk, lr, sr);
148 mSymNames[iChip] = sname;
149 iChip++;
150 }
151 }
152 }
153 }
154 } else {
155 LOG(error) << "SensorInfo::builSymNames() - nullptr to geometry";
156 }
157}
158
159//__________________________________________________________________________
161{
162 int chipIdGeo = 0;
163 for (int index = 0; index < mNumberOfSensors; index++) {
165 chipIdGeo = index;
166 break;
167 }
168 }
169 return chipIdGeo;
170}
171
172//__________________________________________________________________________
173void AlignSensorHelper::setSensorUid(const int chipIndex)
174{
175 if (chipIndex < mNumberOfSensors) {
177 chipIndex);
178 } else {
179 LOGF(error, "AlignSensorHelper::setSensorUid() - chip index %d >= %d",
180 chipIndex, mNumberOfSensors);
182 }
183}
184
185//__________________________________________________________________________
190
191//__________________________________________________________________________
193{
195 return;
196 }
197 if (mGeometry == nullptr) {
199 }
201 o2::math_utils::bit2Mask(o2::math_utils::TransformType::T2L,
204
205 Double_t* tra = mTransform.GetTranslation();
206 mTranslation.SetX(tra[0]);
207 mTranslation.SetY(tra[1]);
208 mTranslation.SetZ(tra[2]);
209
210 Double_t* rot = mTransform.GetRotationMatrix();
211 mRx = std::atan2(-rot[5], rot[8]);
212 mRy = std::asin(rot[2]);
213 mRz = std::atan2(-rot[1], rot[0]);
214
215 // force the value of some calculations of sin, cos to avoid numerical errors
216
217 // for MFT sensors, Rx = - Pi/2, or + Pi/2
218 if (mRx > 0) {
219 mSinRx = 1.0; // std::sin(mRx)
220 } else {
221 mSinRx = -1.0; // std::sin(mRx)
222 }
223 mCosRx = 0.0; // std::cos(mRx)
224
225 // for MFT sensors, Ry = 0
226 mSinRy = 0.0; // std::sin(mRy);
227 mCosRy = 1.0; // std::cos(mRy);
228
229 // for MFT sensors, Rz = 0 or Pi
230 mSinRz = 0.0; // std::sin(mRz);
231 mCosRz = std::cos(mRz);
232
234}
235
236//__________________________________________________________________________
238{
239 mIsTransformExtracted = false;
240
241 double rot[9] = {
242 0., 0., 0.,
243 0., 0., 0.,
244 0., 0., 0.};
245 double tra[3] = {0., 0., 0.};
246 mTransform.SetRotation(rot);
247 mTransform.SetTranslation(tra);
248
249 mTranslation.SetX(0.0);
250 mTranslation.SetY(0.0);
251 mTranslation.SetZ(0.0);
252
253 mRx = 0;
254 mRy = 0;
255 mRz = 0;
256
257 mSinRx = 0;
258 mCosRx = 0;
259 mSinRy = 0;
260 mCosRy = 0;
261 mSinRz = 0;
262 mCosRz = 0;
263}
ClassImp(o2::mft::AlignSensorHelper)
Helper class to access to the global coordinates of the center each MFT sensor.
std::ostringstream debug
static int getSensID(o2::detectors::DetID detid, int sensid)
static constexpr ID MFT
Definition DetID.h:71
const Mat3D & getMatrixL2G(int sensID) const
static constexpr std::array< int, NChips > mChipIDGeoToRO
const std::array< MFTChipMappingData, NChips > & getChipMappingData() const
o2::math_utils::Point3D< double > mTranslation
coordinates of the translation between the local system origin (the center of the sensor) and the glo...
UShort_t mTransceiver
transceiver id to which the sensor is connected in the zone [0, 24]
AlignSensorHelper()
constructor with a pointer to the geometry
UShort_t mConnector
connector index to which the ladder is plugged in the zone [0, 4]
std::array< TString, mNumberOfSensors > mSymNames
void setGeometry()
set pointer to geometry that should already have done fillMatrixCache()
UShort_t mLayer
layer id [0, 9]
double mRx
‍array of symbolic names of all sensors
void resetSensorTransformInfo()
reset all sensor transform related variables
static constexpr int mNumberOfSensors
Total number of sensors (detection elements) in the MFT.
void setSymName()
set the symbolic name of this sensor in the geometry
void setSensorOnlyInfo(const int chipIndex)
set the studied sensor
double mRz
rotation angle aroung global z-axis (radian)
UShort_t mChipIndexOnLadder
sensor index within the ladder [0, 4]
TString mGeoSymbolicName
symbolic name of this sensor in the geometry
UShort_t mHalf
half id [0, 1]
bool setSensor(const int chipIndex)
set the studied sensor
TGeoHMatrix mTransform
sensor transformation matrix L2G
bool mIsTransformExtracted
boolean used to check if the sensor transform was successfully extracted from geometry
void extractSensorTransform()
init the matrix that stores the sensor transform L2G and extract its components
int getChipIdGeoFromRO(const int chipIdRO)
return chip id Geo from a given chip id RO
Int_t mChipUniqueId
ALICE global unique id of the sensor.
double mRy
rotation angle aroung global y-axis (radian)
void builSymNames()
build array of symbolic names of all sensors
UShort_t mDisk
disk id [0, 4]
void setSensorUid(const int chipIndex)
set the ALICE global unique id of the sensor
UShort_t mChipIndexInMft
sensor sw index within the MFT [0, 935]
std::stringstream getSensorFullName(bool wSymName=true)
return a stringstream filled with the sensor info
UShort_t mZone
zone id [0,3]
o2::mft::GeometryTGeo * mGeometry
MFT geometry.
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.
void fillMatrixCache(Int_t mask) override
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 * composeSymNameMFT()
sym name of the MFT
static const char * composeSymNameDisk(int hf, int dk)
Sym name of the disk at given half.
GLuint index
Definition glcorearb.h:781
GLuint const GLchar * name
Definition glcorearb.h:781
static constexpr int L2G
Definition Cartesian.h:54
static constexpr int T2L
Definition Cartesian.h:55
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"