Back to home page

Project CMSSW displayed by LXR

 
 

    


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 }  // namespace l1ct
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     // clock-cycle emulation
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     // link emulation from decoded inputs (for simulation)
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     // convert links to firmware
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 }  // namespace l1ct
0088 
0089 #endif