From 7de3f705f7f49244ae5fbf7eecd5f81133bd390b Mon Sep 17 00:00:00 2001
From: Alexandru Bercuci <abercuci@niham.nipne.ro>
Date: Tue, 6 Jun 2023 14:45:12 +0300
Subject: [PATCH] split CbmTrdParSetAsic class in two. One for module wise
 (CbmTrdParModAsic) and the proper set related. Add also CROB id to the param
 file

---
 MQ/mcbm/CbmDeviceUnpack.cxx                   |  31 ++--
 algo/detectors/trd/UnpackTrd.h                |   2 +-
 core/detectors/trd/CMakeLists.txt             |   1 +
 core/detectors/trd/CbmTrdBaseLinkDef.h        |   1 +
 core/detectors/trd/CbmTrdHardwareSetupR.cxx   |  14 +-
 core/detectors/trd/CbmTrdModuleAbstract.h     |   6 +-
 core/detectors/trd/CbmTrdParManager.cxx       |  19 +-
 core/detectors/trd/CbmTrdParSetAsic.cxx       | 168 ++++--------------
 core/detectors/trd/CbmTrdParSetAsic.h         |  57 +-----
 macro/run/run_unpack_online.C                 |  64 +++----
 macro/run/run_unpack_tsa.C                    |  40 ++---
 reco/detectors/trd/CbmTrdClusterFinder.cxx    |   4 +-
 reco/detectors/trd/CbmTrdHitProducer.cxx      |   4 +-
 reco/detectors/trd/qa/CbmTrdHitDensityQa.cxx  |   7 +-
 .../trd/unpack/CbmTrdUnpackFaspAlgo.cxx       |  14 +-
 .../trd/unpack/CbmTrdUnpackFaspAlgo.h         |   4 +-
 .../trd/unpack/CbmTrdUnpackFaspMonitor.cxx    |  45 ++---
 .../trd/unpack/CbmTrdUnpackFaspMonitor.h      |   3 +-
 .../trd/unpack/CbmTrdUnpackMonitor.cxx        |   5 +-
 reco/tasks/CbmTaskUnpack.cxx                  |   4 +-
 sim/detectors/trd/CbmTrdDigitizer.cxx         |   5 +-
 sim/detectors/trd/CbmTrdModuleSim2D.cxx       |   2 +-
 sim/detectors/trd/CbmTrdModuleSim2D.h         |   4 +-
 sim/detectors/trd/CbmTrdModuleSimR.cxx        |   6 +-
 sim/detectors/trd/qa/CbmTrdHitRateFastQa.cxx  |   3 +-
 25 files changed, 186 insertions(+), 327 deletions(-)

diff --git a/MQ/mcbm/CbmDeviceUnpack.cxx b/MQ/mcbm/CbmDeviceUnpack.cxx
index bfdf0cd7db..48a547c65c 100644
--- a/MQ/mcbm/CbmDeviceUnpack.cxx
+++ b/MQ/mcbm/CbmDeviceUnpack.cxx
@@ -320,25 +320,18 @@ Bool_t CbmDeviceUnpack::InitContainers()
       trdfasp2dconfig->SetDoWriteOutput();
       // Activate the line below to write Trd1D digis to a separate "TrdFaspDigi" branch. Can be used to separate between Fasp and Spadic digis
       //trdfasp2dconfig->SetOutputBranchName("TrdFaspDigi");
-      uint8_t map[NFASPMOD];
-      uint16_t crob_map[NCROBMOD];
-      for (uint32_t i(0); i < NFASPMOD; i++)
-        map[i] = i;
-      if (fuRunId <= 1588) {
-        const size_t nfasps = 12;
-        uint8_t map21[] = {9, 2, 3, 11, 10, 7, 8, 0, 1, 4, 6, 5};
-        for (uint32_t i(0); i < nfasps; i++)
-          map[i] = map21[i];
-        uint16_t crob_map21[] = {0x00f0, 0, 0, 0, 0};
-        for (uint32_t i(0); i < NCROBMOD; i++)
-          crob_map[i] = crob_map21[i];
-      }
-      else if (fuRunId >= 2335) {
-        uint16_t crob_map22[] = {0xffc2, 0xffc5, 0xffc1, 0, 0};
-        for (uint32_t i(0); i < NCROBMOD; i++)
-          crob_map[i] = crob_map22[i];
-      }
-      trdfasp2dconfig->SetCrobMapping(5, crob_map);
+      //   uint16_t crob_map[NCROBMOD];
+      //   if (fuRunId <= 1588) {
+      //     uint16_t crob_map21[] = {0x00f0, 0, 0, 0, 0};
+      //     for (uint32_t i(0); i < NCROBMOD; i++)
+      //       crob_map[i] = crob_map21[i];
+      //   }
+      //   else if (fuRunId >= 2335) {
+      //     uint16_t crob_map22[] = {0xffc2, 0xffc5, 0xffc1, 0, 0};
+      //     for (uint32_t i(0); i < NCROBMOD; i++)
+      //       crob_map[i] = crob_map22[i];
+      //   }
+      //   trdfasp2dconfig->SetCrobMapping(5, crob_map);
       std::string parfilesbasepathTrdfasp2d = Form("%s/parameters/trd", srcDir.Data());
       trdfasp2dconfig->SetParFilesBasePath(parfilesbasepathTrdfasp2d);
       trdfasp2dconfig->SetSystemTimeOffset(-1800);  // [ns] value to be updated
diff --git a/algo/detectors/trd/UnpackTrd.h b/algo/detectors/trd/UnpackTrd.h
index 915535c1f2..51d2ad038e 100644
--- a/algo/detectors/trd/UnpackTrd.h
+++ b/algo/detectors/trd/UnpackTrd.h
@@ -219,7 +219,7 @@ namespace cbm::algo
      ** @param samples 
      ** @return ULong64_t 
      **/
-    uint64_t GetBinTimeShift(const std::vector<std::int16_t>* samples) { return 0.; };
+    uint64_t GetBinTimeShift(const std::vector<std::int16_t>* /*samples*/) { return 0.; };
 
     /**
      ** @brief Get the MaxAdc value
diff --git a/core/detectors/trd/CMakeLists.txt b/core/detectors/trd/CMakeLists.txt
index e746a1b64a..5b61e9fcad 100644
--- a/core/detectors/trd/CMakeLists.txt
+++ b/core/detectors/trd/CMakeLists.txt
@@ -20,6 +20,7 @@ set(SRCS
   CbmTrdSpadic.cxx
   CbmTrdFASP.cxx
   CbmTrdParFasp.cxx
+  CbmTrdParModAsic.cxx
   CbmTrdParModDigi.cxx
   CbmTrdParModGas.cxx
   CbmTrdParModGain.cxx
diff --git a/core/detectors/trd/CbmTrdBaseLinkDef.h b/core/detectors/trd/CbmTrdBaseLinkDef.h
index 46238360fd..6f08f8e0b7 100644
--- a/core/detectors/trd/CbmTrdBaseLinkDef.h
+++ b/core/detectors/trd/CbmTrdBaseLinkDef.h
@@ -30,6 +30,7 @@
 #pragma link C++ class std::map<int, std::array<int, 16>> + ;
 #pragma link C++ class CbmTrdParFasp + ;
 #pragma link C++ class CbmTrdParFaspChannel + ;
+#pragma link C++ class CbmTrdParModAsic + ;
 #pragma link C++ class CbmTrdParModGas + ;
 #pragma link C++ class CbmTrdParModGain + ;
 #pragma link C++ class CbmTrdParModGeo + ;
diff --git a/core/detectors/trd/CbmTrdHardwareSetupR.cxx b/core/detectors/trd/CbmTrdHardwareSetupR.cxx
index effca83781..a280366b59 100644
--- a/core/detectors/trd/CbmTrdHardwareSetupR.cxx
+++ b/core/detectors/trd/CbmTrdHardwareSetupR.cxx
@@ -10,7 +10,7 @@
  */
 #include "CbmTrdHardwareSetupR.h"
 
-#include "CbmTrdParSetAsic.h"  // for CbmTrdParSetAsic
+#include "CbmTrdParModAsic.h"  // for CbmTrdParSetAsic
 #include "CbmTrdParSpadic.h"   // for CbmTrdParSpadic
 
 #include <FairParAsciiFileIo.h>  // for FairParAsciiFileIo
@@ -83,7 +83,7 @@ std::map<size_t, Int_t> CbmTrdHardwareSetupR::CreateHwToSwAsicAddressTranslatorM
   TArrayI uniqueModuleIds(nModuleAsicParSets);
   moduleAsicParSetsList.fill("ModuleId", &uniqueModuleIds);
 
-  CbmTrdParSetAsic* moduleAsicsParSet = nullptr;
+  CbmTrdParModAsic* moduleAsicsParSet = nullptr;
   CbmTrdParSpadic* currentSpadicPar   = nullptr;
 
   Int_t currentUniqueModuleId(-1);
@@ -94,7 +94,7 @@ std::map<size_t, Int_t> CbmTrdHardwareSetupR::CreateHwToSwAsicAddressTranslatorM
 
   for (Int_t iModule = 0; iModule < nModuleAsicParSets; iModule++) {
     currentUniqueModuleId = uniqueModuleIds[iModule];
-    moduleAsicsParSet     = (CbmTrdParSetAsic*) moduleparsets->GetModuleSet(currentUniqueModuleId);
+    moduleAsicsParSet     = (CbmTrdParModAsic*) moduleparsets->GetModulePar(currentUniqueModuleId);
     std::vector<Int_t> asicAddresses;
     moduleAsicsParSet->GetAsicAddresses(&asicAddresses);
     for (auto iAsicIt : asicAddresses) {
@@ -149,7 +149,7 @@ std::map<Int_t, std::vector<Int_t>> CbmTrdHardwareSetupR::CreateAsicChannelMap(C
   TArrayI uniqueModuleIds(nModuleAsicParSets);
   moduleAsicParSetsList.fill("ModuleId", &uniqueModuleIds);
 
-  CbmTrdParSetAsic* moduleAsicsParSet = nullptr;
+  CbmTrdParModAsic* moduleAsicsParSet = nullptr;
   CbmTrdParSpadic* currentSpadicPar   = nullptr;
 
   Int_t currentUniqueModuleId(-1);
@@ -159,7 +159,7 @@ std::map<Int_t, std::vector<Int_t>> CbmTrdHardwareSetupR::CreateAsicChannelMap(C
   std::vector<Int_t> channelAddressVec;
   for (Int_t iModule = 0; iModule < nModuleAsicParSets; iModule++) {
     currentUniqueModuleId = uniqueModuleIds[iModule];
-    moduleAsicsParSet     = (CbmTrdParSetAsic*) moduleparsets->GetModuleSet(currentUniqueModuleId);
+    moduleAsicsParSet     = (CbmTrdParModAsic*) moduleparsets->GetModulePar(currentUniqueModuleId);
     std::vector<Int_t> asicAddresses;
     moduleAsicsParSet->GetAsicAddresses(&asicAddresses);
     for (auto iAsicIt : asicAddresses) {
@@ -219,7 +219,7 @@ bool CbmTrdHardwareSetupR::WriteComponentIdsToParams()
   TArrayI uniqueModuleIds(nModuleAsicParSets);
   moduleAsicParSetsList.fill("ModuleId", &uniqueModuleIds);
 
-  CbmTrdParSetAsic* moduleAsicsParSet = nullptr;
+  CbmTrdParModAsic* moduleAsicsParSet = nullptr;
   CbmTrdParSpadic* currentSpadicPar   = nullptr;
 
   Int_t currentUniqueModuleId(-1);
@@ -227,7 +227,7 @@ bool CbmTrdHardwareSetupR::WriteComponentIdsToParams()
 
   for (Int_t iModule = 0; iModule < nModuleAsicParSets; iModule++) {
     currentUniqueModuleId = uniqueModuleIds[iModule];
-    moduleAsicsParSet     = (CbmTrdParSetAsic*) moduleAsicParSets->GetModuleSet(currentUniqueModuleId);
+    moduleAsicsParSet     = (CbmTrdParModAsic*) moduleAsicParSets->GetModulePar(currentUniqueModuleId);
     std::vector<Int_t> asicAddresses;
     moduleAsicsParSet->GetAsicAddresses(&asicAddresses);
     for (auto iAsicIt : asicAddresses) {
diff --git a/core/detectors/trd/CbmTrdModuleAbstract.h b/core/detectors/trd/CbmTrdModuleAbstract.h
index 3a04a3bed8..75bc0ad3bf 100644
--- a/core/detectors/trd/CbmTrdModuleAbstract.h
+++ b/core/detectors/trd/CbmTrdModuleAbstract.h
@@ -5,9 +5,9 @@
 #ifndef CBMTRDMODULEABSTRACT_H
 #define CBMTRDMODULEABSTRACT_H
 
+#include "CbmTrdParModAsic.h"  // for CbmTrdParSetAsic
 #include "CbmTrdParModDigi.h"  // for CbmTrdParModDigi
 #include "CbmTrdParModGeo.h"   // for CbmTrdParModGeo
-#include "CbmTrdParSetAsic.h"  // for CbmTrdParSetAsic
 
 #include <Rtypes.h>      // for THashConsistencyHolder, ClassDef
 #include <RtypesCore.h>  // for Int_t, Double_t, Char_t, UChar_t, USho...
@@ -80,7 +80,7 @@ public:
 
   virtual void LocalToMaster(Double_t in[3], Double_t out[3]);
 
-  virtual void SetAsicPar(CbmTrdParSetAsic* p = nullptr) { fAsicPar = p; }
+  virtual void SetAsicPar(CbmTrdParModAsic* p = nullptr) { fAsicPar = p; }
   virtual void SetChmbPar(const CbmTrdParModGas* p) { fChmbPar = p; }
   virtual void SetDigiPar(const CbmTrdParModDigi* p) { fDigiPar = p; }
   virtual void SetGainPar(const CbmTrdParModGain* p) { fGainPar = p; }
@@ -121,7 +121,7 @@ protected:
   // calibration objects
   const CbmTrdParModDigi* fDigiPar;  ///< read-out description of module
   const CbmTrdParModGas* fChmbPar;   ///< detection description (HV, drift) of module
-  CbmTrdParSetAsic* fAsicPar;        ///< the set of ASIC operating on the module (owned)
+  CbmTrdParModAsic* fAsicPar;        ///< the set of ASIC operating on the module (owned)
   const CbmTrdParModGain* fGainPar;  ///< Analog to digital conversion for module
   const CbmTrdParModGeo* fGeoPar;    ///< link to gGeometry for module
 
diff --git a/core/detectors/trd/CbmTrdParManager.cxx b/core/detectors/trd/CbmTrdParManager.cxx
index f74a687ca6..0bd84c6077 100644
--- a/core/detectors/trd/CbmTrdParManager.cxx
+++ b/core/detectors/trd/CbmTrdParManager.cxx
@@ -13,6 +13,7 @@
 #include "CbmTrdPads.h"        // for fst1_pad_type, fst1_sect_count
 #include "CbmTrdParAsic.h"     // for CbmTrdParAsic, CbmTrdParAsic::kCriId...
 #include "CbmTrdParFasp.h"     // for CbmTrdParFasp
+#include "CbmTrdParModAsic.h"  // for CbmTrdParModAsic
 #include "CbmTrdParModDigi.h"  // for CbmTrdParModDigi
 #include "CbmTrdParModGain.h"  // for CbmTrdParModGain
 #include "CbmTrdParModGas.h"   // for CbmTrdParModGas
@@ -207,11 +208,11 @@ void CbmTrdParManager::CreateModuleParameters(const TString& path)
   fDigiPar->addParam(digi);
 
   // Create new asic par for this module
-  CbmTrdParSetAsic* asics(nullptr);
+  CbmTrdParModAsic* asics(nullptr);
   // if(moduleType>=9 && fFASP){ // I do not think this check is required, actually I think it creates a bug in parameter creation
   if (moduleType >= 9) {
-    asics = new CbmTrdParSetAsic("TrdParModFasp", Form("Fasp set for Module %d", moduleAddress) /*, GetContext()*/);
-    asics->SetAsicType(moduleType);
+    asics = new CbmTrdParModAsic(Form("FaspPars%03d", moduleAddress), Form("Fasp set for Module %d", moduleAddress));
+    asics->SetChamberType(moduleType);
     Double_t par[6];
     par[1] = 14;
     par[4] = 4.181e-6;
@@ -220,7 +221,7 @@ void CbmTrdParManager::CreateModuleParameters(const TString& path)
     for (Int_t r(0); r < digi->GetNofRows(); r++) {
       for (Int_t c(0); c < ncol; c++) {
         if (c % 8 == 0) {
-          if (asic) asics->SetAsicPar(asicAddress, asic);
+          if (asic) asics->SetAsicPar(asic);
           asicAddress = moduleAddress * 1000 + iasic;
           asic        = new CbmTrdParFasp(asicAddress);
           iasic++;
@@ -237,11 +238,11 @@ void CbmTrdParManager::CreateModuleParameters(const TString& path)
         }
       }
     }
-    if (asic) asics->SetAsicPar(asicAddress, asic);
+    if (asic) asics->SetAsicPar(asic);
   }
   else {  // Here only rectangular modules should enter. Hence, we have spadics in use.
-    asics = new CbmTrdParSetAsic("TrdParModSpadic", Form("Spadic set for Module %d", moduleAddress));
-    asics->SetAsicType(moduleType);
+    asics = new CbmTrdParModAsic("TrdParModSpadic", Form("Spadic set for Module %d", moduleAddress));
+    asics->SetChamberType(moduleType);
     CbmTrdParSpadic* asic(nullptr);
 
     // To write the channelAddresses to the parameter files we first of all need to now the number of columns, rows and channels. The numbering of the channels starts at the bottom left and goes along the short side (column) of the pads row by row, for a not rotated module. The rotation is also taken care about in the following code.
@@ -299,13 +300,13 @@ void CbmTrdParManager::CreateModuleParameters(const TString& path)
       asic->SetChannelAddresses(chAddressesVec);
       // Get the according hardware component Id for the real asic placed at the according position in the experiment
       asic->SetComponentId(fHardwareSetup.GetComponentId(asic->GetAddress()));
-      asics->SetAsicPar(asic->GetAddress(), asic);
+      asics->SetAsicPar(asic);
     }
   }
 
 
   asics->Print();
-  fAsicPar->AddParameters(asics);
+  fAsicPar->addParam(asics);
 
   // Create new gas par for this module
   CbmTrdParModGas* gas(nullptr);
diff --git a/core/detectors/trd/CbmTrdParSetAsic.cxx b/core/detectors/trd/CbmTrdParSetAsic.cxx
index b64098723c..5eef369005 100644
--- a/core/detectors/trd/CbmTrdParSetAsic.cxx
+++ b/core/detectors/trd/CbmTrdParSetAsic.cxx
@@ -8,6 +8,7 @@
 #include "CbmTrdParAsic.h"    // for CbmTrdParAsic
 #include "CbmTrdParFasp.h"    // for CbmTrdParFasp, NFASPCH, CbmTrdParFasp...
 #include "CbmTrdParMod.h"     // for CbmTrdParMod
+#include "CbmTrdParModAsic.h"  // for CbmTrdParModAsic
 #include "CbmTrdParSpadic.h"  // for CbmTrdParSpadic, NSPADICCH
 
 #include <FairParamList.h>  // for FairParamList
@@ -30,33 +31,9 @@ using std::map;
 //_______________________________________________________________________________
 CbmTrdParSetAsic::CbmTrdParSetAsic(const char* name, const char* title, const char* context)
   : CbmTrdParSet(name, title, context)
-  , fType(8)
-  , fModPar()
 {
 }
 
-//_______________________________________________________________________________
-CbmTrdParSetAsic::~CbmTrdParSetAsic()
-{
-  if (fNrOfModules) {
-    //     std::map<Int_t, CbmTrdParSetAsic*>::iterator it=fModPar.begin();
-    //     while(it!=fModPar.end()){
-    //       if(it->second) delete it->second;
-    //       it++;
-    //     }
-    fModPar.clear();
-  }
-}
-
-//_______________________________________________________________________________
-void CbmTrdParSetAsic::addParam(CbmTrdParMod* mod)
-{
-  if (mod->IsA() != CbmTrdParFasp::Class() && mod->IsA() != CbmTrdParSpadic::Class()) return;
-
-  fModuleMap[((CbmTrdParAsic*) mod)->GetAddress()] = mod;
-  fNrOfModules++;
-}
-
 //_______________________________________________________________________________
 Bool_t CbmTrdParSetAsic::getParams(FairParamList* l)
 {
@@ -75,14 +52,17 @@ Bool_t CbmTrdParSetAsic::getParams(FairParamList* l)
     if (nAsic[imod] > maxNrAsics) maxNrAsics = nAsic[imod];
   }
   Int_t address(0);
-  fType = 0xff;
 
+  CbmTrdParModAsic* mod(nullptr);
   CbmTrdParAsic* asic(nullptr);
   for (Int_t i = 0; i < fNrOfModules; i++) {
-    fModPar[moduleId[i]] =
-      new CbmTrdParSetAsic(GetName(), Form("%s for Module %d", GetTitle(), moduleId[i]) /*, GetContext()*/);
+    mod = new CbmTrdParModAsic(GetName(), Form("%s for Module %d", GetTitle(), moduleId[i]));
+    mod->SetChamberType(typeAsic[i]);
     // only for FASP
     if (9 == typeAsic[i]) {
+      TArrayI crobAddress(NCROBMOD);
+      if (!l->fill(Form("CrobInfo - Module %d", moduleId[i]), &crobAddress)) continue;
+      mod->SetCrobAddresses(crobAddress.GetArray());
       Int_t maxValues = maxNrAsics * (NFASPPARS);
       TArrayI values(maxValues);
       if (!l->fill(Form("FaspInfo - Module %d", moduleId[i]), &values)) continue;
@@ -92,9 +72,8 @@ Bool_t CbmTrdParSetAsic::getParams(FairParamList* l)
         if (address == moduleId[i] * 1000 + 999) continue;
         asic         = new CbmTrdParFasp(address);
         static_cast<CbmTrdParFasp*>(asic)->LoadParams(&(values.GetArray()[offset]));
-        fModPar[moduleId[i]]->SetAsicPar(address, asic);
+        mod->SetAsicPar(asic);
       }
-      fModPar[moduleId[i]]->SetAsicType((int) CbmTrdDigi::eCbmTrdAsicType::kFASP);
     }
     else {
       Int_t maxValues = maxNrAsics * (5 + NSPADICCH);
@@ -112,10 +91,10 @@ Bool_t CbmTrdParSetAsic::getParams(FairParamList* l)
           addresses.push_back(values[j]);
         }
         asic->SetChannelAddresses(addresses);
-        fModPar[moduleId[i]]->SetAsicPar(address, asic);
+        mod->SetAsicPar(asic);
       }
-      fModPar[moduleId[i]]->SetAsicType((int) CbmTrdDigi::eCbmTrdAsicType::kSPADIC);
     }
+    fModuleMap[moduleId[i]] = mod;
   }
   return kTRUE;
 }
@@ -127,34 +106,34 @@ void CbmTrdParSetAsic::putParams(FairParamList* l)
   // LOG(info) << GetName() << "::putParams(FairParamList*)";
 
   Int_t idx(0);
-  TArrayI moduleId(fNrOfModules), nAsic(fNrOfModules), typeAsic(fNrOfModules);
-  for (std::map<Int_t, CbmTrdParSetAsic*>::iterator imod = fModPar.begin(); imod != fModPar.end(); imod++) {
-    moduleId[idx]   = imod->first;
-    nAsic[idx]      = imod->second->GetNofAsics();
-    typeAsic[idx++] = imod->second->GetAsicType();
+  TArrayI moduleId(fNrOfModules), nAsic(fNrOfModules), typeChmb(fNrOfModules);
+  for (auto mod : fModuleMap) {
+    moduleId[idx] = mod.first;
+    nAsic[idx]    = ((CbmTrdParModAsic*) mod.second)->GetNofAsics();
+    typeChmb[idx] = ((CbmTrdParModAsic*) mod.second)->GetChamberType();
+    idx++;
   }
   l->add("NrOfModules", fNrOfModules);
   l->add("ModuleId", moduleId);
   l->add("nAsic", nAsic);
-  l->add("typeAsic", typeAsic);
-
-  CbmTrdParSetAsic* mod(nullptr);
-  for (Int_t i = 0; i < fNrOfModules; i++) {
-    mod = (CbmTrdParSetAsic*) fModPar[moduleId[i]];
+  l->add("typeAsic", typeChmb);
 
+  idx = 0;
+  for (auto mapEntry : fModuleMap) {
     Int_t iAsicNr(0);
     Int_t currentAsicAddress(-1);
 
-    if (mod->fModuleMap.begin()->second->IsA() == CbmTrdParSpadic::Class()) {
+    CbmTrdParModAsic* mod = (CbmTrdParModAsic*) mapEntry.second;
+    if (mod->GetAsicType() == CbmTrdDigi::eCbmTrdAsicType::kSPADIC) {
       // Calculate the size of the array to hold all values realted to all
       // asics of a full detector module
       // each ASCIC has a maximum of NSPADICCH channels attached + 5 values
       // for AsicID, CriId, CrobId, CrobNumber and ElinkId
       Int_t sizePerSpadic = 5 + NSPADICCH;
-      Int_t fullSize      = nAsic[i] * sizePerSpadic;
+      Int_t fullSize      = nAsic[idx] * sizePerSpadic;
       TArrayI asicInfo(fullSize);
       iAsicNr = 0;
-      for (auto iModuleIt : mod->fModuleMap) {
+      for (auto iModuleIt : mod->fModPar) {
         size_t asicComponentId(100098);  // 100098 = undefined
         currentAsicAddress   = iModuleIt.first;
         asicComponentId      = ((CbmTrdParSpadic*) iModuleIt.second)->GetComponentId();
@@ -177,14 +156,17 @@ void CbmTrdParSetAsic::putParams(FairParamList* l)
         }
         iAsicNr++;
       }
-      l->add(Form("SpadicInfo - Module %d", moduleId[i]), asicInfo);
+      l->add(Form("SpadicInfo - Module %d", mapEntry.first), asicInfo);
     }
-    if (mod->fModuleMap.begin()->second->IsA() == CbmTrdParFasp::Class()) {
-      Int_t fullSize = nAsic[i] * NFASPPARS;
+    if (mod->GetAsicType() == CbmTrdDigi::eCbmTrdAsicType::kFASP) {
+      TArrayI crobAddress(NCROBMOD);
+      crobAddress.Set(NCROBMOD, mod->GetCrobAddresses());
+      l->add(Form("CrobInfo - Module %d", mapEntry.first), crobAddress);
+      Int_t fullSize = nAsic[idx] * NFASPPARS;
       TArrayI asicInfo(fullSize);
 
       iAsicNr = 0;
-      for (auto iModuleIt : mod->fModuleMap) {
+      for (auto iModuleIt : mod->fModPar) {
         int offset         = iAsicNr * NFASPPARS;
         asicInfo[offset++] = iModuleIt.first;
 
@@ -192,13 +174,13 @@ void CbmTrdParSetAsic::putParams(FairParamList* l)
         asicInfo[offset++]  = fasp->GetChannelMask();
         Int_t ich(0);
         for (auto chAddress : fasp->GetChannelAddresses()) {
-          asicInfo[offset + ich]         = chAddress;
           const CbmTrdParFaspChannel* ch = fasp->GetChannel(ich);
           if (!ch) {
             LOG(info) << "Missing calib for Fasp[" << offset << "] pad " << chAddress;
             ich++;
             continue;
           }
+          asicInfo[offset + ich]                 = (ch->HasPairingT() ? -1 : 1) * chAddress;
           asicInfo[offset + (1 * NFASPCH) + ich] = ch->GetPileUpTime();
           asicInfo[offset + (2 * NFASPCH) + ich] = ch->GetThreshold();
           asicInfo[offset + (3 * NFASPCH) + ich] = ch->GetMinDelaySignal();
@@ -206,97 +188,21 @@ void CbmTrdParSetAsic::putParams(FairParamList* l)
         }
         iAsicNr++;
       }
-      l->add(Form("FaspInfo - Module %d", moduleId[i]), asicInfo);
+      l->add(Form("FaspInfo - Module %d", mapEntry.first), asicInfo);
     }
+    idx++;
   }
 }
 
-//_______________________________________________________________________________
-void CbmTrdParSetAsic::AddParameters(CbmTrdParSetAsic* mod)
-{
-  //printf("CbmTrdParSetAsic::addParam() :\n");
-
-  fModPar[mod->fModuleMap.begin()->first / 1000] = mod;
-  fNrOfModules++;
-}
-
-//_______________________________________________________________________________
-Int_t CbmTrdParSetAsic::GetAsicAddress(Int_t chAddress) const
-{
-  /** Query the ASICs in the module set for the specified read-out channel. 
- * Returns the id of the ASIC within the module or -1 if all returns false.   
- */
-  std::map<Int_t, CbmTrdParMod*>::const_iterator it = fModuleMap.begin();
-  CbmTrdParAsic* asic(nullptr);
-  while (it != fModuleMap.end()) {
-    asic = (CbmTrdParAsic*) it->second;
-    if (asic->QueryChannel(chAddress) >= 0) return it->first;
-    it++;
-  }
-  return -1;
-}
-
-//_______________________________________________________________________________
-void CbmTrdParSetAsic::GetAsicAddresses(std::vector<Int_t>* a) const
-{
-  /** Query the ASICs in the module set for their addresses. 
- * Returns the list of these addresses in the vector prepared by the user   
- */
-  std::map<Int_t, CbmTrdParMod*>::const_iterator it = fModuleMap.begin();
-  CbmTrdParAsic* asic(nullptr);
-  while (it != fModuleMap.end()) {
-    asic = (CbmTrdParAsic*) it->second;
-    a->push_back(asic->GetAddress());
-    it++;
-  }
-}
-
-//_______________________________________________________________________________
-const CbmTrdParSet* CbmTrdParSetAsic::GetModuleSet(Int_t detId) const
-{
-  /** Access the list of ASICs operating on detector detId. Use the class in the sense of
- * container of all module wise containers.
- */
-  map<Int_t, CbmTrdParSetAsic*>::const_iterator imod = fModPar.find(detId);
-  if (imod == fModPar.end()) return nullptr;
-  return imod->second;
-}
-
 //_______________________________________________________________________________
 void CbmTrdParSetAsic::Print(Option_t* opt) const
 {
-  if (fModPar.size()) {
-    printf(" %s Modules[%d]\n", GetName(), fNrOfModules);
-    map<Int_t, CbmTrdParSetAsic*>::const_iterator imod = fModPar.begin();
-    while (imod != fModPar.end()) {
-      printf("  %d %s(%s)\n", imod->first, imod->second->GetName(), imod->second->GetTitle());
-      imod->second->Print(opt);
-      imod++;
-    }
-  }
-  else if (fModuleMap.size()) {
-    printf(" %s Asics[%d]\n", GetName(), GetNofAsics());
-    if (strcmp(opt, "all") == 0) {
-      map<Int_t, CbmTrdParMod*>::const_iterator iasic = fModuleMap.begin();
-      while (iasic != fModuleMap.end()) {
-        iasic->second->Print(opt);
-        iasic++;
-      }
-    }
-  }
-}
+  printf(" %s Modules[%d]\n", GetName(), fNrOfModules);
+  for (auto imod : fModuleMap) {
 
-//_______________________________________________________________________________
-void CbmTrdParSetAsic::SetAsicPar(Int_t address, CbmTrdParAsic* p)
-{
-  std::map<Int_t, CbmTrdParMod*>::iterator it = fModuleMap.find(address);
-  if (it != fModuleMap.end()) {
-    if (address % 1000 == 999) return;
-    LOG(warn) << GetName() << "::SetAsicPar : The ASIC @ " << address << " already initialized. Skip.";
-    return;
+    printf("  %d %s(%s)\n", imod.first, imod.second->GetName(), imod.second->GetTitle());
+    imod.second->Print(opt);
   }
-  fModuleMap[address] = p;
-  fNrOfModules++;
 }
 
 ClassImp(CbmTrdParSetAsic)
diff --git a/core/detectors/trd/CbmTrdParSetAsic.h b/core/detectors/trd/CbmTrdParSetAsic.h
index b2ad65cdd7..b433124b00 100644
--- a/core/detectors/trd/CbmTrdParSetAsic.h
+++ b/core/detectors/trd/CbmTrdParSetAsic.h
@@ -32,20 +32,10 @@ public:
                    const char* context = "Default");
 
   /** \brief Destructor **/
-  virtual ~CbmTrdParSetAsic();
+  virtual ~CbmTrdParSetAsic() { ; }
 
   /** \brief Reset all parameters **/
   virtual void clear() { ; }
-  /** \brief Add ASIC par to the current module
-   * It applies to the list of ASICs.
-   * \param mod ASIC par (FASP or SPADIC)
-   */
-  virtual void addParam(CbmTrdParMod* mod);
-  /** \brief Add Module list of ASIC par to the setup list
-   * It applies to the list of lists.
-   * \param module list
-   */
-  void AddParameters(CbmTrdParSetAsic*);  // (VF) renamed to avoid shadowing of virtual method
 
   /** \brief Build the ASICs par for the current module from the info stored in the param file 
    * It applies to the list of ASICs.
@@ -58,57 +48,12 @@ public:
    */
   void putParams(FairParamList*);
 
-  /** \brief Query the ASICs in the module for their DAQ address. 
-   * It applies to the list of ASICs.
-   * Returns the list of id of the ASICs within the module.   
-   */
-  virtual void GetAsicAddresses(std::vector<Int_t>* a) const;
-  /** \brief Look for the ASIC which operates on a specific channel
-   * It applies to the list of ASICs.
-   *\param chAddress Pad address of the channel
-   *\return id of the ASIC operating on the channel. -1 in case of failure
-   */
-  virtual Int_t GetAsicAddress(Int_t chAddress) const;
-  /** \brief Look for the ASIC parameters of a given DAQ id
-   * It applies to the list of ASICs.
-   * \param address ASIC address from DAQ
-   * \return A read-only pointer to the parameters 
-   */
-  virtual const CbmTrdParAsic* GetAsicPar(Int_t address) const { return (CbmTrdParAsic*) GetModulePar(address); }
-  /** \brief Look for the ASIC parameters of a given DAQ id
-   * It applies to the list of ASICs.
-   * \param address ASIC address from DAQ
-   * \return A read-write pointer to the parameters 
-   */
-  virtual CbmTrdParAsic* GetAsicPar(Int_t address) { return (CbmTrdParAsic*) GetModulePar(address); }
-  /** \brief Query the type of ASICs in the list
-   * It applies to the list of ASICs.
-   */
-  virtual Int_t GetAsicType() const { return fType; }
-  /** \brief Returns the set of ASIC pars corresponding to a whole module
-   * It applies to the list of lists.
-   * \param detId module Identifier in the CBM geometry
-   */
-  virtual const CbmTrdParSet* GetModuleSet(Int_t detId) const;
-  /** \brief Returns the number of ASICs for the current module
-   * It applies to the list of ASICs.
-   */
-  virtual Int_t GetNofAsics() const { return GetNrOfModules(); }
-
   virtual void Print(Option_t* opt = "") const;
-  /** \brief Initialize the ASIC parameters for DAQ id
-   * It applies to the list of ASICs.
-   * \param address DAQ id of the ASIC in the current module
-   */
-  virtual void SetAsicPar(Int_t address, CbmTrdParAsic* p);
-  virtual void SetAsicType(Int_t t) { fType = t; }
 
 private:
   CbmTrdParSetAsic(const CbmTrdParSetAsic& ref);
   const CbmTrdParSetAsic& operator=(const CbmTrdParSetAsic& ref);
 
-  UChar_t fType;                               ///< type of ASIC for current se
-  std::map<Int_t, CbmTrdParSetAsic*> fModPar;  ///< module wise list of ASIC sets
   ClassDef(CbmTrdParSetAsic,
            1);  // The set of ASIC settings for all TRD modules
 };
diff --git a/macro/run/run_unpack_online.C b/macro/run/run_unpack_online.C
index d11d8b5015..67ee880222 100644
--- a/macro/run/run_unpack_online.C
+++ b/macro/run/run_unpack_online.C
@@ -291,38 +291,38 @@ void run_unpack_online(std::vector<std::string> publisher = {"tcp://localhost:55
     trdfasp2dconfig->SetDoWriteOutput();
     // Activate the line below to write Trd1D digis to a separate "TrdFaspDigi" branch. Can be used to separate between Fasp and Spadic digis
     // trdfasp2dconfig->SetOutputBranchName("TrdFaspDigi");
-    uint8_t map[NFASPMOD];
-    uint16_t crob_map[NCROBMOD];
-    for (uint32_t i(0); i < NFASPMOD; i++)
-      map[i] = i;
-    if (runid <= 1588) {
-      const size_t nfasps = 12;
-      uint8_t map21[] = {9, 2, 3, 11, 10, 7, 8, 0, 1, 4, 6, 5};
-      for (uint32_t i(0); i < nfasps; i++)
-        map[i] = map21[i];
-      uint16_t crob_map21[] = {0x00f0, 0, 0, 0, 0};
-      for (uint32_t i(0); i < NCROBMOD; i++)
-        crob_map[i] = crob_map21[i];
-    }
-    else if (runid >= 2335) {
-      const size_t nfasp0 = 72;
-      const size_t nfasps = 36;
-      uint8_t map22[]     = {
-        84,  85,  86,  87,  88,  89,   // FEB14/0xffc1
-        90,  91,  92,  93,  94,  95,   // FEB17/0xffc1
-        96,  97,  98,  99,  100, 101,  // FEB18/0xffc1
-        102, 103, 104, 105, 106, 107,  // FEB16/0xffc1
-        72,  73,  74,  75,  76,  77,   // FEB9/0xffc1
-        78,  79,  80,  81,  82,  83    // FEB8/0xffc1
-      };
-      for (uint32_t i(0); i < nfasps; i++)
-        map[i + nfasp0] = map22[i];
-      uint16_t crob_map22[] = {0xffc2, 0xffc5, 0xffc1, 0, 0};
-      for (uint32_t i(0); i < NCROBMOD; i++)
-        crob_map[i] = crob_map22[i];
-    }
-    trdfasp2dconfig->SetFaspMapping(5, map);
-    trdfasp2dconfig->SetCrobMapping(5, crob_map);
+    //   uint8_t map[NFASPMOD];
+    //   uint16_t crob_map[NCROBMOD];
+    //   for (uint32_t i(0); i < NFASPMOD; i++)
+    //     map[i] = i;
+    //   if (runid <= 1588) {
+    //     const size_t nfasps = 12;
+    //     uint8_t map21[] = {9, 2, 3, 11, 10, 7, 8, 0, 1, 4, 6, 5};
+    //     for (uint32_t i(0); i < nfasps; i++)
+    //       map[i] = map21[i];
+    //     uint16_t crob_map21[] = {0x00f0, 0, 0, 0, 0};
+    //     for (uint32_t i(0); i < NCROBMOD; i++)
+    //       crob_map[i] = crob_map21[i];
+    //   }
+    //   else if (runid >= 2335) {
+    //     const size_t nfasp0 = 72;
+    //     const size_t nfasps = 36;
+    //     uint8_t map22[]     = {
+    //       84,  85,  86,  87,  88,  89,   // FEB14/0xffc1
+    //       90,  91,  92,  93,  94,  95,   // FEB17/0xffc1
+    //       96,  97,  98,  99,  100, 101,  // FEB18/0xffc1
+    //       102, 103, 104, 105, 106, 107,  // FEB16/0xffc1
+    //       72,  73,  74,  75,  76,  77,   // FEB9/0xffc1
+    //       78,  79,  80,  81,  82,  83    // FEB8/0xffc1
+    //     };
+    //     for (uint32_t i(0); i < nfasps; i++)
+    //       map[i + nfasp0] = map22[i];
+    //     uint16_t crob_map22[] = {0xffc2, 0xffc5, 0xffc1, 0, 0};
+    //     for (uint32_t i(0); i < NCROBMOD; i++)
+    //       crob_map[i] = crob_map22[i];
+    //   }
+    //   trdfasp2dconfig->SetFaspMapping(5, map);
+    //   trdfasp2dconfig->SetCrobMapping(5, crob_map);
     std::string parfilesbasepathTrdfasp2d = Form("%s/parameters/trd", srcDir.Data());
     trdfasp2dconfig->SetParFilesBasePath(parfilesbasepathTrdfasp2d);
     trdfasp2dconfig->SetSystemTimeOffset(-1800);  // [ns] value to be updated
diff --git a/macro/run/run_unpack_tsa.C b/macro/run/run_unpack_tsa.C
index 65f975eab1..c8128016ed 100644
--- a/macro/run/run_unpack_tsa.C
+++ b/macro/run/run_unpack_tsa.C
@@ -317,25 +317,25 @@ void run_unpack_tsa(std::vector<std::string> infile = {"test.tsa"}, UInt_t runid
     trdfasp2dconfig->SetDoWriteOutput();
     // Activate the line below to write Trd1D digis to a separate "TrdFaspDigi" branch. Can be used to separate between Fasp and Spadic digis
     // trdfasp2dconfig->SetOutputBranchName("TrdFaspDigi");
-    uint8_t map[NFASPMOD];
-    uint16_t crob_map[NCROBMOD];
-    for (uint32_t i(0); i < NFASPMOD; i++)
-      map[i] = i;
-    if (runid <= 1588) {
-      const size_t nfasps = 12;
-      uint8_t map21[] = {9, 2, 3, 11, 10, 7, 8, 0, 1, 4, 6, 5};
-      for (uint32_t i(0); i < nfasps; i++)
-        map[i] = map21[i];
-      uint16_t crob_map21[] = {0x00f0, 0, 0, 0, 0};
-      for (uint32_t i(0); i < NCROBMOD; i++)
-        crob_map[i] = crob_map21[i];
-    }
-    else if (runid >= 2335) {
-      uint16_t crob_map22[] = {0xffc2, 0xffc5, 0xffc1, 0, 0};
-      for (uint32_t i(0); i < NCROBMOD; i++)
-        crob_map[i] = crob_map22[i];
-    }
-    trdfasp2dconfig->SetCrobMapping(5, crob_map);
+    //   uint8_t map[NFASPMOD];
+    //   uint16_t crob_map[NCROBMOD];
+    //   for (uint32_t i(0); i < NFASPMOD; i++)
+    //     map[i] = i;
+    //   if (runid <= 1588) {
+    //     const size_t nfasps = 12;
+    //     uint8_t map21[] = {9, 2, 3, 11, 10, 7, 8, 0, 1, 4, 6, 5};
+    //     for (uint32_t i(0); i < nfasps; i++)
+    //       map[i] = map21[i];
+    //     uint16_t crob_map21[] = {0x00f0, 0, 0, 0, 0};
+    //     for (uint32_t i(0); i < NCROBMOD; i++)
+    //       crob_map[i] = crob_map21[i];
+    //   }
+    //   else if (runid >= 2335) {
+    //     uint16_t crob_map22[] = {0xffc2, 0xffc5, 0xffc1, 0, 0};
+    //     for (uint32_t i(0); i < NCROBMOD; i++)
+    //       crob_map[i] = crob_map22[i];
+    //   }
+    //   trdfasp2dconfig->SetCrobMapping(5, crob_map);
     std::string parfilesbasepathTrdfasp2d = Form("%s/parameters/trd", srcDir.Data());
     trdfasp2dconfig->SetParFilesBasePath(parfilesbasepathTrdfasp2d);
     trdfasp2dconfig->SetSystemTimeOffset(-1800);  // [ns] value to be updated
@@ -345,7 +345,7 @@ void run_unpack_tsa(std::vector<std::string> infile = {"test.tsa"}, UInt_t runid
     if (2350 <= runid) {
       trdfasp2dconfig->SetSystemTimeOffset(-510);  // [ns] value to be updated
     }
-    // trdfasp2dconfig->SetMonitor(dynamic_pointer_cast<CbmTrdUnpackFaspMonitor>(GetTrdMonitor(outfilename, 1)));
+    trdfasp2dconfig->SetMonitor(dynamic_pointer_cast<CbmTrdUnpackFaspMonitor>(GetTrdMonitor(outfilename, 1)));
   }
   // -------------
 
diff --git a/reco/detectors/trd/CbmTrdClusterFinder.cxx b/reco/detectors/trd/CbmTrdClusterFinder.cxx
index d470d6825f..abcdab7a8a 100644
--- a/reco/detectors/trd/CbmTrdClusterFinder.cxx
+++ b/reco/detectors/trd/CbmTrdClusterFinder.cxx
@@ -185,8 +185,8 @@ CbmTrdModuleRec* CbmTrdClusterFinder::AddModule(const CbmTrdDigi* digi)
     module->SetDigiPar(pDigi);
 
   // try to load ASIC parameters for module
-  CbmTrdParSetAsic* pAsic(NULL);
-  if (!fAsicPar || !(pAsic = (CbmTrdParSetAsic*) fAsicPar->GetModuleSet(address))) {
+  CbmTrdParModAsic* pAsic(NULL);
+  if (!fAsicPar || !(pAsic = (CbmTrdParModAsic*) fAsicPar->GetModulePar(address))) {
     LOG(warn) << GetName() << "::AddModule : No ASIC params for modAddress " << address << ". Using default.";
     //    module->SetAsicPar(); // map ASIC channels to read-out channels - need ParModDigi already loaded
   }
diff --git a/reco/detectors/trd/CbmTrdHitProducer.cxx b/reco/detectors/trd/CbmTrdHitProducer.cxx
index 7f77912475..c2179dc347 100644
--- a/reco/detectors/trd/CbmTrdHitProducer.cxx
+++ b/reco/detectors/trd/CbmTrdHitProducer.cxx
@@ -120,8 +120,8 @@ CbmTrdModuleRec* CbmTrdHitProducer::AddModule(Int_t address, const CbmTrdParModG
     module->SetDigiPar(pDigi);
 
   // try to load ASIC parameters for module
-  CbmTrdParSetAsic* pAsic(NULL);
-  if (!fAsicPar || !(pAsic = (CbmTrdParSetAsic*) fAsicPar->GetModuleSet(address))) {
+  CbmTrdParModAsic* pAsic(NULL);
+  if (!fAsicPar || !(pAsic = (CbmTrdParModAsic*) fAsicPar->GetModulePar(address))) {
     LOG(warn) << GetName() << "::AddModule : No ASIC params for modAddress " << address << ". Using default.";
     //    module->SetAsicPar(); // map ASIC channels to read-out channels - need ParModDigi already loaded
   }
diff --git a/reco/detectors/trd/qa/CbmTrdHitDensityQa.cxx b/reco/detectors/trd/qa/CbmTrdHitDensityQa.cxx
index 581d94d51b..58531faaa3 100644
--- a/reco/detectors/trd/qa/CbmTrdHitDensityQa.cxx
+++ b/reco/detectors/trd/qa/CbmTrdHitDensityQa.cxx
@@ -9,6 +9,7 @@
 #include "CbmTrdDigi.h"
 #include "CbmTrdGeoHandler.h"
 #include "CbmTrdHit.h"
+#include "CbmTrdParModAsic.h"
 #include "CbmTrdParModDigi.h"
 #include "CbmTrdParModGeo.h"
 #include "CbmTrdParSetAsic.h"
@@ -229,7 +230,7 @@ void CbmTrdHitDensityQa::Exec(Option_t*)
         Int_t moduleAddress = CbmTrdAddress::GetModuleAddress(digiAddress);
         //	Int_t moduleId = CbmTrdAddress::GetModuleId(moduleAddress);// TODO
         fLayer                        = CbmTrdAddress::GetLayerId(moduleAddress);
-        CbmTrdParSetAsic* fModuleAsic = (CbmTrdParSetAsic*) fAsicPar->GetModuleSet(moduleAddress);
+        CbmTrdParModAsic* fModuleAsic = (CbmTrdParModAsic*) fAsicPar->GetModulePar(moduleAddress);
         CbmTrdParModDigi* fModuleDigi = (CbmTrdParModDigi*) fDigiPar->GetModulePar(moduleAddress);
         if (fModuleHitMap.find(moduleAddress) == fModuleHitMap.end()) {
           title.Form("hd_Module_%i", moduleAddress);
@@ -273,7 +274,7 @@ void CbmTrdHitDensityQa::Exec(Option_t*)
       //      Int_t moduleId = CbmTrdAddress::GetModuleId(moduleAddress);// TODO
       fLayer                        = CbmTrdAddress::GetLayerId(moduleAddress);
       CbmTrdParModDigi* fModuleDigi = (CbmTrdParModDigi*) fDigiPar->GetModulePar(moduleAddress);
-      CbmTrdParSetAsic* fModuleAsic = (CbmTrdParSetAsic*) fAsicPar->GetModuleSet(moduleAddress);
+      CbmTrdParModAsic* fModuleAsic = (CbmTrdParModAsic*) fAsicPar->GetModulePar(moduleAddress);
       if (digi->GetCharge() > fTriggerThreshold) {
         if (fModuleHitMap.find(moduleAddress) == fModuleHitMap.end()) {
           title.Form("hd_Module_%i", moduleAddress);
@@ -498,7 +499,7 @@ void CbmTrdHitDensityQa::Finish()
     CbmTrdParModDigi* fModuleDigi = (CbmTrdParModDigi*) fDigiPar->GetModulePar(fModuleHitMapIt->first);
     CbmTrdParModGeo* fModuleGeo   = (CbmTrdParModGeo*) fGeoPar->GetModulePar(fModuleHitMapIt->first);
     gGeoManager->FindNode(fModuleGeo->GetX(), fModuleGeo->GetY(), fModuleGeo->GetZ());
-    CbmTrdParSetAsic* fModuleAsic = (CbmTrdParSetAsic*) fAsicPar->GetModuleSet(fModuleHitMapIt->first);
+    CbmTrdParModAsic* fModuleAsic = (CbmTrdParModAsic*) fAsicPar->GetModulePar(fModuleHitMapIt->first);
     std::vector<Int_t> AsicAddresses;
     fModuleAsic->GetAsicAddresses(&AsicAddresses);
     Int_t nofAsics = fModuleAsic->GetNofAsics();
diff --git a/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.cxx b/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.cxx
index 028ec5e783..c0ba18bc92 100644
--- a/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.cxx
+++ b/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.cxx
@@ -7,6 +7,7 @@
 
 #include "CbmTrdDigi.h"
 #include "CbmTrdParFasp.h"
+#include "CbmTrdParModAsic.h"
 #include "CbmTrdParModDigi.h"
 #include "CbmTrdParSetDigi.h"
 #include "CbmTrdParSetGain.h"
@@ -55,23 +56,23 @@ Bool_t CbmTrdUnpackFaspAlgo::initParSet(FairParGenericSet* parset)
   if (strcmp(parset->ClassName(), "CbmTrdParSetAsic") == 0) {
     CbmTrdParSetAsic* setPar = static_cast<CbmTrdParSetAsic*>(parset);
     for (auto did : fModuleId) {
-      const CbmTrdParSetAsic* setDet = static_cast<const CbmTrdParSetAsic*>(setPar->GetModuleSet(did));
+      auto setDet = static_cast<const CbmTrdParModAsic*>(setPar->GetModulePar(did));
       if (!setDet) continue;
-      if (setDet->GetAsicType() != Int_t(CbmTrdDigi::eCbmTrdAsicType::kFASP)) continue;
+      if (setDet->GetAsicType() != CbmTrdDigi::eCbmTrdAsicType::kFASP) continue;
       if (fMonitor) fMonitor->addParam(did, setDet);
       nModules++;
       std::vector<Int_t> a;
       setDet->GetAsicAddresses(&a);
       for (auto add : a) {
-        CbmTrdParAsic* asic = (CbmTrdParAsic*) setDet->GetModulePar(add);
+        CbmTrdParAsic* asic = (CbmTrdParAsic*) setDet->GetAsicPar(add);
         if (asic->IsA() == CbmTrdParSpadic::Class()) continue;
-        fAsicPar.addParam(asic);
+        fAsicSet.addParam(asic);
         if (VERBOSE > 2) asic->Print();
       }
     }
     //      setPar->printParams();
     LOG(info) << GetName() << "::initParSet - for container " << parset->ClassName() << " modules " << nModules
-              << " asics " << fAsicPar.GetNrOfModules();
+              << " asics " << fAsicSet.GetNrOfModules();
   }
   else if (strcmp(parset->ClassName(), "CbmTrdParSetDigi") == 0) {
     fDigiSet                          = static_cast<CbmTrdParSetDigi*>(parset);
@@ -198,7 +199,8 @@ void CbmTrdUnpackFaspAlgo::mess_prt(CbmTrdFaspMessage* mess)
 bool CbmTrdUnpackFaspAlgo::pushDigis(std::vector<CbmTrdUnpackFaspAlgo::CbmTrdFaspMessage> messes, const uint16_t mod_id)
 {
   const UChar_t lFasp             = messes[0].fasp;
-  const CbmTrdParFasp* faspPar    = (CbmTrdParFasp*) fAsicPar.GetAsicPar(mod_id * 1000 + lFasp);
+  const CbmTrdParModAsic* asicPar = (CbmTrdParModAsic*) fAsicSet.GetModulePar(mod_id);
+  const CbmTrdParFasp* faspPar    = (CbmTrdParFasp*) asicPar->GetAsicPar(mod_id * 1000 + lFasp);
   const CbmTrdParModDigi* digiPar = (CbmTrdParModDigi*) fDigiSet->GetModulePar(mod_id);
 
   // link data to the position on the padplane
diff --git a/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.h b/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.h
index bff7160f9d..cb05bb7e4a 100644
--- a/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.h
+++ b/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.h
@@ -101,7 +101,7 @@ public:
     uint8_t fasp   = 0;  ///< FASP id in the module
   };
   /** Access the asic parameter list, read-only*/
-  virtual const CbmTrdParSetAsic* GetAsicPar() const { return &fAsicPar; }
+  virtual const CbmTrdParSetAsic* GetAsicPar() const { return &fAsicSet; }
   /**
    * @brief Get the requested parameter containers.
    * Return the required parameter containers together with the paths to the ascii
@@ -207,7 +207,7 @@ private:
   std::shared_ptr<CbmTrdUnpackFaspMonitor> fMonitor = nullptr;
   uint16_t fCrob                                    = 0xffff;  //! current crob being processed
   std::vector<uint16_t> fModuleId = {};  ///> list of modules for which there is are calibration parameters
-  CbmTrdParSetAsic fAsicPar;
+  CbmTrdParSetAsic fAsicSet;
   CbmTrdParSetDigi* fDigiSet = nullptr;
 
   ClassDef(CbmTrdUnpackFaspAlgo, 3)  // unpack FASP read-out detectors
diff --git a/reco/detectors/trd/unpack/CbmTrdUnpackFaspMonitor.cxx b/reco/detectors/trd/unpack/CbmTrdUnpackFaspMonitor.cxx
index b2bef60976..681684bf60 100644
--- a/reco/detectors/trd/unpack/CbmTrdUnpackFaspMonitor.cxx
+++ b/reco/detectors/trd/unpack/CbmTrdUnpackFaspMonitor.cxx
@@ -115,35 +115,40 @@ Bool_t CbmTrdUnpackFaspMonitor::Init()
 }
 
 //_________________________________________________________________________________
-void CbmTrdUnpackFaspMonitor::MapMaskedChannels(const CbmTrdParSetAsic* par)
+void CbmTrdUnpackFaspMonitor::MapMaskedChannels(const CbmTrdParSetAsic* set)
 {
   int ncol(-1), modAddress(-1);
   std::shared_ptr<TH1> histo = nullptr;
 
   std::vector<int> faspAddress;
-  par->GetAsicAddresses(&faspAddress);
-  for (auto address : faspAddress) {
-    CbmTrdParFasp* fasp = (CbmTrdParFasp*) par->GetModulePar(address);
-
-    if (modAddress != address / 1000) {
-      modAddress   = address / 1000;
-      auto modpair = fDigiHistoMap[eDigiHistos::kMap_St];
-      if (modpair.find(modAddress) == modpair.end()) continue;
-      if (!(histo = modpair[modAddress])) continue;
-
-      if (fModuleDef.find(modAddress) == fModuleDef.end()) continue;
-      ncol = std::get<1>(fModuleDef[modAddress]);
-    }
-    for (int ich(0); ich < NFASPCH; ich++) {
-      const CbmTrdParFaspChannel* faspCh = fasp->GetChannel(ich);
-      int pad = fasp->GetPadAddress(ich), row = pad / ncol, col = pad % ncol;
-      if (faspCh->IsMasked()) histo->Fill(col + (faspCh->HasPairingR() ? 1 : -1) * 0.25, row);
+  for (int idet(0); idet < set->GetNrOfModules(); idet++) {
+    CbmTrdParModAsic* par = (CbmTrdParModAsic*) set->GetModulePar(set->GetModuleId(idet));
+    if (par->GetAsicType() != CbmTrdDigi::eCbmTrdAsicType::kFASP) continue;
+
+    par->GetAsicAddresses(&faspAddress);
+    for (auto address : faspAddress) {
+      CbmTrdParFasp* fasp = (CbmTrdParFasp*) par->GetAsicPar(address);
+
+      if (modAddress != address / 1000) {
+        modAddress   = address / 1000;
+        auto modpair = fDigiHistoMap[eDigiHistos::kMap_St];
+        if (modpair.find(modAddress) == modpair.end()) continue;
+        if (!(histo = modpair[modAddress])) continue;
+
+        if (fModuleDef.find(modAddress) == fModuleDef.end()) continue;
+        ncol = std::get<1>(fModuleDef[modAddress]);
+      }
+      for (int ich(0); ich < NFASPCH; ich++) {
+        const CbmTrdParFaspChannel* faspCh = fasp->GetChannel(ich);
+        int pad = fasp->GetPadAddress(ich), row = pad / ncol, col = pad % ncol;
+        if (faspCh->IsMasked()) histo->Fill(col + (faspCh->HasPairingR() ? 1 : -1) * 0.25, row);
+      }
     }
   }
 }
 
 //_________________________________________________________________________
-void CbmTrdUnpackFaspMonitor::addParam(uint32_t madd, const CbmTrdParSetAsic* asics)
+void CbmTrdUnpackFaspMonitor::addParam(uint32_t madd, const CbmTrdParModAsic* asics)
 {
   auto moduleDef = fModuleDef.find(madd);
   if (moduleDef == fModuleDef.end()) {
@@ -155,7 +160,7 @@ void CbmTrdUnpackFaspMonitor::addParam(uint32_t madd, const CbmTrdParSetAsic* as
   std::vector<Int_t> add;
   asics->GetAsicAddresses(&add);
   for (auto afasp : add) {
-    CbmTrdParFasp* fasp = (CbmTrdParFasp*) asics->GetModulePar(afasp);
+    CbmTrdParFasp* fasp = (CbmTrdParFasp*) asics->GetAsicPar(afasp);
 
     int faspid(afasp % 1000), ich(faspid * 100);
     for (auto ach : fasp->GetChannelAddresses()) {
diff --git a/reco/detectors/trd/unpack/CbmTrdUnpackFaspMonitor.h b/reco/detectors/trd/unpack/CbmTrdUnpackFaspMonitor.h
index ca6e7507bf..f42558d021 100644
--- a/reco/detectors/trd/unpack/CbmTrdUnpackFaspMonitor.h
+++ b/reco/detectors/trd/unpack/CbmTrdUnpackFaspMonitor.h
@@ -19,6 +19,7 @@
 #define CbmTrdUnpackFaspMonitor_H
 
 #include "CbmTrdDigi.h"
+#include "CbmTrdParModAsic.h"
 #include "CbmTrdParModDigi.h"
 #include "CbmTrdParSetAsic.h"
 #include "CbmTrdUnpackMonitor.h"
@@ -84,7 +85,7 @@ protected:
    *  @param madd module address to be added
    *  @param asics asic properties for the current module
    */
-  void addParam(uint32_t madd, const CbmTrdParSetAsic* asics);
+  void addParam(uint32_t madd, const CbmTrdParModAsic* asics);
   /** @brief Init module pad-plane parameters
    *  @param madd module address to be checked
    *  @param digis pad-plane properties for the current module
diff --git a/reco/detectors/trd/unpack/CbmTrdUnpackMonitor.cxx b/reco/detectors/trd/unpack/CbmTrdUnpackMonitor.cxx
index b294a1fb4d..7659647d4d 100644
--- a/reco/detectors/trd/unpack/CbmTrdUnpackMonitor.cxx
+++ b/reco/detectors/trd/unpack/CbmTrdUnpackMonitor.cxx
@@ -5,6 +5,7 @@
 #include "CbmTrdUnpackMonitor.h"
 
 #include "CbmTrdDigi.h"
+#include "CbmTrdParModAsic.h"
 #include "CbmTrdParModDigi.h"
 #include "CbmTrdRawMessageSpadic.h"
 
@@ -158,8 +159,8 @@ Bool_t CbmTrdUnpackMonitor::Init(CbmTrdParSetDigi* digiParSet, CbmTrdParSetAsic*
   for (auto modulepair : modulemap) {
     auto parmoddigi = static_cast<CbmTrdParModDigi*>(modulepair.second);
     if (asicParSet) {
-      auto asicParMod = static_cast<const CbmTrdParSetAsic*>(asicParSet->GetModuleSet(modulepair.first));
-      if (asicParMod->GetAsicType() != Int_t(CbmTrdDigi::eCbmTrdAsicType::kSPADIC)) continue;
+      auto asicParMod = static_cast<const CbmTrdParModAsic*>(asicParSet->GetModulePar(modulepair.first));
+      if (asicParMod->GetAsicType() != CbmTrdDigi::eCbmTrdAsicType::kSPADIC) continue;
     }
     fModuleIdsVec.emplace_back(modulepair.first);
 
diff --git a/reco/tasks/CbmTaskUnpack.cxx b/reco/tasks/CbmTaskUnpack.cxx
index 60db004b8a..9441187a37 100644
--- a/reco/tasks/CbmTaskUnpack.cxx
+++ b/reco/tasks/CbmTaskUnpack.cxx
@@ -271,10 +271,10 @@ cbm::algo::TrdReadoutConfig CbmTaskUnpack::InitTrdReadoutConfig()
     channelMap;  //[criId][crobId][elinkId][chanId] -> chanAddress
 
   for (auto module : moduleIds) {
-    CbmTrdParSetAsic* moduleSet = (CbmTrdParSetAsic*) trdpar.GetModuleSet(module);
+    CbmTrdParModAsic* moduleSet = (CbmTrdParModAsic*) trdpar.GetModulePar(module);
 
     // Skip entries for "Fasp" modules in .asic.par file
-    if (moduleSet->GetAsicType() != static_cast<int32_t>(CbmTrdDigi::eCbmTrdAsicType::kSPADIC)) continue;
+    if (moduleSet->GetAsicType() != CbmTrdDigi::eCbmTrdAsicType::kSPADIC) continue;
 
     std::vector<int> asicAddresses;
     moduleSet->GetAsicAddresses(&asicAddresses);
diff --git a/sim/detectors/trd/CbmTrdDigitizer.cxx b/sim/detectors/trd/CbmTrdDigitizer.cxx
index 2a36c4f662..8ac36826bb 100644
--- a/sim/detectors/trd/CbmTrdDigitizer.cxx
+++ b/sim/detectors/trd/CbmTrdDigitizer.cxx
@@ -15,6 +15,7 @@
 #include "CbmTrdModuleSimR.h"
 #include "CbmTrdPads.h"
 #include "CbmTrdParAsic.h"
+#include "CbmTrdParModAsic.h"
 #include "CbmTrdParModDigi.h"
 #include "CbmTrdParModGain.h"
 #include "CbmTrdParModGas.h"
@@ -378,8 +379,8 @@ CbmTrdModuleSim* CbmTrdDigitizer::AddModule(Int_t detId)
   // TODO check if this works also for ModuleR (moduleType < 9) modules
   if (moduleType >= 9) {
     // try to load ASIC parameters for module
-    CbmTrdParSetAsic* pAsic(NULL);
-    if (!fAsicPar || !(pAsic = (CbmTrdParSetAsic*) fAsicPar->GetModuleSet(detId))) {
+    CbmTrdParModAsic* pAsic(NULL);
+    if (!fAsicPar || !(pAsic = (CbmTrdParModAsic*) fAsicPar->GetModulePar(detId))) {
       LOG(debug) << GetName() << "::AddModule : No ASIC params for module @ " << path << ". Using default.";
       module->SetAsicPar();  // map ASIC channels to read-out channels - need ParModDigi already loaded
     }
diff --git a/sim/detectors/trd/CbmTrdModuleSim2D.cxx b/sim/detectors/trd/CbmTrdModuleSim2D.cxx
index 5d68a3de01..020eed0b55 100644
--- a/sim/detectors/trd/CbmTrdModuleSim2D.cxx
+++ b/sim/detectors/trd/CbmTrdModuleSim2D.cxx
@@ -798,7 +798,7 @@ void CbmTrdModuleSim2D::DumpBuffer() const
 
 
 //_______________________________________________________________________________
-void CbmTrdModuleSim2D::SetAsicPar(CbmTrdParSetAsic* p)
+void CbmTrdModuleSim2D::SetAsicPar(CbmTrdParModAsic* p)
 {
   /** Build local set of ASICs and perform initialization. Need a proper fDigiPar already defined.
  */
diff --git a/sim/detectors/trd/CbmTrdModuleSim2D.h b/sim/detectors/trd/CbmTrdModuleSim2D.h
index 4341b778f2..e7765f7368 100644
--- a/sim/detectors/trd/CbmTrdModuleSim2D.h
+++ b/sim/detectors/trd/CbmTrdModuleSim2D.h
@@ -10,7 +10,7 @@
 class CbmTimeSlice;
 class CbmTrdFASP;
 class CbmTrdTrianglePRF;
-class CbmTrdParSetAsic;
+class CbmTrdParModAsic;
 /** @class CbmTrdModuleSim2D
  ** @brief Simulation module implementation for TRD-2D physics and FEE
  ** @author Alex Bercuci <abercuci@niham.nipne.ro>  
@@ -69,7 +69,7 @@ public:
    * \param[in] set default use FASP/GETS via CbmTrdFASP class. If set to false use SPADIC TODO
    **/
   void SetFasp(Bool_t set = kTRUE) { set ? SETBIT(fConfig, kFEE) : CLRBIT(fConfig, kFEE); }
-  void SetAsicPar(CbmTrdParSetAsic* p = NULL);
+  void SetAsicPar(CbmTrdParModAsic* p = NULL);
   Bool_t UseFasp() const { return TESTBIT(fConfig, kFEE); }
 
 private:
diff --git a/sim/detectors/trd/CbmTrdModuleSimR.cxx b/sim/detectors/trd/CbmTrdModuleSimR.cxx
index cfb1e3547f..8a54c57fe5 100644
--- a/sim/detectors/trd/CbmTrdModuleSimR.cxx
+++ b/sim/detectors/trd/CbmTrdModuleSimR.cxx
@@ -8,8 +8,8 @@
 #include "CbmTrdAddress.h"
 #include "CbmTrdDigi.h"
 #include "CbmTrdDigitizer.h"
+#include "CbmTrdParModAsic.h"
 #include "CbmTrdParModDigi.h"
-#include "CbmTrdParSetAsic.h"
 #include "CbmTrdParSpadic.h"
 #include "CbmTrdPoint.h"
 #include "CbmTrdRadiator.h"
@@ -1607,7 +1607,7 @@ void CbmTrdModuleSimR::SetAsicPar(CbmTrdParSetAsic* /*p*/)
     LOG(warn) << GetName() << "::SetAsicPar : The list for module " << fModAddress << " already initialized.";
     return;
   }
-  fAsicPar = new CbmTrdParSetAsic();
+  fAsicPar = new CbmTrdParModAsic();
   CbmTrdParSpadic* asic(NULL);
 
   Int_t iFebGroup = 0;           // 1; 2;  // normal, super, ultimate
@@ -1645,7 +1645,7 @@ void CbmTrdModuleSimR::SetAsicPar(CbmTrdParSetAsic* /*p*/)
             // local_point[i] must be >= 0 at this point      Double_t local_point[3];
             Double_t fDx(GetDx()), fDy(GetDy());
             asic = new CbmTrdParSpadic(iAsic, iFebGroup, local_point[0] - fDx, local_point[1] - fDy);
-            fAsicPar->SetAsicPar(iAsic, asic);
+            fAsicPar->SetAsicPar(asic);
             if (local_point[0] > 2 * fDx) {
               LOG(error) << "CbmTrdModuleSimR::SetAsicPar: asic position x=" << local_point[0]
                          << " is out of bounds [0," << 2 * fDx << "]!";
diff --git a/sim/detectors/trd/qa/CbmTrdHitRateFastQa.cxx b/sim/detectors/trd/qa/CbmTrdHitRateFastQa.cxx
index 05f9a807eb..9f9b49953c 100644
--- a/sim/detectors/trd/qa/CbmTrdHitRateFastQa.cxx
+++ b/sim/detectors/trd/qa/CbmTrdHitRateFastQa.cxx
@@ -7,6 +7,7 @@
 #include "CbmTrdAddress.h"
 #include "CbmTrdGeoHandler.h"
 #include "CbmTrdParAsic.h"
+#include "CbmTrdParModAsic.h"
 #include "CbmTrdParModDigi.h"
 #include "CbmTrdParModGeo.h"
 #include "CbmTrdParSetAsic.h"
@@ -616,7 +617,7 @@ void CbmTrdHitRateFastQa::ScanModulePlane(const Int_t moduleAddress, TCanvas*& c
   Double_t ratePerModule = 0;  // sum of data from this module
   TVector3 padPos;
   TVector3 padSize;
-  CbmTrdParSetAsic* fModuleAsic = (CbmTrdParSetAsic*) fAsicPar->GetModuleSet(moduleAddress);
+  CbmTrdParModAsic* fModuleAsic = (CbmTrdParModAsic*) fAsicPar->GetModulePar(moduleAddress);
   CbmTrdParModDigi* fModuleInfo = (CbmTrdParModDigi*) fDigiPar->GetModulePar(moduleAddress);
   CbmTrdParModGeo* fModuleGeo   = (CbmTrdParModGeo*) fGeoPar->GetModulePar(moduleAddress);
   gGeoManager->FindNode(fModuleGeo->GetX(), fModuleGeo->GetY(), fModuleGeo->GetZ());
-- 
GitLab