File indexing completed on 2024-04-06 11:57:29
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #include <sstream>
0016 #include <iomanip>
0017 #include <memory>
0018
0019
0020 #include "FWCore/Framework/interface/one/EDAnalyzer.h"
0021 #include "FWCore/Framework/interface/MakerMacros.h"
0022 #include "FWCore/Framework/interface/EventSetup.h"
0023 #include "FWCore/Framework/interface/ESHandle.h"
0024 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0025
0026 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
0027
0028 #include "CondFormats/Alignment/interface/AlignTransform.h"
0029 #include "CondFormats/Alignment/interface/Alignments.h"
0030
0031 #include "Alignment/TrackerAlignment/interface/AlignableTracker.h"
0032 #include "Alignment/CommonAlignment/interface/AlignableNavigator.h"
0033 #include "Alignment/CommonAlignment/interface/AlignableObjectId.h"
0034
0035 static const int kLEAD_WIDTH = 40;
0036
0037
0038
0039
0040
0041
0042 class TestTrackerHierarchy : public edm::one::EDAnalyzer<> {
0043 public:
0044 explicit TestTrackerHierarchy(const edm::ParameterSet& pSet)
0045 : tTopoToken_(esConsumes()),
0046 tkGeomToken_(esConsumes()),
0047 aliToken_(esConsumes()),
0048 aliErrToken_(esConsumes()),
0049 dumpAlignments_(pSet.getUntrackedParameter<bool>("dumpAlignments")) {}
0050
0051 virtual void analyze(const edm::Event&, const edm::EventSetup&);
0052
0053 private:
0054
0055 const edm::ESGetToken<TrackerTopology, TrackerTopologyRcd> tTopoToken_;
0056 const edm::ESGetToken<TrackerGeometry, TrackerDigiGeometryRecord> tkGeomToken_;
0057 const edm::ESGetToken<Alignments, TrackerAlignmentRcd> aliToken_;
0058 const edm::ESGetToken<AlignmentErrorsExtended, TrackerAlignmentErrorExtendedRcd> aliErrToken_;
0059
0060 void dumpAlignable(const Alignable*, unsigned int, unsigned int);
0061 void printInfo(const Alignable*, unsigned int);
0062 void dumpAlignments(const edm::EventSetup& setup, AlignableTracker* aliTracker) const;
0063
0064 std::string leaders_, blank_, filled_;
0065
0066 const bool dumpAlignments_;
0067 std::unique_ptr<AlignableTracker> alignableTracker_;
0068 };
0069
0070 void TestTrackerHierarchy::analyze(const edm::Event&, const edm::EventSetup& setup) {
0071
0072 const TrackerTopology* const tTopo = &setup.getData(tTopoToken_);
0073 edm::LogInfo("TrackerHierarchy") << "Starting!";
0074
0075 const TrackerGeometry* trackerGeometry = &setup.getData(tkGeomToken_);
0076 alignableTracker_ = std::make_unique<AlignableTracker>(&(*trackerGeometry), tTopo);
0077
0078 leaders_ = "";
0079 blank_ = " ";
0080 filled_ = "| ";
0081
0082
0083
0084 this->dumpAlignable(alignableTracker_.get(), 1, 1);
0085
0086 edm::LogInfo("TrackerHierarchy") << "Done!";
0087
0088 if (dumpAlignments_) {
0089 this->dumpAlignments(setup, alignableTracker_.get());
0090 }
0091 }
0092
0093
0094
0095 void TestTrackerHierarchy::dumpAlignable(const Alignable* alignable, unsigned int idau, unsigned int ndau) {
0096 printInfo(alignable, idau);
0097
0098 if (ndau != idau)
0099 leaders_ += filled_;
0100 else
0101 leaders_ += blank_;
0102
0103 const align::Alignables& comps = alignable->components();
0104 if (unsigned int ndau = comps.size()) {
0105 unsigned int idau = 0;
0106 for (align::Alignables::const_iterator iter = comps.begin(); iter != comps.end(); ++iter)
0107 dumpAlignable(*iter, ++idau, ndau);
0108 }
0109
0110 leaders_ = leaders_.substr(0, leaders_.length() - blank_.length());
0111 }
0112
0113
0114
0115 void TestTrackerHierarchy::printInfo(const Alignable* alignable, unsigned int idau) {
0116 int width = kLEAD_WIDTH - leaders_.length();
0117
0118 std::ostringstream name, pos, rot;
0119
0120 name << alignableTracker_->objectIdProvider().idToString(alignable->alignableObjectId()) << idau;
0121
0122
0123 pos.setf(std::ios::fixed);
0124 pos << "(" << std::right << std::setw(8) << std::setprecision(4) << alignable->globalPosition().x() << ","
0125 << std::setw(8) << std::setprecision(4) << alignable->globalPosition().y() << "," << std::setw(8)
0126 << std::setprecision(4) << alignable->globalPosition().z() << ")";
0127
0128 edm::LogVerbatim("DumpAlignable") << leaders_ << "+-> " << std::setw(width) << std::left << name.str() << " | "
0129 << std::setw(3) << std::left << alignable->components().size() << " | "
0130 << std::setw(11) << std::left << alignable->id() << " | " << pos.str();
0131 }
0132
0133
0134 void TestTrackerHierarchy::dumpAlignments(const edm::EventSetup& setup, AlignableTracker* aliTracker) const {
0135 const Alignments* alignments = &setup.getData(aliToken_);
0136 if (alignments->empty()) {
0137 edm::LogWarning("TrackerAlignment") << "@SUB=dumpAlignments"
0138 << "No TrackerAlignmentRcd.";
0139 } else {
0140 AlignableNavigator navi(aliTracker);
0141 edm::LogInfo("TrackerAlignment") << "@SUB=dumpAlignments"
0142 << "Start dumping alignments.";
0143 unsigned int nProblems = 0;
0144 for (std::vector<AlignTransform>::const_iterator iAlign = alignments->m_align.begin(),
0145 iEnd = alignments->m_align.end();
0146 iAlign != iEnd;
0147 ++iAlign) {
0148 const align::ID id = (*iAlign).rawId();
0149 const AlignTransform::Translation pos((*iAlign).translation());
0150 edm::LogVerbatim("DumpAlignable") << (*iAlign).rawId() << " | " << pos;
0151
0152 AlignableDetOrUnitPtr aliPtr = navi.alignableFromDetId(id);
0153 if (!aliPtr.isNull()) {
0154 const Alignable::PositionType& aliPos = aliPtr->globalPosition();
0155 double dR = aliPos.perp() - pos.perp();
0156 double dRphi = (aliPos.phi() - pos.phi()) * pos.perp();
0157 double dZ = aliPos.z() - pos.z();
0158 if (dR * dR + dRphi * dRphi + dZ * dZ) {
0159 ++nProblems;
0160 edm::LogWarning("Alignment") << "@SUB=analyze"
0161 << "Delta r,rphi,z: " << dR << " " << dRphi << " " << dZ
0162 << "\nPos r,phi,z: " << pos.perp() << " " << pos.phi() << " " << pos.z();
0163 }
0164 } else {
0165 ++nProblems;
0166 edm::LogWarning("Alignment") << "@SUB=dumpAlignments"
0167 << "No Alignable for Id " << id;
0168 }
0169 }
0170
0171 if (nProblems) {
0172 edm::LogWarning("TrackerAlignment") << "@SUB=dumpAlignments"
0173 << "Ending: " << nProblems << " Alignments with problems.";
0174 } else {
0175 edm::LogInfo("TrackerAlignment") << "@SUB=dumpAlignments"
0176 << "Ending without problem.";
0177 }
0178 }
0179 }
0180
0181
0182 DEFINE_FWK_MODULE(TestTrackerHierarchy);