33#include "TGeoMatrix.h"
49 LOG(error) <<
"No TRAPconfig given";
57 for (
int iBin = 0; iBin < 128; iBin++) {
109 LOG(error) <<
"No TRAPconfig given";
124 LOG(error) <<
"No TRAPconfig given";
144 for (
int iDet = 0; iDet < 540; iDet++) {
186 configureDyCorr(iDet);
187 configureDRange(iDet);
188 configureNTimebins(iDet);
189 configurePIDcorr(iDet);
208 double padResponse[3];
209 double padResponseR[3];
210 double padResponseL[3];
212 for (
int iLayer = 0; iLayer < 6; iLayer++) {
214 for (
int iBin = 0; iBin < 256 * 0.5; iBin++) {
215 padresponse.
getPRF(1., iBin * 1. / 256., iLayer, padResponse);
216 padresponse.
getPRF(1., iBin * 1. / 256. - 1., iLayer, padResponseR);
217 padresponse.
getPRF(1., iBin * 1. / 256. + 1., iLayer, padResponseL);
218 gr.SetPoint(iBin, (0.5 * (padResponseR[1] - padResponseL[1]) / padResponse[1] * 256), iBin);
220 for (
int iBin = 0; iBin < 128; iBin++) {
221 int corr = (
int)(gr.Eval(iBin)) - iBin;
224 }
else if (corr > 31) {
227 for (
int iStack = 0; iStack < 540 / 6; iStack++) {
248 LOG(error) <<
"No TRAPconfig given";
252 int ignoredLines = 0;
256 LOG(debug3) <<
"Processing file " <<
filename.c_str();
257 std::ifstream infile;
258 infile.open(
filename.c_str(), std::ifstream::in);
259 if (!infile.is_open()) {
260 LOG(error) <<
"Can not open MCM configuration file " <<
filename;
267 mRestrictiveMask = (0x3ffff << 11) | (0x1f << 6) | 0x3f;
268 char linebuffer[512];
271 while (infile.getline(linebuffer, 512) && infile.good()) {
272 unsigned int cmd = 999;
276 line.str(linebuffer);
278 line >> std::skipws >> cmd >> addr >>
data >> extali;
281 if (cmd != 999 && addr != -1 && extali != -1) {
283 if (cmd == mgkScsnCmdWrite) {
285 unsigned int rocpos = (1 << (Geometry::getSector(det) + 11)) | (1 << (Geometry::getStack(det) + 6)) | (1 << Geometry::getLayer(det));
286 LOG(
debug) <<
"checking restriction: mask=0x" << hex << std::setw(8) << mRestrictiveMask <<
" rocpos=0x" << hex << std::setw(8) << rocpos;
287 if ((mRestrictiveMask & rocpos) == rocpos) {
289 <<
" " << cmd <<
" " << extali <<
" " << addr <<
" " <<
data;
290 addValues(det, cmd, extali, addr,
data);
295 else if (cmd == mgkScsnLTUparam) {
299 else if (cmd == mgkScsnCmdRestr) {
300 mRestrictiveMask =
data;
301 LOG(
debug) <<
"updated restrictive mask to 0x" << hex << std::setw(8) << mRestrictiveMask;
304 else if ((cmd == mgkScsnCmdReset) ||
305 (cmd == mgkScsnCmdRobReset)) {
309 else if (cmd == mgkScsnCmdSetHC) {
312 for (
int iDet = 0; iDet <
MAXCHAMBER; iDet++) {
313 int smls = (Geometry::getSector(iDet) << 6) | (Geometry::getLayer(iDet) << 3) | Geometry::getStack(iDet);
315 for (
int iRob = 0; iRob < 8; iRob++) {
325 for (
int iMcm = 0; iMcm < 16; iMcm++) {
333 else if ((cmd == mgkScsnCmdRead) ||
334 (cmd == mgkScsnCmdPause) ||
335 (cmd == mgkScsnCmdPtrg) ||
336 (cmd == mgkScsnCmdHwPtrg) ||
337 (cmd == mgkScsnCmdRobPower) ||
338 (cmd == mgkScsnCmdTtcRx) ||
339 (cmd == mgkScsnCmdMcmTemp) ||
340 (cmd == mgkScsnCmdOri) ||
341 (cmd == mgkScsnCmdPM)) {
342 LOG(debug2) <<
"ignored SCSN command: " << cmd <<
" " << addr <<
" " <<
data <<
" " << extali;
346 LOG(warn) <<
"unknown SCSN command: " << cmd <<
" " << addr <<
" " <<
data <<
" " << extali;
353 else if (!infile.eof() && !infile.good()) {
355 infile.ignore(256,
'\n');
366 LOG(debug3) <<
"Ignored lines: " << ignoredLines <<
", ignored cmds: " << ignoredCmds;
368 if (ignoredLines > readLines) {
369 LOG(error) <<
"More than 50% of the input file could not be processed. Perhaps you should check the input file " <<
filename.c_str();
392 configureDyCorr(det);
393 configureDRange(det);
394 configureNTimebins(det);
395 configurePIDcorr(det);
431 LOG(error) <<
"dest " << dest <<
" not implemented";
435void TrapConfigHandler::configureNTimebins(
int det)
442 LOG(error) <<
"No TRAPconfig given";
449void TrapConfigHandler::configureDyCorr(
int det)
458 LOG(error) <<
"No TRAPconfig given";
462 int nRobs = Geometry::getStack(det) == 2 ? 6 : 8;
464 for (
int r = 0;
r < nRobs;
r++) {
465 for (
int m = 0;
m < 16;
m++) {
466 int dest = 1 << 10 |
r << 7 |
m;
473void TrapConfigHandler::configureDRange(
int det)
484 LOG(error) <<
"No TRAPconfig given";
488 int nRobs = Geometry::getStack(det) == 2 ? 6 : 8;
493 for (
int r = 0;
r < nRobs;
r++) {
494 for (
int m = 0;
m < 16;
m++) {
495 for (
int c = 0;
c < 18;
c++) {
500 int dest = 1 << 10 |
r << 7 |
m;
503 addValues(det, mgkScsnCmdWrite, dest, lutAddr + 0, dyMinInt);
504 addValues(det, mgkScsnCmdWrite, dest, lutAddr + 1, dyMaxInt);
522 for (
int r = 0;
r < 6;
r++) {
523 for (
int m = 0;
m < 16;
m++) {
524 for (
int c = 7;
c < 8;
c++) {
526 <<
";" << mFeeParam->
getX(det,
r,
m)
537void TrapConfigHandler::configurePIDcorr(
int det)
545 LOG(error) <<
"No TRAPconfig given";
559 if (Geometry::getStack(det) == 2) {
565 for (
int row = 0;
row < MaxRows;
row++) {
566 for (
int col = 0;
col < MaxCols;
col++) {
569 int dest = 1 << 10 | readoutboard << 7 |
mcm;
576 addValues(det, mgkScsnCmdWrite, dest, addrLUTcor0, cor0);
577 addValues(det, mgkScsnCmdWrite, dest, addrLUTcor1, cor1);
582bool TrapConfigHandler::addValues(
unsigned int det,
unsigned int cmd,
unsigned int extali,
int addr,
unsigned int data)
587 LOG(error) <<
"No TRAPconfig given";
591 if (cmd != mgkScsnCmdWrite) {
592 LOG(error) <<
"Invalid command received: " << cmd;
597 int rocType = Geometry::getStack(det) == 2 ? 0 : 1;
599 static const int mcmListSize = 40;
600 int mcmList[mcmListSize];
605 for (
int linkPair = 0; linkPair < mgkMaxLinkPairs; linkPair++) {
608 while ((
i < mcmListSize) && (mcmList[
i] != -1)) {
609 if (mcmList[
i] == 127) {
625 for (
int linkPair = 0; linkPair < mgkMaxLinkPairs; linkPair++) {
628 while (
i < mcmListSize && mcmList[
i] != -1) {
629 if (mcmList[
i] == 127) {
632 mTrapConfig->
setDmem(addr,
data, det, mcmList[
i] >> 7, mcmList[
i] & 0x7f);
648 LOG(error) <<
"Writing to unhandled address 0x" << hex << std::setw(4) << addr;
float getMCMGain(int det, int row, int col) const
void setTiltCorrectionEnable(int data)
void setRawTiltCorrectionEnable(bool data)
void setMagField(int data)
void setScaleQ1(int data)
void setRawScaleQ0(int data)
void setLengthCorrectionEnable(int data)
void setScaleQ0(int data)
void setRawMagField(float data)
void getDyRange(int det, int rob, int mcm, int ch, int &dyMinInt, int &dyMaxInt) const
static int getROBfromPad(int irow, int icol)
void getCorrectionFactors(int det, int rob, int mcm, int ch, unsigned int &cor0, unsigned int &cor1, float gain=1.) const
void setOmegaTau(int data)
float getLocalY(int det, int rob, int mcm, int ch) const
void setRawScaleQ1(int data)
float getX(int det, int rob, int mcm) const
void setRawLengthCorrectionEnable(bool data)
void setRawPtMin(float data)
static int extAliToAli(unsigned int dest, unsigned short linkpair, unsigned short rocType, int *list, int listSize)
void setRawOmegaTau(float data)
static FeeParam * instance()
void setNtimebins(int data)
static int getMCMfromPad(int irow, int icol)
int getDyCorrection(int det, int rob, int mcm) const
float getLocalZ(int det, int rob, int mcm) const
int getPRF(double, double, int, double *) const
int setGaintable(CalOnlineGainTables >bl)
TrapConfigHandler(TrapConfig *cfg=nullptr)
void processLTUparam(int dest, int addr, unsigned int data)
static const int mgkDbankStartAddress
bool setDmem(int addr, unsigned int value, int det)
static const int mgkDmemStartAddress
std::string getRegName(TrapReg_t reg)
static const int mgkImemStartAddress
bool setTrapReg(TrapReg_t reg, int value, int det)
bool setDmemAlloc(int addr, Alloc_t mode)
static const int mgkImemWords
bool setTrapRegAlloc(TrapReg_t reg, Alloc_t mode)
TrapReg_t getRegByAddress(int address)
static const int mgkDmemWords
static constexpr int mgkDmemAddrDeflCorr
static constexpr int mgkDmemAddrLUTcor0
static constexpr int mgkDmemAddrDeflCutStart
static constexpr int mgkDmemAddrLUTnbins
static constexpr int mgkDmemAddrNdrift
static constexpr int mgkDmemAddrTrackletStart
static constexpr int mgkDmemAddrLUTcor1
static constexpr int mgkDmemAddrLUTLength
static constexpr int mgkDmemAddrDeflCutEnd
static constexpr int mgkDmemAddrLUTStart
static constexpr int mgkDmemAddrTrackletEnd
static constexpr int mgkDmemAddrLUTEnd
GLenum GLuint GLint GLint layer
constexpr int NCOLUMN
the number of pad columns for each chamber
constexpr int NROWC0
the number of pad rows for chambers of type C0 (installed in stack 2)
constexpr int MAXCHAMBER
the maximum number of installed chambers
constexpr int NROWC1
the number of pad rows for chambers of type C1 (installed in stacks 0, 1, 3 and 4)
std::string fullVersion()
get full version information (official O2 release and git commit)
Defining DataPointCompositeObject explicitly as copiable.
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"