2 #include <ecl/utility/ECLChannelMapper.h>
3 #include <rawdata/dataobjects/RawCOPPERFormat.h>
4 #include <framework/database/DBObjPtr.h>
5 #include <framework/utilities/FileSystem.h>
17 for (i = 0; i < ECL_BARREL_CRATES * ECL_BARREL_SHAPERS_IN_CRATE * ECL_CHANNELS_IN_SHAPER; i++)
18 convertArrayBarrel[i] = 0;
19 for (i = 0; i < ECL_FWD_CRATES * ECL_FWD_SHAPERS_IN_CRATE * ECL_CHANNELS_IN_SHAPER; i++)
20 convertArrayFWD[i] = 0;
21 for (i = 0; i < ECL_BKW_CRATES * ECL_BKW_SHAPERS_IN_CRATE * ECL_CHANNELS_IN_SHAPER; i++)
22 convertArrayBKW[i] = 0;
23 for (i = 0; i < ECL_TOTAL_CHANNELS; i++)
24 for (
int j = 0; j < 3; j++)
25 convertArrayInv[i][j] = 0;
27 isInitialized =
false;
34 return initFromFile(filePath.c_str());
39 B2WARNING(
"Reading possibly outdated ECLChannelMap from " << eclMapFileName);
41 ifstream mapFile(eclMapFileName);
42 if (mapFile.is_open()) {
44 float iCrate, iShaper, iChannel, thetaID, phiID, cellID;
47 while (mapFile.good()) {
50 char ch = mapFile.get();
52 mapFile.ignore(256,
'\n');
54 }
else if (ch ==
'\n') {
60 mapFile >> iCrate >> iShaper >> iChannel >> thetaID >> phiID >> cellID;
62 if (cellID > ECL_TOTAL_CHANNELS) {
63 B2ERROR(
"ECLChannelMapper:: wrong cellID in the init file " << eclMapFileName);
68 convertArrayInv[(int)cellID - 1][0] = (
int)iCrate;
69 convertArrayInv[(int)cellID - 1][1] = (
int)iShaper;
70 convertArrayInv[(int)cellID - 1][2] = (
int)iChannel;
74 if (iCrate >= 1 && iCrate <= 36) {
75 arrayIndex = arrayCount;
76 convertArrayBarrel[arrayIndex] = (int)cellID;
80 if (iCrate > 36 && iCrate < 45) {
81 arrayIndex = arrayCount - 36 * 12 * 16;
83 if (arrayIndex >= 0 && arrayIndex < ECL_FWD_CRATES * ECL_FWD_SHAPERS_IN_CRATE * ECL_CHANNELS_IN_SHAPER)
84 convertArrayFWD[arrayIndex] = (int)cellID;
89 arrayIndex = arrayCount - 36 * 12 * 16 - 8 * 10 * 16;
90 if (arrayIndex >= 0 && arrayIndex < ECL_BKW_CRATES * ECL_BKW_SHAPERS_IN_CRATE * ECL_CHANNELS_IN_SHAPER)
91 convertArrayBKW[arrayIndex] = (int)cellID;
96 B2ERROR(
"ERROR:: file " << eclMapFileName <<
" doesn't found");
100 isInitialized =
true;
109 if (isInitialized && !channelMap.
hasChanged()) {
114 B2FATAL(
"ECLChannelMapper:: Could not get ECLChannelMap from the database.");
117 B2INFO(
"ECLChannelMapper:: loaded ECLChannelMap from the database"
120 const auto& mappingBAR = channelMap->getMappingBAR();
121 const auto& mappingFWD = channelMap->getMappingFWD();
122 const auto& mappingBWD = channelMap->getMappingBWD();
126 int iCrate = 1, iShaper = 1, iChannel = 1;
129 int iMaxShapers = ECL_BARREL_SHAPERS_IN_CRATE;
131 while (iCrate <= ECL_CRATES) {
132 if (iCrate <= ECL_BARREL_CRATES) {
134 cellID = mappingBAR[arrayIndex];
135 convertArrayBarrel[arrayIndex] = cellID;
136 }
else if (iCrate <= ECL_BARREL_CRATES + ECL_FWD_CRATES) {
138 cellID = mappingFWD[arrayIndex];
139 convertArrayFWD[arrayIndex] = cellID;
142 cellID = mappingBWD[arrayIndex];
143 convertArrayBKW[arrayIndex] = cellID;
146 if (cellID > ECL_TOTAL_CHANNELS) {
147 B2FATAL(
"ECLChannelMapper:: wrong cellID (" << cellID <<
") in the database payload");
152 convertArrayInv[cellID - 1][0] = iCrate;
153 convertArrayInv[cellID - 1][1] = iShaper;
154 convertArrayInv[cellID - 1][2] = iChannel;
161 if (iChannel > ECL_CHANNELS_IN_SHAPER) {
164 if (iShaper > iMaxShapers) {
166 if (iCrate == ECL_BARREL_CRATES) {
168 iMaxShapers = getNShapersInCrate(iCrate + 1);
169 }
else if (iCrate == ECL_BARREL_CRATES + ECL_FWD_CRATES) {
171 iMaxShapers = getNShapersInCrate(iCrate + 1);
178 isInitialized =
true;
187 if (!isInitialized) {
188 B2FATAL(
"ECLChannelMapper:: Tried to generate dbobject before initialization");
191 int mappingBAR_size = ECL_BARREL_CRATES * ECL_BARREL_SHAPERS_IN_CRATE * ECL_CHANNELS_IN_SHAPER;
192 int mappingFWD_size = ECL_FWD_CRATES * ECL_FWD_SHAPERS_IN_CRATE * ECL_CHANNELS_IN_SHAPER;
193 int mappingBWD_size = ECL_BKW_CRATES * ECL_BKW_SHAPERS_IN_CRATE * ECL_CHANNELS_IN_SHAPER;
195 std::vector<int> mappingBAR(mappingBAR_size);
196 std::vector<int> mappingFWD(mappingFWD_size);
197 std::vector<int> mappingBWD(mappingBWD_size);
199 for (
int i = 0; i < mappingBAR_size; i++)
200 mappingBAR[i] = convertArrayBarrel[i];
201 for (
int i = 0; i < mappingFWD_size; i++)
202 mappingFWD[i] = convertArrayFWD[i];
203 for (
int i = 0; i < mappingBWD_size; i++)
204 mappingBWD[i] = convertArrayBKW[i];
215 if (iFINESSE > ECL_FINESSES_IN_COPPER - 1) {
216 B2ERROR(
"ECLChannelMapper::ERROR:: wrong FINESSE " << iFINESSE);
220 if ((iCOPPERNode & BECL_ID) == BECL_ID) {
222 iCrate = (iCOPPERNode - BECL_ID - 1) * ECL_FINESSES_IN_COPPER + iFINESSE + 1;
224 }
else if ((iCOPPERNode & EECL_ID) == EECL_ID) {
226 iCrate = ECL_BARREL_CRATES + iFINESSE * ECL_FWD_CRATES + (iCOPPERNode - EECL_ID - 1) + 1;
230 B2ERROR(
"ECLChannelMapper::ERROR:: wrong COPPER NodeID 0x" << std::hex << iCOPPERNode <<
" BECL_ID 0x" << BECL_ID <<
" EECL_ID 0x"
235 if (iCrate > ECL_CRATES || iCrate < 1) {
236 B2ERROR(
"ECLChannelMapper::getCrateID::ERROR:: wrong crate number " << iCrate <<
" return -1");
252 if (iCrate < 1 || iCrate > 52)
return -1;
253 if (iShaper < 1 || iShaper > 12)
return -1;
254 if (iChannel < 1 || iChannel > 16)
return -1;
256 if (iCrate >= 1 && iCrate <= 36) {
261 arrayIndex = (iCrate - 1) * ECL_BARREL_SHAPERS_IN_CRATE * ECL_CHANNELS_IN_SHAPER
262 + (iShaper - 1) * ECL_CHANNELS_IN_SHAPER + (iChannel - 1);
263 cellID = convertArrayBarrel[arrayIndex];
267 if (iCrate > 36 && iCrate < 45) {
268 arrayIndex = (iCrate - 37) * ECL_FWD_SHAPERS_IN_CRATE * ECL_CHANNELS_IN_SHAPER
269 + (iShaper - 1) * ECL_CHANNELS_IN_SHAPER + (iChannel - 1);
270 cellID = convertArrayFWD[arrayIndex];
274 arrayIndex = (iCrate - 45) * ECL_BKW_SHAPERS_IN_CRATE * ECL_CHANNELS_IN_SHAPER
275 + (iShaper - 1) * ECL_CHANNELS_IN_SHAPER + (iChannel - 1);
276 cellID = convertArrayBKW[arrayIndex];
284 if (cellID > 0 && cellID <= ECL_TOTAL_CHANNELS) {
285 return convertArrayInv[cellID - 1 ][0];
291 if (cellID > 0 && cellID <= ECL_TOTAL_CHANNELS) {
292 return convertArrayInv[cellID - 1][1];
298 if (cellID > 0 && cellID <= ECL_TOTAL_CHANNELS) {
299 return convertArrayInv[cellID - 1][2];
305 int systemID, iNode, iCOPPERNode;
307 if (iCrate < 1 || iCrate > ECL_CRATES)
return -1;
308 systemID = (iCrate <= ECL_BARREL_CRATES) * BECL_ID + (iCrate > ECL_BARREL_CRATES) * EECL_ID;
309 iNode = (iCrate <= ECL_BARREL_CRATES) ? (iCrate - 1) / 2 : (iCrate - ECL_BARREL_CRATES - 1) % 8;
310 iCOPPERNode = systemID + iNode + 1;
317 if (iCrate < 1 || iCrate > ECL_CRATES)
return -1;
319 return (iCrate <= ECL_BARREL_CRATES) ? (iCrate - 1) % 2 : (iCrate - ECL_BARREL_CRATES - 1) / 8;
324 if (iCrate <= ECL_BARREL_CRATES)
return 0;
325 if (ECL_BARREL_CRATES < iCrate && iCrate <= ECL_BARREL_CRATES + ECL_FWD_CRATES)
327 if (ECL_BARREL_CRATES + ECL_FWD_CRATES < iCrate && iCrate <= ECL_CRATES)
return 2;