Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-05-22 04:02:35

0001 // -*- C++ -*-
0002 //
0003 // Package:    TrackerTreeGenerator
0004 // Class:      TrackerTreeGenerator
0005 //
0006 /**\class TrackerTreeGenerator TrackerTreeGenerator.cc Alignment/TrackerAlignment/plugins/TrackerTreeGenerator.cc
0007  Description: <one line class summary>
0008  Implementation:
0009      <Notes on implementation>
0010 */
0011 //
0012 // Original Author:  Johannes Hauk
0013 //         Created:  Fri Jan 16 14:09:52 CET 2009
0014 //         Modified by: Gregor Mittag (DESY)
0015 //
0016 //
0017 //
0018 
0019 // system include files
0020 #include <memory>
0021 
0022 // user include files
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 // class decleration
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   // ----------member data ---------------------------
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 // constants, enums and typedefs
0088 //
0089 
0090 //
0091 // static data member definitions
0092 //
0093 
0094 //
0095 // constructors and destructor
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 // member functions
0109 //
0110 
0111 // ------------ method called to for each event  ------------
0112 void TrackerTreeGenerator::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
0113   // now try to take directly the ideal geometry independent of used geometry in Global Tag
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);  // ... so, ladder is not per halfBarrel-Layer, but per barrel-layer!
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();  // = gPModule.barePhi().degrees();
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)) {  //is it a single physical module?
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       // do so only for individual modules and not also one entry for the combined doubleSided Module
0259       if (tkTreeVar.isDoubleSide)
0260         continue;
0261     }
0262     vTkTreeVar_.push_back(tkTreeVar);
0263   }
0264 }
0265 
0266 // ------------ method called once each job just before starting event loop  ------------
0267 void TrackerTreeGenerator::beginJob() {}
0268 
0269 // ------------ method called once each job just after ending the event loop  ------------
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");                 // Barrel: Layer, Forward: Disk
0283   trackerTree->Branch("Side", &side, "Side/i");                    // Rod/Ring in +z or -z
0284   trackerTree->Branch("Half", &half, "Half/i");                    // PXB: HalfBarrel, PXF: HalfCylinder, TIB: HalfShell
0285   trackerTree->Branch("Rod", &rod, "Rod/i");                       // Barrel (Ladder or String or Rod)
0286   trackerTree->Branch("Ring", &ring, "Ring/i");                    // Forward
0287   trackerTree->Branch("Petal", &petal, "Petal/i");                 // TEC
0288   trackerTree->Branch("Blade", &blade, "Blade/i");                 // PXF
0289   trackerTree->Branch("Panel", &panel, "Panel/i");                 // PXF
0290   trackerTree->Branch("OuterInner", &outerInner, "OuterInner/i");  // front/back String,Ring,Petal
0291   trackerTree->Branch("Module", &module, "Module/i");              // Module ID
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 //define this as a plug-in
0340 DEFINE_FWK_MODULE(TrackerTreeGenerator);