File indexing completed on 2024-04-06 12:21:26
0001 #ifndef L1TRIGGER_PHASE2L1PARTICLEFLOW_FOLDED_MULTIFIFO_REGIONIZER_REF_H
0002 #define L1TRIGGER_PHASE2L1PARTICLEFLOW_FOLDED_MULTIFIFO_REGIONIZER_REF_H
0003
0004 #include "L1Trigger/Phase2L1ParticleFlow/interface/regionizer/multififo_regionizer_ref.h"
0005 #include <memory>
0006
0007 namespace l1ct {
0008 struct EGInputSelectorEmuConfig;
0009 }
0010
0011 namespace l1ct {
0012 class FoldedMultififoRegionizerEmulator : public RegionizerEmulator {
0013 public:
0014 enum class FoldMode { EndcapEta2 };
0015
0016 FoldedMultififoRegionizerEmulator(unsigned int nclocks,
0017 unsigned int ntklinks,
0018 unsigned int ncalolinks,
0019 unsigned int ntk,
0020 unsigned int ncalo,
0021 unsigned int nem,
0022 unsigned int nmu,
0023 bool streaming,
0024 unsigned int outii,
0025 unsigned int pauseii,
0026 bool useAlsoVtxCoords);
0027
0028 ~FoldedMultififoRegionizerEmulator() override;
0029
0030 void setEgInterceptMode(bool afterFifo, const l1ct::EGInputSelectorEmuConfig& interceptorConfig);
0031 void initSectorsAndRegions(const RegionizerDecodedInputs& in, const std::vector<PFInputRegion>& out) override;
0032
0033 void run(const RegionizerDecodedInputs& in, std::vector<PFInputRegion>& out) override;
0034
0035
0036 bool step(bool newEvent,
0037 const std::vector<l1ct::TkObjEmu>& links_tk,
0038 const std::vector<l1ct::HadCaloObjEmu>& links_hadCalo,
0039 const std::vector<l1ct::EmCaloObjEmu>& links_emCalo,
0040 const std::vector<l1ct::MuObjEmu>& links_mu,
0041 std::vector<l1ct::TkObjEmu>& out_tk,
0042 std::vector<l1ct::HadCaloObjEmu>& out_hadCalo,
0043 std::vector<l1ct::EmCaloObjEmu>& out_emCalo,
0044 std::vector<l1ct::MuObjEmu>& out_mu,
0045 bool mux = true);
0046
0047
0048 void fillEvent(const RegionizerDecodedInputs& in);
0049
0050 template <typename T>
0051 void fillLinks(unsigned int iclock, std::vector<T>& links, std::vector<bool>& valid) {
0052 Fold& fold = fold_[whichFold(iclock)];
0053 fold.regionizer->fillLinks(iclock % clocksPerFold_, fold.sectors, links, valid);
0054 }
0055
0056
0057 template <typename TEmu, typename TFw>
0058 void toFirmware(const std::vector<TEmu>& emu, TFw fw[]) {
0059 fold_.front().regionizer->toFirmware(emu, fw);
0060 }
0061
0062 protected:
0063 const unsigned int NTK_SECTORS, NCALO_SECTORS;
0064 const unsigned int NTK_LINKS, NCALO_LINKS, HCAL_LINKS, ECAL_LINKS, NMU_LINKS;
0065 unsigned int nclocks_, ntk_, ncalo_, nem_, nmu_, outii_, pauseii_, nregions_;
0066 bool streaming_;
0067 FoldMode foldMode_;
0068 bool init_;
0069 struct Fold {
0070 unsigned int index;
0071 std::unique_ptr<l1ct::MultififoRegionizerEmulator> regionizer;
0072 RegionizerDecodedInputs sectors;
0073 std::vector<PFInputRegion> regions;
0074 Fold(unsigned int i, std::unique_ptr<l1ct::MultififoRegionizerEmulator>&& ptr)
0075 : index(i), regionizer(std::move(ptr)) {}
0076 };
0077 std::vector<Fold> fold_;
0078 unsigned int clocksPerFold_;
0079 unsigned int iclock_;
0080
0081 unsigned int whichFold(const l1ct::PFRegion& reg);
0082 unsigned int whichFold(unsigned int iclock) { return (iclock % nclocks_) / clocksPerFold_; }
0083 bool inFold(const l1ct::PFRegion& reg, const Fold& fold);
0084 void splitSectors(const RegionizerDecodedInputs& in);
0085 void splitRegions(const std::vector<PFInputRegion>& out);
0086 };
0087 }
0088
0089 #endif