From e31d6ea27c737e1aeb8f17bf38655fc0629819dc Mon Sep 17 00:00:00 2001
From: Alexandru Bercuci <abercuci@niham.nipne.ro>
Date: Fri, 19 Aug 2022 13:10:12 +0300
Subject: [PATCH] replace "push_back" call with "emplace_back" for increased
 performance

---
 .../trd/unpack/CbmTrdUnpackFaspAlgo.cxx       | 37 +++++++++----------
 .../trd/unpack/CbmTrdUnpackFaspAlgo.h         | 33 +++++++++--------
 2 files changed, 35 insertions(+), 35 deletions(-)

diff --git a/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.cxx b/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.cxx
index 2186db2829..56afd94e85 100644
--- a/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.cxx
+++ b/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.cxx
@@ -32,12 +32,19 @@
 #define VERBOSE 0
 
 using namespace std;
+CbmTrdUnpackFaspAlgo::CbmTrdFaspMessage::CbmTrdFaspMessage(uint8_t c, uint8_t typ, uint8_t t, uint16_t d, uint8_t rob,
+                                                           uint8_t asic)
+  : ch(c)
+  , type(typ)
+  , tlab(t)
+  , data(d)
+  , crob(rob)
+  , fasp(asic)
+{
+}
 
 CbmTrdUnpackFaspAlgo::CbmTrdUnpackFaspAlgo()
   : CbmRecoUnpackAlgo("CbmTrdUnpackFaspAlgo")
-  , fTime(0)
-  , fModuleId()
-  , fAsicPar()
 {
 }
 
@@ -170,7 +177,7 @@ CbmTrdUnpackFaspAlgo::CbmTrdFaspMessageType CbmTrdUnpackFaspAlgo::mess_type(uint
 }
 
 //_________________________________________________________________________________
-void CbmTrdUnpackFaspAlgo::mess_readDW(uint32_t w, CbmTrdFaspContent* mess)
+void CbmTrdUnpackFaspAlgo::mess_readDW(uint32_t w, CbmTrdFaspMessage* mess)
 {
   uint32_t wd(w), shift(0);
   mess->ch = wd & 0xf;
@@ -188,7 +195,7 @@ void CbmTrdUnpackFaspAlgo::mess_readDW(uint32_t w, CbmTrdFaspContent* mess)
 }
 
 //_________________________________________________________________________________
-void CbmTrdUnpackFaspAlgo::mess_readEW(uint32_t w, CbmTrdFaspContent* mess)
+void CbmTrdUnpackFaspAlgo::mess_readEW(uint32_t w, CbmTrdFaspMessage* mess)
 {
   uint32_t wd(w), shift(0);
   mess->ch = wd & 0xf;
@@ -203,7 +210,7 @@ void CbmTrdUnpackFaspAlgo::mess_readEW(uint32_t w, CbmTrdFaspContent* mess)
 }
 
 //_________________________________________________________________________________
-void CbmTrdUnpackFaspAlgo::mess_prt(CbmTrdFaspContent* mess)
+void CbmTrdUnpackFaspAlgo::mess_prt(CbmTrdFaspMessage* mess)
 {
   if (mess->type == kData)
     cout << boost::format("    DATA : fasp_id=%02d ch_id=%02d tclk=%03d data=%4d\n")
@@ -215,7 +222,7 @@ void CbmTrdUnpackFaspAlgo::mess_prt(CbmTrdFaspContent* mess)
 }
 
 //_________________________________________________________________________________
-bool CbmTrdUnpackFaspAlgo::pushDigis(std::vector<CbmTrdUnpackFaspAlgo::CbmTrdFaspContent> messes)
+bool CbmTrdUnpackFaspAlgo::pushDigis(std::vector<CbmTrdUnpackFaspAlgo::CbmTrdFaspMessage> messes)
 {
   UChar_t lFasp(0xff);
   UShort_t lchR, lchT;
@@ -282,9 +289,8 @@ bool CbmTrdUnpackFaspAlgo::pushDigis(std::vector<CbmTrdUnpackFaspAlgo::CbmTrdFas
 
       // build digi for message when update failed
       if (!use) {
-        CbmTrdDigi digi(pad, lchT, lchR, lTime);
-        digi.SetAddressModule(fMod);
-        fDigiBuffer[fCrob][pad].push_back(digi);
+        fDigiBuffer[fCrob][pad].emplace_back(pad, lchT, lchR, lTime);
+        fDigiBuffer[fCrob][pad].back().SetAddressModule(fMod);
         id = fDigiBuffer[fCrob][pad].rbegin();
       }
 
@@ -426,8 +432,7 @@ bool CbmTrdUnpackFaspAlgo::unpack(const fles::Timeslice* ts, std::uint16_t icomp
 
 
   UChar_t lFaspOld(0xff);
-  vector<CbmTrdFaspContent> vMess;
-  CbmTrdFaspContent mess;
+  vector<CbmTrdFaspMessage> vMess;
   for (uint64_t j = 0; j < nwords; j++, wd++) {
     //     // Select the appropriate conversion type of the word according to the message type
     //     switch(mess_type(*wd)){
@@ -484,13 +489,7 @@ bool CbmTrdUnpackFaspAlgo::unpack(const fles::Timeslice* ts, std::uint16_t icomp
         LOG(debug) << GetName() << "::unpack - Self-triggered data.";
         data &= 0x1fff;
       }
-      mess.ch   = ch_id;
-      mess.type = kData;
-      mess.tlab = slice;
-      mess.data = data >> 1;
-      mess.fasp = lFaspOld;
-      mess.crob = crob_id;
-      vMess.push_back(mess);
+      vMess.emplace_back(ch_id, kData, slice, data >> 1, crob_id, lFaspOld);
     }
     //prt_wd(*wd);
   }
diff --git a/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.h b/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.h
index 65a91e04e8..41adc040e0 100644
--- a/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.h
+++ b/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.h
@@ -60,7 +60,7 @@ public:
    * a - word type (0)
    * c - channel id
    */
-  enum CbmTrdFaspMessage
+  enum CbmTrdFaspMessageLength
   {
     kMessCh    = 4,
     kMessType  = 1,
@@ -89,15 +89,16 @@ public:
 
 
   /** @brief Data structure for unpacking the FASP word */
-  struct CbmTrdFaspContent {
-    uint8_t ch;      ///< ch id in the FASP
-    uint8_t type;    ///< message type 0 = epoch, 1 = data (not used for the moment)
-    uint8_t tlab;    ///< time of the digi inside the epoch
-    uint16_t data;   ///< ADC value
-    uint32_t epoch;  ///< epoch id (not used for the moment)
-    uint32_t mod;    ///< full module address according to CbmTrdAddress
-    uint8_t crob;    ///< CROB id in the module
-    uint8_t fasp;    ///< FASP id in the module
+  struct CbmTrdFaspMessage {
+    CbmTrdFaspMessage(uint8_t c, uint8_t typ, uint8_t t, uint16_t d, uint8_t rob, uint8_t asic);
+    uint8_t ch     = 0;  ///< ch id in the FASP
+    uint8_t type   = 0;  ///< message type 0 = epoch, 1 = data (not used for the moment)
+    uint8_t tlab   = 0;  ///< time of the digi inside the epoch
+    uint16_t data  = 0;  ///< ADC value
+    uint32_t epoch = 0;  ///< epoch id (not used for the moment)
+    uint32_t mod   = 0;  ///< full module address according to CbmTrdAddress
+    uint8_t crob   = 0;  ///< CROB id in the module
+    uint8_t fasp   = 0;  ///< FASP id in the module
   };
 
   /**
@@ -128,18 +129,18 @@ protected:
   /** @brief Get message type from the FASP word */
   CbmTrdFaspMessageType mess_type(uint32_t wd);
   /** @brief Convert the FASP word into a DATA message */
-  void mess_readDW(uint32_t wd, CbmTrdFaspContent* mess);
+  void mess_readDW(uint32_t wd, CbmTrdFaspMessage* mess);
   /** @brief Convert the FASP word into a EPOCH message */
-  void mess_readEW(uint32_t wd, CbmTrdFaspContent* mess);
+  void mess_readEW(uint32_t wd, CbmTrdFaspMessage* mess);
   /** @brief Print FASP message */
-  void mess_prt(CbmTrdFaspContent* mess);
-  bool pushDigis(std::vector<CbmTrdUnpackFaspAlgo::CbmTrdFaspContent> messages);
+  void mess_prt(CbmTrdFaspMessage* mess);
+  bool pushDigis(std::vector<CbmTrdUnpackFaspAlgo::CbmTrdFaspMessage> messages);
   /** @brief Time offset for digi wrt the TS start, expressed in 80 MHz clks. It contains:
    *  - relative offset of the MS wrt the TS
    *  - FASP epoch offset for current CROB
    *  - TRD2D system offset wrt to experiment time (e.g. T0)
    */
-  ULong64_t fTime;
+  ULong64_t fTime = 0;
 
   /** @brief Finish function for this algorithm base clase */
   void finish()
@@ -209,7 +210,7 @@ private:
   std::shared_ptr<CbmTrdUnpackFaspMonitor> fMonitor = nullptr;
   uint16_t fCrob                                    = 0xffff;  //! current crob being processed
   uint16_t fMod                                     = 0xffff;  //! current module being processed
-  std::vector<uint16_t> fModuleId;  ///> list of modules for which there is are calibration parameters
+  std::vector<uint16_t> fModuleId = {};  ///> list of modules for which there is are calibration parameters
   CbmTrdParSetAsic fAsicPar;
   CbmTrdParSetDigi* fDigiSet = nullptr;
 
-- 
GitLab