ATLAS Offline Software
Loading...
Searching...
No Matches
Matrix Class Reference

#include <Matrix.h>

Inheritance diagram for Matrix:
Collaboration diagram for Matrix:

Classes

struct  rpcdata

Public Member Functions

 Matrix (int run, int event, CMAword debug, int subsys, int proj, int sect, int padadd, int lowhig, int add[2], int locadd, int NOBXS, int BCZERO)
 ~Matrix ()
void deleteRPCdata ()
void reset ()
void initRegisters ()
void initPointers ()
void initRPCpointers ()
void initDat ()
void putData (int sidemat, int layer, int stripaddress, float time)
void putPatt (const Matrix *p)
void setDefaultConfiguration ()
void setRunEvent (int runNum, int eventNum)
void setBCzero (ubit16 offset)
void setDeadTime (ubit16 deadt)
void setDeadTime (ubit16 iside, ubit16 ilayer, ubit16 deadt)
void setDeadTime (ubit16 iside, ubit16 ilayer, ubit16 igroup, ubit16 deadt)
void setDelay (ubit16 iside, ubit16 ilayer, ubit16 delay)
void setDelay (ubit16 iside, ubit16 ilayer, ubit16 igroup, ubit16 delay)
void setPulseWidth (ubit16 length)
void setPulseWidth (ubit16 iside, ubit16 ilayer, ubit16 length)
void setPulseWidth (ubit16 iside, ubit16 ilayer, ubit16 igroup, ubit16 length)
void setMask0 (ubit16 iside, ubit16 ilayer, ubit16 ichannel)
void setMask1 (ubit16 ithreshold, ubit16 iside, ubit16 imajority, ubit16 ichannel)
void setMask1 (ubit16 ithreshold, ubit16 iside, ubit16 imajority)
void setMask1 (ubit16 ithreshold, ubit16 iside)
void setMaskReadOut (ubit16 iside, ubit16 ilayer, ubit16 ichannel)
void setMaskReadOut (ubit16 iside, ubit16 ilayer, ubit16 ichannel, ubit16 nchannels)
void setConfig (int *l, ubit16 *p1, int *k, CMAword *p2, int *q, CMAword *o, sbit32 *g)
void setLocalDirection (ubit16 add, int content)
void setKReadOut (int kToReadout)
void setOverlaThres (int overthres)
void setMajority (ubit16 add, int content)
void setRoad (ubit16 addThres, ubit16 addChn, ubit16 add64, CMAword content)
void setRoad (ubit16 addThres, ubit16 addChn, char road[17])
void setMatOverlap (ubit16 add, CMAword content)
void setTrigDeadTime (ubit16 deadt)
void setTrigDeadTime (ubit16 igroup, ubit16 deadt)
void setDiagonal (ubit16 add, sbit32 content)
int getMajority (ubit16 add) const
CMAword getRoad (ubit16 addThres, ubit16 addChn, ubit16 add64) const
CMAword getMatOverlap (ubit16 add) const
void execute ()
int getSubsystem () const
int getProjection () const
int getSector () const
int getPad () const
int getLowHigh () const
int getAddress0 () const
int getAddress1 () const
int getLocalAdd () const
ubit16 getParams () const
ubit16 getOutputThres (ubit16 bunch) const
ubit16 getOutputOverl (ubit16 bunch) const
sbit16 getBunchPhase () const
sbit16 getBunchOffset () const
void display () const
void dispWind () const
void dispWind (ubit16 thres) const
void dispDefaultConfiguration () const
ubit16 char2int (const char *str, CMAword the32[2])
ObjectType tag () const
const std::string & name () const
virtual void Print (std::ostream &, bool) const

Public Attributes

CMAword rodat [2][2][64][2]
 Note array lengths using hardcoded values rather than to depend on NOBXS as they were in the past (assuming NOBXS is at most 8).
CMAword k_readout [64]
ubit16 highestthRO [64]
ubit16 overlapRO [64]

Static Public Attributes

static const ubit16 s_nthres = 3
static const ubit16 s_nchan [2] = {32, 64}
static const float s_BCtime = 25.0
static const ubit16 s_NDLLCYC = 8
static const float s_DLLtime = s_BCtime / (float)s_NDLLCYC
static const sbit16 s_NBunch
static const sbit16 s_nclock
static const sbit16 s_timeGroupA = 16
static const sbit16 s_timeGroupB = 8
static const sbit16 s_wordlen = 32

Private Member Functions

void storeDeadtime ()
void masking ()
void delay ()
void load ()
void copyDataToReadOut ()
void prepro ()
void coincide ()
void maskTo1 ()
void deadTime ()
void pulse_width ()
void declus ()
void majori ()
void reduce (ubit16 ia, ubit16 ja, ubit16 ka, ubit16 la, ubit16 nup, ubit16 first)
void shift (CMAword *buffi, CMAword *buffo, ubit16 i) const
void makeOut ()
void makeTestPattern (ubit16 mode, ubit16 ktimes)
void makeOutPattern ()
ubit16 config (ubit16 i, ubit16 *arr) const
void set_to_0 (CMAword *p, sbit16 channel) const
void set_to_1 (CMAword *p, sbit16 channel) const
CMAword intPow (const ubit16 base, const ubit16 expo) const
void wind () const
void show_attributes () const
void disp_CMAreg (ubit16 id) const
void dispRegister (const CMAword *p, ubit16 side) const
void dispTrigger (const CMAword *p) const
void dispBinary (const CMAword *p, std::ostringstream &strdisp) const

Private Attributes

int m_run
int m_event
int m_Nbunch
int m_nclock
CMAword m_matrixDebug
int m_subsystem
int m_projection
int m_sector
int m_pad
int m_lowhigh
int m_address [2]
int m_localadd
rpcdatam_datarpc [2]
CMAword m_input [2][2][64][2]
CMAword m_prepr [3][2][2][64][2]
CMAword m_mjori [3][2][2][64][2]
CMAword m_trigg [3][72]
ubit16 m_trigger [3][8]
CMAword m_triggerOverlap [8][2]
CMAword m_triggerOverlapRO [64][2]
CMAword m_k_pattern [8 *64]
ubit16 m_highestth [8]
ubit16 m_overlap [8]
sbit16 m_BCID
ubit16m_chdly
ubit16m_width
int * m_locDi
int * m_kRead
CMAwordm_roads
int * m_major
CMAwordm_overl
sbit32m_geome
sbit16 m_thisBC
ubit16 m_BCzero
ubit16 m_lowtohigh
ubit16 m_toreadout
ubit16 m_overlapthres
ubit16 m_majorities [3]
ubit16 m_localDirec [2]
sbit16 m_BunchPhase
sbit16 m_BunchOffset
CMAword m_trigRoad [3][32][2]
ubit16 m_channDeadT [2][2][8]
ubit16 m_channDelay [2][2][4]
ubit16 m_channMask0 [2][2][64]
CMAword m_channMask1 [3][2][2][2]
CMAword m_channReadOutMask [2][2][2]
ubit16 m_pulseWidth [2][2][8]
CMAword m_matOverlap [2]
ubit16 m_trigDeadTime [4]
sbit32 m_diagonal [32]
ObjectType m_tag
std::string m_name

Static Private Attributes

static const sbit16 s_ROOffset = 1

Detailed Description

Constructor & Destructor Documentation

◆ Matrix()

Matrix::Matrix ( int run,
int event,
CMAword debug,
int subsys,
int proj,
int sect,
int padadd,
int lowhig,
int add[2],
int locadd,
int NOBXS,
int BCZERO )

Definition at line 53 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

53 :
54 BaseObject(Hardware, "Matrix") {
55 ubit16 df = 0; // debug flag address
56 m_run = run;
57 m_event = event;
58 //
59 // debug flags first
60 //
62
63 if (m_matrixDebug & 1 << df) {
64 cout << "=============================================" << endl
65 << "Constructor of Matrix called with parameters:" << endl
66 << subsys << " " << proj << " " << sect << " " << lowhig << " " << add[0] << add[1] << endl
67 << "=============================================" << endl;
68 }
69 m_thisBC = 0; // temporary initialization
70
71 m_BCzero = BCZERO;
72 m_Nbunch = NOBXS;
74 // m_BCzero=(m_nclock/s_NDLLCYC)/2; // default initialization of m_BCzero
75 // user setting by setBCzero
76
77 //
78 //
79 // BCzero
80 // |
81 // |
82 // |
83 // V
84 // BCID=-2 BCID=-1 .BCID= 0 BCID=+1 BCID=+2
85 // .
86 // .
87 // ********+********+********+********+********
88 // 01234567 01234567 01234567 01234567 01234567
89 //
90 //
91 // Matrix attributes
92 //
93 m_subsystem = subsys;
95 m_sector = sect;
96 m_pad = padadd;
97 m_lowhigh = lowhig;
98 //
99 m_address[0] = add[0];
100 m_address[1] = add[1];
101 m_localadd = locadd;
102 //
103 // initialize some variables
104 //
105 initDat();
106 //
107 // initialize the RPC data structure
108 //
110 //
111 // initialize the CMAword registers
112 //
114 //
115 // initialize the Configuration pointers
116 //
117 initPointers();
118 //
119 // set default CM parameters configuration
120 //
122}
@ Hardware
Definition BaseObject.h:11
const bool debug
unsigned short int ubit16
BaseObject(ObjectType, const std::string &)
Definition BaseObject.cxx:7
bool add(const std::string &hname, TKey *tobj)
Definition fastadd.cxx:55
df
Printing table to screen.

◆ ~Matrix()

Matrix::~Matrix ( )

Definition at line 124 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

124 {
125 ubit16 df = 1;
127 if (m_matrixDebug & 1 << df) { cout << "Distructor of Matrix executed " << endl; }
128} // end-of-Matrix::~Matrix()

Member Function Documentation

◆ char2int()

ubit16 Matrix::char2int ( const char * str,
CMAword the32[2] )

Definition at line 2017 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

2017 {
2018 ubit16 outflag = 0;
2019 the32[0] = 0;
2020 the32[1] = 0;
2021 ubit16 stringLength = strlen(str);
2022 if (stringLength > 16) {
2023 outflag = 1;
2024 } else {
2025 for (ubit16 i = 0; i < stringLength; i++) {
2026 // cout<<" Reading character "<<*(str+stringLength-1-i)<<endl;
2027 if (*(str + stringLength - 1 - i) == '0')
2028 the32[i / 8] = the32[i / 8] + 0;
2029 else if (*(str + stringLength - 1 - i) == '1')
2030 the32[i / 8] = the32[i / 8] + (intPow(16, i % 8)) * 1;
2031 else if (*(str + stringLength - 1 - i) == '2')
2032 the32[i / 8] = the32[i / 8] + (intPow(16, i % 8)) * 2;
2033 else if (*(str + stringLength - 1 - i) == '3')
2034 the32[i / 8] = the32[i / 8] + (intPow(16, i % 8)) * 3;
2035 else if (*(str + stringLength - 1 - i) == '4')
2036 the32[i / 8] = the32[i / 8] + (intPow(16, i % 8)) * 4;
2037 else if (*(str + stringLength - 1 - i) == '5')
2038 the32[i / 8] = the32[i / 8] + (intPow(16, i % 8)) * 5;
2039 else if (*(str + stringLength - 1 - i) == '6')
2040 the32[i / 8] = the32[i / 8] + (intPow(16, i % 8)) * 6;
2041 else if (*(str + stringLength - 1 - i) == '7')
2042 the32[i / 8] = the32[i / 8] + (intPow(16, i % 8)) * 7;
2043 else if (*(str + stringLength - 1 - i) == '8')
2044 the32[i / 8] = the32[i / 8] + (intPow(16, i % 8)) * 8;
2045 else if (*(str + stringLength - 1 - i) == '9')
2046 the32[i / 8] = the32[i / 8] + (intPow(16, i % 8)) * 9;
2047 else if (*(str + stringLength - 1 - i) == 'a' || *(str + stringLength - 1 - i) == 'A')
2048 the32[i / 8] = the32[i / 8] + (intPow(16, i % 8)) * 10;
2049 else if (*(str + stringLength - 1 - i) == 'b' || *(str + stringLength - 1 - i) == 'B')
2050 the32[i / 8] = the32[i / 8] + (intPow(16, i % 8)) * 11;
2051 else if (*(str + stringLength - 1 - i) == 'c' || *(str + stringLength - 1 - i) == 'C')
2052 the32[i / 8] = the32[i / 8] + (intPow(16, i % 8)) * 12;
2053 else if (*(str + stringLength - 1 - i) == 'd' || *(str + stringLength - 1 - i) == 'D')
2054 the32[i / 8] = the32[i / 8] + (intPow(16, i % 8)) * 13;
2055 else if (*(str + stringLength - 1 - i) == 'e' || *(str + stringLength - 1 - i) == 'E')
2056 the32[i / 8] = the32[i / 8] + (intPow(16, i % 8)) * 14;
2057 else if (*(str + stringLength - 1 - i) == 'f' || *(str + stringLength - 1 - i) == 'F')
2058 the32[i / 8] = the32[i / 8] + (intPow(16, i % 8)) * 15;
2059 else
2060 outflag = 2;
2061 } // end-of-for
2062 }
2063
2064 // if(outflag) {
2065 // the32[0]=0;
2066 // the32[1]=1;
2067 // } else {
2068 // CMAword temp = the32[1];
2069 // the32[1]=the32[0];
2070 // the32[0]=temp;
2071 // }
2072 return outflag;
2073} // end-of-char2int
CMAword intPow(const ubit16 base, const ubit16 expo) const

◆ coincide()

void Matrix::coincide ( )
private

Definition at line 1017 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1017 {
1018 //
1019 // input none
1020 //
1021 // returns trigger flag
1022 //
1023 //
1024 sbit16 BCaddress = 0;
1025 //
1026 ubit16 df = 10;
1027 ubit16 i, j, l, m;
1028 ubit16 thres, chan, nconf, conf[4][2];
1029 for (i = 0; i < 4; i++) {
1030 for (j = 0; j < 2; j++) { conf[i][j] = 0; }
1031 }
1032 //
1033 if (m_matrixDebug & 1 << df) {
1034 cout << "--------------------" << endl << "| matrix: coincide |" << endl << "--------------------" << endl;
1035 } // end-of-if(m_matrixDebug&1<<df)
1036 //
1037 // nconf gives the number of possible configurations compatible with
1038 // the required majority;
1039 // conf[i][j] gives the two indices "j" for the side-x (pivot) and side-y
1040 // array respectively correspondent to the configurtion number "i"
1041 //
1042 if (m_matrixDebug & 1 << df) {
1043 cout << " Matrix::coincidence; lowhigh= " << m_lowhigh << endl
1044 << " Matrix::coincidence; majority array ="
1045 << " " << m_majorities[0] << " " << m_majorities[1] << " " << m_majorities[2] << endl;
1046 } // end-of-if(m_matrixDebug&1<<df)
1047 //
1048 for (i = 0; i < m_nclock; i++) { // loop on clock cycles
1049 for (thres = 0; thres < s_nthres; thres++) { // loop on the three possible thresholds
1050 // thresholds address increases with
1051 // increasing pT
1052 nconf = config(thres, &conf[0][0]); // number of config. for this threshold
1053 //
1054 // if(m_matrixDebug&1<<df) {
1055 // cout<<"nconf="<<nconf<<" conf="<<endl;
1056 // for(int ii=0;ii<4;ii++){ cout<<" "<<conf[ii][0]<<endl;}
1057 // cout<<endl;
1058 // for(int ii=0;ii<4;ii++){ cout<<" "<<conf[ii][1]<<endl;}
1059 // cout<<endl;
1060 //}//end-of-if(m_matrixDebug&1<<df)
1061
1062 for (l = 0; l < nconf; l++) { // loop on all config. for this threshold
1063 for (j = 0; j < s_nchan[0]; j++) { // loop on all side-x channels
1064 //
1065 // coincidence evaluation:
1066 // for the given configuration "l" and the given channel "j" in the
1067 // pivot plane, the coincidence requires
1068 // a) the required majority "m_mjori[thres][0][conf[l][0]][i][0]"
1069 // for channel "j"
1070 // b) the required majority "m_mjori[thres][1][conf[l][0]][i][0,1]"
1071 // in coincidence with the programmed road in "*(m_roads+2*j)" and
1072 // "*(m_roads+2*j+1)
1073 //
1074 // if( bitstatus(&m_mjori[thres][0][conf[l][0]][i][0],j)
1075 // *( m_mjori[thres][1][conf[l][1]][i][0]&(*(m_roads+32*2*thres+2*j+0))
1076 // | m_mjori[thres][1][conf[l][1]][i][1]&(*(m_roads+32*2*thres+2*j+1)))){
1077
1078 if (bitstatus(&m_mjori[thres][0][conf[l][0]][i][0], j) &&
1079 ((m_mjori[thres][1][conf[l][1]][i][0] & m_trigRoad[thres][j][0]) |
1080 (m_mjori[thres][1][conf[l][1]][i][1] & m_trigRoad[thres][j][1]))) {
1081 if (m_matrixDebug & 1 << df) {
1082 cout << "coincidence!!!"
1083 << " clock=" << i << " xchan=" << j << endl;
1084 } // end-of-if(m_matrixDebug
1085
1086 set_to_1(&m_trigg[thres][i], j);
1087 BCaddress = ((i + m_BunchPhase) / s_NDLLCYC) + m_BunchOffset;
1088 if (BCaddress >= 0 && BCaddress < m_Nbunch)
1089 m_trigger[thres][BCaddress] = 1; // set "m_trigger" to 1 for this threshold...
1090 // ...and this Bunch Crossing
1091
1092 } // end-of-if(bitstatus...
1093 } // end-of-for(j
1094 } // end-of-for(l
1095 //
1096 // for(m=0;m<2;m++) { // loop on left-right sides to evaluate overlap
1097 // if(!m_triggerOverlapRO[i][m])
1098 // m_triggerOverlapRO[i][m] = (m_trigg[thres][i] & m_matOverlap[m]);
1099 // if(!m_triggerOverlap[i/s_NDLLCYC][m])
1100 // m_triggerOverlap[i/s_NDLLCYC][m] = (m_trigg[thres][i] & m_matOverlap[m]);
1101 // }//end-of-for(m
1102 } // end-of-for(thres
1103 } // end-of-for(i
1104
1105 if (CMAVERSION == 2004) {
1106 //
1107 // build the rise pulse for "m_trigg" (320 MHz trigger output) signals
1108 //
1109 CMAword previousTime = 0;
1110 for (chan = 0; chan < s_nchan[0]; chan++) {
1111 for (thres = 0; thres < s_nthres; thres++) { // loop on the three possible thresholds
1112 for (i = m_nclock - 1; i > 0; i--) { // loop on clock cycles
1113 previousTime = bitstatus(&m_trigg[thres][i - 1], chan);
1114 if (bitstatus(&m_trigg[thres][i], chan) && previousTime) { set_to_0(&m_trigg[thres][i], chan); } // end-of-if(bitstatus
1115 } // end-of-for(i
1116 } // end-of-for(thres
1117 } // end-of-for(chan
1118 } // end-of-if(CMAVERSION
1119 // - - - - - - - - - - -
1120
1121 for (chan = 0; chan < s_nchan[0]; chan++) {
1122 for (thres = 0; thres < s_nthres; thres++) { // loop on the three possible thresholds
1123 for (i = m_nclock - 1; i > 0; i--) { // loop on clock cycles
1124 if (bitstatus(&m_trigg[thres][i], chan)) {
1125 for (ubit16 idead = 1; idead < m_trigDeadTime[chan / s_timeGroupB]; idead++) {
1126 set_to_0(&m_trigg[thres][i + idead], chan);
1127 } // end-of-for(
1128 } // end-of-bitstatus
1129 } // end-of-for(i
1130 } // end-of-for(thres
1131 } // end-of-for(chan
1132
1133 if (CMAVERSION == 2004) {
1134 //
1135 // ...now determine the correspondent "m_trigger" (40 MHz trigger output)
1136 //
1137 for (thres = 0; thres < s_nthres; thres++) { // loop on the three possible thresholds
1138 // reset trigger
1139 for (j = 0; j < m_Nbunch; j++) { m_trigger[thres][j] = 0; } // end-of-for(j
1140 // compute new "m_trigger"
1141 for (i = 0; i < m_nclock; i++) { // loop on clock cycles
1142 BCaddress = ((i + m_BunchPhase) / s_NDLLCYC) + m_BunchOffset;
1143 if (BCaddress >= 0 && BCaddress < m_Nbunch) {
1144 if (m_trigg[thres][i]) m_trigger[thres][BCaddress] = 1;
1145 } // emd-of-if(BCadd
1146 } // end-of-for(i
1147 } // end-of-for(thres
1148 } // end-of-if(CMAVERSION
1149 // - - - - - - - - - - -
1150 //
1151 // find triggers in overlap regions
1152 //
1153 // for(thres=0; thres<s_nthres; thres++){ // loop on the three possible thresholds
1154 thres = m_overlapthres;
1155 for (i = 0; i < m_nclock; i++) { // loop on clock cycles
1156 if (m_trigg[thres][i]) {
1157 for (m = 0; m < 2; m++) { // loop on left-right sides to evaluate overlap
1158 if (!m_triggerOverlapRO[i][m]) { m_triggerOverlapRO[i][m] = (m_trigg[thres][i] & m_matOverlap[m]); }
1159 BCaddress = ((i + m_BunchPhase) / s_NDLLCYC) + m_BunchOffset;
1160 if (BCaddress >= 0 && BCaddress < m_Nbunch) {
1161 if (!m_triggerOverlap[BCaddress][m]) m_triggerOverlap[BCaddress][m] = (m_trigg[thres][i] & m_matOverlap[m]);
1162 } // end-of-if(BCaddress
1163 } // end-of-for(m
1164
1165 } // end-of-for(m_trigg
1166 } // end-of-for(i
1167 //}//end-of-for(thres
1168 //
1169 // normalize m_triggerOverlapRO
1170 //
1171 for (i = 0; i < m_nclock; i++) { // loop on clock cycles
1172 for (m = 0; m < 2; m++) { // normalize to 1 overlap flags
1174 } // end-of-for(m
1175 } // end-of-for(i
1176 //
1177 // normalize m_triggerOverlap
1178 //
1179 for (i = 0; i < m_Nbunch; i++) { // loop on bunches
1180 for (m = 0; m < 2; m++) { // normalize to 1 overlap flags
1181 m_triggerOverlap[i][m] = m_triggerOverlap[i][m] ? 1 : 0;
1182 } // end-of-for(m
1183 } // end-of-for(i
1184} // end-of-Matrix::coincide
#define CMAVERSION
Definition CMAVERSION.h:6
int16_t sbit16
Definition Lvl1Def.h:21
uint32_t CMAword
Definition Lvl1Def.h:17
void set_to_1(CMAword *p, sbit16 channel) const
ubit16 config(ubit16 i, ubit16 *arr) const
void set_to_0(CMAword *p, sbit16 channel) const
l
Printing final latex table to .tex output file.

◆ config()

ubit16 Matrix::config ( ubit16 i,
ubit16 * arr ) const
private

Definition at line 1682 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1682 {
1683 //
1684 // input: i threshold address
1685 // *arr pointer to bidimen. array
1686 //
1687 // returns the number of possible configurations compatible with the
1688 // required majority pointed by majorities[i]
1689 //
1690 // Data *arr(k) and *arr(k+1) give the majority addresses for the side-x
1691 // and side-y respectevely.
1692 //
1693 ubit16 nconf = 0;
1694 //
1695 // cout<<"lowhig="<<m_lowhigh<< "majorities= "<<m_majorities[0]
1696 // <<" "<< m_majorities[1]<<" "<<m_majorities[2]<<endl;
1697 //
1698 switch (m_lowhigh) {
1699 case 0: // low-pt trigger matrix
1700 switch (m_majorities[i]) { // select the required majority for each thresh.;
1701 case 0: // 1-out-of-4 majority: no implementation yet
1702 // gives 1/2 in I OR 1/2 in J
1703 nconf = 0;
1704 break;
1705 case 1: // 2-out-of-4 majority
1706 nconf = 1;
1707 *(arr + 0) = 0;
1708 *(arr + 1) = 0;
1709 break;
1710 case 2: // 3-out-of-4 majority
1711 nconf = 2;
1712 *(arr + 0) = 0;
1713 *(arr + 1) = 1;
1714 *(arr + 2) = 1;
1715 *(arr + 3) = 0;
1716 break;
1717 case 3: // 4-out-of-4 majority
1718 nconf = 1;
1719 *(arr + 0) = 1;
1720 *(arr + 1) = 1;
1721 break;
1722 default: throw std::runtime_error("Matrix::config: the majority " + std::to_string(m_majorities[i]) + " is unforeseen");
1723 }
1724 break;
1725 case 1: // high-pt trigger matrix
1726 // high-pt trigger
1727 switch (m_majorities[i]) {
1728 case 1: // 1-out-of-2 majority
1729 nconf = 1;
1730 *(arr + 0) = 0;
1731 *(arr + 1) = 0;
1732 break;
1733 case 2: // 2-out-of-2 majority
1734 nconf = 1;
1735 *(arr + 0) = 0;
1736 *(arr + 1) = 1;
1737 break;
1738 default: throw std::runtime_error("Matrix::config: the majority " + std::to_string(m_majorities[i]) + " is unforeseen");
1739 }
1740 break;
1741 default: throw std::runtime_error("Matrix::config: lowhighpt " + std::to_string(m_lowhigh) + " is unforeseen");
1742 }
1743 return nconf;
1744} // end-of-method-config

◆ copyDataToReadOut()

void Matrix::copyDataToReadOut ( )
private

Definition at line 986 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

986 {
987 //
988 // copy input to rodat
989 //
990 for (ubit16 i = 0; i < 2; i++) { // side address
991 for (ubit16 j = 0; j < 2; j++) { // layer address
992 for (ubit16 k = 0; k < m_nclock; k++) { // clock bins
993 for (ubit16 l = 0; l < 2; l++) { // the two words to make 64 bits
994 rodat[i][j][k][l] = m_input[i][j][k][l] & ~m_channReadOutMask[i][j][l];
995 } // end-of-for(l
996 } // end-of-for(k
997 } // end-of-for(j
998 } // end-of-for(i
999} // end-of-copyDataToReadOut
CMAword rodat[2][2][64][2]
Note array lengths using hardcoded values rather than to depend on NOBXS as they were in the past (as...

◆ deadTime()

void Matrix::deadTime ( )
private

Definition at line 1209 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1209 {
1210 ubit16 i, j, k, l;
1211 ubit16 temp[s_NDLLCYC*8];
1212 //
1213 for (i = 0; i < 2; i++) { // loop on both matrix sides
1214 for (j = 0; j < 2; j++) { // loop on both trigger layers
1215 for (k = 0; k < s_nchan[i]; k++) { // loop on all channels
1216 //
1217 // set to 1 the bins in "temp" where signals are "on" for the first time
1218 //
1219 for (l = 0; l < (m_nclock - 1); l++) { // loop on clock bins
1220 ((!bitstatus(&m_input[i][j][l][0], k)) && bitstatus(&m_input[i][j][l + 1][0], k)) ? temp[l + 1] = 1 : temp[l + 1] = 0;
1221 } // end-of-for(l
1222 temp[0] = bitstatus(&m_input[i][j][0][0], k);
1223 //
1224 // transfer to "input" the signals in "temp" far enough each other in time
1225 //
1226 sbit16 lastUp = -1;
1227 for (l = 0; l < m_nclock; l++) { // loop on clock bins
1228 //
1229 if (!temp[l]) {
1230 set_to_0(&m_input[i][j][l][0], k);
1231 } else {
1232 //
1233 if ((lastUp < 0) || (l - lastUp) >= m_channDeadT[i][j][k / s_timeGroupB]) {
1234 lastUp = l;
1235 set_to_1(&m_input[i][j][l][0], k);
1236 } else {
1237 set_to_0(&m_input[i][j][l][0], k);
1238 } // end-of-if
1239 } // end-of-if
1240 //
1241 } // end-of-for(l
1242 } // end-of-for(k
1243 } // end-of-for(j
1244 } // end-of-for(i
1245} // end-of-Matrix::deadTime

◆ declus()

void Matrix::declus ( )
private

Definition at line 1374 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1374 {
1375 //
1376 // Dynamic scanning of "on" channels has not to be done
1377 // in this first part of the method
1378 //
1379 ubit16 df = 14;
1380 ubit16 nup, first, i, j, k, l;
1381 first = 0;
1382 if (m_matrixDebug & 1 << df) {
1383 cout << "------------------------" << endl << "| matrix: declustering |" << endl << "------------------------" << endl;
1384 } // end-of-if(m_matrixDebug&1<<df)
1385 //
1386 // loop on m_input data
1387 //
1388 for (i = 0; i < 2; i++) { // loop on the two sides
1389 for (j = 0; j < 2; j++) { // loop on the two layers
1390 for (k = 0; k < m_nclock; k++) { // loop on the time bins
1391 nup = 0; // counter of consecutive "on" channels
1392 for (l = 0; l < s_nchan[i]; l++) { // loop on the Matrix channels
1393 if (bitstatus(&m_input[i][j][k][0], l)) {
1394 nup++;
1395 if (nup == 1) first = l;
1396 } // end-of-if(bitstatus
1397 if (!bitstatus(&m_input[i][j][k][0], l) || (l == (s_nchan[i] - 1))) {
1398 if (nup) {
1399 reduce(i, j, k, 0, nup, first);
1400 nup = 0;
1401 } // end-of-if(nup
1402 } // end-of-if(bitstatus
1403 } // end-of-for(l
1404 } // end-of-for(k
1405 } // end-of-for(j
1406 } // end-of-for(i
1407} // end-of-method declustering
void reduce(ubit16 ia, ubit16 ja, ubit16 ka, ubit16 la, ubit16 nup, ubit16 first)
bool first
Definition DeMoScan.py:534

◆ delay()

void Matrix::delay ( )
private

Definition at line 930 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

930 {
931 ubit16 df = 7;
932 rpcdata *rpchit;
933 if (m_matrixDebug & 1 << df) {
934 cout << "--------------------" << endl << "| Matrix::delay |" << endl << "--------------------" << endl;
935 } // end-of-if(m_matrixDebug&1<<df)
936 for (ubit16 i = 0; i < 2; i++) {
937 rpchit = m_datarpc[i];
938 while (rpchit) {
939 rpchit->delay = m_channDelay[i][rpchit->layer][rpchit->stripadd / s_timeGroupA];
940 rpchit = rpchit->next;
941 } // end-of-while(rpchit
942 } // end-of-for(ubit16 i
943} // end-of-Matrix::delay

◆ deleteRPCdata()

void Matrix::deleteRPCdata ( )

Definition at line 130 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

130 {
131 ubit16 i;
132 // ubit16 df=1;
133 rpcdata *rpcpnt, *rpcpntnext;
134 //
135 // delete the dynamic memory allocated by the Matrix object
136 //
137 for (i = 0; i < 2; i++) {
138 rpcpnt = m_datarpc[i];
139 while (rpcpnt) {
140 rpcpntnext = rpcpnt->next;
141 delete rpcpnt;
142 rpcpnt = rpcpntnext;
143 } // end-of-while(rpcpnt)
144 } // end-of-for(i
145 // if(rpcpnt) delete rpcpnt;
146 //
147 // set DEFAULT parameters for the Coincidence Matrix
148 //
150 //
151} // end-of-Matrix::deleteRPCdata

◆ disp_CMAreg()

void Matrix::disp_CMAreg ( ubit16 id) const
private

Definition at line 1868 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1868 {
1869 //
1870 // display the CMA registers
1871 //
1872 ubit16 i, j, k;
1873 if (id < 2) {
1874 for (i = 0; i < 2; i++) { // loop on the two Matrix sides
1875 cout << " CMA Side (0=side-x; 1=side-y) " << i << endl;
1876 for (j = 0; j < 2; j++) { // loop on the two Matrix layers
1877 switch (id) {
1878 case 0:
1879 cout << " Layer " << j << endl;
1880 dispRegister(&m_input[i][j][0][0], i);
1881 break;
1882 case 1:
1883 cout << " Layer " << j << endl;
1884 dispRegister(&m_prepr[0][i][j][0][0], i);
1885 break;
1886 default: cout << " Matrix::disp_CMAreg id value " << id << " not foreseen " << endl;
1887 } // end-of-switch
1888 } // end-of-for(j
1889 } // end-of-for(i
1890
1891 } else {
1892 switch (id) {
1893 case 2:
1894 for (i = 0; i < s_nthres; i++) { // loop on threshold
1895 cout << " Threshold address " << i << endl;
1896 for (j = 0; j < 2; j++) { // loop on matrix sides
1897 cout << " CMA Side (0=side-x; 1=side-y) " << j << endl;
1898 for (k = 0; k < 2; k++) { // loop on majority types
1899 cout << " Majority type (0=1/2; 1=2/2) " << k << endl;
1900 dispRegister(&m_mjori[i][j][k][0][0], j);
1901 } // end-of-for(k
1902 } // end-of-for(j
1903 } // end-of-for(i
1904 break;
1905 case 3:
1906 for (i = 0; i < s_nthres; i++) { // loop on the three thresholds
1907 cout << " Trigger Threshold address " << i << endl;
1908 dispTrigger(&m_trigg[i][0]);
1909 } // end-of-for(i
1910 cout << " ReadOut Buffer " << endl;
1911 dispRegister(&rodat[0][0][0][0], 0);
1912 break;
1913 default: cout << " Matrix::disp_CMAreg id value " << id << " not foreseen " << endl;
1914 } // end-of-switch (id)
1915
1916 } // end-of-if(id
1917 cout << " " << endl;
1918} // end-of-Matrix::disp_CMAreg
void dispTrigger(const CMAword *p) const
void dispRegister(const CMAword *p, ubit16 side) const

◆ dispBinary()

void Matrix::dispBinary ( const CMAword * p,
std::ostringstream & strdisp ) const
private

Definition at line 1963 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1963 {
1964 ubit16 i;
1965 CMAword j;
1966 j = 1;
1967 for (i = 0; i < s_wordlen; i++) {
1968 if ((*p) & j) {
1969 strdisp << "|";
1970 } else {
1971 strdisp << ".";
1972 } // end-of-if
1973 j = j << 1;
1974 } // end-of-for(
1975} // end-of-Matrix::dispBinary

◆ dispDefaultConfiguration()

void Matrix::dispDefaultConfiguration ( ) const

Definition at line 319 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

319 {
320 ubit16 i, j, k;
321 //
322 // Coincidence Windows for the the three thresholds
323 //
324 cout << "=================================" << std::endl
325 << "Matrix::dispDefaultConfiguration:" << std::endl
326 << "=================================" << std::endl;
327 cout << "--------------------------------" << std::endl << "+ Coincidence Windows: " << std::endl;
328 for (i = 0; i < s_nthres; i++) {
329 cout << " + Threshold address:" << i << std::endl;
330 for (j = 0; j < s_nchan[0]; j++) {
331 cout << " -Channel address:" << j << " Window 63-32 " << std::hex << m_trigRoad[i][j][1] << " Window 31-00 "
332 << m_trigRoad[i][j][0] << std::dec << std::endl;
333 } // end-of-for(j
334 } // end-of-for(i
335 //
336 // Majority setting
337 //
338 cout << "--------------------------------" << std::endl
339 << "+ Majority addresses: " << std::endl
340 << "--------------------------------" << std::endl;
341 for (i = 0; i < s_nthres; i++) { cout << " - threshold address " << i << " value " << m_majorities[i] << std::endl; }
342 //
343 // threshold to be used for coincidence of the lowpt trigger with the
344 // external RPC doublet
345 //
346 cout << "--------------------------------" << std::endl
347 << "+ Threshold address low-to-high: " << m_lowtohigh << std::endl
348 << "+ Threshold address low-to-readout: " << m_toreadout << std::endl
349 << "+ Threshold address for overlap: " << m_overlapthres << std::endl;
350 //
351 // address of the configuration for the local coincidence
352 //
353 cout << "--------------------------------" << std::endl
354 << "+ Local coincidence setting: " << std::endl
355 << " -Pivot Plane: " << m_localDirec[0] << std::endl
356 << " -Coincidence Plane: " << m_localDirec[1] << std::endl;
357 //
358 // Overlap default masking
359 //
360 cout << "--------------------------------" << std::endl
361 << "+ Overlap mask setting: " << std::endl
362 << " -`right' address " << m_matOverlap[0] << std::endl
363 << " -`left ' address " << m_matOverlap[1] << std::endl;
364 //
365 // default for the signal delay, deadtime and pulse width arrays
366 //
367 cout << "-----------------------------------------------" << std::endl
368 << "+ Channel pulse-width, delay and deadtime : " << std::endl;
369 for (i = 0; i < 2; i++) { // side
370 if (!i) {
371 cout << " +Pivot Plane " << std::endl;
372 } else {
373 cout << " +Coincidence Plane " << std::endl;
374 }
375 for (j = 0; j < 2; j++) { // layer
376 cout << " +Layer " << j << std::endl;
377 for (k = 0; k < (s_nchan[i] / s_timeGroupB); k++) { // group
378 cout << " -group " << k << " pulsewidth " << m_pulseWidth[i][j][k] << std::endl;
379 } // end-of-for(k
380 for (k = 0; k < (s_nchan[i] / s_timeGroupA); k++) { // group
381 cout << " -group " << k << " delay " << m_channDelay[i][j][k] << std::endl;
382 } // end-of-for(k
383 for (k = 0; k < (s_nchan[i] / s_timeGroupB); k++) { // group
384 cout << " -group " << k << " deadtime " << m_channDeadT[i][j][k] << std::endl;
385 } // end-of-for(k
386 } // end-of-for(j
387 } // end-of-for(i
388 //
389 // Masking to 0
390 //
391 cout << "-----------------------------------------------" << std::endl << "+ Map of the masked-to-0 channels : " << std::endl;
392 for (i = 0; i < 2; i++) { // side
393 if (!i) {
394 cout << " +Pivot Plane " << std::endl;
395 } else {
396 cout << " +Coincidence Plane " << std::endl;
397 }
398 for (j = 0; j < 2; j++) { // layer
399 cout << " +Layer " << j << std::endl;
400 for (k = 0; k < s_nchan[1]; k++) {
401 if (m_channMask0[i][j][k]) { cout << " -channel " << k << std::endl; } // end-of-if
402 } // end-of-for(k
403 } // end-of-for(j
404 } // end-of-for(i
405 //
406 // default for trigger dead time
407 //
408 cout << "-----------------------------------------------" << std::endl << "+ Trigger Dead Time " << std::endl;
409 for (k = 0; k < (s_nchan[0] / s_timeGroupB); k++) { // group
410 cout << " -group " << k << " Trigger DeadTime " << m_trigDeadTime[k] << std::endl;
411 } // end-of-for(
412 //
413 // Simulation relevant parameters (used to align with the hardware)
414 //
415 cout << "-----------------------------------------------" << std::endl
416 << "+ Simulation parameters to align with the hardware (not used in CM)" << std::endl;
417 //
418 // m_BunchPhase and m_BunchOffset
419 //
420 cout << "+BunchPhase " << m_BunchPhase << std::endl
421 << " BunchPhase = 0 : to be used for standard ATLAS LVL1 simulation" << std::endl
422 << " BunchPhase = -1 : to be used to compare with the hardware; " << std::endl
423 << " this value fixed with VHDL comparison 1-7 august 2004." << std::endl
424 << "+BunchOffset " << m_BunchOffset << std::endl
425 << " BunchOffset = 0 : to test with hardware; use this setting with setBCzero(0)." << std::endl;
426 //
427 // the end
428 //
429 cout << "======================================" << std::endl
430 << "Matrix::dispDefaultConfiguration: Done" << std::endl
431 << "======================================" << std::endl;
432} // end-of-Matrix::dispDefaultConfiguration

◆ display()

void Matrix::display ( ) const

Definition at line 1814 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1814 {
1815 ubit16 i;
1816 ubit16 df = 19;
1817 rpcdata *rpcpnt;
1818 //
1819 // if(this) {
1820 cout << "=======================" << endl << "|| Matrix Display ||" << endl << "=======================" << endl << endl;
1822
1823 cout << endl << " All raw data " << endl;
1824 for (i = 0; i < 2; i++) {
1825 cout << " Matrix Side is " << i << endl;
1826 rpcpnt = m_datarpc[i];
1827 while (rpcpnt) {
1828 cout << " Layer= " << rpcpnt->layer << " stripadd= " << rpcpnt->stripadd << " time= " << rpcpnt->time
1829 << " mask= " << rpcpnt->masked << " BC= " << rpcpnt->BC << " DLL= " << rpcpnt->DLL << " delay= " << rpcpnt->delay << endl;
1830 rpcpnt = rpcpnt->next;
1831 } // end-of-while(rpcpnt)
1832 } // end-of-for(i
1833 //
1834 if (m_matrixDebug & 1 << (df + 0)) {
1835 cout << " Display Matrix Input " << endl;
1836 disp_CMAreg(0); // display the input registers
1837 }
1838 //
1839 //
1840 if (m_matrixDebug & 1 << (df + 1)) {
1841 cout << " Display Matrix Preprocessing " << endl;
1842 disp_CMAreg(1); // display the prepro registers
1843 }
1844 //
1845 if (m_matrixDebug & 1 << (df + 2)) {
1846 cout << " Display Matrix Majority " << endl;
1847 disp_CMAreg(2); // display the majority registers
1848 }
1849 //
1850 if (m_matrixDebug & 1 << (df + 3)) {
1851 cout << " Display Trigger " << endl;
1852 disp_CMAreg(3); // display the trigger registers
1853 }
1854 //
1855 //} else {
1856 // cout<<"======================="<<endl
1857 // <<"|| Matrix EMPTY ||"<<endl
1858 // <<"======================="<<endl;
1859 //}//end-of-Matrix::display
1860} // end-of-method display

◆ dispRegister()

void Matrix::dispRegister ( const CMAword * p,
ubit16 side ) const
private

Definition at line 1920 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1920 {
1921 ubit16 n, j, k;
1922 //
1923 // allocation for oststream strdisp
1924 //
1925 std::ostringstream strdisp;
1926 n = (s_nchan[side] - 1) / s_wordlen + 1;
1927 strdisp << " ";
1928
1929 for (j = 0; j < s_nchan[side]; j += 2) { strdisp << " " << j % 10; } // end-of-for
1930 strdisp << " " << endl;
1931 for (j = 0; j < m_nclock; j++) { // loop on the m_nclock cycles
1932 strdisp << " " << j % 10 << " ";
1933 for (k = 0; k < n; k++) { // loop on the buffer words
1934 dispBinary(p + k + 2 * j, strdisp);
1935 } // end-of-for(k
1936 strdisp << " " << endl;
1937
1938 } // end-of-for(j
1939
1940 cout << strdisp.str() << endl;
1941} // end-of-Matrix::dispRegister
void dispBinary(const CMAword *p, std::ostringstream &strdisp) const

◆ dispTrigger()

void Matrix::dispTrigger ( const CMAword * p) const
private

Definition at line 1943 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1943 {
1944 ubit16 j;
1945 //
1946 // allocation for oststream strdisp
1947 //
1948
1949 std::ostringstream strdisp;
1950 strdisp << " ";
1951
1952 for (j = 0; j < s_nchan[0]; j += 2) { strdisp << " " << j % 10; } // end-of-for
1953 strdisp << " " << endl;
1954 for (j = 0; j < m_nclock; j++) { // loop on the m_nclock cycles
1955 strdisp << " " << j % 10 << " ";
1956 dispBinary(p + j, strdisp);
1957 strdisp << " " << endl;
1958 } // end-of-for(j
1959
1960 cout << strdisp.str() << endl;
1961} // end-of-Matrix::dispTrigger

◆ dispWind() [1/2]

void Matrix::dispWind ( ) const

Definition at line 1977 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1977 {
1978 for (ubit16 i = 0; i < s_nthres; i++) { dispWind(i); }
1979} // end-of-dispWind

◆ dispWind() [2/2]

void Matrix::dispWind ( ubit16 thres) const

Definition at line 1981 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1981 {
1982 std::ostringstream strdisp;
1983
1984 strdisp << endl
1985 << " =========================" << endl
1986 << " = =" << endl
1987 << " = Matrix::dispWind =" << endl
1988 << " = Threshold address " << thres << " =" << endl
1989 << " = =" << endl
1990 << " =========================" << endl
1991 << endl;
1992 //
1993 for (sbit16 j = s_nchan[1] - 1; j >= 0; j--) {
1994 ubit16 ad1 = j / 32;
1995 ubit16 ad2 = j % 32;
1996 if (j < 10) {
1997 strdisp << " " << j << " ";
1998 } else {
1999 strdisp << j << " ";
2000 }
2001 for (ubit16 k = 0; k < s_nchan[0]; k++) {
2002 if ((m_trigRoad[thres][k][ad1]) & (1 << ad2)) {
2003 strdisp << "*";
2004 } else {
2005 strdisp << ".";
2006 } // end-of-if
2007 } // end-of-for(k
2008 strdisp << " " << endl;
2009 } // end-of-for(j
2010 strdisp << " " << endl;
2011 strdisp << " 00000000001111111111222222222233" << endl << " 01234567890123456789012345678901" << endl;
2012 //
2013 cout << strdisp.str() << endl;
2014} // end-of-dispWind

◆ execute()

void Matrix::execute ( )

Definition at line 856 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

856 {
857 // returns coincidence flag: 0 if there is no trigger for all thresholds
858 // 1 if there is at least one threshold with trigger
859 // 2 if the lowtohigh threshold (or higher) is m_trigg
860 //
861 // execute this active CM
862 //
863 ubit16 df = 4; // debug flag address
864 if (m_matrixDebug & 1 << df) {
865 cout << "====================" << endl
866 << "| |" << endl
867 << "| Matrix::execute |" << endl
868 << "| --------------- |" << endl
869 << "| |" << endl
870 << "====================" << endl;
872 } // end-of-if(m_matrixDebug&1<<df)
873 //
874 // 0) programmed windows (s_nthres) and time calibration constants for this
875 // matrix
876 if (m_matrixDebug & 1 << df) wind();
877 // 1) store deadtime in dyn. structure; deadtime is applied by "applyDeadTime"
879 // 2) masking;
880 masking();
881 // 3) delay
882 delay();
883 // 5) fill the CMA
884 load();
885 // 6) apply deadtime response to Input signals
886 deadTime();
888 // 7) preprocessing
889 prepro();
890 // 8) coincidence;
891 coincide();
892 //
893 makeOut();
894
895 // Code to be activated for testing the VHDL simulation.
896 // makeOutPattern ();
897 //
898} // end-of-method execute;

◆ getAddress0()

int Matrix::getAddress0 ( ) const

Definition at line 1756 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1756{ return m_address[0]; }

◆ getAddress1()

int Matrix::getAddress1 ( ) const

Definition at line 1758 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1758{ return m_address[1]; }

◆ getBunchOffset()

sbit16 Matrix::getBunchOffset ( ) const

Definition at line 1768 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1768{ return m_BunchOffset; } // end-of-ubit16-getBunchOffset

◆ getBunchPhase()

sbit16 Matrix::getBunchPhase ( ) const

Definition at line 1766 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1766{ return m_BunchPhase; } // end-of-ubit16-getBunchPhase

◆ getLocalAdd()

int Matrix::getLocalAdd ( ) const

Definition at line 1760 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1760{ return m_localadd; }

◆ getLowHigh()

int Matrix::getLowHigh ( ) const

Definition at line 1754 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1754{ return m_lowhigh; }

◆ getMajority()

int Matrix::getMajority ( ubit16 add) const

Definition at line 846 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

846 {
847 int output = 0;
848 if (add >= s_nthres) {
849 throw std::out_of_range("Matrix::getMajority : add= " + std::to_string(add) + " not valid");
850 } else {
852 } // end-of-if
853 return output;
854} // end-of-Matrix::getMajority
output
Definition merge.py:16

◆ getMatOverlap()

CMAword Matrix::getMatOverlap ( ubit16 add) const

Definition at line 825 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

825 {
826 CMAword output = 0;
827 if (add > 1) {
828 throw std::out_of_range("Matrix::getMatOverlap : add= " + std::to_string(add) + " not valid");
829 } else {
831 }
832 return output;
833} // end-of-Matrix::getMatOverlap

◆ getOutputOverl()

ubit16 Matrix::getOutputOverl ( ubit16 bunch) const

Definition at line 1764 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1764{ return m_overlap[bunch]; } // end-of-ubit16-getOutput

◆ getOutputThres()

ubit16 Matrix::getOutputThres ( ubit16 bunch) const

Definition at line 1762 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1762{ return m_highestth[bunch]; } // end-of-ubit16-getOutput

◆ getPad()

int Matrix::getPad ( ) const

Definition at line 1752 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1752{ return m_pad; }

◆ getParams()

ubit16 Matrix::getParams ( ) const

◆ getProjection()

int Matrix::getProjection ( ) const

Definition at line 1748 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1748{ return m_projection; }

◆ getRoad()

CMAword Matrix::getRoad ( ubit16 addThres,
ubit16 addChn,
ubit16 add64 ) const

Definition at line 835 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

835 {
836 CMAword output = 0;
837 if (addThres >= s_nthres || addChn > s_nchan[0] || add64 > 1) {
838 throw std::out_of_range("Matrix::getRoad : addThres= " + std::to_string(addThres) + " addChn= " + std::to_string(addChn) +
839 " add64= " + std::to_string(add64) + " not valid");
840 } else {
841 output = m_trigRoad[addThres][addChn][add64];
842 } // end-of-if
843 return output;
844} // end-of-Matrix::getRoad

◆ getSector()

int Matrix::getSector ( ) const

Definition at line 1750 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1750{ return m_sector; }

◆ getSubsystem()

int Matrix::getSubsystem ( ) const

Definition at line 1746 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1746{ return m_subsystem; }

◆ initDat()

void Matrix::initDat ( )

Definition at line 210 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

210 {
211 // put the current BC at the center of the buffer
212 m_BCID = -1;
213} // end-of-Matrix::initDat

◆ initPointers()

void Matrix::initPointers ( )

Definition at line 196 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

196 {
197 //
198 // initialize the Configuration pointers
199 //
200 m_chdly = 0; // pointer to channel delays
201 m_width = 0; // pointer to pulse widths
202 m_locDi = 0; // pointer to local Coincidence Direction
203 m_kRead = 0; // pointer to threshold pattern for readout
204 m_roads = 0; // pointer to the road Matrix settings
205 m_major = 0; // pointer to the majority
206 m_overl = 0; // pointer to the overlapping channel list
207 m_geome = 0; // pointer to "geometry"
208} // end-of-Matrix::initPointers

◆ initRegisters()

void Matrix::initRegisters ( )

Definition at line 169 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

169 {
170
171 // helper to set arrays to zero (only use with integer arrays!)
172 auto zero = [](auto& arr) { memset( arr, 0, sizeof(arr) ); };
173 zero( rodat );
174 zero( m_input );
175 zero( m_prepr );
176 zero( m_mjori );
177 zero( m_trigger );
178 zero( m_trigg );
180 zero( overlapRO );
181 zero( highestthRO );
182 zero( m_k_pattern );
183 zero( k_readout );
185 zero( m_highestth );
186 zero( m_overlap );
187} // end-of-Matrix::initRegisters
void zero(TH2 *h)
zero the contents of a 2d histogram

◆ initRPCpointers()

void Matrix::initRPCpointers ( )

Definition at line 189 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

189 {
190 //
191 // initialize the rpcdata structure
192 //
193 for (ubit16 i = 0; i < 2; i++) { m_datarpc[i] = 0; } // end-of-for(i
194} // end-of-Matrix::initRPCpointers

◆ intPow()

CMAword Matrix::intPow ( const ubit16 base,
const ubit16 expo ) const
private

Definition at line 2075 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

2075 {
2076 CMAword output = 1;
2077 if (expo) {
2078 for (ubit16 i = 1; i <= expo; i++) { output = output * base; } // end-of-for
2079 }
2080 return output;
2081} // end-of-CMAword Matrix::intPow
std::string base
Definition hcg.cxx:81

◆ load()

void Matrix::load ( )
private

Definition at line 945 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

945 {
946 ubit16 df = 8;
947 sbit32 abs_time, timeadd;
948 rpcdata *rpcpnt;
949 //
950 if (m_matrixDebug & 1 << df) {
951 cout << "--------------------" << endl << "| Matrix::load |" << endl << "--------------------" << endl;
952 } // end-of-if(m_matrixDebug&1<<df)
953 //
954 for (ubit16 i = 0; i < 2; i++) { // "i" is the CMA side address
955 rpcpnt = m_datarpc[i];
956 while (rpcpnt) {
957 if (m_matrixDebug & 1 << df) {
958 cout << " Layer= " << rpcpnt->layer << " stripadd= " << rpcpnt->stripadd << " time= " << rpcpnt->time
959 << " mask= " << rpcpnt->masked << " BC= " << rpcpnt->BC << " DLL= " << rpcpnt->DLL << " delay= " << rpcpnt->delay
960 << endl;
961 } // end-of-if(m_matrixDebug&1<<df)
962 abs_time = s_NDLLCYC * rpcpnt->BC + rpcpnt->DLL + rpcpnt->delay;
963
964 timeadd = abs_time - s_NDLLCYC * m_thisBC // synchronize the data to m_thisBC
965 + s_NDLLCYC * m_BCzero; // put m_thisBC at the center of the buffer
966
967 if (m_matrixDebug & 1 << df) { cout << " abs_time= " << abs_time << " timeadd= " << timeadd << endl; }
968
969 //
970 // store this digit if it is within time window and not masked
971 //
972 if (timeadd >= 0 && timeadd < m_nclock && !rpcpnt->masked) {
973 if (m_matrixDebug & 1 << df) {
974 cout << " setting input with side " << i << " " << rpcpnt->layer << " " << timeadd << " 0"
975 << " for channel " << rpcpnt->stripadd << " timeadd " << timeadd << endl;
976 } // end-of-if(m_matrixDebug&1<<df)
977 set_to_1(&m_input[i][rpcpnt->layer][timeadd][0], rpcpnt->stripadd);
978 } // end-of-if(timeadd
979 //
980 rpcpnt = rpcpnt->next;
981 //
982 } // end-of-while(rpcpnt)
983 } // end-of-for(i
984} // end-of-Matrix::load()
int32_t sbit32
Definition Lvl1Def.h:19

◆ majori()

void Matrix::majori ( )
private

Definition at line 1276 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1276 {
1277 //
1278 // input none
1279 // returns nothing
1280 //
1281 // Fills the majority registers the 1/2 and 2/2 majority logic
1282 //
1283 // Dynamic scanning of "on" channels has not to be done
1284 // in this first part of the method
1285 //
1286 ubit16 i, j, k, l, n;
1287 ubit16 df = 13; // debug flag address
1288 CMAword buffi[2], buffo[2];
1289 if (m_matrixDebug & 1 << df) {
1290 cout << "-------------------" << endl << "| Matrix::majori |" << endl << "-------------------" << endl;
1291 } // end-of-if(m_matrixDebug&1<<df)
1292 //
1293 // the loop on the CMA sides has to be made as follows:
1294 // 1) side=0 and side=1 as long as the lowpt Matrix is concerned;
1295 // 2) side=1 only as long as the highpt Matrix is concerned.
1296 // To do this, loop from lowhigh address.
1297 //
1298 for (n = 0; n < s_nthres; n++) { // the s_nthres thresholds
1299 for (i = 0; i < 2; i++) { // the two Matrix sides
1300 for (j = 0; j < m_nclock; j++) { // the clock cycles
1301 for (k = 0; k < 2; k++) { // the two words to make 64 bits
1302 // copy layer with address 0,1 to buffi; initialize buffoutput
1303 buffi[k] = m_prepr[n][i][1][j][k];
1304 buffo[k] = 0;
1305 }
1306 shift(&buffi[0], &buffo[0], i);
1307 for (k = 0; k < 2; k++) { // the two words
1308 // 1/2 majority
1309 m_mjori[n][i][0][j][k] = m_prepr[n][i][0][j][k] | m_prepr[n][i][1][j][k];
1310 // 2/2 majority
1311 m_mjori[n][i][1][j][k] = m_prepr[n][i][0][j][k] & buffo[k];
1312 } // end-of-for(k
1313 //
1314 // complete preprocessing...
1315 //
1316 for (l = 0; l < s_nchan[i]; l++) { // loop in the number of channel for this side
1317 if (bitstatus(&m_mjori[n][i][1][j][0], l)) {
1318 if ((l > 0) && (!bitstatus(&m_mjori[n][i][1][j][0], l - 1))) set_to_0(&m_mjori[n][i][0][j][0], l - 1);
1319 if ((l < s_nchan[i] - 1) && (!bitstatus(&m_mjori[n][i][1][j][0], l + 1))) set_to_0(&m_mjori[n][i][0][j][0], l + 1);
1320 } // end-of-if(
1321 } // end-of-for(l
1322 // preprocessing completed
1323 } // end-of-for(j
1324 } // end-of-for(i
1325 } // end-of-for(n
1326} // end-of-method majori
void shift(CMAword *buffi, CMAword *buffo, ubit16 i) const

◆ makeOut()

void Matrix::makeOut ( )
private

Definition at line 1459 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1459 {
1460 ubit16 i, j, k;
1461 //
1462 // fill k-pattern
1463 //
1464 for (j = 0; j < m_nclock; j++) { // loop on the clock bins
1466 k_readout[j] = m_trigg[m_toreadout][j];
1467 } // end-of-for(j
1468 //
1469 // find the highest satisfied threshold;
1470 // identify Bunch Crossing and put it in BCID.
1471 //
1472 for (j = 0; j < m_Nbunch; j++) {
1473 for (i = 0; i < s_nthres; i++) {
1474 if (m_trigger[i][j]) {
1475 m_highestth[j] = i + 1; // put threshold address+1 (correct threshold value)
1476 if (m_BCID < 0)
1477 m_BCID = j // local Bunch Crossing IDentifier
1478 + m_thisBC; // re-syncronize to absolute BCID
1479 // - m_BCzero; // remove offset used
1480 } // end-of-if(m_trigger
1481 } // end-of-for(i
1482 } // end-of-for(j
1483 //
1484 // Trigger in Overlapping channels is reported in m_triggerOverlap
1485 //
1486 for (j = 0; j < m_Nbunch; j++) { m_overlap[j] = m_triggerOverlap[j][0] + 2 * m_triggerOverlap[j][1]; } // end-of-for(j
1487 //
1488 // find the highest satisfied threshold for ReadOut pourposes;
1489 //
1490 for (j = 0; j < m_nclock; j++) { // loop on the clock bins
1491 for (i = 0; i < s_nthres; i++) { // loop on thresholds
1492 for (k = 0; k < s_nchan[0]; k++) { // loop on channels (pivot side)
1493 if (m_trigg[i][j] & (1 << k)) highestthRO[j] = i + 1;
1494 } // end-of-for(k
1495 } // end-of-for(i
1496 } // end-of-for(j
1497 //
1498 //
1499 // Trigger in Overlapping channels is reported in m_triggerOverlapRO
1500 //
1501 for (j = 0; j < m_nclock; j++) { overlapRO[j] = m_triggerOverlapRO[j][0] + 2 * m_triggerOverlapRO[j][1]; } // end-of-for(j
1502 //
1503} // end-of-Matrix::makeOut

◆ makeOutPattern()

void Matrix::makeOutPattern ( )
private

Definition at line 1601 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1601 {
1602 // int df=17;
1603 const float timeOffsetKPa = 168.125;
1604 const float timeOffsetThr = 210.500;
1605 ubit16 i, l;
1606 CMAword bit;
1607 ubit16 chanHistory[32] = {0};
1608 const ubit16 maxchan = 100;
1609 const ubit16 maxtimes = m_nclock;
1610 ubit16 ntimes, newtime;
1611 ubit16 nchannels[s_NDLLCYC*8][2][2], channels[s_NDLLCYC*8][2][2][maxchan];
1612 float time, times[s_NDLLCYC*8]{0};
1613 //
1614 // trigger registers: k-trigger (historically was k-pattern)
1615 //
1616 ntimes = 0;
1617 for (i = 0; i < m_nclock; i++) { nchannels[i][0][0] = 0; }
1618 time = (float)m_thisBC * s_BCtime - ((float)(m_BCzero * s_NDLLCYC)) * s_DLLtime;
1619 for (i = 0; i < m_nclock; time += s_DLLtime, i++) {
1620 bit = 1;
1621 newtime = 1;
1622 for (l = 0; l < s_nchan[0]; l++) {
1623 if (m_k_pattern[i] & bit) {
1624 if (!chanHistory[l]) {
1625 if (newtime) {
1626 if (ntimes < maxtimes) ntimes += 1;
1627 times[ntimes - 1] = time;
1628 } // end-of-if(newtime
1629 if (nchannels[ntimes - 1][0][0] < maxchan) nchannels[ntimes - 1][0][0] += 1;
1630 channels[ntimes - 1][0][0][nchannels[ntimes - 1][0][0] - 1] = l;
1631 newtime = 0;
1632 } // end-of-if(!chanHistory
1633 chanHistory[l] = 1;
1634 } else { // if(m_k_pattern
1635 chanHistory[l] = 0;
1636 } // end-of-if(m_k_pattern
1637 bit = bit << 1;
1638 } // end-of-for(l
1639 } // end-of-for(i
1640
1641 ubit16 nthresPass, thresPass[8], overlPass[8], BCidentifier[8];
1642 nthresPass = 0;
1643 for (i = 0; i < m_Nbunch; i++) {
1644 if (m_highestth[i]) {
1645 thresPass[nthresPass] = m_highestth[i];
1646 overlPass[nthresPass] = m_overlap[i];
1647 BCidentifier[nthresPass] = i;
1648 nthresPass += 1;
1649 }
1650 }
1651 makeTestPattern(1, ntimes + 2 * nthresPass);
1652 //
1653 // open output file
1654 //
1655 ofstream out_k_trigger;
1656 out_k_trigger.open("k-trigger.output", ios::app);
1657 //
1658 // code to print out m_k_pattern
1659 //
1660 for (i = 0; i < ntimes; i++) {
1661 out_k_trigger << " TIME " << times[i] + timeOffsetKPa << " K ";
1662 out_k_trigger << nchannels[i][0][0] << " ";
1663 for (l = 0; l < nchannels[i][0][0]; l++) { out_k_trigger << channels[i][0][0][l] << " "; } // end-of-for(l
1664 out_k_trigger << endl;
1665 } // end-of-for(i
1666 //
1667 if (nthresPass) {
1668 for (i = 0; i < nthresPass; i++) {
1669 out_k_trigger << " TIME " << BCidentifier[i] * 25. + timeOffsetThr;
1670 out_k_trigger << " THR " << thresPass[i] << endl;
1671 if (overlPass[i]) {
1672 out_k_trigger << " TIME " << BCidentifier[i] * 25. + timeOffsetThr;
1673 out_k_trigger << " OVL " << overlPass[i] << std::endl;
1674 }
1675 }
1676 }
1677 //
1678 out_k_trigger.close();
1679 //
1680} // end-of-makeOutPattern
void makeTestPattern(ubit16 mode, ubit16 ktimes)
time(flags, cells_name, *args, **kw)

◆ makeTestPattern()

void Matrix::makeTestPattern ( ubit16 mode,
ubit16 ktimes )
private

Definition at line 1505 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1505 {
1506 //
1507 int df = 16;
1508 const ubit16 maxchan = 100;
1509 const ubit16 maxtimes = 1000;
1510 ubit16 i, j, l;
1511 ubit16 IJ[maxtimes][4] = {{0}};
1512 ubit16 channels[maxtimes][4][maxchan] = {{{0}}};
1513 float times[maxtimes] = {0};
1514 char plane[4][3];
1515 const float timeOffsetHit = 114.675;
1516 //
1517 rpcdata *rpcpnt;
1518 float timemin;
1519 //
1520 strcpy(plane[0], "I0");
1521 strcpy(plane[1], "I1");
1522 strcpy(plane[2], "J0");
1523 strcpy(plane[3], "J1");
1524 if (m_matrixDebug & 1 << df) {
1525 cout << "-------------------------------" << endl
1526 << "| Matrix::makeTestPattern |" << endl
1527 << "-------------------------------" << endl;
1528 } // end-of-if(m_matrixDebug&1<<df)
1529 //
1530 int ntimes = 0;
1531 ubit16 completed = 0;
1532 //
1533 // first reset the marker flags
1534 //
1535 for (i = 0; i < 2; i++) {
1536 rpcpnt = m_datarpc[i];
1537 while (rpcpnt) {
1538 rpcpnt->mark = 0;
1539 rpcpnt = rpcpnt->next;
1540 } // end-of-while(rpcpnt
1541 } // end-of-for(i
1542 //
1543 while (!completed) {
1544 completed = 1;
1545 timemin = 999999999.;
1546 for (i = 0; i < 2; i++) { // "i" is the CMA side address
1547 rpcpnt = m_datarpc[i];
1548 while (rpcpnt) {
1549 if (rpcpnt->time < timemin && !rpcpnt->mark) {
1550 timemin = rpcpnt->time;
1551 completed = 0;
1552 } // end-of-if(rpcnt
1553 rpcpnt = rpcpnt->next;
1554 } // end-of-while(rpcpnt)
1555 } // end-of-for(i
1556 if (!completed) {
1557 if (ntimes < maxtimes) ntimes += 1;
1558 times[ntimes - 1] = timemin;
1559 for (i = 0; i < 2; i++) { // "i" is the CMA side address
1560 rpcpnt = m_datarpc[i];
1561 while (rpcpnt) {
1562 if (rpcpnt->time == timemin) {
1563 rpcpnt->mark = 1;
1564 if (IJ[ntimes - 1][rpcpnt->layer + 2 * i] < maxchan) { IJ[ntimes - 1][rpcpnt->layer + 2 * i] += 1; }
1565 channels[ntimes - 1][rpcpnt->layer + 2 * i][IJ[ntimes - 1][rpcpnt->layer + 2 * i] - 1] = rpcpnt->stripadd;
1566 } // end-of-if(rpcnt
1567 rpcpnt = rpcpnt->next;
1568 } // end-of-while(rpcpnt)
1569 } // end-of-for(i
1570 } // end-of-if(!completed
1571 } // end-of-while(!completed)
1572 //
1573 //
1574 // open output file
1575 //
1576 ofstream vhdlinput;
1577 vhdlinput.open("k-trigger.output", ios::app);
1578 if (!vhdlinput) {
1579 cout << " File for vhdl analysis not opened. " << endl << " ==================================" << endl << endl;
1580 } else {
1581 if (m_matrixDebug & 1 << df) {
1582 cout << " File for vhdl analysis correctly opened" << endl << endl;
1583 } // end-of-if(m_matrixDebug&1<<df)
1584 } // end-of-if(!vhdlinput
1585 if (mode) {
1586 vhdlinput << " RUN " << m_run << " EVENT " << m_event << " WINDOW " << m_Nbunch;
1587 vhdlinput << " LINES " << (ntimes + ktimes) << std::endl;
1588 } // end-of-if(mode
1589 for (l = 0; l < ntimes; l++) {
1590 vhdlinput << " TIME " << times[l] + timeOffsetHit << " ";
1591 for (i = 0; i < 4; i++) {
1592 vhdlinput << plane[i][0] << plane[i][1] << " " << IJ[l][i] << " ";
1593 for (j = 0; j < IJ[l][i]; j++) { vhdlinput << channels[l][i][IJ[l][i] - 1 - j] << " "; } // end-of-for(j
1594 } // end-of-for(i
1595 vhdlinput << std::endl;
1596 } // end-of-for(l
1597 //
1598 vhdlinput.close();
1599} // end-of-makeTestPattern

◆ masking()

void Matrix::masking ( )
private

Definition at line 915 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

915 {
916 ubit16 df = 6;
917 rpcdata *rpchit;
918 if (m_matrixDebug & 1 << df) {
919 cout << "--------------------" << endl << "| Matrix::masking |" << endl << "--------------------" << endl;
920 } // end-of-if(m_matrixDebug&1<<df)
921 for (ubit16 i = 0; i < 2; i++) {
922 rpchit = m_datarpc[i];
923 while (rpchit) {
924 rpchit->masked = m_channMask0[i][rpchit->layer][rpchit->stripadd];
925 rpchit = rpchit->next;
926 } // end-of-while(rpchit
927 } // end-of-for(ubit16 i
928} // end-of-Matrix::masking

◆ maskTo1()

void Matrix::maskTo1 ( )
private

Definition at line 1186 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1186 {
1187 ubit16 df = 11;
1188 if (m_matrixDebug & 1 << df) {
1189 cout << "---------------------" << endl << "| Matrix::mask_to_1 |" << endl << "---------------------" << endl;
1190 } // end-of-if(m_matrixDebug&1<<df)
1191
1192 ubit16 i, j, k, l, m;
1193 for (m = 0; m < s_nthres; m++) { // thresholds
1194 for (i = 0; i < 2; i++) { // side address
1195 for (j = 0; j < 2; j++) { // majority address
1196 for (l = 0; l < s_nchan[i]; l++) { // channel
1197 if (bitstatus(&m_channMask1[m][i][j][0], l)) {
1198 for (k = 0; k < m_nclock; k++) { // clock bins
1199 set_to_1(&m_mjori[m][i][j][k][0], l);
1200 } // end-of-for(k
1201 } // end-of-if(m_channMask1
1202 } // end-of-for(l
1203 } // end-of-for(j
1204 } // end-of-for(i
1205 } // end-of-for(m
1206
1207} // end-of-Matrix::mask_to_1

◆ name()

const std::string & BaseObject::name ( ) const
inlineinherited

Definition at line 23 of file BaseObject.h.

23{ return m_name; }
std::string m_name
Definition BaseObject.h:16

◆ prepro()

void Matrix::prepro ( )
private

Definition at line 1001 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1001 {
1002 ubit16 df = 9;
1003 if (m_matrixDebug & 1 << df) {
1004 cout << "-------------------------" << endl << "| matrix: preprocessing |" << endl << "-------------------------" << endl;
1005 } // end-of-if(m_matrixDebug&1<<df)
1006 //
1007 // 1) pulse width
1008 pulse_width();
1009 // 2) declustering
1010 declus();
1011 // 3) majority
1012 majori();
1013 // 4) mask to 1
1014 maskTo1();
1015} // end-of-method prepro

◆ Print()

◆ pulse_width()

void Matrix::pulse_width ( )
private

Definition at line 1247 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1247 {
1248 ubit16 df = 12;
1249 ubit16 i, j, l, m;
1250 sbit16 k;
1251 if (m_matrixDebug & 1 << df) {
1252 cout << "-----------------------" << endl << "| Matrix::pulse_width |" << endl << "-----------------------" << endl;
1253 } // end-of-if(m_matrixDebug&1<<df)
1254 //
1255 for (i = 0; i < 2; i++) { // loop on the two Matrix sides
1256 for (j = 0; j < 2; j++) { // loop on both layers
1257 for (l = 0; l < s_nchan[i]; l++) { // loop on all channels
1258 for (k = m_nclock - 1; k >= 0; k--) { // loop on the m_nclock cycles backwards
1259 if (bitstatus(&m_input[i][j][k][0], l)) {
1260 // loop on all time bins to be set to 1
1261 for (m = k + 1; m < k + m_pulseWidth[i][j][l / s_timeGroupB]; m++) {
1262 if (m < m_nclock) {
1263 set_to_1(&m_input[i][j][m][0], l);
1264 } else {
1265 break;
1266 } // end-of-if(m
1267 } // end-of-for(m
1268 } // end-of-if(bitstatus
1269 } // end-of-for(k
1270 } // end-of-for(l
1271 } // end-of-for(j
1272 } // end-of-for(i
1273 //
1274} // end-of-Matrix::pulse_width

◆ putData()

void Matrix::putData ( int sidemat,
int layer,
int stripaddress,
float time )

Definition at line 434 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

434 {
435 //
436 sbit16 BCID; // BC time bin (from 0)
437 ubit16 DLLID; // DLL time bin (from 0)
438 ubit16 df = 2; // debug flag address
439 rpcdata *rpcpntnew;
440 if (m_matrixDebug & 1 << df) { cout << "Matrix:putData: putting data on Matrix" << endl; }
441 //
442 BCID = (int)(time / s_BCtime);
443 if (time < 0.0) BCID--; // to cope with negative times
444 //
445 // the next line determines the DLL clock bin associated
446 // to the given time. For historical reasons, a +1 offset has
447 // been used so far:
448 // DLLID= (int)((time-(float)BCID*s_BCtime)/s_DLLtime)+1;
449 // It should be now removed. Aleandro, 11 November 2008.
450 //
451 DLLID = (int)((time - (float)BCID * s_BCtime) / s_DLLtime);
452 if (DLLID == s_NDLLCYC) {
453 BCID++;
454 DLLID = 0;
455 } // end-of-if(DLLID
456 //
457 // put this digi in the dynamic store
458 //
459 // coverity change
460 // rpcpntnew = new rpcdata;
461 //
462 // check the stripaddress is consistent with the Matrix dimension
463 //
464 if (BCID >= m_Nbunch) return;
465
466 if (stripaddress >= 0 && stripaddress < s_nchan[sidemat]) {
467 // coverity change
468 rpcpntnew = new rpcdata;
469
470 rpcpntnew->layer = layer;
471 rpcpntnew->stripadd = stripaddress;
472 rpcpntnew->time = time;
473 rpcpntnew->BC = BCID;
474 rpcpntnew->DLL = DLLID;
475 rpcpntnew->masked = 0;
476 rpcpntnew->maskto1 = 0;
477 rpcpntnew->deadtime = 0;
478 rpcpntnew->delay = 0;
479 rpcpntnew->mark = 0;
480 rpcpntnew->next = m_datarpc[sidemat];
481 //
482 // put this element as first in the queue
483 //
484 m_datarpc[sidemat] = rpcpntnew;
485
486 } else {
487 throw std::out_of_range("Matrix::putData failure: channel addressed is " + std::to_string(stripaddress) + " for matrix side " +
488 std::to_string(sidemat));
489 } // end-of-if
490} // end-of-putData
@ layer
Definition HitInfo.h:79

◆ putPatt()

void Matrix::putPatt ( const Matrix * p)

Definition at line 492 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

492 {
493 //
494 // input: p pointer of the low-pt Matrix belonging to the
495 // high-pt one
496 //
497 CMAword k;
498 ubit16 i, j;
499 ubit16 df = 3; // debug flag address
500 if (m_matrixDebug & 1 << df) { cout << " method putPatt called; p is " << p << endl; }
501 //
502 //
503 // for(i=0; i<2; i++) { // loop on the two majorities
504 // for(j=0; j<m_nclock; j++) { // loop on the clock bins
505 // for(k=0; k<2; k++) { // loop on buffer words
506 // for(n=0; n<s_nthres; n++) { // loop on the "s_nthres" registers
507 // m_mjori[n][0][i][j][k] = p->m_k_pattern[j];
508 // }//end-of-for(n
509 // }//end-of-for(k
510 // }//end-of-for(j
511 // }//end-of-for(i
512 //
513 //
514 float time = 0.0;
515 k = 1;
516
517 // cout<<" RITARDI-1 "<<endl;
518 // for(int iside=0;iside<=1;iside++){
519 // for(int ilayer=0;ilayer<=1;ilayer++){
520 // for(ubit16 k=0; k<(s_nchan[iside]/s_timeGroupA); k++) {
521 // cout<<" side="<<iside<<" layer="<<ilayer<<" group="<<k
522 // <<" delay="<<m_channDelay[iside][ilayer][k]<<endl;
523 // }
524 // }
525 // }//end-of-for(ubit16 k
526
527 for (i = 0; i < s_nchan[0]; i++) {
528 for (j = 0; j < m_nclock; j++) {
529 if (p->m_k_pattern[j] & k) {
530 time = ((float)j + 0.5) * s_DLLtime + (float)m_thisBC * s_BCtime - (float)(m_BCzero)*s_BCtime;
531 putData(0, 0, i, time);
532 } // end-of-if(p->m_k_pattern
533 } // end-of-for(j
534 k = k << 1;
535 } // end-of-for(i
536 //
537 if (m_matrixDebug & 1 << df) { cout << " copy_pivot; input matrix address " << p << endl; } // end-of-if(m_matrixDebug&1<<df)
538} // end-of-method putPatt
void putData(int sidemat, int layer, int stripaddress, float time)

◆ reduce()

void Matrix::reduce ( ubit16 ia,
ubit16 ja,
ubit16 ka,
ubit16 la,
ubit16 nup,
ubit16 first )
private

Definition at line 1409 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1409 {
1410 //
1411 // input ia, ja, ka, la indices of the Matrix data
1412 // nup cluster size = number of consecutive channels on
1413 // first address of the first channel on in the cluster (from 0)
1414 // returns nothing
1415 //
1416 // It copies into m_prepr the channels from input selected by the
1417 // declustering logic.
1418 //
1419 //
1420 ubit16 ncop, i, j, na;
1421 ubit16 df = 15;
1422 ncop = 0;
1423 j = 0;
1424 if (m_matrixDebug & 1 << df) {
1425 cout << " --------------------" << endl
1426 << " | Matrix::reduce |" << endl
1427 << " --------------------" << endl
1428 << " nup= " << nup << " first " << first << endl;
1429 } // end-of-if(m_matrixDebug&1<<df)
1430 //
1431 // analyse nup value and apply the cluster reduction according to it.
1432 // j is the first channel of the cluster retained after declustering;
1433 // ncop is the cluster size after declustering
1434 //
1435 if (nup <= 2) {
1436 j = first;
1437 ncop = nup;
1438 } else if (nup == 3) {
1439 j = first + 1;
1440 ncop = 1;
1441 } else if (nup == 4) {
1442 j = first + 1;
1443 ncop = 2;
1444 } else if (nup > 4) {
1445 j = first + 2;
1446 ncop = nup - 4;
1447 } // end-of-if
1448 if (m_matrixDebug & 1 << df) { cout << " j= " << j << " ncop= " << ncop << endl; } // end-of-if(m_matrixDebug&1<<df)
1449 //
1450 // copy the reduced cluster into the "s_nthres" m_prepr registers
1451 //
1452 for (na = 0; na < s_nthres; na++) {
1453 for (i = j; i < j + ncop; i++) { // loop on each element of the reduced cluster
1454 set_to_1(&m_prepr[na][ia][ja][ka][la], i);
1455 } // end-of-for(i
1456 } // end-of-for(na
1457} // end-of-reduce

◆ reset()

void Matrix::reset ( )

Definition at line 153 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

153 {
154 //
155 // initialize some variables
156 //
157 initDat();
158 //
159 // delete dynamic memory used for RPC data
160 //
162 //
163 // initialize the CMAword registers
164 //
166 //
167} // end-of-Matrix::reset

◆ set_to_0()

void Matrix::set_to_0 ( CMAword * p,
sbit16 channel ) const
private

Definition at line 1780 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1780 {
1781 CMAword j{1};
1782 std::array<ubit16, 2> i = inds(channel);
1783 if (!(channel < 0)) {
1784 *(p + i[0]) = *(p + i[0]) & ~(j << i[1]);
1785 } else {
1786 throw std::out_of_range("Matrix::set_to_1: channel is negative; channel=" + std::to_string(channel));
1787 } // end-of-if(!(channel<0
1788} // end-of-Matrix::set_to_1

◆ set_to_1()

void Matrix::set_to_1 ( CMAword * p,
sbit16 channel ) const
private

Definition at line 1770 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1770 {
1771 CMAword j{1};
1772 std::array<ubit16, 2> i = inds(channel);
1773 if (!(channel < 0)) {
1774 *(p + i[0]) = *(p + i[0]) | j << i[1];
1775 } else {
1776 throw std::out_of_range("Matrix::set_to_1: channel is negative; channel=" + std::to_string(channel));
1777 } // end-of-if(!(channel<0
1778} // end-of-Matrix::set_to_1

◆ setBCzero()

void Matrix::setBCzero ( ubit16 offset)

Definition at line 545 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

545 {
546 //
547 // set the BunchCrossing=0 to the "offset" array address in memory
548 //
549 if (offset <= m_Nbunch - 1)
551 else
552 m_BCzero = m_Nbunch - 1;
553} // end-of-setBCzero

◆ setConfig()

void Matrix::setConfig ( int * l,
ubit16 * p1,
int * k,
CMAword * p2,
int * q,
CMAword * o,
sbit32 * g )

Definition at line 688 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

688 {
689 //
690 // input: l pointer to local coincidence direction
691 // p pointer to pulse width
692 // k pointer to threshold for k-readout pattern
693 // r pointer to the three Matrix roads;
694 // m pointer to the three majorities;
695 // o pointer to the overlapping channel list;
696 // g pointer to "geometry"
697 //
698 ubit16 i, j, jg;
699 ubit16 addGroupMax = 0;
700 // ubit16 df=4; // debug flag address
702 m_locDi = l; // local coincidence direction //
703 m_width = p; // pulse width //
704 m_chdly = 0; // delay //
705 m_kRead = k; // k-readout address //
706 m_roads = r; // programmed coincidence window address //
707 m_major = m; // programmed majority address //
708 m_overl = o; // programmed overlap flag address //
709 m_geome = g; // pre-calculated geometry //
711 for (i = 0; i < 2; i++) { setLocalDirection(i, *(m_locDi + i)); }
712 // set Pulse Widths
713 for (i = 0; i < 2; i++) { // side
714 addGroupMax = s_nchan[0] / s_timeGroupB;
715 if (i) addGroupMax = s_nchan[1] / s_timeGroupB;
716 for (j = 0; j < 2; j++) { // layer
717 for (jg = 0; jg < addGroupMax; jg++) { // group
718 // setPulseWidth(i,j,jg,*(m_width+jg+8*j+16*i));
719 // setDelay (i,j,jg,*(m_chdly+jg+8*j+16*i));
720 } // end-of-for(jg
721 } // end-of-for(j
722 } // end-of-for(i
723 // set address of threshold to be readout
725 // set majority levels
726 for (i = 0; i < s_nthres; i++) { setMajority(i, *(m_major + i)); }
727 // set coincidence roads for the s_nthres thresholds
728 for (i = 0; i < s_nthres; i++) {
729 for (j = 0; j < s_nchan[0]; j++) {
730 setRoad(i, j, 0, *(m_roads + s_nchan[0] * 2 * i + 2 * j + 0));
731 setRoad(i, j, 1, *(m_roads + s_nchan[0] * 2 * i + 2 * j + 1));
732 } // end-of-for(j
733 } // end-of-for(i
734 // set the overlap registers
735 for (i = 0; i < 2; i++) { setMatOverlap(i, *(m_overl + i)); }
736 for (i = 0; i < s_nchan[0]; i++) { setDiagonal(i, *(m_geome + i)); }
737} // end-of-Matrix::setConfig
void setMatOverlap(ubit16 add, CMAword content)
void setLocalDirection(ubit16 add, int content)
void setMajority(ubit16 add, int content)
void setRoad(ubit16 addThres, ubit16 addChn, ubit16 add64, CMAword content)
void setDiagonal(ubit16 add, sbit32 content)
int r
Definition globals.cxx:22

◆ setDeadTime() [1/3]

void Matrix::setDeadTime ( ubit16 deadt)

Definition at line 555 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

555 {
556 for (ubit16 iside = 0; iside < 2; iside++) {
557 for (ubit16 ilayer = 0; ilayer < 2; ilayer++) {
558 for (ubit16 k = 0; k < (s_nchan[iside] / s_timeGroupB); k++) { setDeadTime(iside, ilayer, k, deadt); } // end-of-for(ubit16 k
559 } // end-of-for(ubit16 ilayer
560 } // end-of-for(ubit16 iside
561} // end-of-setDeadTime

◆ setDeadTime() [2/3]

void Matrix::setDeadTime ( ubit16 iside,
ubit16 ilayer,
ubit16 deadt )

Definition at line 563 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

563 {
564 for (ubit16 k = 0; k < (s_nchan[iside] / s_timeGroupB); k++) { setDeadTime(iside, ilayer, k, deadt); } // end-of-for(ubit16 k
565} // end-of-setDeadTime

◆ setDeadTime() [3/3]

void Matrix::setDeadTime ( ubit16 iside,
ubit16 ilayer,
ubit16 igroup,
ubit16 deadt )

Definition at line 567 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

567 {
568 if (iside < 2 && ilayer < 2 && igroup < (s_nchan[1] / s_timeGroupB)) {
569 m_channDeadT[iside][ilayer][igroup] = deadt;
570 if (iside == 0 && igroup > 3) {
571 throw std::out_of_range(
572 "Matrix::setDeadTime: problems with side and group addresses: "
573 "side=" +
574 std::to_string(iside) + " layer=" + std::to_string(ilayer) + " group=" + std::to_string(igroup));
575 } // end-of-if
576 } else {
577 throw std::out_of_range(
578 "Matrix::setDeadTime: problems in adressing pulseWidth: "
579 "side=" +
580 std::to_string(iside) + " layer=" + std::to_string(ilayer) + " group=" + std::to_string(igroup));
581 } // end-of-if
582} // end-of-setDeadTime

◆ setDefaultConfiguration()

void Matrix::setDefaultConfiguration ( )

Definition at line 215 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

215 {
216 ubit16 df = 0; // debug flag address as for constructor
217 ubit16 i, j, k, l;
218 //
219 // set DEFAULT parameters for the Coincidence Matrix
220 //
221 //
222
223 //
224 // Coincidence Windows for the the three thresholds
225 //
226 for (i = 0; i < s_nthres; i++) {
227 for (j = 0; j < s_nchan[0]; j++) {
228 m_trigRoad[i][j][0] = 0x00000000;
229 m_trigRoad[i][j][1] = 0x00000000;
230 } // end-of-for(j
231 } // end-of-for(i
232 //
233 // Majority setting
234 //
235 m_majorities[0] = 2; // majority values for threshold address 0
236 m_majorities[1] = 2; // majority values for threshold address 1
237 m_majorities[2] = 2; // majority values for threshold address 2
238 //
239 // threshold to be used for coincidence of the lowpt trigger with the
240 // external RPC doublet
241 //
242 m_lowtohigh = s_nthres - 1;
243 //
244 // threshold to be used to provide the trigger data in the readout;
245 // important for the correct functioning of the LVL2 (muFast)
246 //
247 m_toreadout = 0; // threshold of the pattern to be sent to the readout
248 //
249 // address of the threshold to be considered in overlap (dimuon counting)
250 //
251 m_overlapthres = 0;
252 //
253 // address of the configuration for the local coincidence
254 //
255 m_localDirec[0] = 7; // majority Direction
256 m_localDirec[1] = 7; // majority Direction
257 //
258 // default for m_matOverlap
259 //
260 for (i = 0; i < 2; i++) { m_matOverlap[i] = 0; }
261 //
262 // default for the signal delay, deadtime and pulse width arrays
263 //
264 for (i = 0; i < 2; i++) { // side
265 for (j = 0; j < 2; j++) { // layer
266 for (k = 0; k < (s_nchan[1] / s_timeGroupB); k++) { // group
267 m_pulseWidth[i][j][k] = 8;
268 } // end-of-for(k
269 for (k = 0; k < (s_nchan[1] / s_timeGroupA); k++) { // group
270 m_channDelay[i][j][k] = 0;
271 } // end-of-for(k
272 for (k = 0; k < (s_nchan[1] / s_timeGroupB); k++) { // group
273 m_channDeadT[i][j][k] = 0;
274 } // end-of-for(k
275 } // end-of-for(j
276 } // end-of-for(i
277 //
278 // Masking to 0 and masking to 1
279 //
280 for (i = 0; i < 2; i++) { // side
281 for (j = 0; j < 2; j++) { // layer (or "1/2"=0, "2/2"=1 in case of m_channMask1)
282 for (k = 0; k < s_nchan[1]; k++) { m_channMask0[i][j][k] = 0; } // end-of-for(k
283 for (l = 0; l < s_nthres; l++) {
284 m_channMask1[l][i][j][0] = 0;
285 m_channMask1[l][i][j][1] = 0;
286 } // end-of-for(l=0
287 m_channReadOutMask[i][j][0] = 0;
288 m_channReadOutMask[i][j][1] = 0;
289 } // end-of-for(j
290 } // end-of-for(i
291 //
292 // default for trigger dead time
293 //
294 for (k = 0; k < (s_nchan[0] / s_timeGroupB); k++) { // group
295 m_trigDeadTime[k] = 8;
296 } // end-of-for(
297 //
298 // initialize m_BunchPhase and m_BunchOffset
299 //
300 m_BunchPhase = 0; // use this setting for standard ATLAS simulation;
301 // m_BunchPhase=-1; // use this setting with comparison with the HARDWARE;
302 // value fixed with VHDL comparison 1-7 august 2004.
303 // use with setBCzero(0);
304 m_BunchOffset = 0; // test with hardware; use with setBCzero(0);
305 //
306 // default for m_diagonal
307 //
308 for (i = 0; i < s_nchan[0]; i++) { m_diagonal[i] = 0; }
309
310 if (m_matrixDebug & 1 << df) {
311 cout << "====================================================================" << endl
312 << "Matrix::setDefaultConfiguration: "
313 << "Default settings have been loaded." << std::endl
314 << "===================================================================" << endl;
316 }
317} // end-of-Matrix::setDefaultConfiguration

◆ setDelay() [1/2]

void Matrix::setDelay ( ubit16 iside,
ubit16 ilayer,
ubit16 delay )

Definition at line 584 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

584 {
585 if (iside > 1 || ilayer > 1) {
586 throw std::out_of_range(
587 "Matrix::setDelay: problems with side and layer addresses: "
588 "side=" +
589 std::to_string(iside) + " layer=" + std::to_string(ilayer));
590 } else {
591 for (ubit16 k = 0; k < (s_nchan[iside] / s_timeGroupA); k++) { setDelay(iside, ilayer, k, delay); } // end-of-for(ubit16 k
592 }
593} // end-of-setDelay
void setDelay(ubit16 iside, ubit16 ilayer, ubit16 delay)

◆ setDelay() [2/2]

void Matrix::setDelay ( ubit16 iside,
ubit16 ilayer,
ubit16 igroup,
ubit16 delay )

Definition at line 595 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

595 {
596 if (iside < 2 && ilayer < 2 && igroup < (s_nchan[1] / s_timeGroupA)) {
597 m_channDelay[iside][ilayer][igroup] = delay;
598 if (iside == 0 && igroup > 3) {
599 throw std::out_of_range(
600 "Matrix::setDelay: problems with side and group addresses:"
601 "side=" +
602 std::to_string(iside) + " layer=" + std::to_string(ilayer) + " group=" + std::to_string(igroup));
603 } // end-of-if
604 } else {
605 throw std::out_of_range(
606 "Matrix::setDelay: problems in adressing pulseWidth:"
607 "side=" +
608 std::to_string(iside) + " layer=" + std::to_string(ilayer) + " group=" + std::to_string(igroup));
609 } // end-of-if
610} // end-of-setDelay

◆ setDiagonal()

void Matrix::setDiagonal ( ubit16 add,
sbit32 content )

Definition at line 817 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

817 {
818 if (add > s_nchan[0]) {
819 throw std::out_of_range("Matrix::setDiagonal : add= " + std::to_string(add) + " not valid");
820 } else {
822 } // end-of-if
823} // end-of-Matrix::setDiagonal
str content
Definition grepfile.py:56

◆ setKReadOut()

void Matrix::setKReadOut ( int kToReadout)

Definition at line 747 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

747 {
748 if (content < 0 || content >> 2) {
749 throw std::out_of_range("Matrix::setKReadout : threshold address = " + std::to_string(content) + " not valid");
750 } else {
752 } // end-of-if
753} // end-of-Matrix::setKReadOut

◆ setLocalDirection()

void Matrix::setLocalDirection ( ubit16 add,
int content )

Definition at line 739 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

739 {
740 if (add > 1) {
741 throw std::out_of_range("Matrix::setLocalDirection : add=" + std::to_string(add) + " not valid");
742 } else {
744 } // end-of-if;
745} // end-of-Matrix::setLocalDirection

◆ setMajority()

void Matrix::setMajority ( ubit16 add,
int content )

Definition at line 775 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

775 {
776 if (add >= s_nthres) {
777 throw std::out_of_range("Matrix::setMajority : add=" + std::to_string(add) + " not valid");
778 } else {
780 } // end-of-if
781} // end-of-Matrix::setMajority

◆ setMask0()

void Matrix::setMask0 ( ubit16 iside,
ubit16 ilayer,
ubit16 ichannel )

Definition at line 642 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

642 {
643 if (iside > 1 || ilayer > 1 || ichannel > (s_nchan[iside] - 1)) {
644 throw std::out_of_range(
645 "Matrix::setMask0: problems with side/layer/channel addresses: "
646 "side=" +
647 std::to_string(iside) + " layer=" + std::to_string(ilayer) + " channel=" + std::to_string(ichannel));
648 } else {
649 m_channMask0[iside][ilayer][ichannel] = 1;
650 }
651} // end-of-setMask0

◆ setMask1() [1/3]

void Matrix::setMask1 ( ubit16 ithreshold,
ubit16 iside )

Definition at line 669 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

669 {
670 for (int imajority = 0; imajority < 2; imajority++) { setMask1(ithreshold, iside, imajority); }
671} // end-of-setMask1
void setMask1(ubit16 ithreshold, ubit16 iside, ubit16 imajority, ubit16 ichannel)

◆ setMask1() [2/3]

void Matrix::setMask1 ( ubit16 ithreshold,
ubit16 iside,
ubit16 imajority )

Definition at line 665 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

665 {
666 for (int ichannel = 0; ichannel < s_nchan[iside]; ichannel++) { setMask1(ithreshold, iside, imajority, ichannel); }
667} // end-of-setMask1

◆ setMask1() [3/3]

void Matrix::setMask1 ( ubit16 ithreshold,
ubit16 iside,
ubit16 imajority,
ubit16 ichannel )

Definition at line 653 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

653 {
654 if (ithreshold > 2 || iside > 1 || imajority > 1 || ichannel > (s_nchan[iside] - 1)) {
655 throw std::out_of_range(
656 "Matrix::setMask1: problems with side/layer/channel addresses: "
657 "threshold= " +
658 std::to_string(ithreshold) + " side=" + std::to_string(iside) + " majority=" + std::to_string(imajority) +
659 " channel=" + std::to_string(ichannel));
660 } else {
661 set_to_1(&m_channMask1[ithreshold][iside][imajority][0], ichannel);
662 }
663} // end-of-setMask1

◆ setMaskReadOut() [1/2]

void Matrix::setMaskReadOut ( ubit16 iside,
ubit16 ilayer,
ubit16 ichannel )

Definition at line 673 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

673 {
674 if (iside > 1 || ilayer > 1 || ichannel > (s_nchan[iside] - 1)) {
675 throw std::out_of_range(
676 "Matrix::setMaskReadout: problems with side/layer/channel addresses: "
677 "side=" +
678 std::to_string(iside) + " layer=" + std::to_string(ilayer) + " channel=" + std::to_string(ichannel));
679 } else {
680 set_to_1(&m_channReadOutMask[iside][ilayer][0], ichannel);
681 }
682} // end-of-setMaskReadOut

◆ setMaskReadOut() [2/2]

void Matrix::setMaskReadOut ( ubit16 iside,
ubit16 ilayer,
ubit16 ichannel,
ubit16 nchannels )

Definition at line 684 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

684 {
685 for (ubit16 i = ichannel; i < (ichannel + nchannels - 1); i++) { setMaskReadOut(iside, ilayer, ichannel, i); }
686} // end-of-setMaskReadOut
void setMaskReadOut(ubit16 iside, ubit16 ilayer, ubit16 ichannel)

◆ setMatOverlap()

void Matrix::setMatOverlap ( ubit16 add,
CMAword content )

Definition at line 809 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

809 {
810 if (add > 1) {
811 throw std::out_of_range("Matrix::setMatOverlap : add= " + std::to_string(add) + " not valid");
812 } else {
814 }
815} // end-of-Matrix::setMatOverlap

◆ setOverlaThres()

void Matrix::setOverlaThres ( int overthres)

Definition at line 755 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

755 {
756 if (content >= 0 && content < s_nthres) {
758 } else {
759 m_overlapthres = 0;
760 }
761} // end-of-setOverlapThres

◆ setPulseWidth() [1/3]

void Matrix::setPulseWidth ( ubit16 iside,
ubit16 ilayer,
ubit16 igroup,
ubit16 length )

Definition at line 625 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

625 {
626 if (iside < 2 && ilayer < 2 && igroup < s_nchan[1] / s_timeGroupB) {
627 m_pulseWidth[iside][ilayer][igroup] = length;
628 if (iside == 0 && igroup > 3) {
629 throw std::out_of_range(
630 "Matrix::setDelay: problems with side and group addresses:"
631 "side=" +
632 std::to_string(iside) + " layer=" + std::to_string(ilayer) + " group=" + std::to_string(igroup));
633 } // end-of-if
634 } else {
635 throw std::out_of_range(
636 "Matrix::setDelay: problems in adressing pulseWidth:"
637 "side=" +
638 std::to_string(iside) + " layer=" + std::to_string(ilayer) + " group=" + std::to_string(igroup));
639 } // end-of-if
640} // end-of-setPulseWidth
double length(const pvec &v)

◆ setPulseWidth() [2/3]

void Matrix::setPulseWidth ( ubit16 iside,
ubit16 ilayer,
ubit16 length )

Definition at line 621 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

621 {
622 for (ubit16 k = 0; k < (s_nchan[iside] / s_timeGroupB); k++) { setPulseWidth(iside, ilayer, k, length); } // end-of-for(ubit16 k
623} // end-of-setPulseWidth

◆ setPulseWidth() [3/3]

void Matrix::setPulseWidth ( ubit16 length)

Definition at line 612 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

612 {
613 for (ubit16 iside = 0; iside < 2; iside++) {
614 for (ubit16 ilayer = 0; ilayer < 2; ilayer++) {
615 for (ubit16 k = 0; k < (s_nchan[iside] / s_timeGroupB); k++) { setPulseWidth(iside, ilayer, k, length); } // end-of-for(ubit16
616 // k
617 } // end-of-for(ubit16 ilayer
618 } // end-of-for(ubit16 iside
619} // end-of-setPulseWidth

◆ setRoad() [1/2]

void Matrix::setRoad ( ubit16 addThres,
ubit16 addChn,
char road[17] )

Definition at line 792 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

792 {
793 if (addThres >= s_nthres || addChn > s_nchan[0]) {
794 throw std::out_of_range("Matrix::setRoad : addThres= " + std::to_string(addThres) + " addChn= " + std::to_string(addChn));
795 } else {
796 CMAword the32[2] = {0, 0};
797 ubit16 outflag = char2int(road, the32);
798 if (outflag) {
799 throw std::runtime_error("Matrix::setRoad; outflag from char2int is positive: " + std::to_string(outflag));
800 m_trigRoad[addThres][addChn][0] = 0;
801 m_trigRoad[addThres][addChn][1] = 0;
802 } else {
803 m_trigRoad[addThres][addChn][0] = the32[0];
804 m_trigRoad[addThres][addChn][1] = the32[1];
805 }
806 } // end-of-if
807} // end-of-Matrix::setRoad
ubit16 char2int(const char *str, CMAword the32[2])

◆ setRoad() [2/2]

void Matrix::setRoad ( ubit16 addThres,
ubit16 addChn,
ubit16 add64,
CMAword content )

Definition at line 783 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

783 {
784 if (addThres >= s_nthres || addChn > s_nchan[0] || add64 > 1) {
785 throw std::out_of_range("Matrix::setRoad : addThres= " + std::to_string(addThres) + " addChn= " + std::to_string(addChn) +
786 " add64= " + std::to_string(add64) + " not valid");
787 } else {
788 m_trigRoad[addThres][addChn][add64] = content;
789 } // end-of-if
790} // end-of-Matrix::setRoad

◆ setRunEvent()

void Matrix::setRunEvent ( int runNum,
int eventNum )

Definition at line 540 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

540 {
541 m_run = runNum;
542 m_event = eventNum;
543} // end-of-Matrix::setRunEvent

◆ setTrigDeadTime() [1/2]

void Matrix::setTrigDeadTime ( ubit16 deadt)

Definition at line 771 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

771 {
772 for (ubit16 k = 0; k < (s_nchan[0] / s_timeGroupB); k++) { setTrigDeadTime(k, deadt); } // end-of-for(ubit16 k
773} // end-of-setTrigDeadTime

◆ setTrigDeadTime() [2/2]

void Matrix::setTrigDeadTime ( ubit16 igroup,
ubit16 deadt )

Definition at line 763 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

763 {
764 if (igroup < 4) {
765 m_trigDeadTime[igroup] = deadt;
766 } else {
767 throw std::out_of_range("Matrix::setTrigDeadTime : igroup= " + std::to_string(igroup) + " not valid");
768 }
769} // end-of-setTrigDeadTime

◆ shift()

void Matrix::shift ( CMAword * buffi,
CMAword * buffo,
ubit16 i ) const
private

Definition at line 1328 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1328 {
1329 //
1330 ubit16 k;
1331 switch (m_localDirec[i]) {
1332 case 1: // n(layer0)-->n(layer1)
1333 for (k = 0; k < 2; k++) { *(buffo + k) = *(buffi + k); }
1334 break;
1335 case 2: // n(0)-->n-1(1)
1336 for (k = 0; k < 2; k++) { *(buffo + k) = *(buffi + k) << 1; }
1337 *(buffo + 1) = (*(buffi + 0) & 0x80000000) ? (*(buffo + 1) | 0x1) : (*(buffo + 1) | 0);
1338 break;
1339 case 3: // case 2 plus case 1
1340 for (k = 0; k < 2; k++) { *(buffo + k) = *(buffi + k) | (*(buffi + k) << 1); }
1341 *(buffo + 1) = (*(buffi + 0) & 0x80000000) ? (*(buffo + 1) | 0x1) : (*(buffo + 1) | 0);
1342 break;
1343 case 4: // n(0)-->n+1(1)
1344 for (k = 0; k < 2; k++) { *(buffo + k) = *(buffi + k) >> 1; }
1345 *(buffo + 0) = (*(buffi + 1) & 0x1) ? (*(buffo + 0) | 0x80000000) : (*(buffo + 0) | 0);
1346 break;
1347 case 5: // case 4 plus case 1
1348 for (k = 0; k < 2; k++) { *(buffo + k) = *(buffi + k) | (*(buffi + k) >> 1); }
1349 *(buffo + 0) = (*(buffi + 1) & 0x1) ? (*(buffo + 0) | 0x80000000) : (*(buffo + 0) | 0);
1350 break;
1351 case 6: // case 4 plus case 2
1352 for (k = 0; k < 2; k++) { *(buffo + k) = (*(buffi + k) >> 1) | (*(buffi + k) << 1); }
1353 *(buffo + 0) = (*(buffi + 1) & 0x1) ? (*(buffo + 0) | 0x80000000) : (*(buffo + 0) | 0);
1354 *(buffo + 1) = (*(buffi + 0) & 0x80000000) ? (*(buffo + 1) | 0x1) : (*(buffo + 1) | 0);
1355 break;
1356 case 7: // case 4 plus case 2 pluse case 1
1357 for (k = 0; k < 2; k++) { *(buffo + k) = *(buffi + k) | (*(buffi + k) >> 1) | (*(buffi + k) << 1); }
1358 *(buffo + 0) = (*(buffi + 1) & 0x1) ? (*(buffo + 0) | 0x80000000) : (*(buffo + 0) | 0);
1359 *(buffo + 1) = (*(buffi + 0) & 0x80000000) ? (*(buffo + 1) | 0x1) : (*(buffo + 1) | 0);
1360 break;
1361 default:
1362 cout << " Matrix::shift -- m_localDirec[" << i << "]=" << m_localDirec[i] << " not expected; m_localDirec forced to be 1 "
1363 << endl;
1364 for (k = 0; k < 2; k++) { *(buffo + k) = *(buffi + k); }
1365 }
1366 //
1367 // correct patter in *(buffo+1) in case side of Matrix (="i" in this method)
1368 // is = 1
1369 //
1370 if (!i) *(buffo + 1) = 0;
1371 //
1372} // end-of-Matrix::shift(buff0, buffi, buffo)

◆ show_attributes()

void Matrix::show_attributes ( ) const
private

Definition at line 1862 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1862 {
1863 cout << " Matrix Attributes: " << endl
1864 << " Subsystem " << m_subsystem << "; Projection " << m_projection << "; Sector " << m_sector << "; Pad " << m_pad << "; LowHig "
1865 << m_lowhigh << "; addresses: " << m_address[0] << " " << m_address[1] << endl;
1866} // end-of-Matrix::attributes

◆ storeDeadtime()

void Matrix::storeDeadtime ( )
private

Definition at line 900 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

900 {
901 ubit16 df = 5;
902 rpcdata *rpchit;
903 if (m_matrixDebug & 1 << df) {
904 cout << "--------------------------" << endl << "| Matrix::storeDeadtime |" << endl << "--------------------------" << endl;
905 } // end-of-if(m_matrixDebug&1<<df)
906 for (ubit16 i = 0; i < 2; i++) {
907 rpchit = m_datarpc[i];
908 while (rpchit) {
909 rpchit->deadtime = m_channDeadT[i][rpchit->layer][rpchit->stripadd / s_timeGroupB];
910 rpchit = rpchit->next;
911 } // end-of-while(rpchit
912 } // end-of-for(ubit16 i
913} // end-of-Matrix::storeDeadtime

◆ tag()

ObjectType BaseObject::tag ( ) const
inlineinherited

Definition at line 22 of file BaseObject.h.

22{ return m_tag; }
ObjectType m_tag
Definition BaseObject.h:15

◆ wind()

void Matrix::wind ( ) const
private

Definition at line 1791 of file Trigger/TrigT1/TrigT1RPChardware/src/Matrix.cxx.

1791 {
1792 sbit16 i, j;
1793 cout << "-----------------------" << endl
1794 << "| Matrix::wind |" << endl
1795 << "-----------------------" << endl
1796 << " Matrix Roads " << endl;
1797 for (i = 0; i < s_nthres; i++) {
1798 for (j = 0; j < s_nchan[0]; j++) {
1799 cout << " thres. " << i << " channel "
1800 << j
1801 // <<" Road0 "<<hex<<(*(m_roads+32*2*i+2*j+0))<<dec
1802 // <<" Road1 "<<hex<<(*(m_roads+32*2*i+2*j+1))<<dec<<endl;
1803 << " Road0 " << hex << (m_trigRoad[i][j][0]) << dec << " Road1 " << hex << (m_trigRoad[i][j][1]) << dec << endl;
1804 }
1805 }
1806 cout << " majorities: " << endl;
1807 for (i = 0; i < 3; i++) { cout << m_majorities[i] << " " << endl; }
1808 cout << endl
1809 << " number of overlapping ' low' channels: " << m_matOverlap[0] << endl
1810 << " number of overlapping 'high' channels: " << m_matOverlap[1] << endl;
1811 for (i = 0; i < s_nchan[0]; i++) { cout << " channel " << i << " in coincidence with " << m_diagonal[i] << endl; } // end-of-for(i
1812} // end-of-method-wind

Member Data Documentation

◆ highestthRO

ubit16 Matrix::highestthRO[64]

◆ k_readout

CMAword Matrix::k_readout[64]

◆ m_address

int Matrix::m_address[2]
private

◆ m_BCID

sbit16 Matrix::m_BCID
private

◆ m_BCzero

ubit16 Matrix::m_BCzero
private

◆ m_BunchOffset

sbit16 Matrix::m_BunchOffset
private

◆ m_BunchPhase

sbit16 Matrix::m_BunchPhase
private

◆ m_channDeadT

ubit16 Matrix::m_channDeadT[2][2][8]
private

◆ m_channDelay

ubit16 Matrix::m_channDelay[2][2][4]
private

◆ m_channMask0

ubit16 Matrix::m_channMask0[2][2][64]
private

◆ m_channMask1

CMAword Matrix::m_channMask1[3][2][2][2]
private

◆ m_channReadOutMask

CMAword Matrix::m_channReadOutMask[2][2][2]
private

◆ m_chdly

ubit16* Matrix::m_chdly
private

◆ m_datarpc

rpcdata* Matrix::m_datarpc[2]
private

◆ m_diagonal

sbit32 Matrix::m_diagonal[32]
private

◆ m_event

int Matrix::m_event
private

◆ m_geome

sbit32* Matrix::m_geome
private

◆ m_highestth

ubit16 Matrix::m_highestth[8]
private

◆ m_input

CMAword Matrix::m_input[2][2][64][2]
private

◆ m_k_pattern

CMAword Matrix::m_k_pattern[8 *64]
private

◆ m_kRead

int* Matrix::m_kRead
private

◆ m_localadd

int Matrix::m_localadd
private

◆ m_localDirec

ubit16 Matrix::m_localDirec[2]
private

◆ m_locDi

int* Matrix::m_locDi
private

◆ m_lowhigh

int Matrix::m_lowhigh
private

◆ m_lowtohigh

ubit16 Matrix::m_lowtohigh
private

◆ m_major

int* Matrix::m_major
private

◆ m_majorities

ubit16 Matrix::m_majorities[3]
private

◆ m_matOverlap

CMAword Matrix::m_matOverlap[2]
private

◆ m_matrixDebug

CMAword Matrix::m_matrixDebug
private

◆ m_mjori

CMAword Matrix::m_mjori[3][2][2][64][2]
private

◆ m_name

std::string BaseObject::m_name
privateinherited

Definition at line 16 of file BaseObject.h.

◆ m_Nbunch

int Matrix::m_Nbunch
private

◆ m_nclock

int Matrix::m_nclock
private

◆ m_overl

CMAword* Matrix::m_overl
private

◆ m_overlap

ubit16 Matrix::m_overlap[8]
private

◆ m_overlapthres

ubit16 Matrix::m_overlapthres
private

◆ m_pad

int Matrix::m_pad
private

◆ m_prepr

CMAword Matrix::m_prepr[3][2][2][64][2]
private

◆ m_projection

int Matrix::m_projection
private

◆ m_pulseWidth

ubit16 Matrix::m_pulseWidth[2][2][8]
private

◆ m_roads

CMAword* Matrix::m_roads
private

◆ m_run

int Matrix::m_run
private

◆ m_sector

int Matrix::m_sector
private

◆ m_subsystem

int Matrix::m_subsystem
private

◆ m_tag

ObjectType BaseObject::m_tag
privateinherited

Definition at line 15 of file BaseObject.h.

◆ m_thisBC

sbit16 Matrix::m_thisBC
private

◆ m_toreadout

ubit16 Matrix::m_toreadout
private

◆ m_trigDeadTime

ubit16 Matrix::m_trigDeadTime[4]
private

◆ m_trigg

CMAword Matrix::m_trigg[3][72]
private

◆ m_trigger

ubit16 Matrix::m_trigger[3][8]
private

◆ m_triggerOverlap

CMAword Matrix::m_triggerOverlap[8][2]
private

◆ m_triggerOverlapRO

CMAword Matrix::m_triggerOverlapRO[64][2]
private

◆ m_trigRoad

CMAword Matrix::m_trigRoad[3][32][2]
private

◆ m_width

ubit16* Matrix::m_width
private

◆ overlapRO

ubit16 Matrix::overlapRO[64]

◆ rodat

CMAword Matrix::rodat[2][2][64][2]

Note array lengths using hardcoded values rather than to depend on NOBXS as they were in the past (assuming NOBXS is at most 8).

Original NOBXS dependence in comments

Definition at line 29 of file Trigger/TrigT1/TrigT1RPChardware/TrigT1RPChardware/Matrix.h.

◆ s_BCtime

const float Matrix::s_BCtime = 25.0
static

◆ s_DLLtime

const float Matrix::s_DLLtime = s_BCtime / (float)s_NDLLCYC
static

◆ s_NBunch

const sbit16 Matrix::s_NBunch
static

◆ s_nchan

const ubit16 Matrix::s_nchan = {32, 64}
static

◆ s_nclock

const sbit16 Matrix::s_nclock
static

◆ s_NDLLCYC

const ubit16 Matrix::s_NDLLCYC = 8
static

◆ s_nthres

const ubit16 Matrix::s_nthres = 3
static

◆ s_ROOffset

const sbit16 Matrix::s_ROOffset = 1
staticprivate

◆ s_timeGroupA

const sbit16 Matrix::s_timeGroupA = 16
static

◆ s_timeGroupB

const sbit16 Matrix::s_timeGroupB = 8
static

◆ s_wordlen

const sbit16 Matrix::s_wordlen = 32
static

The documentation for this class was generated from the following files: