Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:15:28

0001 // -*- C++ -*-
0002 //
0003 /* 
0004  Description: <one line class summary>
0005 
0006  Implementation:
0007      <Notes on implementation>
0008 */
0009 
0010 //
0011 // Original Author:  Riccardo Ranieri
0012 //         Created:  Wed May 3 10:30:00 CEST 2006
0013 //     Modified by:  Michael Case, April 2010.
0014 //
0015 
0016 // system include files
0017 #include <memory>
0018 
0019 // user include files
0020 #include "FWCore/Framework/interface/Frameworkfwd.h"
0021 #include "FWCore/Framework/interface/one/EDAnalyzer.h"
0022 
0023 #include "FWCore/Framework/interface/Event.h"
0024 #include "FWCore/Framework/interface/EventSetup.h"
0025 #include "FWCore/Framework/interface/MakerMacros.h"
0026 
0027 #include "FWCore/Utilities/interface/Exception.h"
0028 
0029 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0030 #include "Geometry/CommonDetUnit/interface/TrackingGeometry.h"
0031 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
0032 #include "Geometry/TrackerNumberingBuilder/interface/GeometricDet.h"
0033 #include "Geometry/CommonTopologies/interface/PixelTopology.h"
0034 #include "Geometry/CommonTopologies/interface/StripTopology.h"
0035 #include "Geometry/CommonDetUnit/interface/PixelGeomDetType.h"
0036 #include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetType.h"
0037 
0038 #include "Geometry/CommonDetUnit/interface/PixelGeomDetUnit.h"
0039 #include "DataFormats/GeometrySurface/interface/BoundSurface.h"
0040 #include "DataFormats/Math/interface/angle_units.h"
0041 #include "DataFormats/Math/interface/Rounding.h"
0042 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0043 
0044 #include "DataFormats/SiStripDetId/interface/StripSubdetector.h"
0045 #include "DataFormats/TrackerCommon/interface/TrackerTopology.h"
0046 #include "Geometry/TrackerNumberingBuilder/interface/CmsTrackerStringToEnum.h"
0047 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
0048 
0049 // output
0050 #include <iostream>
0051 #include <fstream>
0052 #include <iomanip>
0053 #include <cmath>
0054 #include <bitset>
0055 
0056 using namespace cms_rounding;
0057 using namespace geometric_det_ns;
0058 using namespace angle_units::operators;
0059 
0060 typedef ROOT::Math::DisplacementVector3D<ROOT::Math::Cartesian3D<double> > Displ3DVec;
0061 
0062 class ModuleInfo : public edm::one::EDAnalyzer<> {
0063 public:
0064   explicit ModuleInfo(const edm::ParameterSet&);
0065 
0066   void analyze(edm::Event const& iEvent, edm::EventSetup const&) override;
0067 
0068 private:
0069   bool fromDDD_;
0070   bool printDDD_;
0071   double tolerance_;
0072   edm::ESGetToken<GeometricDet, IdealGeometryRecord> rDDToken_;
0073   edm::ESGetToken<TrackerGeometry, TrackerDigiGeometryRecord> pDDToken_;
0074   edm::ESGetToken<TrackerTopology, TrackerTopologyRcd> tTopoToken_;
0075 };
0076 
0077 ModuleInfo::ModuleInfo(const edm::ParameterSet& ps)
0078     : fromDDD_(ps.getParameter<bool>("fromDDD")),
0079       printDDD_(ps.getUntrackedParameter<bool>("printDDD", true)),
0080       tolerance_(ps.getUntrackedParameter<double>("tolerance", 1.e-23)),
0081       rDDToken_(esConsumes()),
0082       pDDToken_(esConsumes()),
0083       tTopoToken_(esConsumes()) {}
0084 
0085 // ------------ method called to produce the data  ------------
0086 void ModuleInfo::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
0087   edm::LogInfo("ModuleInfo") << "begins";
0088 
0089   // output file
0090   std::ofstream Output("ModuleInfo.log", std::ios::out);
0091   // TEC output as Martin Weber's
0092   std::ofstream TECOutput("TECLayout_CMSSW.dat", std::ios::out);
0093   TECOutput << std::fixed << std::setprecision(4);
0094 
0095   // Numbering Scheme
0096   std::ofstream NumberingOutput("ModuleNumbering.dat", std::ios::out);
0097 
0098   // get the GeometricDet
0099   //
0100   auto const& rDD = iSetup.getData(rDDToken_);
0101 
0102   edm::LogInfo("ModuleInfo") << " Top node is  " << &rDD << " " << rDD.name() << std::endl;
0103   edm::LogInfo("ModuleInfo") << " And Contains  Daughters: " << rDD.deepComponents().size() << std::endl;
0104   //
0105   //first instance tracking geometry
0106   auto const& pDD = iSetup.getData(pDDToken_);
0107   const TrackerTopology* tTopo = &iSetup.getData(tTopoToken_);
0108   //
0109 
0110   // counters
0111   unsigned int pxbN = 0;
0112   unsigned int pxb_fullN = 0;
0113   unsigned int pxb_halfN = 0;
0114   unsigned int pxfN = 0;
0115   unsigned int pxf_1x2N = 0;
0116   unsigned int pxf_1x5N = 0;
0117   unsigned int pxf_2x3N = 0;
0118   unsigned int pxf_2x4N = 0;
0119   unsigned int pxf_2x5N = 0;
0120   unsigned int tibN = 0;
0121   unsigned int tib_L12_rphiN = 0;
0122   unsigned int tib_L12_sterN = 0;
0123   unsigned int tib_L34_rphiN = 0;
0124   unsigned int tidN = 0;
0125   unsigned int tid_r1_rphiN = 0;
0126   unsigned int tid_r1_sterN = 0;
0127   unsigned int tid_r2_rphiN = 0;
0128   unsigned int tid_r2_sterN = 0;
0129   unsigned int tid_r3_rphiN = 0;
0130   unsigned int tobN = 0;
0131   unsigned int tob_L12_rphiN = 0;
0132   unsigned int tob_L12_sterN = 0;
0133   unsigned int tob_L34_rphiN = 0;
0134   unsigned int tob_L56_rphiN = 0;
0135   unsigned int tecN = 0;
0136   unsigned int tec_r1_rphiN = 0;
0137   unsigned int tec_r1_sterN = 0;
0138   unsigned int tec_r2_rphiN = 0;
0139   unsigned int tec_r2_sterN = 0;
0140   unsigned int tec_r3_rphiN = 0;
0141   unsigned int tec_r4_rphiN = 0;
0142   unsigned int tec_r5_rphiN = 0;
0143   unsigned int tec_r5_sterN = 0;
0144   unsigned int tec_r6_rphiN = 0;
0145   unsigned int tec_r7_rphiN = 0;
0146 
0147   std::vector<const GeometricDet*> modules = rDD.deepComponents();
0148   Output << "************************ List of modules with positions ************************" << std::endl;
0149 
0150   for (auto& module : modules) {
0151     unsigned int rawid = module->geographicalId().rawId();
0152     DetId id(rawid);
0153 
0154     GeometricDet::NavRange detPos = module->navpos();
0155     Output << std::fixed << std::setprecision(6);  // set as default 6 decimal digits
0156     std::bitset<32> binary_rawid(rawid);
0157     Output << " ******** raw Id = " << rawid << " (" << binary_rawid << ") ";
0158     if (fromDDD_ && printDDD_) {
0159       Output << "\t nav type = " << detPos;
0160     }
0161     Output << std::endl;
0162     int subdetid = module->geographicalId().subdetId();
0163     double thickness = module->bounds()->thickness() * 10000;  // cm-->um
0164 
0165     switch (subdetid) {
0166         // PXB
0167       case PixelSubdetector::PixelBarrel: {
0168         pxbN++;
0169         const std::string& name = module->name();
0170         if (name == "PixelBarrelActiveFull")
0171           pxb_fullN++;
0172         if (name == "PixelBarrelActiveHalf")
0173           pxb_halfN++;
0174         unsigned int theLayer = tTopo->pxbLayer(id);
0175         unsigned int theLadder = tTopo->pxbLadder(id);
0176         unsigned int theModule = tTopo->pxbModule(id);
0177 
0178         Output << " PXB"
0179                << "\t"
0180                << "Layer " << theLayer << " Ladder " << theLadder << "\t"
0181                << " module " << theModule << " " << name << "\t";
0182         break;
0183       }
0184 
0185         // PXF
0186       case PixelSubdetector::PixelEndcap: {
0187         pxfN++;
0188         const std::string& name = module->name();
0189         if (name == "PixelForwardActive1x2")
0190           pxf_1x2N++;
0191         if (name == "PixelForwardActive1x5")
0192           pxf_1x5N++;
0193         if (name == "PixelForwardActive2x3")
0194           pxf_2x3N++;
0195         if (name == "PixelForwardActive2x4")
0196           pxf_2x4N++;
0197         if (name == "PixelForwardActive2x5")
0198           pxf_2x5N++;
0199         unsigned int thePanel = tTopo->pxfPanel(id);
0200         unsigned int theDisk = tTopo->pxfDisk(id);
0201         unsigned int theBlade = tTopo->pxfBlade(id);
0202         unsigned int theModule = tTopo->pxfModule(id);
0203         std::string side;
0204         side = (tTopo->pxfSide(id) == 1) ? "-" : "+";
0205         Output << " PXF" << side << "\t"
0206                << "Disk " << theDisk << " Blade " << theBlade << " Panel " << thePanel << "\t"
0207                << " module " << theModule << "\t" << name << "\t";
0208         break;
0209       }
0210 
0211         // TIB
0212       case StripSubdetector::TIB: {
0213         tibN++;
0214         const std::string& name = module->name();
0215         if (name == "TIBActiveRphi0")
0216           tib_L12_rphiN++;
0217         if (name == "TIBActiveSter0")
0218           tib_L12_sterN++;
0219         if (name == "TIBActiveRphi2")
0220           tib_L34_rphiN++;
0221         unsigned int theLayer = tTopo->tibLayer(id);
0222         std::vector<unsigned int> theString = tTopo->tibStringInfo(id);
0223         unsigned int theModule = tTopo->tibModule(id);
0224         std::string side;
0225         std::string part;
0226         side = (theString[0] == 1) ? "-" : "+";
0227         part = (theString[1] == 1) ? "int" : "ext";
0228 
0229         Output << " TIB" << side << "\t"
0230                << "Layer " << theLayer << " " << part << "\t"
0231                << "string " << theString[2] << "\t"
0232                << " module " << theModule << " " << name << "\t";
0233         Output << " " << module->translation().X() << "   \t" << module->translation().Y() << "   \t"
0234                << module->translation().Z() << std::endl;
0235         break;
0236       }
0237 
0238         // TID
0239       case StripSubdetector::TID: {
0240         tidN++;
0241         const std::string& name = module->name();
0242         if (name == "TIDModule0RphiActive")
0243           tid_r1_rphiN++;
0244         if (name == "TIDModule0StereoActive")
0245           tid_r1_sterN++;
0246         if (name == "TIDModule1RphiActive")
0247           tid_r2_rphiN++;
0248         if (name == "TIDModule1StereoActive")
0249           tid_r2_sterN++;
0250         if (name == "TIDModule2RphiActive")
0251           tid_r3_rphiN++;
0252         unsigned int theDisk = tTopo->tidWheel(id);
0253         unsigned int theRing = tTopo->tidRing(id);
0254         std::string side;
0255         std::string part;
0256         side = (tTopo->tidSide(id) == 1) ? "-" : "+";
0257         part = (tTopo->tidOrder(id) == 1) ? "back" : "front";
0258         Output << " TID" << side << "\t"
0259                << "Disk " << theDisk << " Ring " << theRing << " " << part << "\t"
0260                << " module " << tTopo->tidModule(id) << "\t" << name << "\t";
0261         Output << " " << roundIfNear0(module->translation().X(), tolerance_) << "   \t"
0262                << roundIfNear0(module->translation().Y(), tolerance_) << "   \t"
0263                << roundIfNear0(module->translation().Z(), tolerance_) << std::endl;
0264         break;
0265       }
0266 
0267         // TOB
0268       case StripSubdetector::TOB: {
0269         tobN++;
0270         const std::string& name = module->name();
0271         if (name == "TOBActiveRphi0")
0272           tob_L12_rphiN++;
0273         if (name == "TOBActiveSter0")
0274           tob_L12_sterN++;
0275         if (name == "TOBActiveRphi2")
0276           tob_L34_rphiN++;
0277         if (name == "TOBActiveRphi4")
0278           tob_L56_rphiN++;
0279         unsigned int theLayer = tTopo->tobLayer(id);
0280         unsigned int theModule = tTopo->tobModule(id);
0281         std::string side;
0282         std::string part;
0283         side = (tTopo->tobSide(id) == 1) ? "-" : "+";
0284 
0285         Output << " TOB" << side << "\t"
0286                << "Layer " << theLayer << "\t"
0287                << "rod " << tTopo->tobRod(id) << " module " << theModule << "\t" << name << "\t";
0288         Output << " " << module->translation().X() << "   \t" << module->translation().Y() << "   \t"
0289                << module->translation().Z() << std::endl;
0290         break;
0291       }
0292 
0293         // TEC
0294       case StripSubdetector::TEC: {
0295         tecN++;
0296         const std::string& name = module->name();
0297         if (name == "TECModule0RphiActive")
0298           tec_r1_rphiN++;
0299         if (name == "TECModule0StereoActive")
0300           tec_r1_sterN++;
0301         if (name == "TECModule1RphiActive")
0302           tec_r2_rphiN++;
0303         if (name == "TECModule1StereoActive")
0304           tec_r2_sterN++;
0305         if (name == "TECModule2RphiActive")
0306           tec_r3_rphiN++;
0307         if (name == "TECModule3RphiActive")
0308           tec_r4_rphiN++;
0309         if (name == "TECModule4RphiActive")
0310           tec_r5_rphiN++;
0311         if (name == "TECModule4StereoActive")
0312           tec_r5_sterN++;
0313         if (name == "TECModule5RphiActive")
0314           tec_r6_rphiN++;
0315         if (name == "TECModule6RphiActive")
0316           tec_r7_rphiN++;
0317         unsigned int theWheel = tTopo->tecWheel(id);
0318         unsigned int theModule = tTopo->tecModule(id);
0319         unsigned int theRing = tTopo->tecRing(id);
0320         std::string side;
0321         std::string petal;
0322         side = (tTopo->tecSide(id) == 1) ? "-" : "+";
0323         petal = (tTopo->tecOrder(id) == 1) ? "back" : "front";
0324         Output << " TEC" << side << "\t"
0325                << "Wheel " << theWheel << " Petal " << tTopo->tecPetalNumber(id) << " " << petal << " Ring " << theRing
0326                << "\t"
0327                << "\t"
0328                << " module " << theModule << "\t" << name << "\t";
0329         Output << " " << roundIfNear0(module->translation().X(), tolerance_) << "   \t"
0330                << roundIfNear0(module->translation().Y(), tolerance_) << "   \t"
0331                << roundIfNear0(module->translation().Z(), tolerance_) << std::endl;
0332 
0333         // TEC output as Martin Weber's
0334         int out_side = (tTopo->tecSide(id) == 1) ? -1 : 1;
0335         unsigned int out_disk = tTopo->tecWheel(id);
0336         unsigned int out_sector = tTopo->tecPetalNumber(id);
0337         int out_petal = (tTopo->tecOrder(id) == 1) ? 1 : -1;
0338         // swap sector numbers for TEC-
0339         if (out_side == -1) {
0340           // fine for back petals, substract 1 for front petals
0341           if (out_petal == -1) {
0342             out_sector = (out_sector + 6) % 8 + 1;
0343           }
0344         }
0345         unsigned int out_ring = tTopo->tecRing(id);
0346         int out_sensor = 0;
0347         if (name == "TECModule0RphiActive")
0348           out_sensor = -1;
0349         if (name == "TECModule0StereoActive")
0350           out_sensor = 1;
0351         if (name == "TECModule1RphiActive")
0352           out_sensor = -1;
0353         if (name == "TECModule1StereoActive")
0354           out_sensor = 1;
0355         if (name == "TECModule2RphiActive")
0356           out_sensor = -1;
0357         if (name == "TECModule3RphiActive")
0358           out_sensor = -1;
0359         if (name == "TECModule4RphiActive")
0360           out_sensor = -1;
0361         if (name == "TECModule4StereoActive")
0362           out_sensor = 1;
0363         if (name == "TECModule5RphiActive")
0364           out_sensor = -1;
0365         if (name == "TECModule6RphiActive")
0366           out_sensor = -1;
0367         unsigned int out_module;
0368         if (out_ring == 1 || out_ring == 2 || out_ring == 5) {
0369           // rings with stereo modules
0370           // create number odd by default
0371           out_module = 2 * (tTopo->tecModule(id) - 1) + 1;
0372           if (out_sensor == 1) {
0373             // in even rings, stereo modules are the even ones
0374             if (out_ring == 2)
0375               out_module += 1;
0376           } else
0377             // in odd rings, stereo modules are the odd ones
0378             if (out_ring != 2)
0379               out_module += 1;
0380         } else {
0381           out_module = tTopo->tecModule(id);
0382         }
0383         double out_x = roundIfNear0(module->translation().X(), tolerance_);
0384         double out_y = roundIfNear0(module->translation().Y(), tolerance_);
0385         double out_z = module->translation().Z();
0386         double out_r = sqrt(module->translation().X() * module->translation().X() +
0387                             module->translation().Y() * module->translation().Y());
0388         double out_phi_rad = roundIfNear0(atan2(module->translation().Y(), module->translation().X()), tolerance_);
0389         if (almostEqual(out_phi_rad, -1._pi, 10)) {
0390           out_phi_rad = 1._pi;
0391           // Standardize phi values of |pi| to be always +pi instead of sometimes -pi.
0392         }
0393         TECOutput << out_side << " " << out_disk << " " << out_sector << " " << out_petal << " " << out_ring << " "
0394                   << out_module << " " << out_sensor << " " << out_x << " " << out_y << " " << out_z << " " << out_r
0395                   << " " << out_phi_rad << std::endl;
0396         //
0397         break;
0398       }
0399       default:
0400         Output << " WARNING no Silicon Strip detector, I got a " << rawid << std::endl;
0401         ;
0402     }
0403 
0404     // Local axes from Reco
0405     const GeomDet* geomdet = pDD.idToDet(module->geographicalId());
0406     // Global Coordinates (i,j,k)
0407     LocalVector xLocal(1, 0, 0);
0408     LocalVector yLocal(0, 1, 0);
0409     LocalVector zLocal(0, 0, 1);
0410     // Versor components
0411     GlobalVector xGlobal = (geomdet->surface()).toGlobal(xLocal);
0412     GlobalVector yGlobal = (geomdet->surface()).toGlobal(yLocal);
0413     GlobalVector zGlobal = (geomdet->surface()).toGlobal(zLocal);
0414     //
0415 
0416     // Output: set as default 4 decimal digits (0.1 um or 0.1 deg/rad)
0417     // active area center
0418     Output << "\t"
0419            << "thickness " << std::fixed << std::setprecision(0) << thickness << " um \n";
0420     Output << "\tActive Area Center" << std::endl;
0421     Output << "\t O = (" << std::fixed << std::setprecision(4) << roundIfNear0(module->translation().X(), tolerance_)
0422            << "," << std::fixed << std::setprecision(4) << roundIfNear0(module->translation().Y(), tolerance_) << ","
0423            << std::fixed << std::setprecision(4) << roundIfNear0(module->translation().Z(), tolerance_) << ")"
0424            << std::endl;
0425     //
0426     double polarRadius = std::sqrt(module->translation().X() * module->translation().X() +
0427                                    module->translation().Y() * module->translation().Y());
0428     double phiRad = roundIfNear0(atan2(module->translation().Y(), module->translation().X()), tolerance_);
0429     if (almostEqual(phiRad, -1._pi, 10)) {
0430       phiRad = 1._pi;
0431       // Standardize phi values of |pi| to be always +pi instead of sometimes -pi.
0432     }
0433     double phiDeg = convertRadToDeg(phiRad);
0434     //
0435     Output << "\t\t polar radius " << std::fixed << std::setprecision(4) << polarRadius << "\t"
0436            << "phi [deg] " << std::fixed << std::setprecision(4) << phiDeg << "\t"
0437            << "phi [rad] " << std::fixed << std::setprecision(4) << phiRad << std::endl;
0438     // active area versors (rotation matrix)
0439     Displ3DVec x, y, z;
0440     module->rotation().GetComponents(x, y, z);
0441     x = roundVecIfNear0(x, tolerance_);
0442     y = roundVecIfNear0(y, tolerance_);
0443     z = roundVecIfNear0(z, tolerance_);
0444     xGlobal = roundVecIfNear0(xGlobal, tolerance_);
0445     yGlobal = roundVecIfNear0(yGlobal, tolerance_);
0446     zGlobal = roundVecIfNear0(zGlobal, tolerance_);
0447     Output << "\tActive Area Rotation Matrix" << std::endl;
0448     Output << "\t z = n = (" << std::fixed << std::setprecision(4) << z.X() << "," << std::fixed << std::setprecision(4)
0449            << z.Y() << "," << std::fixed << std::setprecision(4) << z.Z() << ")" << std::endl
0450            << "\t [Rec] = (" << std::fixed << std::setprecision(4) << zGlobal.x() << "," << std::fixed
0451            << std::setprecision(4) << zGlobal.y() << "," << std::fixed << std::setprecision(4) << zGlobal.z() << ")"
0452            << std::endl
0453            << "\t x = t = (" << std::fixed << std::setprecision(4) << x.X() << "," << std::fixed << std::setprecision(4)
0454            << x.Y() << "," << std::fixed << std::setprecision(4) << x.Z() << ")" << std::endl
0455            << "\t [Rec] = (" << std::fixed << std::setprecision(4) << xGlobal.x() << "," << std::fixed
0456            << std::setprecision(4) << xGlobal.y() << "," << std::fixed << std::setprecision(4) << xGlobal.z() << ")"
0457            << std::endl
0458            << "\t y = k = (" << std::fixed << std::setprecision(4) << y.X() << "," << std::fixed << std::setprecision(4)
0459            << y.Y() << "," << std::fixed << std::setprecision(4) << y.Z() << ")" << std::endl
0460            << "\t [Rec] = (" << std::fixed << std::setprecision(4) << yGlobal.x() << "," << std::fixed
0461            << std::setprecision(4) << yGlobal.y() << "," << std::fixed << std::setprecision(4) << yGlobal.z() << ")"
0462            << std::endl;
0463 
0464     // NumberingScheme
0465     NumberingOutput << rawid;
0466     if (fromDDD_ && printDDD_) {
0467       NumberingOutput << " " << detPos;
0468     }
0469     NumberingOutput << " " << std::fixed << std::setprecision(4) << roundIfNear0(module->translation().X(), tolerance_)
0470                     << " " << std::fixed << std::setprecision(4) << roundIfNear0(module->translation().Y(), tolerance_)
0471                     << " " << std::fixed << std::setprecision(4) << roundIfNear0(module->translation().Z(), tolerance_)
0472                     << " " << std::endl;
0473     //
0474   }
0475 
0476   // params
0477   // Pixel
0478   unsigned int chan_per_psi = 52 * 80;
0479   unsigned int psi_pxb = 16 * pxb_fullN + 8 * pxb_halfN;
0480   unsigned int chan_pxb = psi_pxb * chan_per_psi;
0481   unsigned int psi_pxf = 2 * pxf_1x2N + 5 * pxf_1x5N + 6 * pxf_2x3N + 8 * pxf_2x4N + 10 * pxf_2x5N;
0482   unsigned int chan_pxf = psi_pxf * chan_per_psi;
0483   // Strip
0484   unsigned int chan_per_apv = 128;
0485   unsigned int apv_tib = 6 * (tib_L12_rphiN + tib_L12_sterN) + 4 * tib_L34_rphiN;
0486   unsigned int chan_tib = apv_tib * chan_per_apv;
0487   unsigned int apv_tid = 6 * (tid_r1_rphiN + tid_r1_sterN) + 6 * (tid_r2_rphiN + tid_r2_sterN) + 4 * tid_r3_rphiN;
0488   unsigned int chan_tid = apv_tid * chan_per_apv;
0489   unsigned int apv_tob = 4 * (tob_L12_rphiN + tob_L12_sterN) + 4 * tob_L34_rphiN + 6 * tob_L56_rphiN;
0490   unsigned int chan_tob = apv_tob * chan_per_apv;
0491   unsigned int apv_tec = 6 * (tec_r1_rphiN + tec_r1_sterN) + 6 * (tec_r2_rphiN + tec_r2_sterN) + 4 * tec_r3_rphiN +
0492                          4 * tec_r4_rphiN + 6 * (tec_r5_rphiN + tec_r5_sterN) + 4 * tec_r6_rphiN + 4 * tec_r7_rphiN;
0493   unsigned int chan_tec = apv_tec * chan_per_apv;
0494   unsigned int psi_tot = psi_pxb + psi_pxf;
0495   unsigned int apv_tot = apv_tib + apv_tid + apv_tob + apv_tec;
0496   unsigned int chan_pixel = chan_pxb + chan_pxf;
0497   unsigned int chan_strip = chan_tib + chan_tid + chan_tob + chan_tec;
0498   unsigned int chan_tot = chan_pixel + chan_strip;
0499   //
0500 
0501   // summary
0502   Output << "---------------------" << std::endl;
0503   Output << " Counters " << std::endl;
0504   Output << "---------------------" << std::endl;
0505   Output << " PXB    = " << pxbN << std::endl;
0506   Output << "   Full = " << pxb_fullN << std::endl;
0507   Output << "   Half = " << pxb_halfN << std::endl;
0508   Output << "   Active Silicon Detectors" << std::endl;
0509   Output << "        PSI46s   = " << psi_pxb << std::endl;
0510   Output << "        channels = " << chan_pxb << std::endl;
0511   Output << " PXF    = " << pxfN << std::endl;
0512   Output << "   1x2 = " << pxf_1x2N << std::endl;
0513   Output << "   1x5 = " << pxf_1x5N << std::endl;
0514   Output << "   2x3 = " << pxf_2x3N << std::endl;
0515   Output << "   2x4 = " << pxf_2x4N << std::endl;
0516   Output << "   2x5 = " << pxf_2x5N << std::endl;
0517   Output << "   Active Silicon Detectors" << std::endl;
0518   Output << "        PSI46s   = " << psi_pxf << std::endl;
0519   Output << "        channels = " << chan_pxf << std::endl;
0520   Output << " TIB    = " << tibN << std::endl;
0521   Output << "   L12 rphi   = " << tib_L12_rphiN << std::endl;
0522   Output << "   L12 stereo = " << tib_L12_sterN << std::endl;
0523   Output << "   L34        = " << tib_L34_rphiN << std::endl;
0524   Output << "   Active Silicon Detectors" << std::endl;
0525   Output << "        APV25s   = " << apv_tib << std::endl;
0526   Output << "        channels = " << chan_tib << std::endl;
0527   Output << " TID    = " << tidN << std::endl;
0528   Output << "   r1 rphi    = " << tid_r1_rphiN << std::endl;
0529   Output << "   r1 stereo  = " << tid_r1_sterN << std::endl;
0530   Output << "   r2 rphi    = " << tid_r2_rphiN << std::endl;
0531   Output << "   r2 stereo  = " << tid_r2_sterN << std::endl;
0532   Output << "   r3 rphi    = " << tid_r3_rphiN << std::endl;
0533   Output << "   Active Silicon Detectors" << std::endl;
0534   Output << "        APV25s   = " << apv_tid << std::endl;
0535   Output << "        channels = " << chan_tid << std::endl;
0536   Output << " TOB    = " << tobN << std::endl;
0537   Output << "   L12 rphi   = " << tob_L12_rphiN << std::endl;
0538   Output << "   L12 stereo = " << tob_L12_sterN << std::endl;
0539   Output << "   L34        = " << tob_L34_rphiN << std::endl;
0540   Output << "   L56        = " << tob_L56_rphiN << std::endl;
0541   Output << "   Active Silicon Detectors" << std::endl;
0542   Output << "        APV25s   = " << apv_tob << std::endl;
0543   Output << "        channels = " << chan_tob << std::endl;
0544   Output << " TEC    = " << tecN << std::endl;
0545   Output << "   r1 rphi    = " << tec_r1_rphiN << std::endl;
0546   Output << "   r1 stereo  = " << tec_r1_sterN << std::endl;
0547   Output << "   r2 rphi    = " << tec_r2_rphiN << std::endl;
0548   Output << "   r2 stereo  = " << tec_r2_sterN << std::endl;
0549   Output << "   r3 rphi    = " << tec_r3_rphiN << std::endl;
0550   Output << "   r4 rphi    = " << tec_r4_rphiN << std::endl;
0551   Output << "   r5 rphi    = " << tec_r5_rphiN << std::endl;
0552   Output << "   r5 stereo  = " << tec_r5_sterN << std::endl;
0553   Output << "   r6 rphi    = " << tec_r6_rphiN << std::endl;
0554   Output << "   r7 rphi    = " << tec_r7_rphiN << std::endl;
0555   Output << "   Active Silicon Detectors" << std::endl;
0556   Output << "        APV25s   = " << apv_tec << std::endl;
0557   Output << "        channels = " << chan_tec << std::endl;
0558   Output << "---------------------" << std::endl;
0559   Output << "        PSI46s   = " << psi_tot << std::endl;
0560   Output << "        APV25s   = " << apv_tot << std::endl;
0561   Output << "        pixel channels = " << chan_pixel << std::endl;
0562   Output << "        strip channels = " << chan_strip << std::endl;
0563   Output << "        total channels = " << chan_tot << std::endl;
0564   //
0565 }
0566 
0567 //define this as a plug-in
0568 DEFINE_FWK_MODULE(ModuleInfo);