Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-10-10 23:04:47

0001 #ifndef ALIGNMENT_MILLEPEDEALIGNMENTALGORITHM_INTERFACE_MILLEPEDEFILEREADER_H_
0002 #define ALIGNMENT_MILLEPEDEALIGNMENTALGORITHM_INTERFACE_MILLEPEDEFILEREADER_H_
0003 
0004 /*** system includes ***/
0005 #include <array>
0006 #include <string>
0007 #include <iostream>
0008 
0009 /*** core framework functionality ***/
0010 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0011 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0012 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0013 
0014 /*** Alignment ***/
0015 #include "Alignment/MillePedeAlignmentAlgorithm/interface/PedeLabelerBase.h"
0016 #include "CondFormats/PCLConfig/interface/AlignPCLThresholdsHG.h"
0017 #include "Geometry/TrackerGeometryBuilder/interface/PixelTopologyMap.h"
0018 
0019 /*** Quality ****/
0020 #include "CondFormats/SiPixelObjects/interface/SiPixelQuality.h"
0021 
0022 struct mpPCLresults {
0023 private:
0024   bool m_isHG;
0025   bool m_isDBUpdated;
0026   bool m_isDBUpdateVetoed;
0027   int m_nRecords;
0028   int m_exitCode;
0029   std::string m_exitMessage;
0030   std::bitset<4> m_updateBits;
0031 
0032 public:
0033   mpPCLresults(bool isDBUpdated,
0034                bool isDBUpdateVetoed,
0035                int nRecords,
0036                int exitCode,
0037                std::string exitMessage,
0038                std::bitset<4> updateBits,
0039                bool isHG)
0040       : m_isHG(isHG),
0041         m_isDBUpdated(isDBUpdated),
0042         m_isDBUpdateVetoed(isDBUpdateVetoed),
0043         m_nRecords(nRecords),
0044         m_exitCode(exitCode),
0045         m_exitMessage(exitMessage),
0046         m_updateBits(updateBits) {}
0047 
0048   const bool isHighGranularity() { return m_isHG; }
0049   const bool getDBUpdated() { return m_isDBUpdated; }
0050   const bool getDBVetoed() { return m_isDBUpdateVetoed; }
0051   const bool exceedsThresholds() { return m_updateBits.test(0); }
0052   const bool exceedsCutoffs() { return m_updateBits.test(1); }
0053   const bool exceedsMaxError() { return m_updateBits.test(2); }
0054   const bool belowSignificance() { return m_updateBits.test(3); }
0055   const int getNRecords() { return m_nRecords; }
0056   const int getExitCode() { return m_exitCode; }
0057   const std::string getExitMessage() { return m_exitMessage; }
0058 
0059   void print() {
0060     edm::LogInfo("MillePedeFileReader") << " is DB updated: " << m_isDBUpdated
0061                                         << " is DB update vetoed: " << m_isDBUpdateVetoed << " nRecords: " << m_nRecords
0062                                         << " exitCode: " << m_exitCode << " (" << m_exitMessage << ")" << std::endl;
0063   }
0064 };
0065 
0066 class MillePedeFileReader {
0067   //========================== PUBLIC METHODS ==================================
0068 public:  //====================================================================
0069   explicit MillePedeFileReader(const edm::ParameterSet&,
0070                                const std::shared_ptr<const PedeLabelerBase>&,
0071                                const std::shared_ptr<const AlignPCLThresholdsHG>&,
0072                                const std::shared_ptr<const PixelTopologyMap>&,
0073                                const std::shared_ptr<const SiPixelQuality>&);
0074 
0075   virtual ~MillePedeFileReader() = default;
0076 
0077   static void fillPSetDescription(edm::ParameterSetDescription& desc);
0078 
0079   void read();
0080   bool storeAlignments();
0081 
0082   enum { SIZE_LG_STRUCTS = 6, SIZE_HG_STRUCTS = 820 };
0083 
0084   const std::array<double, SIZE_LG_STRUCTS>& getXobs() const { return Xobs_; }
0085   const std::array<double, SIZE_LG_STRUCTS>& getXobsErr() const { return XobsErr_; }
0086   const std::array<double, SIZE_LG_STRUCTS>& getTXobs() const { return tXobs_; }
0087   const std::array<double, SIZE_LG_STRUCTS>& getTXobsErr() const { return tXobsErr_; }
0088 
0089   const std::array<double, SIZE_LG_STRUCTS>& getYobs() const { return Yobs_; }
0090   const std::array<double, SIZE_LG_STRUCTS>& getYobsErr() const { return YobsErr_; }
0091   const std::array<double, SIZE_LG_STRUCTS>& getTYobs() const { return tYobs_; }
0092   const std::array<double, SIZE_LG_STRUCTS>& getTYobsErr() const { return tYobsErr_; }
0093 
0094   const std::array<double, SIZE_LG_STRUCTS>& getZobs() const { return Zobs_; }
0095   const std::array<double, SIZE_LG_STRUCTS>& getZobsErr() const { return ZobsErr_; }
0096   const std::array<double, SIZE_LG_STRUCTS>& getTZobs() const { return tZobs_; }
0097   const std::array<double, SIZE_LG_STRUCTS>& getTZobsErr() const { return tZobsErr_; }
0098 
0099   const std::array<double, SIZE_HG_STRUCTS>& getXobs_HG() const { return Xobs_HG_; }
0100   const std::array<double, SIZE_HG_STRUCTS>& getXobsErr_HG() const { return XobsErr_HG_; }
0101   const std::array<double, SIZE_HG_STRUCTS>& getTXobs_HG() const { return tXobs_HG_; }
0102   const std::array<double, SIZE_HG_STRUCTS>& getTXobsErr_HG() const { return tXobsErr_HG_; }
0103 
0104   const std::array<double, SIZE_HG_STRUCTS>& getYobs_HG() const { return Yobs_HG_; }
0105   const std::array<double, SIZE_HG_STRUCTS>& getYobsErr_HG() const { return YobsErr_HG_; }
0106   const std::array<double, SIZE_HG_STRUCTS>& getTYobs_HG() const { return tYobs_HG_; }
0107   const std::array<double, SIZE_HG_STRUCTS>& getTYobsErr_HG() const { return tYobsErr_HG_; }
0108 
0109   const std::array<double, SIZE_HG_STRUCTS>& getZobs_HG() const { return Zobs_HG_; }
0110   const std::array<double, SIZE_HG_STRUCTS>& getZobsErr_HG() const { return ZobsErr_HG_; }
0111   const std::array<double, SIZE_HG_STRUCTS>& getTZobs_HG() const { return tZobs_HG_; }
0112   const std::array<double, SIZE_HG_STRUCTS>& getTZobsErr_HG() const { return tZobsErr_HG_; }
0113 
0114   const AlignPCLThresholdsHG::threshold_map getThresholdMap() const { return theThresholds_.get()->getThreshold_Map(); }
0115 
0116   const int binariesAmount() const { return binariesAmount_; }
0117 
0118   const mpPCLresults getResults() const {
0119     return mpPCLresults(updateDB_, vetoUpdateDB_, Nrec_, exitCode_, exitMessage_, updateBits_, isHG_);
0120   }
0121 
0122   const std::map<std::string, std::array<bool, 6>>& getResultsHG() const { return fractionExceeded_; }
0123 
0124 private:
0125   //========================= PRIVATE ENUMS ====================================
0126   //============================================================================
0127 
0128   enum class PclHLS : int {
0129     NotInPCL = -1,
0130     TPEHalfCylinderXplusZminus = 0,
0131     TPEHalfCylinderXminusZminus = 1,
0132     TPBHalfBarrelXplus = 2,
0133     TPBHalfBarrelXminus = 3,
0134     TPEHalfCylinderXplusZplus = 4,
0135     TPEHalfCylinderXminusZplus = 5,
0136     TPBLadderLayer1 = 6,
0137     TPBLadderLayer2 = 7,
0138     TPBLadderLayer3 = 8,
0139     TPBLadderLayer4 = 9,
0140     TPEPanelDisk1 = 10,
0141     TPEPanelDisk2 = 11,
0142     TPEPanelDisk3 = 12,
0143     TPEPanelDiskM1 = 13,
0144     TPEPanelDiskM2 = 14,
0145     TPEPanelDiskM3 = 15,
0146   };
0147 
0148   //========================= PRIVATE METHODS ==================================
0149   //============================================================================
0150 
0151   void readMillePedeEndFile();
0152   void readMillePedeLogFile();
0153   void readMillePedeResultFile();
0154   PclHLS getHLS(const Alignable*);
0155   std::string getStringFromHLS(PclHLS HLS);
0156   int getIndexForHG(align::ID id, PclHLS HLS);
0157   void initializeIndexHelper();
0158   bool isAlignableActive(const Alignable* alignable, const std::shared_ptr<const SiPixelQuality>& pixelQual);
0159 
0160   //========================== PRIVATE DATA ====================================
0161   //============================================================================
0162 
0163   // pede labeler plugin
0164   const std::shared_ptr<const PedeLabelerBase> pedeLabeler_;
0165 
0166   // thresholds from DB
0167   const std::shared_ptr<const AlignPCLThresholdsHG> theThresholds_;
0168 
0169   // PixelTopologyMap
0170   const std::shared_ptr<const PixelTopologyMap> pixelTopologyMap_;
0171 
0172   // switch to ignor inactive alignables when vetoing
0173   const bool ignoreInactiveAlignables_;
0174 
0175   // SiPixelQuality
0176   const std::shared_ptr<const SiPixelQuality> quality_;
0177 
0178   // input directory name
0179   std::string dirName_;
0180 
0181   // file-names
0182   const std::string millePedeEndFile_;
0183   const std::string millePedeLogFile_;
0184   const std::string millePedeResFile_;
0185 
0186   // conversion factors: cm to um & rad to urad
0187   static constexpr std::array<double, 6> multiplier_ = {{10000.,      // X
0188                                                          10000.,      // Y
0189                                                          10000.,      // Z
0190                                                          1000000.,    // tX
0191                                                          1000000.,    // tY
0192                                                          1000000.}};  // tZ
0193 
0194   bool updateDB_{false};
0195   bool vetoUpdateDB_{false};
0196   const bool isHG_;
0197 
0198   // stores in a compact format the 4 decisions:
0199   // 1st bit: exceeds maximum thresholds
0200   // 2nd bit: exceeds cutoffs (significant movement)
0201   // 3rd bit: exceeds maximum errors
0202   // 4th bit: is below the significance
0203   std::bitset<4> updateBits_;
0204 
0205   // pede binaries available
0206   int binariesAmount_{0};
0207 
0208   // Fraction threshold booleans for HG alignment
0209   std::map<std::string, std::array<bool, 6>> fractionExceeded_;
0210 
0211   int Nrec_{0};
0212   int exitCode_{-1};
0213   std::string exitMessage_{""};
0214 
0215   std::array<double, SIZE_LG_STRUCTS> Xobs_ = std::array<double, SIZE_LG_STRUCTS>();
0216   std::array<double, SIZE_LG_STRUCTS> XobsErr_ = std::array<double, SIZE_LG_STRUCTS>();
0217   std::array<double, SIZE_LG_STRUCTS> tXobs_ = std::array<double, SIZE_LG_STRUCTS>();
0218   std::array<double, SIZE_LG_STRUCTS> tXobsErr_ = std::array<double, SIZE_LG_STRUCTS>();
0219 
0220   std::array<double, SIZE_LG_STRUCTS> Yobs_ = std::array<double, SIZE_LG_STRUCTS>();
0221   std::array<double, SIZE_LG_STRUCTS> YobsErr_ = std::array<double, SIZE_LG_STRUCTS>();
0222   std::array<double, SIZE_LG_STRUCTS> tYobs_ = std::array<double, SIZE_LG_STRUCTS>();
0223   std::array<double, SIZE_LG_STRUCTS> tYobsErr_ = std::array<double, SIZE_LG_STRUCTS>();
0224 
0225   std::array<double, SIZE_LG_STRUCTS> Zobs_ = std::array<double, SIZE_LG_STRUCTS>();
0226   std::array<double, SIZE_LG_STRUCTS> ZobsErr_ = std::array<double, SIZE_LG_STRUCTS>();
0227   std::array<double, SIZE_LG_STRUCTS> tZobs_ = std::array<double, SIZE_LG_STRUCTS>();
0228   std::array<double, SIZE_LG_STRUCTS> tZobsErr_ = std::array<double, SIZE_LG_STRUCTS>();
0229 
0230   std::array<double, SIZE_HG_STRUCTS> Xobs_HG_ = std::array<double, SIZE_HG_STRUCTS>();
0231   std::array<double, SIZE_HG_STRUCTS> XobsErr_HG_ = std::array<double, SIZE_HG_STRUCTS>();
0232   std::array<double, SIZE_HG_STRUCTS> tXobs_HG_ = std::array<double, SIZE_HG_STRUCTS>();
0233   std::array<double, SIZE_HG_STRUCTS> tXobsErr_HG_ = std::array<double, SIZE_HG_STRUCTS>();
0234 
0235   std::array<double, SIZE_HG_STRUCTS> Yobs_HG_ = std::array<double, SIZE_HG_STRUCTS>();
0236   std::array<double, SIZE_HG_STRUCTS> YobsErr_HG_ = std::array<double, SIZE_HG_STRUCTS>();
0237   std::array<double, SIZE_HG_STRUCTS> tYobs_HG_ = std::array<double, SIZE_HG_STRUCTS>();
0238   std::array<double, SIZE_HG_STRUCTS> tYobsErr_HG_ = std::array<double, SIZE_HG_STRUCTS>();
0239 
0240   std::array<double, SIZE_HG_STRUCTS> Zobs_HG_ = std::array<double, SIZE_HG_STRUCTS>();
0241   std::array<double, SIZE_HG_STRUCTS> ZobsErr_HG_ = std::array<double, SIZE_HG_STRUCTS>();
0242   std::array<double, SIZE_HG_STRUCTS> tZobs_HG_ = std::array<double, SIZE_HG_STRUCTS>();
0243   std::array<double, SIZE_HG_STRUCTS> tZobsErr_HG_ = std::array<double, SIZE_HG_STRUCTS>();
0244 
0245   std::unordered_map<PclHLS, std::pair<int, int>> indexHelper;
0246 };
0247 
0248 const std::array<std::string, 8> coord_str = {{"X", "Y", "Z", "theta_X", "theta_Y", "theta_Z", "extra_DOF", "none"}};
0249 inline std::ostream& operator<<(std::ostream& os, const AlignPCLThresholdsHG::coordType& c) {
0250   if (c >= AlignPCLThresholdsHG::endOfTypes || c < AlignPCLThresholdsHG::X)
0251     return os << "unrecongnized coordinate";
0252   return os << coord_str[c];
0253 }
0254 
0255 #endif /* ALIGNMENT_MILLEPEDEALIGNMENTALGORITHM_INTERFACE_MILLEPEDEFILEREADER_H_ */