File indexing completed on 2024-04-06 12:21:20
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #include <iostream>
0014 #include <iomanip>
0015 #include <iterator>
0016
0017 #include "L1Trigger/L1TTwinMux/interface/L1TTwinMuxAlgorithm.h"
0018 #include "Geometry/RPCGeometry/interface/RPCRoll.h"
0019 #include "Geometry/RPCGeometry/interface/RPCGeometry.h"
0020 #include "CondFormats/DataRecord/interface/RPCEMapRcd.h"
0021 #include "Geometry/Records/interface/MuonGeometryRecord.h"
0022 #include "L1Trigger/L1TTwinMux/interface/AlignTrackSegments.h"
0023 #include "L1Trigger/L1TTwinMux/interface/RPCtoDTTranslator.h"
0024 #include "L1Trigger/L1TTwinMux/interface/DTRPCBxCorrection.h"
0025 #include "L1Trigger/L1TTwinMux/interface/DTLowQMatching.h"
0026 #include "L1Trigger/L1TTwinMux/interface/RPCHitCleaner.h"
0027 #include "L1Trigger/L1TTwinMux/interface/IOPrinter.h"
0028 #include "L1Trigger/L1TTwinMux/interface/L1MuTMChambPhContainer.h"
0029
0030 using namespace std;
0031
0032 void L1TTwinMuxAlgorithm::run(edm::Handle<L1MuDTChambPhContainer> inphiDigis,
0033 edm::Handle<L1MuDTChambThContainer> thetaDigis,
0034 edm::Handle<RPCDigiCollection> rpcDigis,
0035 const L1TTwinMuxParams& tmParams,
0036 const RPCGeometry& rpcGeometry) {
0037
0038 bool onlyRPC = tmParams.get_UseOnlyRPC();
0039 bool onlyDT = tmParams.get_UseOnlyDT();
0040 bool useLowQDT = tmParams.get_UseLowQDT();
0041 bool correctBX = tmParams.get_CorrectDTBxwRPC();
0042 bool verbose = tmParams.get_Verbose();
0043
0044
0045 AlignTrackSegments alignedDTs{*inphiDigis};
0046 alignedDTs.run();
0047 L1MuDTChambPhContainer const& phiDigis = alignedDTs.getDTContainer();
0048
0049
0050 if (onlyDT && !correctBX && !useLowQDT) {
0051 m_tm_phi_output = phiDigis;
0052 return;
0053 }
0054
0055 RPCHitCleaner rpcHitCl{*rpcDigis};
0056 rpcHitCl.run();
0057 RPCDigiCollection const& rpcDigisCleaned = rpcHitCl.getRPCCollection();
0058
0059
0060 RPCtoDTTranslator dt_from_rpc{rpcDigisCleaned};
0061 dt_from_rpc.run(rpcGeometry);
0062 L1MuDTChambPhContainer const& rpcPhiDigis =
0063 dt_from_rpc.getDTContainer();
0064 L1MuDTChambPhContainer const& rpcHitsPhiDigis =
0065 dt_from_rpc.getDTRPCHitsContainer();
0066
0067
0068 DTLowQMatching dtlowq{&phiDigis, rpcHitsPhiDigis};
0069 dtlowq.run(tmParams);
0070
0071 if (onlyDT && !correctBX && useLowQDT) {
0072 m_tm_phi_output = phiDigis;
0073 if (verbose) {
0074 IOPrinter ioPrinter;
0075 cout << "======DT========" << endl;
0076 ioPrinter.run(inphiDigis, m_tm_phi_output, rpcDigis, rpcGeometry);
0077 cout << "======RPC========" << endl;
0078 ioPrinter.run(&rpcHitsPhiDigis, m_tm_phi_output, &rpcDigisCleaned, rpcGeometry);
0079 cout << "+++++++++++++++++++++++++++++++++++++++++++++++++" << endl;
0080 }
0081
0082 return;
0083 }
0084
0085
0086
0087 DTRPCBxCorrection rpc_dt_bx{phiDigis, rpcHitsPhiDigis};
0088 rpc_dt_bx.run(tmParams);
0089
0090 L1MuDTChambPhContainer const& phiDigiscp = rpc_dt_bx.getDTContainer();
0091
0092
0093 std::vector<L1MuDTChambPhDigi> l1ttma_out;
0094
0095 int bx = 0, wheel = 0, sector = 0, station = 1;
0096
0097 for (bx = -3; bx <= 3; bx++) {
0098 for (wheel = -2; wheel <= 2; wheel++) {
0099 for (sector = 0; sector < 12; sector++) {
0100 for (station = 1; station <= 4; station++) {
0101 L1MuDTChambPhDigi const* dtts1 = phiDigiscp.chPhiSegm1(wheel, station, sector, bx);
0102 L1MuDTChambPhDigi const* dtts2 = phiDigiscp.chPhiSegm2(wheel, station, sector, bx);
0103 L1MuDTChambPhDigi const* rpcts1 = rpcPhiDigis.chPhiSegm1(wheel, station, sector, bx);
0104
0105 if (!onlyRPC) {
0106 if (!dtts1 && !dtts2 && !rpcts1)
0107 continue;
0108 if (dtts1 && dtts1->code() != 7) {
0109 l1ttma_out.push_back(*dtts1);
0110 }
0111 if (dtts2 && dtts2->code() != 7) {
0112 l1ttma_out.push_back(*dtts2);
0113 }
0114 if (!onlyDT) {
0115 if (!dtts1 && !dtts2 && rpcts1 && station <= 2) {
0116 l1ttma_out.emplace_back(rpcts1->bxNum(),
0117 rpcts1->whNum(),
0118 rpcts1->scNum(),
0119 rpcts1->stNum(),
0120 rpcts1->phi(),
0121 rpcts1->phiB(),
0122 rpcts1->code(),
0123 rpcts1->Ts2Tag(),
0124 rpcts1->BxCnt(),
0125 2);
0126 }
0127 }
0128 }
0129
0130 else if (onlyRPC) {
0131 if (rpcts1 && station <= 2) {
0132 l1ttma_out.emplace_back(rpcts1->bxNum(),
0133 rpcts1->whNum(),
0134 rpcts1->scNum(),
0135 rpcts1->stNum(),
0136 rpcts1->phi(),
0137 rpcts1->phiB(),
0138 rpcts1->code(),
0139 rpcts1->Ts2Tag(),
0140 rpcts1->BxCnt(),
0141 2);
0142 }
0143 }
0144 }
0145 }
0146 }
0147 }
0148
0149 m_tm_phi_output.setContainer(l1ttma_out);
0150
0151 if (verbose) {
0152 IOPrinter ioPrinter;
0153 cout << "======DT========" << endl;
0154 ioPrinter.run(inphiDigis, m_tm_phi_output, rpcDigis, rpcGeometry);
0155 cout << "======RPC========" << endl;
0156 ioPrinter.run(&rpcHitsPhiDigis, m_tm_phi_output, &rpcDigisCleaned, rpcGeometry);
0157 cout << "+++++++++++++++++++++++++++++++++++++++++++++++++" << endl;
0158 }
0159 }