/
githubmirror
/
cmssw
Обзор
Документация
Войти
/
githubmirror
/
cmssw
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
MagneticField/GeomBuilder/src/buildBox.icc
106 строк
5 KB
Shahzad Malik Muzaffar
[RECONSTRUCTION] Apply code-checks with misc-definitions-in-headers
21 июн 2021, 18:53
21 июн 2021, 18:53
5a3b474
Код
Авторство
О чём код?
/* * Compute parameters for a box * * \author N. Amapane - INFN Torino */ inline void volumeHandle::buildBox(double halfX, double halfY, double halfZ) { LogTrace("MagGeoBuilder") << "Building box surfaces...: "; // Global vectors of the normals to X, Y, Z axes GlobalVector planeXAxis = refPlane->toGlobal(LocalVector(1, 0, 0)); GlobalVector planeYAxis = refPlane->toGlobal(LocalVector(0, 1, 0)); GlobalVector planeZAxis = refPlane->toGlobal(LocalVector(0, 0, 1)); // FIXME Assumption: it is assumed that in the following that // local Z is always along global Z // (true for version 1103l, not necessarily in the future) // To determine the orientation of other local axes, // find local axis closest to global R GlobalVector Rvol(refPlane->position().x(), refPlane->position().y(), refPlane->position().z()); double rnX = planeXAxis.dot(Rvol); double rnY = planeYAxis.dot(Rvol); GlobalPoint pos_outer; GlobalPoint pos_inner; GlobalPoint pos_phiplus; GlobalPoint pos_phiminus; GlobalPoint pos_zplus(refPlane->toGlobal(LocalPoint(0., 0., halfZ))); GlobalPoint pos_zminus(refPlane->toGlobal(LocalPoint(0., 0., -halfZ))); Surface::RotationType rot_R; Surface::RotationType rot_phi; Surface::RotationType rot_Z = Surface::RotationType(planeXAxis, planeYAxis); if (std::abs(rnX) > std::abs(rnY)) { // X is ~parallel to global R dir, Y is along +/- phi theRN = std::abs(rnX); if (rnX < 0) { halfX = -halfX; halfY = -halfY; } pos_outer = GlobalPoint(refPlane->toGlobal(LocalPoint(halfX, 0., 0.))); pos_inner = GlobalPoint(refPlane->toGlobal(LocalPoint(-halfX, 0., 0.))); pos_phiplus = GlobalPoint(refPlane->toGlobal(LocalPoint(0., halfY, 0.))); pos_phiminus = GlobalPoint(refPlane->toGlobal(LocalPoint(0., -halfY, 0.))); rot_R = Surface::RotationType(planeZAxis, planeYAxis); rot_phi = Surface::RotationType(planeZAxis, planeXAxis); // opposite to y axis } else { // Y is ~parallel to global R dir, X is along +/- phi theRN = std::abs(rnY); if (rnY < 0) { halfX = -halfX; halfY = -halfY; } pos_outer = GlobalPoint(refPlane->toGlobal(LocalPoint(0., halfY, 0.))); pos_inner = GlobalPoint(refPlane->toGlobal(LocalPoint(0., -halfY, 0.))); pos_phiplus = GlobalPoint(refPlane->toGlobal(LocalPoint(-halfX, 0., 0.))); pos_phiminus = GlobalPoint(refPlane->toGlobal(LocalPoint(halfX, 0., 0.))); rot_R = Surface::RotationType(planeZAxis, planeXAxis); rot_phi = Surface::RotationType(planeZAxis, planeYAxis); // opposite to x axis } LogTrace("MagGeoBuilder") << " halfX: " << halfX << " halfY: " << halfY << " halfZ: " << halfZ << " RN: " << theRN; LogTrace("MagGeoBuilder") << "pos_outer " << pos_outer << " " << pos_outer.perp() << " " << pos_outer.phi() << newln << "pos_inner " << pos_inner << " " << pos_inner.perp() << " " << pos_inner.phi() << newln << "pos_zplus " << pos_zplus << " " << pos_zplus.perp() << " " << pos_zplus.phi() << newln << "pos_zminus " << pos_zminus << " " << pos_zminus.perp() << " " << pos_zminus.phi() << newln << "pos_phiplus " << pos_phiplus << " " << pos_phiplus.perp() << " " << pos_phiplus.phi() << newln << "pos_phiminus " << pos_phiminus << " " << pos_phiminus.perp() << " " << pos_phiminus.phi(); // Check ordering. if (debug) { if (pos_outer.perp() < pos_inner.perp()) { LogTrace("MagGeoBuilder") << "*** WARNING: pos_outer < pos_inner for box"; } if (pos_zplus.z() < pos_zminus.z()) { LogTrace("MagGeoBuilder") << "*** WARNING: pos_zplus < pos_zminus for box"; } if (Geom::Phi<float>(pos_phiplus.phi() - pos_phiminus.phi()) < 0.) { LogTrace("MagGeoBuilder") << "*** WARNING: pos_phiplus < pos_phiminus for box"; } } // FIXME: use builder surfaces[outer] = new Plane(pos_outer, rot_R); surfaces[inner] = new Plane(pos_inner, rot_R); surfaces[zplus] = new Plane(pos_zplus, rot_Z); surfaces[zminus] = new Plane(pos_zminus, rot_Z); surfaces[phiplus] = new Plane(pos_phiplus, rot_phi); surfaces[phiminus] = new Plane(pos_phiminus, rot_phi); LogTrace("MagGeoBuilder") << "rot_R " << surfaces[outer]->toGlobal(LocalVector(0., 0., 1.)) << newln << "rot_Z " << surfaces[zplus]->toGlobal(LocalVector(0., 0., 1.)) << newln << "rot_phi " << surfaces[phiplus]->toGlobal(LocalVector(0., 0., 1.)); // Save volume boundaries theRMin = std::abs(surfaces[inner]->toLocal(GlobalPoint(0, 0, 0)).z()); theRMax = std::abs(surfaces[outer]->toLocal(GlobalPoint(0, 0, 0)).z()); // FIXME: use phi of middle plane of phiminus surface. Is not the absolute phimin! thePhiMin = surfaces[phiminus]->position().phi(); }