File indexing completed on 2024-09-07 04:37:41
0001 #ifndef GEMCSCSegment_GEMCSCSegFit_h
0002 #define GEMCSCSegment_GEMCSCSegFit_h
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029 #include "DataFormats/TrackingRecHit/interface/TrackingRecHit.h"
0030 #include <DataFormats/CSCRecHit/interface/CSCRecHit2D.h>
0031 #include <DataFormats/GEMRecHit/interface/GEMRecHit.h>
0032 #include <DataFormats/MuonDetId/interface/CSCDetId.h>
0033
0034 #include <Geometry/CSCGeometry/interface/CSCChamber.h>
0035 #include <Geometry/CSCGeometry/interface/CSCLayer.h>
0036 #include <Geometry/GEMGeometry/interface/GEMChamber.h>
0037
0038 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0039 #include "FWCore/Utilities/interface/Exception.h"
0040
0041 #include <Math/Functions.h>
0042 #include <Math/SVector.h>
0043 #include <Math/SMatrix.h>
0044
0045 #include <vector>
0046
0047 class GEMCSCSegFit {
0048 public:
0049
0050
0051
0052 typedef ROOT::Math::SMatrix<double, 16, 16, ROOT::Math::MatRepSym<double, 16> > SMatrixSym16;
0053
0054
0055 typedef ROOT::Math::SMatrix<double, 16, 4> SMatrix16by4;
0056
0057
0058 typedef ROOT::Math::SMatrix<double, 4> SMatrix4;
0059 typedef ROOT::Math::SMatrix<double, 4, 4, ROOT::Math::MatRepSym<double, 4> > SMatrixSym4;
0060
0061
0062 typedef ROOT::Math::SMatrix<double, 2, 2, ROOT::Math::MatRepSym<double, 2> > SMatrixSym2;
0063
0064
0065 typedef ROOT::Math::SVector<double, 4> SVector4;
0066
0067
0068
0069
0070 GEMCSCSegFit(std::map<uint32_t, const CSCLayer*> csclayermap,
0071 std::map<uint32_t, const GEMEtaPartition*> gemrollmap,
0072 const std::vector<const TrackingRecHit*> hits)
0073 : csclayermap_(csclayermap),
0074 gemetapartmap_(gemrollmap),
0075 hits_(hits),
0076 scaleXError_(1.0),
0077 refid_(csclayermap_.begin()->first),
0078 fitdone_(false) {
0079
0080 edm::LogVerbatim("GEMCSCSegFit") << "[GEMCSCSegFit::ctor] cached the csclayermap and the gemrollmap";
0081
0082
0083 std::stringstream csclayermapss;
0084 csclayermapss << "[GEMCSCSegFit::ctor] :: csclayermap :: elements [" << std::endl;
0085 for (std::map<uint32_t, const CSCLayer*>::const_iterator mapIt = csclayermap_.begin(); mapIt != csclayermap_.end();
0086 ++mapIt) {
0087 csclayermapss << "[CSC DetId " << mapIt->first << " =" << CSCDetId(mapIt->first) << ", CSC Layer "
0088 << mapIt->second << " =" << (mapIt->second)->id() << "]," << std::endl;
0089 }
0090 csclayermapss << "]" << std::endl;
0091 std::string csclayermapstr = csclayermapss.str();
0092 edm::LogVerbatim("GEMCSCSegFit") << csclayermapstr;
0093
0094
0095
0096 std::stringstream gemetapartmapss;
0097 gemetapartmapss << "[GEMCSCSegFit::ctor] :: gemetapartmap :: elements [" << std::endl;
0098 for (std::map<uint32_t, const GEMEtaPartition*>::const_iterator mapIt = gemetapartmap_.begin();
0099 mapIt != gemetapartmap_.end();
0100 ++mapIt) {
0101 gemetapartmapss << "[GEM DetId " << mapIt->first << " =" << GEMDetId(mapIt->first) << ", GEM EtaPart "
0102 << mapIt->second << "]," << std::endl;
0103 }
0104 gemetapartmapss << "]" << std::endl;
0105 std::string gemetapartmapstr = gemetapartmapss.str();
0106 edm::LogVerbatim("GEMCSCSegFit") << gemetapartmapstr;
0107
0108 }
0109
0110 virtual ~GEMCSCSegFit() {}
0111
0112
0113 void fit(void);
0114
0115 AlgebraicSymMatrix covarianceMatrix(void);
0116
0117
0118
0119 void setScaleXError(double factor) { scaleXError_ = factor; }
0120
0121
0122 float xfit(float z) const;
0123 float yfit(float z) const;
0124
0125
0126 float xdev(float x, float z) const;
0127 float ydev(float y, float z) const;
0128 float Rdev(float x, float y, float z) const;
0129
0130
0131 std::vector<const TrackingRecHit*> hits(void) const { return hits_; }
0132 double scaleXError(void) const { return scaleXError_; }
0133 size_t nhits(void) const { return hits_.size(); }
0134 double chi2(void) const { return chi2_; }
0135 int ndof(void) const { return ndof_; }
0136 LocalPoint intercept() const { return intercept_; }
0137 LocalVector localdir() const { return localdir_; }
0138
0139 const CSCChamber* cscchamber(uint32_t id) const {
0140
0141 if (csclayermap_.find(id) == csclayermap_.end()) {
0142 throw cms::Exception("InvalidDetId") << "[GEMCSCSegFit] Failed to find CSCChamber in CSCLayerMap" << std::endl;
0143 }
0144 else {
0145 return (csclayermap_.find(id)->second)->chamber();
0146 }
0147 }
0148 const CSCLayer* csclayer(uint32_t id) const {
0149 if (csclayermap_.find(id) == csclayermap_.end()) {
0150 throw cms::Exception("InvalidDetId") << "[GEMCSCSegFit] Failed to find CSCLayer in CSCLayerMap" << std::endl;
0151 } else {
0152 return csclayermap_.find(id)->second;
0153 }
0154 }
0155 const GEMEtaPartition* gemetapartition(uint32_t id) const {
0156 if (gemetapartmap_.find(id) == gemetapartmap_.end()) {
0157 throw cms::Exception("InvalidDetId")
0158 << "[GEMCSCSegFit] Failed to find GEMEtaPartition in GEMEtaPartMap" << std::endl;
0159 } else {
0160 return gemetapartmap_.find(id)->second;
0161 }
0162 }
0163 const CSCChamber* refcscchamber() const {
0164 if (csclayermap_.find(refid_) == csclayermap_.end()) {
0165 throw cms::Exception("InvalidDetId")
0166 << "[GEMCSCSegFit] Failed to find Reference CSCChamber in CSCLayerMap" << std::endl;
0167 } else {
0168 return (csclayermap_.find(refid_)->second)->chamber();
0169 }
0170 }
0171 bool fitdone() const { return fitdone_; }
0172
0173 private:
0174
0175
0176 void fit2(void);
0177 void fitlsq(void);
0178 void setChi2(void);
0179
0180 protected:
0181
0182
0183
0184 void setOutFromIP(void);
0185
0186 SMatrix16by4 derivativeMatrix(void);
0187 SMatrixSym16 weightMatrix(void);
0188 AlgebraicSymMatrix flipErrors(const SMatrixSym4&);
0189
0190
0191
0192 std::map<uint32_t, const CSCLayer*> csclayermap_;
0193 std::map<uint32_t, const GEMEtaPartition*> gemetapartmap_;
0194 const CSCChamber* refcscchamber_;
0195
0196 std::vector<const TrackingRecHit*> hits_;
0197 float uslope_;
0198 float vslope_;
0199 LocalPoint intercept_;
0200 LocalVector localdir_;
0201 double chi2_;
0202 int ndof_;
0203 double scaleXError_;
0204 uint32_t refid_;
0205 bool fitdone_;
0206
0207 };
0208
0209 #endif