CbmRoot
Loading...
Searching...
No Matches
CbmTaskTrdUnpackParWrite.cxx
Go to the documentation of this file.
1/* Copyright (C) 2024 FIAS Frankfurt Institute for Advanced Studies, Frankfurt / Main
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Felix Weiglhofer [committer] */
4
6
7#include "CbmTrdParFasp.h"
8#include "CbmTrdParModAsic.h"
9#include "CbmTrdParModDigi.h"
10#include "CbmTrdParSetAsic.h"
11#include "CbmTrdParSetDigi.h"
12#include "CbmTrdParSpadic.h"
13#include "trd/ReadoutConfig.h"
14#include "trd2d/ReadoutConfig.h"
15#include "yaml/Yaml.h"
16
17#include <FairParamList.h>
18#include <fairlogger/Logger.h>
19
20#include <fstream>
21
22using namespace cbm::algo;
23
25{
26
27 assert(fPars.digi != nullptr);
28 auto& digiparset = *fPars.digi;
29
30 assert(fPars.asic != nullptr);
31 auto& asicparset = *fPars.asic;
32
33
34 // TRD2D ===================================================================
35 {
36 // Output object
38
39 // Map (moduleId) -> (array of crobId)
40 std::map<uint32_t, std::vector<uint16_t>> crobMap;
41 // Map (equipId, asicId, chanId) -> (pad address, mask flag, daq offset [FASP clk])
42 std::map<size_t, std::map<size_t, std::map<size_t, std::tuple<int32_t, bool, uint8_t, uint16_t>>>> channelMap;
43
44 // Loop through a list of module IDs from the .digi file (can in principle contradict crob_map).
45 for (auto entry : digiparset.GetModuleMap()) {
46
47 const auto moduleId = entry.first;
48
49 // Get ASIC parameters for this module
50 CbmTrdParModAsic* setDet = static_cast<CbmTrdParModAsic*>(asicparset.GetModulePar(moduleId));
51 if (!setDet) continue;
52 if (setDet->GetAsicType() != CbmTrdDigi::eCbmTrdAsicType::kFASP) continue;
53 auto digipar = entry.second;
54
55 const int* crobs = setDet->GetCrobAddresses();
56 for (int icrob(0); icrob < NCROBMOD; icrob++) {
57 crobMap[moduleId].emplace_back(crobs[icrob] & 0xffff);
58 // check if there is an extra fiber defined on this ROB (version 2025 -)
59 uint16_t eq_id = (crobs[icrob] >> 16) & 0xffff;
60 if (eq_id) crobMap[moduleId].emplace_back(eq_id);
61 }
62 // Loop through ASICs for this module
63 std::vector<int32_t> addresses;
64 setDet->GetAsicAddresses(&addresses);
65 for (auto add : addresses) {
66 //Get local IDs for this component / equipment.
67 const int32_t fasp_in_mod = add - 1000 * moduleId;
68 const int32_t fasp_in_eq = fasp_in_mod % (NFASPCROB);
69 const int32_t crob_in_mod = fasp_in_mod / (NFASPCROB);
70 const uint16_t eq_id = crobMap[moduleId][crob_in_mod];
71
72 // ASIC parameter set
73 CbmTrdParFasp* fasppar = (CbmTrdParFasp*) setDet->GetAsicPar(add);
74
75 // Loop through channels for this ASIC and fill map
76 for (int chan = 0; chan < fasppar->GetNchannels(); chan++) {
77 const CbmTrdParFaspChannel* faspch = fasppar->GetChannel(chan);
78 const int32_t pad = fasppar->GetPadAddress(chan) * (faspch->HasPairingR() ? 1 : -1);
79 const bool isMasked = faspch->IsMasked();
80 uint8_t daq_offset = 0;
81 uint8_t thres = 0;
82 if (((CbmTrdParModDigi*) digipar)->GetPadRow(pad) % 2 == 0) daq_offset = 3;
83 channelMap[eq_id][fasp_in_eq][chan] = std::make_tuple(pad, isMasked, daq_offset, thres);
84 }
85 }
86 }
87
88 trd2dConfig.InitComponentMap(crobMap);
89 trd2dConfig.InitChannelMap(channelMap);
90
91 // Apply system time offset
92 // See <source_dir>/macro/run/run_unpack_tsa.C
93 if (fPars.setup == Setup::mCBM2022 || fPars.setup == Setup::mCBM2024_03 || fPars.setup == Setup::mCBM2024_05) {
94 // Ni 2022, Au 2022, Ni 2024
95 trd2dConfig.SetSystemTimeOffset(-510);
96 }
97
98 std::ofstream("Trd2dReadoutSetup.yaml") << yaml::Dump{}(trd2dConfig);
99 }
100
101 // TRD1D ===================================================================
102 {
103 // Output object
105
106 FairParamList parlist;
107 asicparset.putParams(&parlist);
108
109 std::vector<int> moduleIds(asicparset.GetNrOfModules());
110 parlist.fill("ModuleId", moduleIds.data(), moduleIds.size());
111
112 std::map<size_t, std::map<size_t, std::map<size_t, size_t>>> addressMap; //[criId][crobId][elinkId] -> asicAddress
113 std::map<size_t, std::map<size_t, std::map<size_t, std::map<size_t, size_t>>>>
114 channelMap; //[criId][crobId][elinkId][chanId] -> chanAddress
115
116 for (auto module : moduleIds) {
117 CbmTrdParModAsic* moduleSet = (CbmTrdParModAsic*) asicparset.GetModulePar(module);
118
119 // Skip entries for "Fasp" modules in .asic.par file
120 if (moduleSet->GetAsicType() != CbmTrdDigi::eCbmTrdAsicType::kSPADIC) continue;
121
122 std::vector<int> asicAddresses;
123 moduleSet->GetAsicAddresses(&asicAddresses);
124
125 for (auto address : asicAddresses) {
126 CbmTrdParSpadic* asicPar = (CbmTrdParSpadic*) moduleSet->GetAsicPar(address);
127 const uint16_t criId = asicPar->GetCriId();
128 const uint8_t crobId = asicPar->GetCrobId();
129 const uint8_t elinkId = asicPar->GetElinkId(0);
130 if (elinkId >= 98) {
131 continue;
132 } // Don't add not connected asics to the map
133 addressMap[criId][crobId][elinkId] = address;
134 addressMap[criId][crobId][elinkId + 1] = address;
135
136 const uint8_t numChans = 16;
137 for (uint8_t chan = 0; chan < numChans; chan++) {
138 auto asicChannelId = (elinkId % 2) == 0 ? chan : chan + numChans;
139 auto chanAddr = asicPar->GetChannelAddresses().at(asicChannelId);
140 channelMap[criId][crobId][elinkId][chan] = chanAddr;
141 }
142 for (uint8_t chan = 0; chan < numChans; chan++) {
143 auto asicChannelId = (elinkId + 1 % 2) == 0 ? chan : chan + numChans;
144 auto chanAddr = asicPar->GetChannelAddresses().at(asicChannelId);
145 channelMap[criId][crobId][elinkId + 1][chan] = chanAddr;
146 }
147 LOG(debug) << "componentID " << asicPar->GetComponentId() << " "
148 << "address " << address << " key " << criId << " " << unsigned(crobId) << " " << unsigned(elinkId);
149 }
150 }
151 trdConfig.Init(addressMap, channelMap);
152
153 // Apply system time offset
154 // See <source_dir>/macro/run/run_unpack_tsa.C
155 if (fPars.setup == Setup::mCBM2022 || fPars.setup == Setup::mCBM2024_03 || fPars.setup == Setup::mCBM2024_05) {
156 // Ni 2022, Au 2022, Ni 2024
157 trdConfig.SetSystemTimeOffset(1300);
158 }
159
160 // Apply time offset per elink
161 // See: https://git.cbm.gsi.de/computing/cbmroot/-/merge_requests/1751
162 // and <source_dir>/macro/run/run_unpack_tsa.C
163 if (fPars.setup == Setup::mCBM2024_05) {
164 for (int elinkId = 0; elinkId < 36; ++elinkId) {
165 trdConfig.SetElinkTimeOffset(20736, elinkId, -36);
166 trdConfig.SetElinkTimeOffset(20737, elinkId, -37);
167 trdConfig.SetElinkTimeOffset(20738, elinkId, -65);
168 trdConfig.SetElinkTimeOffset(20739, elinkId, -52);
169 trdConfig.SetElinkTimeOffset(20740, elinkId, -50);
170 trdConfig.SetElinkTimeOffset(20741, elinkId, -49);
171
172 //trdConfig.SetElinkTimeOffset(20992, elinkId, 0); //no correlation
173 trdConfig.SetElinkTimeOffset(20993, elinkId, -50);
174 trdConfig.SetElinkTimeOffset(20994, elinkId, -57);
175 trdConfig.SetElinkTimeOffset(20995, elinkId, -52);
176 trdConfig.SetElinkTimeOffset(20996, elinkId, -52);
177 trdConfig.SetElinkTimeOffset(20997, elinkId, -53);
178 }
179 }
180
181 std::ofstream("TrdReadoutSetup.yaml") << yaml::Dump{}(trdConfig);
182 }
183
184 return kSUCCESS;
185}
#define NCROBMOD
#define NFASPCROB
virtual std::vector< Int_t > GetChannelAddresses() const
virtual size_t GetComponentId() const
Definition of FASP channel calibration container.
Bool_t HasPairingR() const
Query pad pairing type.
bool IsMasked() const
Definition of FASP parameters.
const CbmTrdParFaspChannel * GetChannel(Int_t pad_address, UChar_t pair) const
Query the calibration for one FASP RO channel.
int GetPadAddress(Int_t ich) const
virtual Int_t GetNchannels() const
Describe TRD module ASIC settings (electronic gain, delays, etc)
virtual void GetAsicAddresses(std::vector< Int_t > *a) const
Query the ASICs in the module for their DAQ address. It applies to the list of ASICs....
virtual CbmTrdDigi::eCbmTrdAsicType GetAsicType() const
Query the type of ASICs in the list.
virtual const CbmTrdParAsic * GetAsicPar(Int_t address) const
Look for the ASIC parameters of a given DAQ id It applies to the list of ASICs.
virtual const int32_t * GetCrobAddresses() const
Query the type of chamber.
Definition of chamber gain conversion for one TRD module.
Definition of SPADIC parameters.
static std::uint16_t GetCriId(size_t componentId)
Extracts the CriId from a given componentId - Remark when the par files are created from geometries t...
static std::uint8_t GetCrobId(size_t componentId)
Extracts the CrobId from a given componentId.
static std::uint8_t GetElinkId(size_t componentId, Int_t channelId)
eLinkId for the given asicAddress and channelId (in the asic coordinates, i.e. 00....
Provides the hardware-to-software address mapping for the CBM-TRD2D.
void SetSystemTimeOffset(int64_t offsetNs)
Get system time offset.
void InitComponentMap(const std::map< uint32_t, std::vector< uint16_t > > &map)
Initialisation of readout map.
void InitChannelMap(const std::map< size_t, std::map< size_t, std::map< size_t, std::tuple< int32_t, bool, uint8_t, uint16_t > > > > &channelMap)
Initialisation of channel map.
Provides the hardware-to-software address mapping for the CBM-TRD.
void Init(const std::map< size_t, std::map< size_t, std::map< size_t, size_t > > > &addressMap, std::map< size_t, std::map< size_t, std::map< size_t, std::map< size_t, size_t > > > > &channelMap)
Initialisation of readout map.
void SetElinkTimeOffset(uint32_t criid, uint8_t elinkid, int32_t offsetNs)
Register a time offeset to be substracted from the digis which come from a specific CRI.
void SetSystemTimeOffset(int64_t offsetNs)
Get system time offset.
CbmTrdParSetAsic * asic
parameter list for ASIC characterization
cbm::algo::Setup setup
Setup type.
CbmTrdParSetDigi * digi
parameter list for read-out geometry