diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXJwoJAlgo.h b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXJwoJAlgo.h new file mode 100644 index 0000000000000000000000000000000000000000..b520dafc181e59261c2c174739d5234671eca7af --- /dev/null +++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXJwoJAlgo.h @@ -0,0 +1,81 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +*/ +//*************************************************************************** +// gFEXJwoJAlgo - Jets without jets algorithm for gFEX +// ------------------- +// begin : 10 08 2021 +// email : cecilia.tosciri@cern.ch +//*************************************************************************** + +#ifndef gFEXJwoJAlgo_H +#define gFEXJwoJAlgo_H + +#include "AthenaBaseComps/AthAlgTool.h" +#include "L1CaloFEXToolInterfaces/IgFEXJwoJAlgo.h" +#include "AthenaKernel/CLASS_DEF.h" +#include "L1CaloFEXSim/gFEXJwoJTOB.h" +#include "L1CaloFEXSim/gTowerContainer.h" + +#include "AthenaBaseComps/AthAlgorithm.h" +#include "StoreGate/StoreGateSvc.h" +#include "L1CaloFEXSim/FEXAlgoSpaceDefs.h" + + + +namespace LVL1 { + + class gFEXJwoJAlgo : public AthAlgTool, virtual public IgFEXJwoJAlgo { + + public: + /** Constructors */ + gFEXJwoJAlgo(const std::string& type, const std::string& name, const IInterface* parent); + + /** standard Athena-Algorithm method */ + virtual StatusCode initialize() override; + + + virtual void setAlgoConstant(unsigned int aFPGA_A, unsigned int bFPGA_A, + unsigned int aFPGA_B, unsigned int bFPGA_B, + int gblockThreshold) override; + + virtual std::vector<std::unique_ptr<gFEXJwoJTOB>> jwojAlgo(gTowersCentral Atwr, gTowersCentral Btwr, + std::array<uint32_t, 4> & outTOB) override; + + + + private: + + unsigned int m_aFPGA_A; + unsigned int m_bFPGA_A; + unsigned int m_aFPGA_B; + unsigned int m_bFPGA_B; + int m_gBlockthreshold; + + + virtual void gBlockAB(gTowersCentral twrs, gTowersCentral & gBlkSum); + + virtual void metFPGA(gTowersCentral twrs, gTowersCentral & gBlkSum, + unsigned short & MHT_x, unsigned short & MHT_y, + unsigned short & MST_x, unsigned short & MST_y, + unsigned short & MET_x, unsigned short & MET_y); + + virtual void metTotal(unsigned short A_MET_x, unsigned short A_MET_y, + unsigned short B_MET_x, unsigned short B_MET_y, + unsigned short & MET_x, unsigned short & MET_y, unsigned short & MET); + + virtual void sumEtFPGA(gTowersCentral twrs, unsigned int & partial_sumEt); + + virtual void sumEt(unsigned int A_sumEt, unsigned int B_sumEt, unsigned int & total_sumEt); + + virtual unsigned short sinLUT(unsigned int phiIDX, unsigned int aw, unsigned int dw); + + virtual unsigned short cosLUT(unsigned int phiIDX, unsigned int aw, unsigned int dw); + + + }; + +} // end of namespace + + +#endif diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXJwoJTOB.h b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXJwoJTOB.h new file mode 100644 index 0000000000000000000000000000000000000000..f61e3cdcd50f4ca41655c37baf87c83bf148fbc5 --- /dev/null +++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXJwoJTOB.h @@ -0,0 +1,55 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +*/ +//*************************************************************************** +// gFEXJwoJTOB - Forms the JwoJ TOBs for gFEX +// ------------------- +// begin : 10 08 2021 +// email : cecilia.tosciri@cern.ch +//*************************************************************************** + +#pragma once +#include "AthenaKernel/CLASS_DEF.h" + +namespace LVL1 { + class gFEXJwoJTOB + { + //gFEXJwoJTOB class description below: + /** The gFEXJwoJTOB.h class stores the energy, the eta, phi coordinate, + * the status and the type (gRho, gBlock, gJwoJ) of the gFEX JwoJ TOBs + */ + private: + uint32_t m_word; + unsigned int m_quantity1; + unsigned int m_quantity2; + unsigned int m_st1; + unsigned int m_st2; + unsigned int m_satur; + unsigned int m_tobID; + + + public: + gFEXJwoJTOB(); + ~gFEXJwoJTOB() {}; + + inline uint32_t getWord() const {return m_word;} + inline unsigned int getQuantity1() const {return m_quantity1;} + inline unsigned int getQuantity2() const {return m_quantity2;} + inline unsigned int getStatus1() const {return m_st1;} + inline unsigned int getStatus2() const {return m_st2;} + inline unsigned int getSaturation() const {return m_satur;} + inline unsigned int getTobID() const {return m_tobID;} + + + void setWord(uint32_t); + void setQuantity1(unsigned int); + void setQuantity2(unsigned int); + void setStatus1(unsigned int); + void setStatus2(unsigned int); + void setSaturation(unsigned int); + void setTobID(unsigned int); + }; + +} // end of namespace + +CLASS_DEF( LVL1::gFEXJwoJTOB, 2352924 , 1 ) diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXNtupleWriter.h b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXNtupleWriter.h index 028a7319277eddaa86c457aac38563e1446924dc..9d24e718222c993bc133286cea98576b0d1fb11f 100644 --- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXNtupleWriter.h +++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXNtupleWriter.h @@ -31,11 +31,13 @@ public: private: gFEXOutputCollection* m_gFEXOutputCollection; float m_jet_nTOBs; + float m_global_nTOBs; bool m_load_truth_jet; std::vector<float> m_truth_jet_eta; std::vector<float> m_truth_jet_phi; std::vector<float> m_truth_jet_ET; + std::vector<float> m_jet_TOB; std::vector<float> m_jet_TOB_Eta; std::vector<float> m_jet_TOB_Phi; @@ -43,10 +45,20 @@ private: std::vector<float> m_jet_TOB_ID; std::vector<float> m_jet_TOB_Status; + + std::vector<float> m_global_TOB; + std::vector<float> m_global_TOB_Quantity1; + std::vector<float> m_global_TOB_Quantity2; + std::vector<float> m_global_TOB_Saturation; + std::vector<float> m_global_TOB_ID; + std::vector<float> m_global_TOB_Status1; + std::vector<float> m_global_TOB_Status2; + std::string m_jet_container_name = "AntiKt10TruthJets"; TTree *m_myTree; StatusCode loadJetAlgoVariables(); + StatusCode loadGlobalAlgoVariables(); StatusCode loadTruthElectron(); StatusCode loadTruthJets(); diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXOutputCollection.h b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXOutputCollection.h index d794848d943f19e4dce471e432052d761066e264..77f0d7815a0d6cbce81f713676e1e5174a037cdc 100644 --- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXOutputCollection.h +++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXOutputCollection.h @@ -31,7 +31,8 @@ namespace LVL1 { ~gFEXOutputCollection(); - void clear(); + void clearJets(); + void clearGlobals(); /** * @brief add a value related to the jet finder algorithm for a TOB @@ -41,29 +42,38 @@ namespace LVL1 { * */ void addValueJet(std::string key, float value); + void addValueGlobal(std::string key, float value); //Save all jet values. Use only after finishing defining all jet values for one TOB. void fillJet(); + void fillGlobal(); //Get total number of TOBs saved - int size(); + int jetsSize(); + int globalsSize(); - //Get all jeta related values the ith TOB + //Get all jets related values std::unordered_map<std::string, float> getJet(int) const; + std::unordered_map<std::string, float> getGlobal(int) const; //Add a 32-bit jet TOB word void addJetTob(uint32_t); + void addGlobalTob(uint32_t); //Get all jet TOB words of an event std::vector<uint32_t> getJetTob() const; + std::vector<uint32_t> getGlobalTob() const; private: //vector of TOB words std::vector<uint32_t> m_jettob; + std::vector<uint32_t> m_globaltob; // /// jet related values of a TOB std::unordered_map<std::string, float> m_values_gFEXJet; + std::unordered_map<std::string, float> m_values_gFEXGlobal; /// jet related values of all TOBs in an event std::vector<std::unordered_map<std::string, float>> m_allvalues_gFEXjet; + std::vector<std::unordered_map<std::string, float>> m_allvalues_gFEXglobal; }; } diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXSim.h b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXSim.h index abf5683b0a20f40e578fde1e0283490a85bff51b..8822ebb4698a8128fee3a7683ebd471ec2bfe4c9 100644 --- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXSim.h +++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXSim.h @@ -17,6 +17,8 @@ #include "L1CaloFEXSim/gFEXFPGA.h" #include "L1CaloFEXSim/gFEXJetAlgo.h" #include "L1CaloFEXSim/gFEXJetTOB.h" +#include "L1CaloFEXSim/gFEXJwoJAlgo.h" +#include "L1CaloFEXSim/gFEXJwoJTOB.h" #include "L1CaloFEXSim/gFEXOutputCollection.h" @@ -39,14 +41,10 @@ namespace LVL1 { /** Destructor */ virtual ~gFEXSim(); - //virtual void init (int id) override ; - virtual void reset () override ; virtual void execute() override ; - //virtual int ID() override {return m_id;} - virtual StatusCode executegFEXSim(gTowersIDs tmp) override; virtual std::vector<uint32_t> getgRhoTOBs() const override; @@ -55,6 +53,8 @@ namespace LVL1 { virtual std::vector<uint32_t> getgJetTOBs() const override; + virtual std::vector<uint32_t> getgGlobalTOBs() const override; + /** Internal data */ private: @@ -68,15 +68,15 @@ namespace LVL1 { std::vector<uint32_t> m_gJetTobWords; - // std::array<uint32_t> m_gRhoTobWords; + std::vector<uint32_t> m_gGlobalTobWords; - // std::array<uint32_t> m_gBlockTobWords; - // std::array<uint32_t> m_gJetTobWords; ToolHandle<IgFEXFPGA> m_gFEXFPGA_Tool {this, "gFEXFPGATool", "LVL1::gFEXFPGA", "Tool that simulates the FPGA hardware"}; ToolHandle<IgFEXJetAlgo> m_gFEXJetAlgoTool {this, "gFEXJetAlgoTool", "LVL1::gFEXJetAlgo", "Tool that runs the gFEX jet algorithm"}; + + ToolHandle<IgFEXJwoJAlgo> m_gFEXJwoJAlgoTool {this, "gFEXJwoJAlgoTool", "LVL1::gFEXJwoJAlgo", "Tool that runs the gFEX Jets without Jets algorithm"}; }; } // end of namespace diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXSysSim.h b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXSysSim.h index 8a10da2b01413e63bf32a1317441f83eab2b1bf4..4be59907783a4a4523c0d374c85bd1dbc675f32c 100644 --- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXSysSim.h +++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/L1CaloFEXSim/gFEXSysSim.h @@ -20,6 +20,10 @@ #include "xAODTrigger/gFexJetRoIContainer.h" #include "xAODTrigger/gFexJetRoIAuxContainer.h" +#include "xAODTrigger/gFexGlobalRoI.h" +#include "xAODTrigger/gFexGlobalRoIContainer.h" +#include "xAODTrigger/gFexGlobalRoIAuxContainer.h" + namespace LVL1 { //Doxygen class description below: @@ -56,6 +60,8 @@ namespace LVL1 { virtual StatusCode fillgJetEDM(uint32_t tobWord) override ; + virtual StatusCode fillgGlobalEDM(uint32_t tobWord) override ; + /** Internal data */ private: std::unique_ptr< xAOD::gFexJetRoIContainer > m_gRhoContainer; @@ -67,6 +73,10 @@ namespace LVL1 { std::unique_ptr< xAOD::gFexJetRoIContainer > m_gJetContainer; std::unique_ptr< xAOD::gFexJetRoIAuxContainer > m_gJetAuxContainer; + std::unique_ptr< xAOD::gFexGlobalRoIContainer > m_gGlobalContainer; + std::unique_ptr< xAOD::gFexGlobalRoIAuxContainer > m_gGlobalAuxContainer; + + std::vector<gFEXSim*> m_gFEXCollection; ToolHandle<IgFEXSim> m_gFEXSimTool {this, "gFEXSimTool", "LVL1::gFEXSim", "Tool that creates the gFEX Simulation"}; @@ -75,10 +85,12 @@ namespace LVL1 { SG::ReadHandleKey<CaloCellContainer> m_scellsCollectionSGKey {this, "SCell", "SCell", "SCell"}; SG::WriteHandleKey< xAOD::gFexJetRoIContainer > m_gFexJetOutKey {this,"Key_gFexJetOutputContainer","L1_gJetRoI","Output gFexJet container"}; + SG::WriteHandleKey< xAOD::gFexGlobalRoIContainer > m_gFexGlobalOutKey {this,"Key_gFexGlobalOutputContainer","L1_gJetRoI","Output gFexGlobal container"}; std::vector<uint32_t> m_allgRhoTobs; std::vector<uint32_t> m_allgBlockTobs; std::vector<uint32_t> m_allgJetTobs; + std::vector<uint32_t> m_allgGlobalTobs; }; diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/share/gFEXDriverJobOptions.py b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/share/gFEXDriverJobOptions.py index 931b4c1b05301cae687cb8af65bf1f2c7a84bca1..36ac564ea3be0e4694910c447316ea8b4145cdc9 100644 --- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/share/gFEXDriverJobOptions.py +++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/share/gFEXDriverJobOptions.py @@ -40,6 +40,5 @@ svcMgr.THistSvc.Output += ["ANALYSIS DATAFILE='myfile.root' OPT='RECREATE'"] log.info("==========================================================") log.info("Scheduling gFEXDriver") athAlgSeq += CfgMgr.LVL1__gFEXDriver('MygFEXDriver') -#athAlgSeq += CfgMgr.LVL1__gFEXNtupleWriter('MygFEXNtupleWriter') log.info("==========================================================") ####################################################### diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/components/FEXDriver_entries.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/components/FEXDriver_entries.cxx index c94b2ccb0b9e3fbcce5bc8e238e92690a9f45135..2d053fcc4c039bab6cda775be12ac980fd071ab7 100644 --- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/components/FEXDriver_entries.cxx +++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/components/FEXDriver_entries.cxx @@ -32,6 +32,7 @@ #include "L1CaloFEXSim/gFEXSim.h" #include "L1CaloFEXSim/gFEXFPGA.h" #include "L1CaloFEXSim/gFEXJetAlgo.h" +#include "L1CaloFEXSim/gFEXJwoJAlgo.h" #include "L1CaloFEXSim/gFEXNtupleWriter.h" @@ -75,5 +76,6 @@ DECLARE_COMPONENT(gTowerBuilder) DECLARE_COMPONENT(gSuperCellTowerMapper) DECLARE_COMPONENT(gFEXFPGA) DECLARE_COMPONENT(gFEXJetAlgo) +DECLARE_COMPONENT(gFEXJwoJAlgo) DECLARE_COMPONENT(gFEXNtupleWriter) diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXDriver.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXDriver.cxx index e0e745ebcad67751ecd7bae3a5624604541f615f..6a6d1cdb1f6337d0845693d2565b5ef2e99fec63 100644 --- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXDriver.cxx +++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXDriver.cxx @@ -11,6 +11,7 @@ #include "L1CaloFEXSim/gFEXSim.h" #include "L1CaloFEXSim/gFEXOutputCollection.h" #include "L1CaloFEXSim/gFEXJetTOB.h" +#include "L1CaloFEXSim/gFEXJwoJTOB.h" #include "StoreGate/WriteHandle.h" #include "StoreGate/ReadHandle.h" @@ -83,7 +84,7 @@ StatusCode gFEXDriver::initialize() //STEP 1 - Do some monitoring gFEXOutputCollection* my_gFEXOutputCollection = new gFEXOutputCollection(); ATH_CHECK( evtStore()->record(my_gFEXOutputCollection,"gFEXOutputCollection") ); - + // SG::WriteHandle<LVL1::gFEXOutputCollection> gFEXOutputCollectionSG(m_gFEXOutputCollectionSGKey); // ATH_CHECK(gFEXOutputCollectionSG.record(std::move(my_gFEXOutputCollection))); diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXJwoJAlgo.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXJwoJAlgo.cxx new file mode 100644 index 0000000000000000000000000000000000000000..6a2d1baea8fc410dc02a0dea156c34f1ec8197ea --- /dev/null +++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXJwoJAlgo.cxx @@ -0,0 +1,312 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +*/ +//*************************************************************************** +// gFEXJwoJAlg - Jets without jets algorithm for gFEX +// ------------------- +// begin : 10 08 2021 +// email : cecilia.tosciri@cern.ch +//*************************************************************************** + +#define _USE_MATH_DEFINES +#include <cmath> +#include <vector> + +#include "L1CaloFEXSim/gFEXJwoJAlgo.h" +#include "L1CaloFEXSim/gFEXJwoJTOB.h" +#include "L1CaloFEXSim/gTowerContainer.h" +#include "L1CaloFEXSim/gTower.h" + +namespace LVL1 { + + // default constructor for persistency +gFEXJwoJAlgo::gFEXJwoJAlgo(const std::string& type, const std::string& name, const IInterface* parent): + AthAlgTool(type, name, parent) + { + declareInterface<IgFEXJwoJAlgo>(this); + } + + +StatusCode gFEXJwoJAlgo::initialize(){ + + return StatusCode::SUCCESS; + +} + + +void gFEXJwoJAlgo::setAlgoConstant(unsigned int aFPGA_A, unsigned int bFPGA_A, + unsigned int aFPGA_B, unsigned int bFPGA_B, + int gblockThreshold) { + m_aFPGA_A = aFPGA_A; + m_bFPGA_A = bFPGA_A; + m_aFPGA_B = aFPGA_B; + m_bFPGA_B = bFPGA_B; + m_gBlockthreshold = gblockThreshold; +} + + + +std::vector<std::unique_ptr<gFEXJwoJTOB>> gFEXJwoJAlgo::jwojAlgo(gTowersCentral Atwr, gTowersCentral Btwr, + std::array<uint32_t, 4> & outTOB) { + + + // find gBlocks + gTowersCentral gBLKA; + gBlockAB(Atwr, gBLKA); + + + gTowersCentral gBLKB; + gBlockAB(Btwr, gBLKB); + + //FPGA A observables + unsigned short A_MHT_x = 0x0; + unsigned short A_MHT_y = 0x0; + unsigned short A_MST_x = 0x0; + unsigned short A_MST_y = 0x0; + unsigned short A_MET_x = 0x0; + unsigned short A_MET_y = 0x0; + + unsigned int A_sumEt = 0x0; + + //FPGA B observables + unsigned short B_MHT_x = 0x0; + unsigned short B_MHT_y = 0x0; + unsigned short B_MST_x = 0x0; + unsigned short B_MST_y = 0x0; + unsigned short B_MET_x = 0x0; + unsigned short B_MET_y = 0x0; + + unsigned int B_sumEt = 0x0; + + //Global observables + unsigned short MET_x = 0x0; + unsigned short MET_y = 0x0; + unsigned short MET = 0x0; + + unsigned int total_sumEt = 0x0; + unsigned int MHT_x = 0x0; + unsigned int MHT_y = 0x0; + unsigned int MST_x = 0x0; + unsigned int MST_y = 0x0; + + + metFPGA(Atwr, gBLKA, A_MHT_x, A_MHT_y, A_MST_x, A_MST_y, A_MET_x, A_MET_y); + metFPGA(Btwr, gBLKB, B_MHT_x, B_MHT_y, B_MST_x, B_MST_y, B_MET_x, B_MET_y); + + metTotal(A_MET_x, A_MET_y, B_MET_x, B_MET_y, MET_x, MET_y, MET); + + sumEtFPGA(Atwr, A_sumEt); + sumEtFPGA(Btwr, B_sumEt); + + sumEt(A_sumEt, B_sumEt, total_sumEt); + sumEt(A_MHT_x, B_MHT_x, MHT_x); + sumEt(A_MHT_y, B_MHT_y, MHT_y); + sumEt(A_MST_x, B_MST_x, MST_x); + sumEt(A_MST_y, B_MST_y, MST_y); + + //Define a vector to be filled with all the TOBs of one event + std::vector<std::unique_ptr<gFEXJwoJTOB>> tobs_v; + tobs_v.resize(4); + + + // fill in TOBs + // The order of the TOBs is given according to the TOB ID (TODO: check how it's done in fw) + + // First TOB is (MET, SumEt) + outTOB[0] = total_sumEt; //set the Quantity2 to the corresponding slot (LSB) + outTOB[0] = outTOB[0] | (MET & 0x00000FFF) << 12;//Quantity 1 (in bit number 12) + if (total_sumEt != 0) outTOB[0] = outTOB[0] | 0x00000001 << 24;//Status bit for Quantity 2 (0 if quantity is null) + if (MET != 0) outTOB[0] = outTOB[0] | 0x00000001 << 25;//Status bit for Quantity 1 (0 if quantity is null) + outTOB[0] = outTOB[0] | (1 & 0x0000001F) << 26;//TOB ID is 1 for scalar values (5 bits starting at 26) + +// Second TOB is (MET_x, MET_y) + outTOB[1] = MET_y; //set the Quantity2 to the corresponding slot (LSB) + outTOB[1] = outTOB[1] | (MET_x & 0x00000FFF) << 12;//Quantity 1 (in bit number 12) + if (MET_y != 0) outTOB[1] = outTOB[1] | 0x00000001 << 24;//Status bit for Quantity 2 (0 if quantity is null) + if (MET_x != 0) outTOB[1] = outTOB[1] | 0x00000001 << 25;//Status bit for Quantity 1 (0 if quantity is null) + outTOB[1] = outTOB[1] | (2 & 0x0000001F) << 26;//TOB ID is 2 for MET_x, MET_y (5 bits starting at 26) + +// Third TOB is hard components (MHT_x, MHT_y) + outTOB[2] = MHT_y; //set the Quantity2 to the corresponding slot (LSB) + outTOB[2] = outTOB[2] | (MHT_x & 0x00000FFF) << 12;//Quantity 1 (in bit number 12) + if (MHT_y != 0) outTOB[2] = outTOB[2] | 0x00000001 << 24;//Status bit for Quantity 2 (0 if quantity is null) + if (MHT_x != 0) outTOB[2] = outTOB[2] | 0x00000001 << 25;//Status bit for Quantity 1 (0 if quantity is null) + outTOB[2] = outTOB[2] | (3 & 0x0000001F) << 26;//TOB ID is 3 for hard components (5 bits starting at 26) + + // Fourth TOB is hard components (MHT_x, MHT_y) + outTOB[3] = MST_y; //set the Quantity2 to the corresponding slot (LSB) + outTOB[3] = outTOB[3] | (MST_x & 0x00000FFF) << 12;//Quantity 1 (in bit number 12) + if (MST_y != 0) outTOB[3] = outTOB[3] | 0x00000001 << 24;//Status bit for Quantity 2 (0 if quantity is null) + if (MST_x != 0) outTOB[3] = outTOB[3] | 0x00000001 << 25;//Status bit for Quantity 1 (0 if quantity is null) + outTOB[3] = outTOB[3] | (4 & 0x0000001F) << 26;//TOB ID is 4 for soft components (5 bits starting at 26) + + + tobs_v[0] = std::make_unique<gFEXJwoJTOB>(); + tobs_v[0]->setWord(outTOB[0]); + tobs_v[0]->setQuantity1(MET); + tobs_v[0]->setQuantity2(total_sumEt); + tobs_v[0]->setSaturation(0); //Always 0 for now, need a threshold? + tobs_v[0]->setTobID(1); + if( MET != 0 ) tobs_v[0]->setStatus1(1); + else tobs_v[0]->setStatus1(0); + if(total_sumEt!= 0) tobs_v[0]->setStatus2(1); + else tobs_v[0]->setStatus2(0); + + tobs_v[1] = std::make_unique<gFEXJwoJTOB>(); + tobs_v[1]->setWord(outTOB[1]); + tobs_v[1]->setQuantity1(MET_x); + tobs_v[1]->setQuantity2(MET_y); + tobs_v[1]->setSaturation(0); //Always 0 for now, need a threshold? + tobs_v[1]->setTobID(2); + if( MET_x != 0 ) tobs_v[1]->setStatus1(1); + else tobs_v[1]->setStatus1(0); + if(MET_y!= 0) tobs_v[1]->setStatus2(1); + else tobs_v[1]->setStatus2(0); + + tobs_v[2] = std::make_unique<gFEXJwoJTOB>(); + tobs_v[2]->setWord(outTOB[2]); + tobs_v[2]->setQuantity1(MHT_x); + tobs_v[2]->setQuantity2(MHT_y); + tobs_v[2]->setSaturation(0); //Always 0 for now, need a threshold? + tobs_v[2]->setTobID(3); + if( MHT_x != 0 ) tobs_v[2]->setStatus1(1); + else tobs_v[2]->setStatus1(0); + if(MHT_y!= 0) tobs_v[2]->setStatus2(1); + else tobs_v[2]->setStatus2(0); + + tobs_v[3] = std::make_unique<gFEXJwoJTOB>(); + tobs_v[3]->setWord(outTOB[3]); + tobs_v[3]->setQuantity1(MST_x); + tobs_v[3]->setQuantity2(MST_y); + tobs_v[3]->setSaturation(0); //Always 0 for now, need a threshold? + tobs_v[3]->setTobID(4); + if( MST_x != 0 ) tobs_v[3]->setStatus1(1); + else tobs_v[2]->setStatus1(0); + if(MST_y!= 0) tobs_v[3]->setStatus2(1); + else tobs_v[3]->setStatus2(0); + + + return tobs_v; + +} + + + +void gFEXJwoJAlgo::gBlockAB(gTowersCentral twrs, gTowersCentral & gBlkSum){ + + int rows = twrs.size(); + int cols = twrs[0].size(); + + for( int irow = 0; irow < rows; irow++ ){ + for(int jcolumn = 0; jcolumn<cols; jcolumn++){ + // zero jet sum here + gBlkSum[irow][jcolumn] = 0; + int krowUp = (irow + 1)%32; + int krowDn = (irow - 1 +32)%32; + if( (jcolumn == 0) || (jcolumn == 6) ) { + //left edge case + gBlkSum[irow][jcolumn] = + twrs[irow][jcolumn] + twrs[krowUp][jcolumn] + twrs[krowDn][jcolumn] + + twrs[irow][jcolumn+1] + twrs[krowUp][jcolumn+1] + twrs[krowDn][jcolumn+1]; + } else if( (jcolumn == 5) || (jcolumn == 11)) { + // right edge case + gBlkSum[irow][jcolumn] = + twrs[irow][jcolumn] + twrs[krowUp][jcolumn] + twrs[krowDn][jcolumn] + + twrs[irow][jcolumn-1] + twrs[krowUp][jcolumn-1] + twrs[krowDn][jcolumn-1]; + } else{ + // normal case + gBlkSum[irow][jcolumn] = + twrs[irow][jcolumn] + twrs[krowUp][jcolumn] + twrs[krowDn][jcolumn] + + twrs[irow][jcolumn-1] + twrs[krowUp][jcolumn-1] + twrs[krowDn][jcolumn-1] + + twrs[irow][jcolumn+1] + twrs[krowUp][jcolumn+1] + twrs[krowDn][jcolumn+1]; + } + } + } + +} + + +void gFEXJwoJAlgo::metFPGA(gTowersCentral twrs, gTowersCentral & gBlkSum, + unsigned short & MHT_x, unsigned short & MHT_y, + unsigned short & MST_x, unsigned short & MST_y, + unsigned short & MET_x, unsigned short & MET_y){ + + int rows = twrs.size(); + int cols = twrs[0].size(); + + for( int irow = 0; irow < rows; irow++ ){ + for(int jcolumn = 0; jcolumn<cols; jcolumn++){ + if(gBlkSum[irow][jcolumn] > m_gBlockthreshold){ + MHT_x += (twrs[irow][jcolumn])*cosLUT(irow, 5, 6); + MHT_y += (twrs[irow][jcolumn])*sinLUT(irow, 5, 6); + } + else{ + MST_x += (twrs[irow][jcolumn])*cosLUT(irow, 5, 6); + MST_y += (twrs[irow][jcolumn])*sinLUT(irow, 5, 6); + } + } + } + + MET_x = m_aFPGA_A * MHT_x + m_bFPGA_A * MST_x; + MET_y = m_aFPGA_B * MHT_y + m_bFPGA_B * MST_y; + +} + +void gFEXJwoJAlgo::metTotal(unsigned short A_MET_x, unsigned short A_MET_y, + unsigned short B_MET_x, unsigned short B_MET_y, + unsigned short & MET_x, unsigned short & MET_y, unsigned short & MET){ + + MET_x = A_MET_x + B_MET_x; + MET_y = A_MET_y + B_MET_y; + MET = sqrt((MET_x * MET_x) + (MET_y * MET_y)); + +} + + +void gFEXJwoJAlgo::sumEtFPGA(gTowersCentral twrs, unsigned int & partial_sumEt ){ + + int rows = twrs.size(); + int cols = twrs[0].size(); + + for( int irow = 0; irow < rows; irow++ ){ + for(int jcolumn = 0; jcolumn<cols; jcolumn++){ + partial_sumEt += twrs[irow][jcolumn]; + } + } + +} + +void gFEXJwoJAlgo::sumEt(unsigned int A_sumEt, unsigned int B_sumEt, unsigned int & total_sumEt ){ + + total_sumEt = A_sumEt + B_sumEt; + +} + +//---------------------------------------------------------------------------------- +// bitwise simulation of sine LUT in firmware +//---------------------------------------------------------------------------------- +unsigned short gFEXJwoJAlgo::sinLUT(unsigned int phiIDX, unsigned int aw, unsigned int dw) +{ + float c = ((float)phiIDX)/pow(2,aw); + float rad = 2*M_PI*c; + float rsin = sin(rad); + + return static_cast<unsigned short>(round((pow(2.0,dw-1)-1.0)*rsin)); +} + +//---------------------------------------------------------------------------------- +// bitwise simulation cosine LUT in firmware +//---------------------------------------------------------------------------------- +unsigned short gFEXJwoJAlgo::cosLUT(unsigned int phiIDX, unsigned int aw, unsigned int dw) +{ + float c = ((float)phiIDX)/pow(2,aw); + float rad = 2*M_PI*c; + float rcos = cos(rad); + + return static_cast<unsigned short>(round((pow(2.0,dw-1)-1.0)*rcos)); +} + + + + +} // namespace LVL1 diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXJwoJTOB.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXJwoJTOB.cxx new file mode 100644 index 0000000000000000000000000000000000000000..4db19172c4f792bb8b10693c0d8ed8013dc1816e --- /dev/null +++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXJwoJTOB.cxx @@ -0,0 +1,61 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +*/ +//*************************************************************************** +// gFEXJwoJTOB - Forms the Jets without Jets TOBs for gFEX +// ------------------- +// begin : 11 08 2021 +// email : cecilia.tosciri@cern.ch +//*************************************************************************** + +#include "L1CaloFEXSim/gFEXJwoJTOB.h" + + +LVL1::gFEXJwoJTOB::gFEXJwoJTOB(): + m_word{99999}, + m_quantity1{99999}, + m_quantity2{99999}, + m_st1{99999}, + m_st2{99999}, + m_satur{99999}, + m_tobID{99999} +{} + + void setWord(uint32_t); + void setQuantity1(unsigned int); + void setQuantity2(unsigned int); + void setStatus1(unsigned int); + void setStatus2(unsigned int); + void setSaturation(unsigned int); + void setTobID(unsigned int); + + +void LVL1::gFEXJwoJTOB::setWord(uint32_t word) { + m_word = word; +} + +void LVL1::gFEXJwoJTOB::setQuantity1(unsigned int quantity1) { + m_quantity1 = quantity1; +} + +void LVL1::gFEXJwoJTOB::setQuantity2(unsigned int quantity2) { + m_quantity2 = quantity2; +} + +void LVL1::gFEXJwoJTOB::setStatus1(unsigned int st1) { + m_st1 = st1; +} + +void LVL1::gFEXJwoJTOB::setStatus2(unsigned int st2) { + m_st2 = st2; +} + +void LVL1::gFEXJwoJTOB::setSaturation(unsigned int satur) { + m_satur = satur; +} + +void LVL1::gFEXJwoJTOB::setTobID(unsigned int tobID) { + m_tobID = tobID; +} + + diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXNtupleWriter.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXNtupleWriter.cxx index 89fbb74ea9cfe1f5aa3a6d33599122e90a4f1099..65bf4216f4cbdf16686e9895a18c3ed7bb58066b 100644 --- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXNtupleWriter.cxx +++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXNtupleWriter.cxx @@ -12,6 +12,8 @@ #include "StoreGate/StoreGateSvc.h" #include "L1CaloFEXSim/gFEXJetTOB.h" #include "L1CaloFEXSim/gFEXJetAlgo.h" +#include "L1CaloFEXSim/gFEXJwoJTOB.h" +#include "L1CaloFEXSim/gFEXJwoJAlgo.h" #include "L1CaloFEXSim/gFEXOutputCollection.h" #include <vector> #include "TTree.h" @@ -51,6 +53,15 @@ StatusCode LVL1::gFEXNtupleWriter::initialize () { m_myTree->Branch ("jet_TOB_Status", &m_jet_TOB_Status); m_myTree->Branch ("jet_nTOBs", &m_jet_nTOBs); + m_myTree->Branch ("global_TOB", &m_global_TOB); + m_myTree->Branch ("global_TOB_Quantity1", &m_global_TOB_Quantity1); + m_myTree->Branch ("global_TOB_Quantity2", &m_global_TOB_Quantity2); + m_myTree->Branch ("global_TOB_Saturation", &m_global_TOB_Saturation); + m_myTree->Branch ("global_TOB_ID", &m_global_TOB_ID); + m_myTree->Branch ("global_TOB_Status1", &m_global_TOB_Status1); + m_myTree->Branch ("global_TOB_Status2", &m_global_TOB_Status2); + m_myTree->Branch ("global_nTOBs", &m_global_nTOBs); + return StatusCode::SUCCESS; } @@ -66,6 +77,8 @@ StatusCode LVL1::gFEXNtupleWriter::execute () { CHECK(loadTruthJets()); } + CHECK(loadGlobalAlgoVariables()); + m_myTree->Fill(); return StatusCode::SUCCESS; } @@ -84,8 +97,8 @@ StatusCode LVL1::gFEXNtupleWriter::loadJetAlgoVariables() { m_jet_TOB_Status.clear(); - m_jet_nTOBs = m_gFEXOutputCollection->size(); - for (int i = 0; i < m_gFEXOutputCollection->size(); i++) + m_jet_nTOBs = m_gFEXOutputCollection->jetsSize(); + for (int i = 0; i < m_gFEXOutputCollection->jetsSize(); i++) { uint32_t TOB = m_gFEXOutputCollection->getJetTob()[i]; m_jet_TOB.push_back(TOB); @@ -100,6 +113,30 @@ StatusCode LVL1::gFEXNtupleWriter::loadJetAlgoVariables() { return StatusCode::SUCCESS; } +StatusCode LVL1::gFEXNtupleWriter::loadGlobalAlgoVariables() { + m_global_TOB.clear(); + m_global_TOB_Quantity1.clear(); + m_global_TOB_Quantity2.clear(); + m_global_TOB_Saturation.clear(); + m_global_TOB_ID.clear(); + m_global_TOB_Status1.clear(); + m_global_TOB_Status2.clear(); + + m_global_nTOBs = m_gFEXOutputCollection->globalsSize(); + for (int i = 0; i < m_gFEXOutputCollection->globalsSize(); i++) + { + uint32_t TOB = m_gFEXOutputCollection->getGlobalTob()[i]; + m_global_TOB.push_back(TOB); + std::unordered_map<std::string, float> gFEXglobalvalue = (m_gFEXOutputCollection->getGlobal(i)); + m_global_TOB_Quantity1.push_back(gFEXglobalvalue["GlobalQuantity1"]); + m_global_TOB_Quantity2.push_back(gFEXglobalvalue["GlobalQuantity2"]); + m_global_TOB_Saturation.push_back(gFEXglobalvalue["SaturationGlobal"]); + m_global_TOB_ID.push_back(gFEXglobalvalue["TobIDJet"]); + m_global_TOB_Status1.push_back(gFEXglobalvalue["GlobalStatus1"]); + m_global_TOB_Status2.push_back(gFEXglobalvalue["GlobalStatus2"]); + } + return StatusCode::SUCCESS; +} StatusCode LVL1::gFEXNtupleWriter::loadTruthJets() { m_truth_jet_eta.clear(); diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXOutputCollection.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXOutputCollection.cxx index 15d35fb5d3ddaa1bbed509879181f993439b7eb3..54f5c89ec428f32f0bad598dfbcd7451c7dec8d2 100644 --- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXOutputCollection.cxx +++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXOutputCollection.cxx @@ -14,7 +14,7 @@ LVL1::gFEXOutputCollection::~gFEXOutputCollection() { } -void LVL1::gFEXOutputCollection::clear() +void LVL1::gFEXOutputCollection::clearJets() { for (auto iValues : m_allvalues_gFEXjet) { iValues.clear(); @@ -22,21 +22,26 @@ void LVL1::gFEXOutputCollection::clear() m_jettob.clear(); } +void LVL1::gFEXOutputCollection::clearGlobals() +{ + for (auto iValues : m_allvalues_gFEXglobal) { + iValues.clear(); + } + m_globaltob.clear(); +} void LVL1::gFEXOutputCollection::addValueJet(std::string key, float value) { m_values_gFEXJet.emplace(std::move(key), value); } - void LVL1::gFEXOutputCollection::fillJet() { m_allvalues_gFEXjet.push_back(std::move(m_values_gFEXJet)); m_values_gFEXJet.clear(); } - -int LVL1::gFEXOutputCollection::size() +int LVL1::gFEXOutputCollection::jetsSize() { return m_allvalues_gFEXjet.size(); } @@ -46,7 +51,6 @@ std::unordered_map<std::string, float> LVL1::gFEXOutputCollection::getJet(int lo return m_allvalues_gFEXjet[location]; } - void LVL1::gFEXOutputCollection::addJetTob(uint32_t jettob) { m_jettob.push_back(jettob); @@ -56,3 +60,36 @@ std::vector<uint32_t> LVL1::gFEXOutputCollection::getJetTob() const { return m_jettob; } + + + +void LVL1::gFEXOutputCollection::addValueGlobal(std::string key, float value) +{ + m_values_gFEXGlobal.emplace(std::move(key), value); +} + +void LVL1::gFEXOutputCollection::fillGlobal() +{ + m_allvalues_gFEXglobal.push_back(std::move(m_values_gFEXGlobal)); + m_values_gFEXGlobal.clear(); +} + +int LVL1::gFEXOutputCollection::globalsSize() +{ + return m_allvalues_gFEXglobal.size(); +} + +std::unordered_map<std::string, float> LVL1::gFEXOutputCollection::getGlobal(int location) const +{ + return m_allvalues_gFEXglobal[location]; +} + +void LVL1::gFEXOutputCollection::addGlobalTob(uint32_t globaltob) +{ + m_globaltob.push_back(globaltob); +} + +std::vector<uint32_t> LVL1::gFEXOutputCollection::getGlobalTob() const +{ + return m_globaltob; +} diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXSim.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXSim.cxx index fc4179692af6f3bf9e9e34497d3b2ed75a029d25..ee6e2ed981236c8d3dc08063358efc4e3d4c6661 100644 --- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXSim.cxx +++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXSim.cxx @@ -187,6 +187,21 @@ StatusCode gFEXSim::executegFEXSim(gTowersIDs tmp_gTowersIDs_subset){ m_gJetTobWords[2] = BTOB1_dat[3];//leading gJet in FPGA B, eta bins (0--5) m_gJetTobWords[3] = BTOB2_dat[3];//leading gJet in FPGA B, eta bins (6--11) + + // Retrieve the gFEXJetAlgoTool + ATH_CHECK( m_gFEXJwoJAlgoTool.retrieve() ); + std::array<uint32_t, 4> outTOB = {0}; + + auto global_tobs = m_gFEXJwoJAlgoTool->jwojAlgo(Atwr, Btwr, outTOB); + + m_gGlobalTobWords.resize(4); + +//Placing the global TOBs into a dedicated array + m_gGlobalTobWords[0] = outTOB[0];// + m_gGlobalTobWords[1] = outTOB[1];// + m_gGlobalTobWords[2] = outTOB[2];// + m_gGlobalTobWords[3] = outTOB[3];// + gFEXOutputCollection* gFEXOutputs; ATH_CHECK(evtStore()->retrieve(gFEXOutputs, "gFEXOutputCollection")); @@ -200,12 +215,25 @@ StatusCode gFEXSim::executegFEXSim(gTowersIDs tmp_gTowersIDs_subset){ gFEXOutputs->addValueJet("TobIDJet", tobs_v[i]->getTobID()); gFEXOutputs->fillJet(); + } + + for (int i = 0; i <4; i++){ + gFEXOutputs->addGlobalTob(global_tobs[i]->getWord()); + gFEXOutputs->addValueGlobal("GlobalQuantity1", global_tobs[i]->getQuantity1()); + gFEXOutputs->addValueGlobal("GlobalQuantity2", global_tobs[i]->getQuantity2()); + gFEXOutputs->addValueGlobal("SaturationGlobal", global_tobs[i]->getSaturation()); + gFEXOutputs->addValueGlobal("TobIDGlobal", global_tobs[i]->getTobID()); + gFEXOutputs->addValueGlobal("GlobalStatus1", global_tobs[i]->getStatus1()); + gFEXOutputs->addValueGlobal("GlobalStatus2", global_tobs[i]->getStatus2()); + gFEXOutputs->fillGlobal(); + } return StatusCode::SUCCESS; } + std::vector<uint32_t> gFEXSim::getgRhoTOBs() const { return m_gRhoTobWords; @@ -221,5 +249,10 @@ std::vector<uint32_t> gFEXSim::getgJetTOBs() const return m_gJetTobWords; } +std::vector<uint32_t> gFEXSim::getgGlobalTOBs() const +{ + return m_gGlobalTobWords; +} + } // end of namespace bracket diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXSysSim.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXSysSim.cxx index 0f2cf72858c3d80a4cbe002cc39f78a60d9bb9a1..31dcc398e367cdb4f6763a604b5d6d751bf56098 100644 --- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXSysSim.cxx +++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/gFEXSysSim.cxx @@ -75,6 +75,7 @@ namespace LVL1 { m_allgRhoTobs.clear(); m_allgBlockTobs.clear(); m_allgJetTobs.clear(); + m_allgGlobalTobs.clear(); // int centralNphi = 32; @@ -229,6 +230,7 @@ namespace LVL1 { m_allgRhoTobs = m_gFEXSimTool->getgRhoTOBs(); m_allgBlockTobs = m_gFEXSimTool->getgBlockTOBs(); m_allgJetTobs = m_gFEXSimTool->getgJetTOBs(); + m_allgGlobalTobs = m_gFEXSimTool->getgGlobalTOBs(); m_gFEXSimTool->reset(); @@ -244,6 +246,10 @@ namespace LVL1 { m_gJetAuxContainer = std::make_unique<xAOD::gFexJetRoIAuxContainer> (); m_gJetContainer->setStore(m_gJetAuxContainer.get()); + m_gGlobalContainer = std::make_unique<xAOD::gFexGlobalRoIContainer> (); + m_gGlobalAuxContainer = std::make_unique<xAOD::gFexGlobalRoIAuxContainer> (); + m_gGlobalContainer->setStore(m_gGlobalAuxContainer.get()); + //iterate over all gRho Tobs and fill EDM with them for(auto &tob : m_allgRhoTobs){ ATH_CHECK(fillgRhoEDM(tob)); @@ -257,6 +263,10 @@ namespace LVL1 { for(auto &tob : m_allgJetTobs){ ATH_CHECK(fillgJetEDM(tob)); } + //iterate over all Global Tobs and fill EDM with them + for(auto &tob : m_allgGlobalTobs){ + ATH_CHECK(fillgGlobalEDM(tob)); + } SG::WriteHandle<xAOD::gFexJetRoIContainer> outputgFexJetHandle(m_gFexJetOutKey/*, ctx*/); ATH_MSG_DEBUG(" write: " << outputgFexJetHandle.key() << " = " << "..." ); @@ -266,36 +276,39 @@ namespace LVL1 { } StatusCode gFEXSysSim::fillgRhoEDM(uint32_t tobWord){ - xAOD::gFexJetRoI* myEDM = new xAOD::gFexJetRoI(); - m_gRhoContainer->push_back( myEDM ); - myEDM->initialize(tobWord); - ATH_MSG_DEBUG(" setting gRho : " << myEDM->tobEt() ); - return StatusCode::SUCCESS; + std::unique_ptr<xAOD::gFexJetRoI> myEDM (new xAOD::gFexJetRoI()); + m_gRhoContainer->push_back(std::move(myEDM)); + m_gRhoContainer->back()->initialize(tobWord); + return StatusCode::SUCCESS; } StatusCode gFEXSysSim::fillgBlockEDM(uint32_t tobWord){ - xAOD::gFexJetRoI* myEDM = new xAOD::gFexJetRoI(); - m_gBlockContainer->push_back( myEDM ); - myEDM->initialize(tobWord); - ATH_MSG_DEBUG(" setting gBlock et: " << myEDM->tobEt() << " eta: " << myEDM->iEta() << " phi: " << myEDM->iPhi() ); + std::unique_ptr<xAOD::gFexJetRoI> myEDM (new xAOD::gFexJetRoI()); + m_gBlockContainer->push_back(std::move(myEDM)); + m_gBlockContainer->back()->initialize(tobWord); return StatusCode::SUCCESS; - } StatusCode gFEXSysSim::fillgJetEDM(uint32_t tobWord){ - xAOD::gFexJetRoI* myEDM = new xAOD::gFexJetRoI(); - m_gJetContainer->push_back( myEDM ); - - myEDM->initialize(tobWord); - ATH_MSG_DEBUG(" setting gJet et: " << myEDM->tobEt() << " eta: " << myEDM->iEta() << " phi: " << myEDM->iPhi() ); + std::unique_ptr<xAOD::gFexJetRoI> myEDM (new xAOD::gFexJetRoI()); + m_gJetContainer->push_back(std::move(myEDM)); + m_gJetContainer->back()->initialize(tobWord); return StatusCode::SUCCESS; + } + + StatusCode gFEXSysSim::fillgGlobalEDM(uint32_t tobWord){ + std::unique_ptr<xAOD::gFexGlobalRoI> myEDM (new xAOD::gFexGlobalRoI()); + m_gGlobalContainer->push_back(std::move(myEDM)); + m_gGlobalContainer->back()->initialize(tobWord); + + return StatusCode::SUCCESS; } diff --git a/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IgFEXJwoJAlgo.h b/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IgFEXJwoJAlgo.h new file mode 100644 index 0000000000000000000000000000000000000000..8fb4d469fa7d136cd02f9764b472c33d2660ec16 --- /dev/null +++ b/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IgFEXJwoJAlgo.h @@ -0,0 +1,45 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +*/ + + +#ifndef IgFEXJwoJAlgo_H +#define IgFEXJwoJAlgo_H + +#include "GaudiKernel/IAlgTool.h" +#include "L1CaloFEXSim/gFEXJwoJTOB.h" +#include "L1CaloFEXSim/FEXAlgoSpaceDefs.h" + +namespace LVL1 { + +/* +Interface definition for gFEXJwoJAlgo +*/ + + static const InterfaceID IID_IgFEXJwoJAlgo("LVL1::IgFEXJwoJAlgo", 1, 0); + typedef std::array<std::array<int, 12>, 32> gTowersCentral; + typedef std::array<std::array<int, 7>, 32> gTowersForward; + + class IgFEXJwoJAlgo : virtual public IAlgTool { + public: + static const InterfaceID& interfaceID( ) ; + + + virtual void setAlgoConstant(unsigned int aFPGA_A, unsigned int bFPGA_A, + unsigned int aFPGA_B, unsigned int bFPGA_B, + int gblockThreshold) = 0; + + virtual std::vector<std::unique_ptr<gFEXJwoJTOB>> jwojAlgo(gTowersCentral Atwr, gTowersCentral Btwr, + std::array<uint32_t, 4> & outTOB) = 0; + + + }; + + inline const InterfaceID& LVL1::IgFEXJwoJAlgo::interfaceID() + { + return IID_IgFEXJwoJAlgo; + } + +} // end of namespace + +#endif diff --git a/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IgFEXSim.h b/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IgFEXSim.h index 329dfe560afc6a1e1799297a88188e8d610568aa..38c70ed13c279c3a6329806b89131c7a5a7e399a 100644 --- a/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IgFEXSim.h +++ b/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IgFEXSim.h @@ -36,6 +36,8 @@ Interface definition for gFEXSim virtual std::vector<uint32_t> getgJetTOBs() const =0; + virtual std::vector<uint32_t> getgGlobalTOBs() const =0; + private: }; diff --git a/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IgFEXSysSim.h b/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IgFEXSysSim.h index a42656e6be156f459365fd4a662d6239c15bce23..24c9469abd6e0a6a8299240aa2968af921db03fd 100644 --- a/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IgFEXSysSim.h +++ b/Trigger/TrigT1/L1CaloFEXToolInterfaces/L1CaloFEXToolInterfaces/IgFEXSysSim.h @@ -33,6 +33,8 @@ Interface definition for gFEXSysSim virtual StatusCode fillgJetEDM(uint32_t tobWord) = 0; + virtual StatusCode fillgGlobalEDM(uint32_t tobWord) = 0; + private: };