11 #include <alignment/GlobalParam.h>
13 #include <alignment/Hierarchy.h>
14 #include <cdc/dbobjects/CDCLayerAlignment.h>
15 #include <framework/database/Database.h>
16 #include <framework/geometry/B2Vector3.h>
17 #include <framework/logging/Logger.h>
18 #include <vxd/geometry/GeoCache.h>
40 this->ensureConstructed();
41 if (element != 0 or param > 3) {
42 B2ERROR(
"Invalid global BeamSpot parameter id");
46 if (
auto bp =
dynamic_cast<BeamSpot*
>(this->getDBObj()))
47 return bp->getIPPosition()[param - 1];
49 B2ERROR(
"Could not get value for BeamSpot");
56 this->ensureConstructed();
57 if (element != 0 or param > 3) {
58 B2ERROR(
"Invalid global BeamSpot id");
61 if (
auto bp =
dynamic_cast<BeamSpot*
>(this->getDBObj())) {
63 vertex[param - 1] = value;
64 bp->setIP(vertex, bp->getIPPositionCovMatrix());
66 B2ERROR(
"Could not set value for BeamSpot");
74 return {{0, 1}, {0, 2}, {0, 3}};
80 void GlobalParamVector::updateGlobalParam(
double difference,
short unsigned int uniqueID,
short unsigned int element,
81 short unsigned int param)
84 auto prev = getGlobalParam(uniqueID, element, param);
85 setGlobalParam(prev + difference, uniqueID, element, param);
87 void GlobalParamVector::setGlobalParam(
double value,
short unsigned int uniqueID,
short unsigned int element,
88 short unsigned int param)
90 auto dbObj = m_vector.find(uniqueID);
91 if (dbObj != m_vector.end()) {
92 dbObj->second->setGlobalParam(value, element, param);
94 B2WARNING(
"Did not found DB object with unique id " << uniqueID <<
" in global vector. Cannot set value for element " << element <<
95 " and parameter " << param);
98 double GlobalParamVector::getGlobalParam(
short unsigned int uniqueID,
short unsigned int element,
short unsigned int param)
100 auto dbObj = m_vector.find(uniqueID);
101 if (dbObj != m_vector.end()) {
102 return dbObj->second->getGlobalParam(element, param);
104 B2WARNING(
"Did not found DB object with unique id " << uniqueID <<
" in global vector. Cannot get value for element " << element <<
105 " and parameter " << param <<
". Returning 0.");
109 std::vector< std::tuple< short unsigned int, short unsigned int, short unsigned int > > GlobalParamVector::listGlobalParams()
111 std::vector<std::tuple<unsigned short, unsigned short, unsigned short>> params;
112 for (
auto& uID_DBObj : m_vector) {
113 for (
auto element_param : uID_DBObj.second->listGlobalParams()) {
114 params.push_back({uID_DBObj.first, element_param.first, element_param.second});
119 std::vector< TObject* > GlobalParamVector::releaseObjects(
bool onlyConstructed)
121 std::vector<TObject*> result;
122 for (
auto& uID_DBObj : m_vector) {
123 if (onlyConstructed and not uID_DBObj.second->isConstructed())
126 result.push_back({uID_DBObj.second->releaseObject()});
130 void GlobalParamVector::loadFromDB()
132 for (
auto& uID_DBObj : m_vector) {
133 uID_DBObj.second->loadFromDBObjPtr();
136 void GlobalParamVector::loadFromDB(
const EventMetaData& event)
138 for (
auto& uID_DBObj : m_vector) {
139 uID_DBObj.second->loadFromDB(event);
142 void GlobalParamVector::postHierarchyChanged(GlobalDerivativesHierarchy& hierarchy)
144 for (
auto interface : m_subDetectorInterfacesVector) {
145 interface->setupAlignmentHierarchy(hierarchy);
149 void GlobalParamVector::construct()
151 for (
auto& uID_DBObj : m_vector) {
152 if (not uID_DBObj.second->isConstructed()) uID_DBObj.second->construct();
155 void GlobalParamVector::postReadFromResult(
156 std::vector< std::tuple< short unsigned int, short unsigned int, short unsigned int, double > >& result)
158 for (
auto interface : m_subDetectorInterfacesVector) {
159 interface->readFromResult(result, *
this);
164 VXDGlobalParamInterface::E_VXDHierarchyType::c_Full;
165 bool VXDGlobalParamInterface::s_enablePXD =
true;
166 bool VXDGlobalParamInterface::s_enableSVD =
true;
172 auto& geo = VXD::GeoCache::getInstance();
175 if (s_hierarchyType == c_None) {
179 }
else if (s_hierarchyType == c_Flat) {
180 for (
auto& sensor : geo.getListOfSensors()) {
183 if (sensor.getLayerNumber() <= 2 and !s_enablePXD)
186 if (sensor.getLayerNumber() > 2 and !s_enableSVD)
190 geo.get(sensor).getTransformation(
true));
192 }
else if (s_hierarchyType == c_HalfShells) {
202 for (
auto& halfShellPlacement : geo.getHalfShellPlacements()) {
204 if (halfShellPlacement.first.getLayerNumber() <= 2 and !s_enablePXD)
207 if (halfShellPlacement.first.getLayerNumber() > 2 and !s_enableSVD)
210 TGeoHMatrix trafoHalfShell = halfShellPlacement.second;
211 trafoHalfShell *= geo.getTGeoFromRigidBodyParams(
212 vxdAlignments->get(halfShellPlacement.first, VXDAlignment::dU),
213 vxdAlignments->get(halfShellPlacement.first, VXDAlignment::dV),
214 vxdAlignments->get(halfShellPlacement.first, VXDAlignment::dW),
215 vxdAlignments->get(halfShellPlacement.first, VXDAlignment::dAlpha),
216 vxdAlignments->get(halfShellPlacement.first, VXDAlignment::dBeta),
217 vxdAlignments->get(halfShellPlacement.first, VXDAlignment::dGamma)
219 rigidBodyHierarchy.insertTGeoTransform<VXDAlignment, alignment::EmptyGlobalParamSet>(halfShellPlacement.first, 0, trafoHalfShell);
221 for (
auto& ladderPlacement : geo.getLadderPlacements(halfShellPlacement.first)) {
223 TGeoHMatrix trafoLadder = ladderPlacement.second;
224 trafoLadder *= geo.getTGeoFromRigidBodyParams(
225 vxdAlignments->get(ladderPlacement.first, VXDAlignment::dU),
226 vxdAlignments->get(ladderPlacement.first, VXDAlignment::dV),
227 vxdAlignments->get(ladderPlacement.first, VXDAlignment::dW),
228 vxdAlignments->get(ladderPlacement.first, VXDAlignment::dAlpha),
229 vxdAlignments->get(ladderPlacement.first, VXDAlignment::dBeta),
230 vxdAlignments->get(ladderPlacement.first, VXDAlignment::dGamma)
235 for (
auto& sensorPlacement : geo.getSensorPlacements(ladderPlacement.first)) {
237 TGeoHMatrix trafoSensor = sensorPlacement.second;
238 trafoSensor *= geo.getTGeoFromRigidBodyParams(
239 vxdAlignments->get(sensorPlacement.first, VXDAlignment::dU),
240 vxdAlignments->get(sensorPlacement.first, VXDAlignment::dV),
241 vxdAlignments->get(sensorPlacement.first, VXDAlignment::dW),
242 vxdAlignments->get(sensorPlacement.first, VXDAlignment::dAlpha),
243 vxdAlignments->get(sensorPlacement.first, VXDAlignment::dBeta),
244 vxdAlignments->get(sensorPlacement.first, VXDAlignment::dGamma)
246 rigidBodyHierarchy.insertTGeoTransform<VXDAlignment, VXDAlignment>(sensorPlacement.first, halfShellPlacement.first,
247 trafoLadder * trafoSensor);
253 }
else if (s_hierarchyType == c_Full) {
265 for (
auto& halfShellPlacement : geo.getHalfShellPlacements()) {
267 if (halfShellPlacement.first.getLayerNumber() <= 2 and !s_enablePXD)
270 if (halfShellPlacement.first.getLayerNumber() > 2 and !s_enableSVD)
273 TGeoHMatrix trafoHalfShell = halfShellPlacement.second;
274 trafoHalfShell *= geo.getTGeoFromRigidBodyParams(
275 vxdAlignments->get(halfShellPlacement.first, VXDAlignment::dU),
276 vxdAlignments->get(halfShellPlacement.first, VXDAlignment::dV),
277 vxdAlignments->get(halfShellPlacement.first, VXDAlignment::dW),
278 vxdAlignments->get(halfShellPlacement.first, VXDAlignment::dAlpha),
279 vxdAlignments->get(halfShellPlacement.first, VXDAlignment::dBeta),
280 vxdAlignments->get(halfShellPlacement.first, VXDAlignment::dGamma)
282 rigidBodyHierarchy.insertTGeoTransform<VXDAlignment, alignment::EmptyGlobalParamSet>(halfShellPlacement.first, 0, trafoHalfShell);
284 for (
auto& ladderPlacement : geo.getLadderPlacements(halfShellPlacement.first)) {
286 TGeoHMatrix trafoLadder = ladderPlacement.second;
287 trafoLadder *= geo.getTGeoFromRigidBodyParams(
288 vxdAlignments->get(ladderPlacement.first, VXDAlignment::dU),
289 vxdAlignments->get(ladderPlacement.first, VXDAlignment::dV),
290 vxdAlignments->get(ladderPlacement.first, VXDAlignment::dW),
291 vxdAlignments->get(ladderPlacement.first, VXDAlignment::dAlpha),
292 vxdAlignments->get(ladderPlacement.first, VXDAlignment::dBeta),
293 vxdAlignments->get(ladderPlacement.first, VXDAlignment::dGamma)
295 rigidBodyHierarchy.insertTGeoTransform<VXDAlignment, VXDAlignment>(ladderPlacement.first, halfShellPlacement.first, trafoLadder);
297 for (
auto& sensorPlacement : geo.getSensorPlacements(ladderPlacement.first)) {
299 TGeoHMatrix trafoSensor = sensorPlacement.second;
300 trafoSensor *= geo.getTGeoFromRigidBodyParams(
301 vxdAlignments->get(sensorPlacement.first, VXDAlignment::dU),
302 vxdAlignments->get(sensorPlacement.first, VXDAlignment::dV),
303 vxdAlignments->get(sensorPlacement.first, VXDAlignment::dW),
304 vxdAlignments->get(sensorPlacement.first, VXDAlignment::dAlpha),
305 vxdAlignments->get(sensorPlacement.first, VXDAlignment::dBeta),
306 vxdAlignments->get(sensorPlacement.first, VXDAlignment::dGamma)
308 rigidBodyHierarchy.insertTGeoTransform<VXDAlignment, VXDAlignment>(sensorPlacement.first, ladderPlacement.first, trafoSensor);
315 }
catch (
const std::bad_cast& e) {