File indexing completed on 2024-05-22 04:02:35
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #include <memory>
0021
0022
0023 #include "FWCore/Framework/interface/one/EDAnalyzer.h"
0024 #include "FWCore/Framework/interface/Event.h"
0025 #include "FWCore/Framework/interface/EventSetup.h"
0026 #include "FWCore/Framework/interface/MakerMacros.h"
0027 #include "FWCore/Framework/interface/ESHandle.h"
0028 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0029 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0030 #include "FWCore/ServiceRegistry/interface/Service.h"
0031
0032 #include "CondFormats/GeometryObjects/interface/PTrackerParameters.h"
0033 #include "CommonTools/UtilAlgos/interface/TFileService.h"
0034 #include "CommonTools/Utils/interface/TFileDirectory.h"
0035
0036 #include "DataFormats/DetId/interface/DetId.h"
0037 #include "DataFormats/SiPixelDetId/interface/PixelSubdetector.h"
0038 #include "DataFormats/SiStripDetId/interface/StripSubdetector.h"
0039 #include "DataFormats/TrackerCommon/interface/TrackerTopology.h"
0040 #include "DataFormats/GeometryVector/interface/LocalPoint.h"
0041 #include "DataFormats/GeometryVector/interface/GlobalPoint.h"
0042 #include "DataFormats/GeometrySurface/interface/Surface.h"
0043 #include "DataFormats/Math/interface/deltaPhi.h"
0044
0045 #include "Geometry/Records/interface/IdealGeometryRecord.h"
0046 #include "Geometry/Records/interface/TrackerTopologyRcd.h"
0047 #include "Geometry/TrackerNumberingBuilder/interface/GeometricDet.h"
0048 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
0049 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeomBuilderFromGeometricDet.h"
0050 #include "Geometry/Records/interface/PTrackerParametersRcd.h"
0051 #include "Geometry/Records/interface/PTrackerAdditionalParametersPerDetRcd.h"
0052 #include "Geometry/CommonDetUnit/interface/TrackingGeometry.h"
0053 #include "Geometry/CommonDetUnit/interface/GeomDet.h"
0054 #include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetUnit.h"
0055 #include "Geometry/CommonTopologies/interface/StripTopology.h"
0056
0057 #include "Alignment/TrackerAlignment/interface/TrackerTreeVariables.h"
0058 #include "Alignment/TrackerAlignment/interface/AlignableTracker.h"
0059
0060 #include "TTree.h"
0061
0062
0063
0064
0065 class TrackerTreeGenerator : public edm::one::EDAnalyzer<edm::one::SharedResources> {
0066 public:
0067 explicit TrackerTreeGenerator(const edm::ParameterSet&);
0068 ~TrackerTreeGenerator() override = default;
0069
0070 private:
0071 void beginJob() override;
0072 void analyze(const edm::Event&, const edm::EventSetup&) override;
0073 void endJob() override;
0074
0075
0076 const edm::ESGetToken<GeometricDet, IdealGeometryRecord> geomDetToken_;
0077 const edm::ESGetToken<PTrackerParameters, PTrackerParametersRcd> ptpToken_;
0078 const edm::ESGetToken<PTrackerAdditionalParametersPerDet, PTrackerAdditionalParametersPerDetRcd> ptitpToken_;
0079 const edm::ESGetToken<TrackerTopology, TrackerTopologyRcd> topoToken_;
0080
0081 const bool createEntryForDoubleSidedModule_;
0082 std::vector<TrackerTreeVariables> vTkTreeVar_;
0083 edm::ParameterSet config_;
0084 };
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097 TrackerTreeGenerator::TrackerTreeGenerator(const edm::ParameterSet& config)
0098 : geomDetToken_(esConsumes()),
0099 ptpToken_(esConsumes()),
0100 ptitpToken_(esConsumes()),
0101 topoToken_(esConsumes()),
0102 createEntryForDoubleSidedModule_(config.getParameter<bool>("createEntryForDoubleSidedModule")),
0103 config_(config) {
0104 usesResource(TFileService::kSharedResource);
0105 }
0106
0107
0108
0109
0110
0111
0112 void TrackerTreeGenerator::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
0113
0114 const GeometricDet* geometricDet = &iSetup.getData(geomDetToken_);
0115 const PTrackerParameters& ptp = iSetup.getData(ptpToken_);
0116 const PTrackerAdditionalParametersPerDet* ptitp = &iSetup.getData(ptitpToken_);
0117 const TrackerTopology* tTopo = &iSetup.getData(topoToken_);
0118
0119 TrackerGeomBuilderFromGeometricDet trackerBuilder;
0120 const TrackerGeometry* tkGeom = trackerBuilder.build(geometricDet, ptitp, ptp, tTopo);
0121 AlignableTracker alignableTracker{tkGeom, tTopo};
0122 const auto& ns = alignableTracker.trackerNameSpace();
0123
0124 edm::LogInfo("TrackerTreeGenerator") << "@SUB=TrackerTreeGenerator::analyze"
0125 << "There are " << tkGeom->detIds().size() << " dets and "
0126 << tkGeom->detUnitIds().size() << " detUnits in the Geometry Record";
0127
0128 if (createEntryForDoubleSidedModule_) {
0129 edm::LogInfo("TrackerTreeGenerator") << "@SUB=TrackerTreeGenerator::analyze"
0130 << "Create entry for each module AND one entry for virtual "
0131 << "double-sided module in addition";
0132 } else {
0133 edm::LogInfo("TrackerTreeGenerator") << "@SUB=TrackerTreeGenerator::analyze"
0134 << "Create one entry for each physical module, do NOT create additional "
0135 << "entry for virtual double-sided module";
0136 }
0137
0138 for (const auto& detId : tkGeom->detIds()) {
0139 const GeomDet& geomDet = *tkGeom->idToDet(detId);
0140 const Surface& surface = geomDet.surface();
0141
0142 TrackerTreeVariables tkTreeVar;
0143 const auto rawId = detId.rawId();
0144 tkTreeVar.rawId = rawId;
0145 tkTreeVar.subdetId = detId.subdetId();
0146
0147 switch (tkTreeVar.subdetId) {
0148 case PixelSubdetector::PixelBarrel:
0149 tkTreeVar.layer = tTopo->pxbLayer(detId);
0150 tkTreeVar.half = ns.tpb().halfBarrelNumber(rawId);
0151 tkTreeVar.rod = tTopo->pxbLadder(detId);
0152 tkTreeVar.module = tTopo->pxbModule(detId);
0153 break;
0154 case PixelSubdetector::PixelEndcap:
0155 tkTreeVar.layer = tTopo->pxfDisk(detId);
0156 tkTreeVar.side = tTopo->pxfSide(detId);
0157 tkTreeVar.half = ns.tpe().halfCylinderNumber(rawId);
0158 tkTreeVar.blade = tTopo->pxfBlade(detId);
0159 tkTreeVar.panel = tTopo->pxfPanel(detId);
0160 tkTreeVar.module = tTopo->pxfModule(detId);
0161 break;
0162 case StripSubdetector::TIB:
0163 tkTreeVar.layer = tTopo->tibLayer(detId);
0164 tkTreeVar.side = tTopo->tibStringInfo(detId)[0];
0165 tkTreeVar.half = ns.tib().halfShellNumber(rawId);
0166 tkTreeVar.rod = tTopo->tibStringInfo(detId)[2];
0167 tkTreeVar.outerInner = tTopo->tibStringInfo(detId)[1];
0168 tkTreeVar.module = tTopo->tibModule(detId);
0169 tkTreeVar.isDoubleSide = tTopo->tibIsDoubleSide(detId);
0170 tkTreeVar.isRPhi = tTopo->tibIsRPhi(detId);
0171 tkTreeVar.isStereo = tTopo->tibIsStereo(detId);
0172 break;
0173 case StripSubdetector::TID:
0174 tkTreeVar.layer = tTopo->tidWheel(detId);
0175 tkTreeVar.side = tTopo->tidSide(detId);
0176 tkTreeVar.ring = tTopo->tidRing(detId);
0177 tkTreeVar.outerInner = tTopo->tidModuleInfo(detId)[0];
0178 tkTreeVar.module = tTopo->tidModuleInfo(detId)[1];
0179 tkTreeVar.isDoubleSide = tTopo->tidIsDoubleSide(detId);
0180 tkTreeVar.isRPhi = tTopo->tidIsRPhi(detId);
0181 tkTreeVar.isStereo = tTopo->tidIsStereo(detId);
0182 break;
0183 case StripSubdetector::TOB:
0184 tkTreeVar.layer = tTopo->tobLayer(detId);
0185 tkTreeVar.side = tTopo->tobRodInfo(detId)[0];
0186 tkTreeVar.rod = tTopo->tobRodInfo(detId)[1];
0187 tkTreeVar.module = tTopo->tobModule(detId);
0188 tkTreeVar.isDoubleSide = tTopo->tobIsDoubleSide(detId);
0189 tkTreeVar.isRPhi = tTopo->tobIsRPhi(detId);
0190 tkTreeVar.isStereo = tTopo->tobIsStereo(detId);
0191 break;
0192 case StripSubdetector::TEC:
0193 tkTreeVar.layer = tTopo->tecWheel(detId);
0194 tkTreeVar.side = tTopo->tecSide(detId);
0195 tkTreeVar.ring = tTopo->tecRing(detId);
0196 tkTreeVar.petal = tTopo->tecPetalInfo(detId)[1];
0197 tkTreeVar.outerInner = tTopo->tecPetalInfo(detId)[0];
0198 tkTreeVar.module = tTopo->tecModule(detId);
0199 tkTreeVar.isDoubleSide = tTopo->tecIsDoubleSide(detId);
0200 tkTreeVar.isRPhi = tTopo->tecIsRPhi(detId);
0201 tkTreeVar.isStereo = tTopo->tecIsStereo(detId);
0202 break;
0203 }
0204
0205 LocalPoint lPModule(0., 0., 0.), lUDirection(1., 0., 0.), lVDirection(0., 1., 0.), lWDirection(0., 0., 1.);
0206 GlobalPoint gPModule = surface.toGlobal(lPModule), gUDirection = surface.toGlobal(lUDirection),
0207 gVDirection = surface.toGlobal(lVDirection), gWDirection = surface.toGlobal(lWDirection);
0208 double dR(999.), dPhi(999.), dZ(999.);
0209 switch (tkTreeVar.subdetId) {
0210 case PixelSubdetector::PixelBarrel:
0211 case StripSubdetector::TIB:
0212 case StripSubdetector::TOB:
0213 dR = gWDirection.perp() - gPModule.perp();
0214 dPhi = deltaPhi(gUDirection.barePhi(), gPModule.barePhi());
0215 dZ = gVDirection.z() - gPModule.z();
0216 tkTreeVar.uDirection = dPhi > 0. ? 1 : -1;
0217 tkTreeVar.vDirection = dZ > 0. ? 1 : -1;
0218 tkTreeVar.wDirection = dR > 0. ? 1 : -1;
0219 break;
0220 case PixelSubdetector::PixelEndcap:
0221 dR = gUDirection.perp() - gPModule.perp();
0222 dPhi = deltaPhi(gVDirection.barePhi(), gPModule.barePhi());
0223 dZ = gWDirection.z() - gPModule.z();
0224 tkTreeVar.uDirection = dR > 0. ? 1 : -1;
0225 tkTreeVar.vDirection = dPhi > 0. ? 1 : -1;
0226 tkTreeVar.wDirection = dZ > 0. ? 1 : -1;
0227 break;
0228 case StripSubdetector::TID:
0229 case StripSubdetector::TEC:
0230 dR = gVDirection.perp() - gPModule.perp();
0231 dPhi = deltaPhi(gUDirection.barePhi(), gPModule.barePhi());
0232 dZ = gWDirection.z() - gPModule.z();
0233 tkTreeVar.uDirection = dPhi > 0. ? 1 : -1;
0234 tkTreeVar.vDirection = dR > 0. ? 1 : -1;
0235 tkTreeVar.wDirection = dZ > 0. ? 1 : -1;
0236 break;
0237 }
0238 tkTreeVar.posR = gPModule.perp();
0239 tkTreeVar.posPhi = gPModule.barePhi();
0240 tkTreeVar.posEta = gPModule.eta();
0241 tkTreeVar.posX = gPModule.x();
0242 tkTreeVar.posY = gPModule.y();
0243 tkTreeVar.posZ = gPModule.z();
0244
0245 if (auto stripGeomDetUnit = dynamic_cast<const StripGeomDetUnit*>(&geomDet)) {
0246 switch (tkTreeVar.subdetId) {
0247 case StripSubdetector::TIB:
0248 case StripSubdetector::TOB:
0249 case StripSubdetector::TID:
0250 case StripSubdetector::TEC:
0251 auto& topol = dynamic_cast<const StripTopology&>(stripGeomDetUnit->specificTopology());
0252 tkTreeVar.nStrips = topol.nstrips();
0253 break;
0254 }
0255 }
0256
0257 if (!createEntryForDoubleSidedModule_) {
0258
0259 if (tkTreeVar.isDoubleSide)
0260 continue;
0261 }
0262 vTkTreeVar_.push_back(tkTreeVar);
0263 }
0264 }
0265
0266
0267 void TrackerTreeGenerator::beginJob() {}
0268
0269
0270 void TrackerTreeGenerator::endJob() {
0271 UInt_t rawId(999), subdetId(999), layer(999), side(999), half(999), rod(999), ring(999), petal(999), blade(999),
0272 panel(999), outerInner(999), module(999), nStrips(999);
0273 Bool_t isDoubleSide(false), isRPhi(false), isStereo(false);
0274 Int_t uDirection(999), vDirection(999), wDirection(999);
0275 Float_t posR(999.F), posPhi(999.F), posEta(999.F), posX(999.F), posY(999.F), posZ(999.F);
0276
0277 edm::Service<TFileService> fileService;
0278 TFileDirectory treeDir = fileService->mkdir("TrackerTree");
0279 auto trackerTree{treeDir.make<TTree>("TrackerTree", "IDs of all modules (ideal geometry)")};
0280 trackerTree->Branch("RawId", &rawId, "RawId/i");
0281 trackerTree->Branch("SubdetId", &subdetId, "SubdetId/i");
0282 trackerTree->Branch("Layer", &layer, "Layer/i");
0283 trackerTree->Branch("Side", &side, "Side/i");
0284 trackerTree->Branch("Half", &half, "Half/i");
0285 trackerTree->Branch("Rod", &rod, "Rod/i");
0286 trackerTree->Branch("Ring", &ring, "Ring/i");
0287 trackerTree->Branch("Petal", &petal, "Petal/i");
0288 trackerTree->Branch("Blade", &blade, "Blade/i");
0289 trackerTree->Branch("Panel", &panel, "Panel/i");
0290 trackerTree->Branch("OuterInner", &outerInner, "OuterInner/i");
0291 trackerTree->Branch("Module", &module, "Module/i");
0292 trackerTree->Branch("NStrips", &nStrips, "NStrips/i");
0293 trackerTree->Branch("IsDoubleSide", &isDoubleSide, "IsDoubleSide/O");
0294 trackerTree->Branch("IsRPhi", &isRPhi, "IsRPhi/O");
0295 trackerTree->Branch("IsStereo", &isStereo, "IsStereo/O");
0296 trackerTree->Branch("UDirection", &uDirection, "UDirection/I");
0297 trackerTree->Branch("VDirection", &vDirection, "VDirection/I");
0298 trackerTree->Branch("WDirection", &wDirection, "WDirection/I");
0299 trackerTree->Branch("PosR", &posR, "PosR/F");
0300 trackerTree->Branch("PosPhi", &posPhi, "PosPhi/F");
0301 trackerTree->Branch("PosEta", &posEta, "PosEta/F");
0302 trackerTree->Branch("PosX", &posX, "PosX/F");
0303 trackerTree->Branch("PosY", &posY, "PosY/F");
0304 trackerTree->Branch("PosZ", &posZ, "PosZ/F");
0305
0306 for (const auto& iTree : vTkTreeVar_) {
0307 rawId = iTree.rawId;
0308 subdetId = iTree.subdetId;
0309 layer = iTree.layer;
0310 side = iTree.side;
0311 half = iTree.half;
0312 rod = iTree.rod;
0313 ring = iTree.ring;
0314 petal = iTree.petal;
0315 blade = iTree.blade;
0316 panel = iTree.panel;
0317 outerInner = iTree.outerInner;
0318 module = iTree.module;
0319 nStrips = iTree.nStrips;
0320 isDoubleSide = iTree.isDoubleSide;
0321 isRPhi = iTree.isRPhi;
0322 isStereo = iTree.isStereo;
0323 uDirection = iTree.uDirection;
0324 vDirection = iTree.vDirection;
0325 wDirection = iTree.wDirection;
0326 posR = iTree.posR;
0327 posPhi = iTree.posPhi;
0328 posEta = iTree.posEta;
0329 posX = iTree.posX;
0330 posY = iTree.posY;
0331 posZ = iTree.posZ;
0332
0333 trackerTree->Fill();
0334 }
0335 edm::LogInfo("TrackerTreeGenerator") << "@SUB=TrackerTreeGenerator::endJob"
0336 << "TrackerTree contains " << vTkTreeVar_.size() << " entries overall";
0337 }
0338
0339
0340 DEFINE_FWK_MODULE(TrackerTreeGenerator);