#include "AliTRDgeometry.h"
#include "AliTRDfeeParam.h"
#include "AliTRDtrapConfig.h"
+#include "AliTRDtrapConfigHandler.h"
#include <fstream>
#include <iostream>
const Int_t AliTRDtrapConfig::fgkMaxMcm = AliTRDfeeParam::GetNmcmRob() + 2;
const Int_t AliTRDtrapConfig::fgkDmemStartAddress = 0xc000;
-AliTRDtrapConfig::AliTRDtrapConfig() :
+AliTRDtrapConfig::AliTRDtrapConfig() :
TObject(), fScaleQ0(0), fScaleQ1(0)
{
// default constructor, initializing array of TRAP registers
for(Int_t iAddr = 0; iAddr < fgkDmemWords; iAddr++) {
-
+
if(iAddr == fgkDmemAddrDeflCorr - fgkDmemStartAddress) {
fDmem[iAddr] = new UInt_t[fgkDmemSizeSmIndividual];
fDmemDepth[iAddr] = fgkDmemSizeSmIndividual;
}
else if(iAddr >= fgkDmemAddrDeflCutStart-fgkDmemStartAddress && iAddr <= fgkDmemAddrDeflCutEnd-fgkDmemStartAddress) {
- fDmem[iAddr] = new UInt_t[fgkDmemSizeSmIndividual];
+ fDmem[iAddr] = new UInt_t[fgkDmemSizeSmIndividual];
fDmemDepth[iAddr] = fgkDmemSizeSmIndividual;
}
}
else if(iAddr == fgkDmemAddrLUTcor0-fgkDmemStartAddress) {
- fDmem[iAddr] = new UInt_t[fgkDmemSizeSmIndividual];
+ fDmem[iAddr] = new UInt_t[fgkDmemSizeSmIndividual];
fDmemDepth[iAddr] = fgkDmemSizeSmIndividual;
}
else if(iAddr == fgkDmemAddrLUTcor1-fgkDmemStartAddress) {
- fDmem[iAddr] = new UInt_t[fgkDmemSizeSmIndividual];
+ fDmem[iAddr] = new UInt_t[fgkDmemSizeSmIndividual];
fDmemDepth[iAddr] = fgkDmemSizeSmIndividual;
}
-
+
else if(iAddr == fgkDmemAddrLUTnbins-fgkDmemStartAddress) {
fDmem[iAddr] = new UInt_t; // same value for all MCMs
fDmemDepth[iAddr] = fgkDmemSizeUniform;
fDmem[iAddr] = NULL;
fDmemDepth[iAddr] = fgkDmemSizeEmpty;
}
-
+
}
InitRegs();
if (!fgInstance) {
fgInstance = new AliTRDtrapConfig();
- fgInstance->LoadConfig();
+ AliTRDtrapConfigHandler cfgHandler;
+ cfgHandler.LoadConfig();
}
return fgInstance;
else if(iAddr == fgkDmemAddrLUTcor1-fgkDmemStartAddress)
delete [] fDmem[iAddr];
-
+
else if(iAddr == fgkDmemAddrLUTnbins-fgkDmemStartAddress)
delete fDmem[iAddr];
Int_t AliTRDtrapConfig::GetTrapReg(TrapReg_t reg, Int_t det, Int_t rob, Int_t mcm) const
{
- // get the value of an individual TRAP register
+ // get the value of an individual TRAP register
// if it is individual for TRAPs a valid TRAP has to be specified
if ((reg < 0) || (reg >= kLastReg)) {
return fRegisterValue[reg].globalValue;
}
else if (fRegisterValue[reg].state == RegValue_t::kIndividual) {
- if((det >= 0 && det < AliTRDgeometry::Ndet()) &&
- (rob >= 0 && rob < AliTRDfeeParam::GetNrobC1()) &&
+ if((det >= 0 && det < AliTRDgeometry::Ndet()) &&
+ (rob >= 0 && rob < AliTRDfeeParam::GetNrobC1()) &&
(mcm >= 0 && mcm < fgkMaxMcm)) {
return fRegisterValue[reg].individualValue[det*AliTRDfeeParam::GetNrobC1()*fgkMaxMcm + rob*fgkMaxMcm + mcm];
}
return kTRUE;
}
else {
- AliError("Register has individual values");
+ AliError(Form("Register %s has individual values", AliTRDtrapConfig::GetRegName(reg)));
}
return kFALSE;
}
// set a global value for the given TRAP register,
// i.e. the same value for all TRAPs
- if (fRegisterValue[reg].state == RegValue_t::kGlobal) {
- fRegisterValue[reg].globalValue = value;
- return kTRUE;
- }
- else if (fRegisterValue[reg].state == RegValue_t::kIndividual) {
- // if the register is in idividual mode but a broadcast is requested, the selected register is
- // set to value for all MCMs on the chamber
+ if( (det>=0 && det<AliTRDgeometry::Ndet())) {
+ if (fRegisterValue[reg].state == RegValue_t::kGlobal) {
+ Int_t defaultValue = fRegisterValue[reg].globalValue;
+
+ fRegisterValue[reg].state = RegValue_t::kIndividual;
+ fRegisterValue[reg].individualValue = new Int_t[AliTRDgeometry::Ndet()*AliTRDfeeParam::GetNrobC1()*fgkMaxMcm];
+
+ for(Int_t i = 0; i < AliTRDgeometry::Ndet()*AliTRDfeeParam::GetNrobC1()*fgkMaxMcm; i++)
+ fRegisterValue[reg].individualValue[i] = defaultValue; // set the requested register of all MCMs to the value previously stored
- if( (det>=0 && det<AliTRDgeometry::Ndet())) {
- for(Int_t rob=0; rob<AliTRDfeeParam::GetNrobC1(); rob++) {
- for(Int_t mcm=0; mcm<fgkMaxMcm; mcm++)
- fRegisterValue[reg].individualValue[det*AliTRDfeeParam::GetNrobC1()*fgkMaxMcm + rob*fgkMaxMcm + mcm] = value;
- }
+ for(Int_t rob=0; rob<AliTRDfeeParam::GetNrobC1(); rob++) {
+ for(Int_t mcm=0; mcm<fgkMaxMcm; mcm++)
+ fRegisterValue[reg].individualValue[det*AliTRDfeeParam::GetNrobC1()*fgkMaxMcm + rob*fgkMaxMcm + mcm] = value;
}
- else {
- AliError(Form("Invalid detector number: %i\n", det));
- return kFALSE;
+ }
+ else if (fRegisterValue[reg].state == RegValue_t::kIndividual) {
+ // if the register is in idividual mode but a broadcast is requested, the selected register is
+ // set to value for all MCMs on the chamber
+
+ for(Int_t rob=0; rob<AliTRDfeeParam::GetNrobC1(); rob++) {
+ for(Int_t mcm=0; mcm<fgkMaxMcm; mcm++)
+ fRegisterValue[reg].individualValue[det*AliTRDfeeParam::GetNrobC1()*fgkMaxMcm + rob*fgkMaxMcm + mcm] = value;
}
- }
- else { // should never be reached
+ }
+ else { // should never be reached
AliError("MCM register status neither kGlobal nor kIndividual");
return kFALSE;
- }
-
- return kFALSE;
+ }
+ }
+ else {
+ AliError(Form("Invalid detector number: %i\n", det));
+ return kFALSE;
+ }
+
+ return kFALSE;
}
Bool_t AliTRDtrapConfig::SetTrapReg(TrapReg_t reg, Int_t value, Int_t det, Int_t rob, Int_t mcm)
{
- // set the value for the given TRAP register of an individual MCM
+ // set the value for the given TRAP register of an individual MCM
- //std::cout << "-- reg: 0x" << std::hex << fRegs[reg].addr <<
+ //std::cout << "-- reg: 0x" << std::hex << fRegs[reg].addr <<
//std::dec << ", data " << value << ", det " << det << ", rob " << rob << ", mcm " << mcm << std::endl;
- if( (det >= 0 && det < AliTRDgeometry::Ndet()) &&
- (rob >= 0 && rob < AliTRDfeeParam::GetNrobC1()) &&
+ if( (det >= 0 && det < AliTRDgeometry::Ndet()) &&
+ (rob >= 0 && rob < AliTRDfeeParam::GetNrobC1()) &&
(mcm >= 0 && mcm < fgkMaxMcm) ) {
if (fRegisterValue[reg].state == RegValue_t::kGlobal) {
Int_t defaultValue = fRegisterValue[reg].globalValue;
-
+
fRegisterValue[reg].state = RegValue_t::kIndividual;
fRegisterValue[reg].individualValue = new Int_t[AliTRDgeometry::Ndet()*AliTRDfeeParam::GetNrobC1()*fgkMaxMcm];
{
// reading from given address
- if ( (addr >= fgkDmemStartAddress) &&
+ if ( (addr >= fgkDmemStartAddress) &&
(addr < (fgkDmemStartAddress + fgkDmemWords)) ) {
return GetDmemUnsigned(addr, det, rob, mcm);
}
{
// writing to given address
- if ( (addr >= fgkDmemStartAddress) &&
+ if ( (addr >= fgkDmemStartAddress) &&
(addr < (fgkDmemStartAddress + fgkDmemWords)) ) {
AliDebug(2, Form("DMEM 0x%08x : %i", addr, value));
SetDmem(addr, value, det, rob, mcm);
return kTRUE;
}
}
-
+
return kFALSE;
}
Bool_t AliTRDtrapConfig::SetDmem(Int_t addr, UInt_t value)
{
- // Set the content of the given DMEM address
+ // Set the content of the given DMEM address
addr = addr - fgkDmemStartAddress;
Bool_t AliTRDtrapConfig::SetDmem(Int_t addr, UInt_t value, Int_t det, Int_t rob, Int_t mcm)
{
- // Set the content of the given DMEM address
+ // Set the content of the given DMEM address
addr = addr - fgkDmemStartAddress;
Int_t roc = det%30;
Int_t loc;
-
+
if(addr < 0 || addr >= fgkDmemWords) {
AliError(Form("No DMEM address: 0x%08x", addr+fgkDmemStartAddress));
return kFALSE;
if(loc < fgkDmemSizeTotalIndividual) {
if(fDmem[addr][loc]!=0)
AliDebug(5, Form("Warning: Setting new value to DMEM 0x%08x", addr+fgkDmemStartAddress));
-
+
fDmem[addr][loc]=value;
}
else {
AliError(Form("DMEM sub-address %i out of scope", det));
return kFALSE;
}
-
+
break;
default:
AliError(Form("Invalid selection type"));
return kFALSE;
break;
}
-
+
return kTRUE;
}
addr = addr - fgkDmemStartAddress;
Int_t roc = det%30;
Int_t loc;
-
+
if(addr < 0 || addr >= fgkDmemWords) {
AliError(Form("No DMEM address: 0x%08x", addr+fgkDmemStartAddress));
return 0;
return 0;
break;
}
-
- return 0;
-}
-
-Bool_t AliTRDtrapConfig::LoadConfig()
-{
- // load a set of TRAP register values (configuration)
- // here a default set is implemented for testing
- // for a detailed description of the registers see the TRAP manual
-
- // HC header configuration bits
- SetTrapReg(kC15CPUA, 0x2102); // zs, deh
-
- // no. of timebins
- SetTrapReg(kC13CPUA, 24);
-
- // pedestal filter
- SetTrapReg(kFPNP, 4*10);
- SetTrapReg(kFPTC, 0);
- SetTrapReg(kFPBY, 0); // bypassed!
-
- // gain filter
- for (Int_t adc = 0; adc < 20; adc++) {
- SetTrapReg(TrapReg_t(kFGA0+adc), 40);
- SetTrapReg(TrapReg_t(kFGF0+adc), 15);
- }
- SetTrapReg(kFGTA, 20);
- SetTrapReg(kFGTB, 2060);
- SetTrapReg(kFGBY, 0); // bypassed!
-
- // tail cancellation
- SetTrapReg(kFTAL, 267);
- SetTrapReg(kFTLL, 356);
- SetTrapReg(kFTLS, 387);
- SetTrapReg(kFTBY, 0);
-
- // tracklet calculation
- SetTrapReg(kTPQS0, 5);
- SetTrapReg(kTPQE0, 10);
- SetTrapReg(kTPQS1, 11);
- SetTrapReg(kTPQE1, 20);
- SetTrapReg(kTPFS, 5);
- SetTrapReg(kTPFE, 20);
- SetTrapReg(kTPVBY, 0);
- SetTrapReg(kTPVT, 10);
- SetTrapReg(kTPHT, 150);
- SetTrapReg(kTPFP, 40);
- SetTrapReg(kTPCL, 1);
- SetTrapReg(kTPCT, 10);
-
- // ndrift (+ 5 binary digits)
- SetDmem(0xc025, 20 << 5);
- // deflection + tilt correction
- SetDmem(0xc022, 0);
- // deflection range table
- for (Int_t iTrklCh = 0; iTrklCh < 18; iTrklCh++) {
- SetDmem(0xc030 + 2 * iTrklCh, -64); // min. deflection
- SetDmem(0xc031 + 2 * iTrklCh, 63); // max. deflection
- }
-
- // hit position LUT
- const UShort_t lutPos[128] = {
- 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15,
- 16, 16, 16, 17, 17, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 22, 22, 22, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 26, 26, 26, 26,
- 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 27, 27, 27, 27, 26,
- 26, 26, 26, 25, 25, 25, 24, 24, 23, 23, 22, 22, 21, 21, 20, 20, 19, 18, 18, 17, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 7};
- for (Int_t iCOG = 0; iCOG < 128; iCOG++)
- SetTrapReg((TrapReg_t) (kTPL00 + iCOG), lutPos[iCOG]);
-
- // event buffer
- SetTrapReg(kEBSF, 1); // 0: store filtered; 1: store unfiltered
- // zs applied to data stored in event buffer (sel. by EBSF)
- SetTrapReg(kEBIS, 15 << 2); // single indicator threshold (plus two digits)
- SetTrapReg(kEBIT, 30 << 2); // sum indicator threshold (plus two digits)
- SetTrapReg(kEBIL, 0xf0); // lookup table
- SetTrapReg(kEBIN, 0); // neighbour sensitivity
-
- // raw data
- SetTrapReg(kNES, (0x0000 << 16) | 0x1000);
-
- return kTRUE;
+ return 0;
}
-Bool_t AliTRDtrapConfig::ReadPackedConfig(Int_t hc, UInt_t *data, Int_t size)
+Bool_t AliTRDtrapConfig::ReadPackedConfig(Int_t hc, UInt_t *data, Int_t size)
{
// Read the packed configuration from the passed memory block
//
- // To be used to retrieve the TRAP configuration from the
- // configuration as sent in the raw data.
+ // To be used to retrieve the TRAP configuration from the
+ // configuration as sent in the raw data.
AliDebug(1, "Reading packed configuration");
Int_t idx = 0;
Int_t err = 0;
Int_t step, bwidth, nwords, exitFlag, bitcnt;
-
+
UShort_t caddr;
UInt_t dat, msk, header, dataHi;
-
+
while (idx < size && *data != 0x00000000) {
-
+
Int_t rob = (*data >> 28) & 0x7;
Int_t mcm = (*data >> 24) & 0xf;
AliDebug(1, Form("Config of det. %3i MCM %i:%02i (0x%08x)", det, rob, mcm, *data));
data++;
-
+
while (idx < size && *data != 0x00000000) {
-
+
header = *data;
data++;
idx++;
-
+
AliDebug(5, Form("read: 0x%08x", header));
-
+
if (header & 0x01) // single data
{
- dat = (header >> 2) & 0xFFFF; // 16 bit data
- caddr = (header >> 18) & 0x3FFF; // 14 bit address
-
+ dat = (header >> 2) & 0xFFFF; // 16 bit data
+ caddr = (header >> 18) & 0x3FFF; // 14 bit address
+
if (caddr != 0x1FFF) // temp!!! because the end marker was wrong
{
if (header & 0x02) // check if > 16 bits
return err;
}
}
-
- else // block of data
+
+ else // block of data
{
step = (header >> 1) & 0x0003;
bwidth = ((header >> 3) & 0x001F) + 1;
nwords = (header >> 8) & 0x00FF;
caddr = (header >> 16) & 0xFFFF;
exitFlag = (step == 0) || (step == 3) || (nwords == 0);
-
- if (exitFlag)
+
+ if (exitFlag)
break;
-
+
switch (bwidth)
{
case 15:
AliDebug(5, Form("addr=0x%04x (%s) data=0x%08x\n", caddr, GetRegName(GetRegByAddress(caddr)), header & msk));
if ( ! Poke(caddr, header & msk, det, rob, mcm) )
AliDebug(5, Form("(single-write): non-existing address 0x%04x containing 0x%08x\n", caddr, header));
-
+
caddr += step;
header = header >> bwidth;
if (idx >= size)
}
}
break;
- } // end case 5-15
+ } // end case 5-15
case 31:
{
while (nwords > 0)
idx++;
nwords--;
err += (header & 1);
-
+
AliDebug(5, Form("addr=0x%04x (%s) data=0x%08x", caddr, GetRegName(GetRegByAddress(caddr)), header >> 1));
if ( ! Poke(caddr, header >> 1, det, rob, mcm) )
AliDebug(5, Form("(single-write): non-existing address 0x%04x containing 0x%08x\n", caddr, header));
-
+
caddr += step;
if (idx >= size)
{
break;
}
default: return err;
- } // end switch
+ } // end switch
} // end block case
}
} // end while
AliDebug(5, Form("no end marker! %d words read", idx));
- return -err; // only if the max length of the block reached!
+ return -err; // only if the max length of the block reached!
}
// if it is individual a valid MCM has to be specified
if (fRegisterValue[reg].state == RegValue_t::kGlobal) {
- printf("%s (%i bits) at 0x%08x is 0x%08x and resets to: 0x%08x (currently global mode)\n",
+ printf("%10s (%2i bits) at 0x%04x is 0x%08x and resets to: 0x%08x (currently global mode)\n",
GetRegName((TrapReg_t) reg),
GetRegNBits((TrapReg_t) reg),
GetRegAddress((TrapReg_t) reg),
GetRegResetValue((TrapReg_t) reg));
}
else if (fRegisterValue[reg].state == RegValue_t::kIndividual) {
- if((det >= 0 && det < AliTRDgeometry::Ndet()) &&
- (rob >= 0 && rob < AliTRDfeeParam::GetNrobC1()) &&
+ if((det >= 0 && det < AliTRDgeometry::Ndet()) &&
+ (rob >= 0 && rob < AliTRDfeeParam::GetNrobC1()) &&
(mcm >= 0 && mcm < fgkMaxMcm)) {
- printf("%s (%i bits) at 0x%08x is 0x%08x and resets to: 0x%08x (currently individual mode)\n",
+ printf("%10s (%2i bits) at 0x%04x is 0x%08x and resets to: 0x%08x (currently individual mode)\n",
GetRegName((TrapReg_t) reg),
GetRegNBits((TrapReg_t) reg),
GetRegAddress((TrapReg_t) reg),
// configuration registers
if(mcmReg >= 0 && mcmReg < kLastReg) {
-
+
for(Int_t linkPair=0; linkPair<fgkMaxLinkPairs; linkPair++) {
if(AliTRDfeeParam::ExtAliToAli(extali, linkPair, rocType, mcmList, mcmListSize)!=0) {
Int_t i=0;
while(mcmList[i] != -1 && i<mcmListSize) {
- if(mcmList[i]==127)
+ if(mcmList[i]==127) {
+ AliDebug(1, Form("broadcast write to %s: 0x%08x",
+ GetRegName((TrapReg_t) mcmReg), data));
SetTrapReg( (TrapReg_t) mcmReg, data, det);
- else
- SetTrapReg( (TrapReg_t) mcmReg, data, det, (mcmList[i]>>7), (mcmList[i]&0x7F));
+ }
+ else {
+ AliDebug(1, Form("individual write to %s (%i, %i): 0x%08x",
+ GetRegName((TrapReg_t) mcmReg), (mcmList[i]>>7), (mcmList[i]&0x7F), data));
+ SetTrapReg( (TrapReg_t) mcmReg, data, det, (mcmList[i]>>7)&0x7, (mcmList[i]&0x7F));
+ }
i++;
}
}
return kTRUE;
}
// DMEM
- else if ( (addr >= fgkDmemStartAddress) &&
+ else if ( (addr >= fgkDmemStartAddress) &&
(addr < (fgkDmemStartAddress + fgkDmemWords))) {
for(Int_t linkPair=0; linkPair<fgkMaxLinkPairs; linkPair++) {
if(AliTRDfeeParam::ExtAliToAli(extali, linkPair, rocType, mcmList, mcmListSize)!=0) {
}
return kTRUE;
}
- else
+ else
return kFALSE;
}
void AliTRDtrapConfig::PrintDatx(ostream &os, UInt_t addr, UInt_t data, Int_t rob, Int_t mcm) const
{
- os << std::setw(5) << 10
+ os << std::setw(5) << 10
<< std::setw(8) << addr
<< std::setw(12) << data;
if(mcm==127)
os << std::setw(8) << 127;
else
os << std::setw(8) << AliTRDfeeParam::AliToExtAli(rob, mcm);
-
+
os << std::endl;
}