File indexing completed on 2024-06-04 04:35:08
0001 #ifndef middle_buffer_multififo_regionizer_ref_h
0002 #define middle_buffer_multififo_regionizer_ref_h
0003
0004 #include "L1Trigger/Phase2L1ParticleFlow/interface/regionizer/multififo_regionizer_ref.h"
0005 #include "L1Trigger/Phase2L1ParticleFlow/interface/dbgPrintf.h"
0006 #include <memory>
0007 #include <deque>
0008
0009 namespace l1ct {
0010 class MiddleBufferMultififoRegionizerEmulator : public RegionizerEmulator {
0011 public:
0012 MiddleBufferMultififoRegionizerEmulator(unsigned int nclocks,
0013 unsigned int nbuffers,
0014 unsigned int etabufferDepth,
0015 unsigned int ntklinks,
0016 unsigned int nHCalLinks,
0017 unsigned int nECalLinks,
0018 unsigned int ntk,
0019 unsigned int ncalo,
0020 unsigned int nem,
0021 unsigned int nmu,
0022 bool streaming,
0023 unsigned int outii,
0024 unsigned int pauseii,
0025 bool useAlsoVtxCoords);
0026
0027 MiddleBufferMultififoRegionizerEmulator(const edm::ParameterSet& iConfig);
0028
0029 ~MiddleBufferMultififoRegionizerEmulator() override;
0030
0031 static edm::ParameterSetDescription getParameterSetDescription();
0032
0033 void initSectorsAndRegions(const RegionizerDecodedInputs& in, const std::vector<PFInputRegion>& out) override;
0034
0035 void run(const RegionizerDecodedInputs& in, std::vector<PFInputRegion>& out) override;
0036
0037
0038 void fillLinks(unsigned int iclock,
0039 const RegionizerDecodedInputs& in,
0040 std::vector<l1ct::TkObjEmu>& links,
0041 std::vector<bool>& valid);
0042 void fillLinks(unsigned int iclock,
0043 const RegionizerDecodedInputs& in,
0044 std::vector<l1ct::HadCaloObjEmu>& links,
0045 std::vector<bool>& valid);
0046 void fillLinks(unsigned int iclock,
0047 const RegionizerDecodedInputs& in,
0048 std::vector<l1ct::EmCaloObjEmu>& links,
0049 std::vector<bool>& valid);
0050 void fillLinks(unsigned int iclock,
0051 const RegionizerDecodedInputs& in,
0052 std::vector<l1ct::MuObjEmu>& links,
0053 std::vector<bool>& valid);
0054 template <typename T>
0055 void fillLinks(unsigned int iclock, const RegionizerDecodedInputs& in, std::vector<T>& links) {
0056 std::vector<bool> unused;
0057 fillLinks(iclock, in, links, unused);
0058 }
0059
0060 void destream(int iclock,
0061 const std::vector<l1ct::TkObjEmu>& tk_out,
0062 const std::vector<l1ct::EmCaloObjEmu>& em_out,
0063 const std::vector<l1ct::HadCaloObjEmu>& calo_out,
0064 const std::vector<l1ct::MuObjEmu>& mu_out,
0065 PFInputRegion& out);
0066
0067
0068 bool step(bool newEvent,
0069 const std::vector<l1ct::TkObjEmu>& links_tk,
0070 const std::vector<l1ct::HadCaloObjEmu>& links_hadCalo,
0071 const std::vector<l1ct::EmCaloObjEmu>& links_emCalo,
0072 const std::vector<l1ct::MuObjEmu>& links_mu,
0073 std::vector<l1ct::TkObjEmu>& out_tk,
0074 std::vector<l1ct::HadCaloObjEmu>& out_hadCalo,
0075 std::vector<l1ct::EmCaloObjEmu>& out_emCalo,
0076 std::vector<l1ct::MuObjEmu>& out_mu,
0077 bool );
0078
0079 template <typename TEmu, typename TFw>
0080 void toFirmware(const std::vector<TEmu>& emu, TFw fw[]) {
0081 for (unsigned int i = 0, n = emu.size(); i < n; ++i) {
0082 fw[i] = emu[i];
0083 }
0084 }
0085
0086 void reset();
0087
0088 static void encode(const l1ct::EmCaloObjEmu& from, l1ct::HadCaloObjEmu& to);
0089 static void encode(const l1ct::HadCaloObjEmu& from, l1ct::HadCaloObjEmu& to);
0090 static void decode(l1ct::HadCaloObjEmu& had, l1ct::EmCaloObjEmu& em);
0091
0092 protected:
0093 const unsigned int NTK_SECTORS, NCALO_SECTORS;
0094 const unsigned int NTK_LINKS, HCAL_LINKS, ECAL_LINKS, NMU_LINKS;
0095 unsigned int nclocks_, nbuffers_, etabuffer_depth_, ntk_, ncalo_, nem_, nmu_, outii_, pauseii_, nregions_pre_,
0096 nregions_post_;
0097 bool streaming_;
0098 bool init_;
0099 unsigned int iclock_;
0100 std::vector<l1ct::PFRegionEmu> mergedRegions_, outputRegions_;
0101 multififo_regionizer::Regionizer<l1ct::TkObjEmu> tkRegionizerPre_, tkRegionizerPost_;
0102 multififo_regionizer::Regionizer<l1ct::HadCaloObjEmu> hadCaloRegionizerPre_, hadCaloRegionizerPost_;
0103 multififo_regionizer::Regionizer<l1ct::EmCaloObjEmu> emCaloRegionizerPre_, emCaloRegionizerPost_;
0104 multififo_regionizer::Regionizer<l1ct::MuObjEmu> muRegionizerPre_, muRegionizerPost_;
0105 std::vector<l1ct::multififo_regionizer::Route> tkRoutes_, caloRoutes_, emCaloRoutes_, muRoutes_;
0106 std::vector<l1ct::multififo_regionizer::EtaPhiBuffer<l1ct::TkObjEmu>> tkBuffers_;
0107 std::vector<l1ct::multififo_regionizer::EtaPhiBuffer<l1ct::HadCaloObjEmu>> hadCaloBuffers_;
0108 std::vector<l1ct::multififo_regionizer::EtaPhiBuffer<l1ct::EmCaloObjEmu>> emCaloBuffers_;
0109 std::vector<l1ct::multififo_regionizer::EtaPhiBuffer<l1ct::MuObjEmu>> muBuffers_;
0110
0111 template <typename T>
0112 void fillCaloLinks_(unsigned int iclock,
0113 const std::vector<DetectorSector<T>>& in,
0114 std::vector<T>& links,
0115 std::vector<bool>& valid);
0116
0117 void fillSharedCaloLinks(unsigned int iclock,
0118 const std::vector<DetectorSector<l1ct::EmCaloObjEmu>>& em_in,
0119 const std::vector<DetectorSector<l1ct::HadCaloObjEmu>>& had_in,
0120 std::vector<l1ct::HadCaloObjEmu>& links,
0121 std::vector<bool>& valid);
0122 };
0123 }
0124
0125 #endif