CbmRoot
Loading...
Searching...
No Matches
CbmTaskTrdHitFinderParWrite.cxx
Go to the documentation of this file.
1/* Copyright (C) 2010-2021 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Florian Uhlig [committer], Pascal Raisig, Alexandru Bercuci */
4
6
7#include "CbmTrdParAsic.h"
8#include "CbmTrdParFasp.h"
9#include "CbmTrdParModAsic.h"
10#include "CbmTrdParModDigi.h"
11#include "CbmTrdParModGeo.h"
12#include "CbmTrdParSetAsic.h"
13#include "CbmTrdParSetDigi.h"
14#include "CbmTrdParSetGeo.h"
15#include "TGeoPhysicalNode.h"
16#include "TVector3.h"
17#include "trd/Hitfind2DSetup.h"
18#include "trd/HitfindSetup.h"
19#include "yaml/Yaml.h"
20
21#include <FairRootManager.h>
22#include <FairRunAna.h>
23#include <FairRuntimeDb.h>
24#include <Logger.h>
25
26#include <iomanip>
27#include <iostream>
28#include <vector>
29
30using std::fixed;
31using std::left;
32using std::right;
33using std::setprecision;
34using std::setw;
35using std::stringstream;
36
37//_____________________________________________________________________
39
40//_____________________________________________________________________
42{
43 FairRuntimeDb* rtdb = FairRun::Instance()->GetRuntimeDb();
44 fAsicPar = static_cast<CbmTrdParSetAsic*>(rtdb->getContainer("CbmTrdParSetAsic"));
45 fDigiPar = static_cast<CbmTrdParSetDigi*>(rtdb->getContainer("CbmTrdParSetDigi"));
46 fGeoPar = static_cast<CbmTrdParSetGeo*>(rtdb->getContainer("CbmTrdParSetGeo"));
47}
48
49//_____________________________________________________________________
51{
52 // Get the full geometry information of the detector gas layers and store
53 // them with the CbmTrdModuleRec. This information can then be used for
54 // transformation calculations
55 if (!fGeoPar->LoadAlignVolumes()) {
56 LOG(error) << GetName() << "::Init: GEO info for modules unavailable !";
57 return kFATAL;
58 }
60 LOG(fatal) << "CbmTaskTrdHitFinderParWrite::Init() - Geometry and parameter files"
61 << " have different number of modules.";
62 }
63
64 LOG(info) << "Creating TRD + TRD2D parameters";
65
66 // Sets of module IDs
67 std::vector<uint16_t> trdModules;
68 std::vector<uint16_t> trd2DModules;
69
70 // Store IDs of 1D and 2D modules
71 for (auto entry : fDigiPar->GetModuleMap()) {
72 const auto moduleId = entry.first;
73
74 // Get ASIC parameters for this module
75 const CbmTrdParModAsic* asicPar = static_cast<const CbmTrdParModAsic*>(fAsicPar->GetModulePar(moduleId));
76 if (!asicPar) continue;
77
79 trd2DModules.push_back(entry.first);
80 }
81 else {
82 trdModules.push_back(entry.first);
83 }
84 }
85
86 // Create setup files for each type
89 setup.modules.resize(trdModules.size());
90 setup2D.modules.resize(trd2DModules.size());
91
92 // Fill 2D setup files
93 for (size_t mod = 0; mod < trd2DModules.size(); mod++) {
94 const uint16_t moduleId = trd2DModules[mod];
95
96 // Get Geometry parameters for module
97 CbmTrdParModGeo* pGeo = static_cast<CbmTrdParModGeo*>(fGeoPar->GetModulePar(moduleId));
98
99 // Get ASIC parameters for this module
100 const CbmTrdParModAsic* asicPar = static_cast<const CbmTrdParModAsic*>(fAsicPar->GetModulePar(moduleId));
101
102 if (!asicPar) continue;
103 const CbmTrdParModDigi* digiPar = static_cast<const CbmTrdParModDigi*>(fDigiPar->GetModulePar(moduleId));
104
105 cbm::algo::trd::Hitfind2DSetup::Mod& module = setup2D.modules[mod];
106 module.padSizeX = digiPar->GetPadSizeX(0);
107 module.padSizeY = digiPar->GetPadSizeY(0);
108 module.address = moduleId;
109 module.rowPar.resize(digiPar->GetNofRows());
110
111 const double* tra_ptr = pGeo->GetNode()->GetMatrix()->GetTranslation();
112 const double* rot_ptr = pGeo->GetNode()->GetMatrix()->GetRotationMatrix();
113 memcpy(module.translation.data(), tra_ptr, 3 * sizeof(double));
114 memcpy(module.rotation.data(), rot_ptr, 9 * sizeof(double));
115
116 for (int row = 0; row < digiPar->GetNofRows(); row++) {
117
118 cbm::algo::trd::Hitfind2DSetup::Row& rowPar = module.rowPar[row];
119 rowPar.padPar.resize(digiPar->GetNofColumns());
120
121 int rowInSector = 0;
122 const int sector = digiPar->GetSectorRow(row, rowInSector); // Second is ref. TO DO: Return std::pair instead.
123
124 for (int col = 0; col < digiPar->GetNofColumns(); col++) {
125 cbm::algo::trd::Hitfind2DSetup::Pad& padPar = rowPar.padPar[col];
126 TVector3 pos, posErr;
127 digiPar->GetPadPosition(sector, col, rowInSector, pos, posErr);
128 const std::array<double, 3> pos_ptr = {pos[0], pos[1], pos[2]};
129 const std::array<double, 3> posErr_ptr = {posErr[0], posErr[1], posErr[2]};
130 memcpy(padPar.position.data(), pos_ptr.data(), 3 * sizeof(double));
131 memcpy(padPar.positionError.data(), posErr_ptr.data(), 3 * sizeof(double));
132
133 const size_t chan = row * digiPar->GetNofColumns() + col;
134 const CbmTrdParFaspChannel *daqFaspChT(nullptr), *daqFaspChR(nullptr);
135 asicPar->GetFaspChannelPar(chan, daqFaspChT, daqFaspChR);
136 if (!daqFaspChR) {
137 padPar.chRMasked = false; // TODO implement case for not installed
138 }
139 else {
140 padPar.chRMasked = daqFaspChR->IsMasked();
141 }
142 if (!daqFaspChT) {
143 padPar.chTMasked = false; // TODO implement case for not installed
144 }
145 else {
146 padPar.chTMasked = daqFaspChT->IsMasked();
147 }
148 }
149 }
150 } // for (size_t mod; mod < trd2DModules.size(); mod++) {
151
152
153 // Fill 1D setup files
154 for (size_t mod = 0; mod < trdModules.size(); mod++) {
155 const uint16_t moduleId = trdModules[mod];
156
157 // Get Geometry parameters for module
158 CbmTrdParModGeo* pGeo = static_cast<CbmTrdParModGeo*>(fGeoPar->GetModulePar(moduleId));
159
160 // Get ASIC parameters for this module
161 const CbmTrdParModAsic* asicPar = static_cast<const CbmTrdParModAsic*>(fAsicPar->GetModulePar(moduleId));
162
163 if (!asicPar) continue;
164 const CbmTrdParModDigi* digiPar = static_cast<const CbmTrdParModDigi*>(fDigiPar->GetModulePar(moduleId));
165
166 cbm::algo::trd::HitfindSetup::Mod& module = setup.modules[mod];
167 module.padSizeX = digiPar->GetPadSizeX(0);
168 module.padSizeY = digiPar->GetPadSizeY(0);
169 module.padSizeErrX = digiPar->GetPadSizeX(1);
170 module.padSizeErrY = digiPar->GetPadSizeY(1);
171 module.orientation = digiPar->GetOrientation();
172 module.address = moduleId;
173 module.rowPar.resize(digiPar->GetNofRows());
174
175 const double* tra_ptr = pGeo->GetNode()->GetMatrix()->GetTranslation();
176 const double* rot_ptr = pGeo->GetNode()->GetMatrix()->GetRotationMatrix();
177 memcpy(module.translation.data(), tra_ptr, 3 * sizeof(double));
178 memcpy(module.rotation.data(), rot_ptr, 9 * sizeof(double));
179
180 for (int row = 0; row < digiPar->GetNofRows(); row++) {
181
182 cbm::algo::trd::HitfindSetup::Row& rowPar = module.rowPar[row];
183 rowPar.padPar.resize(digiPar->GetNofColumns());
184
185 int rowInSector = 0;
186 const int sector = digiPar->GetSectorRow(row, rowInSector); // Second is ref. TO DO: Return std::pair instead.
187
188 for (int col = 0; col < digiPar->GetNofColumns(); col++) {
189 cbm::algo::trd::HitfindSetup::Pad& padPar = rowPar.padPar[col];
190 TVector3 pos, posErr;
191 digiPar->GetPadPosition(sector, col, rowInSector, pos, posErr);
192 const std::array<double, 3> pos_ptr = {pos[0], pos[1], pos[2]};
193 const std::array<double, 3> posErr_ptr = {posErr[0], posErr[1], posErr[2]};
194 memcpy(padPar.position.data(), pos_ptr.data(), 3 * sizeof(double));
195 memcpy(padPar.positionError.data(), posErr_ptr.data(), 3 * sizeof(double));
196 }
197 }
198 } // for (size_t mod; mod < trdModules.size(); mod++) {
199
200
201 /* Write Yaml files */
202
204 std::ofstream fout("TrdHitfinderPar.yaml");
205 fout << dump(setup);
206 fout.close();
207
208 std::ofstream f2Dout("TrdHitfinder2DPar.yaml");
209 f2Dout << dump(setup2D);
210 f2Dout.close();
211
212 return kSUCCESS;
213}
214
ClassImp(CbmConverterManager)
CbmTaskTrdHitFinderParWrite()
Default constructor.
CbmTrdParSetDigi * fDigiPar
parameter list for read-out geometry
CbmTrdParSetGeo * fGeoPar
parameter list for modules geometry
CbmTrdParSetAsic * fAsicPar
parameter list for ASIC characterization
Definition of FASP channel calibration container.
bool IsMasked() const
Describe TRD module ASIC settings (electronic gain, delays, etc)
virtual CbmTrdDigi::eCbmTrdAsicType GetAsicType() const
Query the type of ASICs in the list.
bool GetFaspChannelPar(int pad, const CbmTrdParFaspChannel *&tilt, const CbmTrdParFaspChannel *&rect) const
Access the calibration objects describing the two FASP channels allocated to a pad....
Definition of chamber gain conversion for one TRD module.
Int_t GetSectorRow(Int_t growId, Int_t &srowId) const
Find the sector wise row given the module row. Inverse of GetModuleRow()
Int_t GetNofRows() const
void GetPadPosition(const Int_t sector, const Int_t col, const Int_t row, TVector3 &padPos, TVector3 &padPosErr) const
Int_t GetNofColumns() const
Definition of geometry for one TRD module.
TGeoPhysicalNode * GetNode()
Describe TRD module ASIC settings (electronic gain, delays, etc)
bool LoadAlignVolumes()
Trigger loading alignment information for all nodes registered.
virtual Int_t GetNrOfModules() const
virtual const CbmTrdParMod * GetModulePar(Int_t detId) const
std::map< Int_t, CbmTrdParMod * > GetModuleMap()
std::array< double, 3 > translation
std::array< double, 9 > rotation
std::array< double, 3 > position
std::array< double, 3 > positionError
Hitfind setup / Hardware cabling for TRD2D Used to create the hardware mapping for the TRD2D hitfinde...
std::array< double, 9 > rotation
std::array< double, 3 > translation
std::array< double, 3 > position
std::array< double, 3 > positionError
Hitfind setup / Hardware cabling for TRD Used to create the hardware mapping for the TRD hitfinder.