From dc7a4bcd01e9eb2e8b850e34d549e7d30e9dc73f Mon Sep 17 00:00:00 2001
From: Paul Dauncey
Date: Wed, 2 Jan 2019 20:55:25 +0000
Subject: [PATCH] More bug fixes
---
interface/Buffering/BeSlinkAna.hh | 65 ++++----
interface/Buffering/BeSlinkSim.hh | 239 ++++++++++++++++--------------
interface/Buffering/BlockCheck.hh | 2 +
interface/Buffering/EconSim.hh | 2 +-
interface/Buffering/HgcrocAna.hh | 2 +-
interface/Buffering/HgcrocBoe.hh | 2 +-
interface/Buffering/LpGbtCheck.hh | 4 +-
interface/Buffering/SlinkCheck.hh | 27 ++++
src/DaqDaqBuffer.cpp | 9 +-
9 files changed, 206 insertions(+), 146 deletions(-)
diff --git a/interface/Buffering/BeSlinkAna.hh b/interface/Buffering/BeSlinkAna.hh
index db92a95..3c4408d 100644
--- a/interface/Buffering/BeSlinkAna.hh
+++ b/interface/Buffering/BeSlinkAna.hh
@@ -22,11 +22,11 @@ public:
std::ostringstream sout;
sout << "BeSlinkAna" << std::setw(2) << std::setfill('0')
- << fBeSlinkSim->fSlink;
+ << fBeSlinkSim->slinkNumber();
std::string sHgcroc[18]={"00","01","02","03","04","05","06","07","08",
"09","10","11","12","13","14","15","16","17"};
-
+ /*
hBitmapWordsVsChannels=new TH1I((sout.str()+"BitmapWordsVsChannels").c_str(),
";Number of channels per HGCROC packet;Number of words per HGCROC packet",73,-0.5,72.5);
hLabelsWordsVsChannels=new TH1I((sout.str()+"LabelsWordsVsChannels").c_str(),
@@ -36,18 +36,19 @@ public:
";ECON total number of channels",1300,0,1300);
hTotalWords=new TH1D((sout.str()+"TotalWords").c_str(),
";ECON total number of words",1000,0,1000);
-
- for(unsigned block(0);block<1;block++) {
- hBlockTotalChannels[block]=new TH1D((sout.str()+"Block"+sHgcroc[block]+"TotalChannels").c_str(),
- ";Block total number of channels",1300,0,1300);
- hBlockTotalWords[block]=new TH1D((sout.str()+"Block"+sHgcroc[block]+"TotalWords").c_str(),
- ";Block total number of words",1000,0,1000);
- hEventBufferUsed[block]=new TH1D((sout.str()+"Block"+sHgcroc[block]+"EventBufferUsed").c_str(),
- ";Number of event buffer words used",50000,0,50000);
- hEventBufferUsedHistory[block]=new TH1I((sout.str()+"Block"+sHgcroc[block]+"EventBufferUsedHistory").c_str(),
- ";BX;Number of event buffer words used",nHistory,0,nHistory);
- }
+ */
+ const SlinkArch &slinkArch(*(fBeSlinkSim->fSlinkArch));
+ for(unsigned e(0);efEconArch.fNumberOfBlocks;block++) {
- hEventBufferUsed[block]->Fill(fEconSim->fEventBuffer[block].used());
- hEventBufferUsedHistory[block]->Fill(bx,fEconSim->fEventBuffer[block].used());
+ const SlinkArch &slinkArch(*(fBeSlinkSim->fSlinkArch));
+ for(unsigned e(0);eFill(fBeSlinkSim->fEventBuffer[e][b].used());
+ hEventBufferUsedHistory[e][b]->Fill(bx,fBeSlinkSim->fEventBuffer[e][b].used());
+ }
}
- */
}
void eoj() {
@@ -100,21 +104,22 @@ public:
private:
const BeSlinkSim *fBeSlinkSim;
- TH1I *hBitmapWordsVsChannels;
- TH1I *hLabelsWordsVsChannels;
+ //TH1I *hBitmapWordsVsChannels;
+ //TH1I *hLabelsWordsVsChannels;
- TH1D *hMeans;
+ //TH1D *hMeans;
- TH1D *hChannels[18];
- TH1D *hWords[18];
- TH2D *hWordsVsChannels[18];
+ //TH1D *hChannels[18];
+ //TH1D *hWords[18];
+ //TH2D *hWordsVsChannels[18];
+
+ //TH1D *hTotalChannels;
+ //TH1D *hTotalWords;
+ //TH1D *hBlockTotalChannels[7];
+ //TH1D *hBlockTotalWords[7];
- TH1D *hTotalChannels;
- TH1D *hTotalWords;
- TH1D *hBlockTotalChannels[7];
- TH1D *hBlockTotalWords[7];
- TH1D *hEventBufferUsed[7];
- TH1I *hEventBufferUsedHistory[7];
+ TH1D *hEventBufferUsed[Dimensions::MaxNumberOfEconsPerSlink][Dimensions::MaxNumberOfBlocksPerEcon];
+ TH1I *hEventBufferUsedHistory[Dimensions::MaxNumberOfEconsPerSlink][Dimensions::MaxNumberOfBlocksPerEcon];
};
#endif
diff --git a/interface/Buffering/BeSlinkSim.hh b/interface/Buffering/BeSlinkSim.hh
index 9c89e31..424be86 100644
--- a/interface/Buffering/BeSlinkSim.hh
+++ b/interface/Buffering/BeSlinkSim.hh
@@ -13,6 +13,7 @@ class BeSlinkSim {
friend class BeSlinkAna;
public:
+ /*
enum {
NumberOfParallelBuffers=2
};
@@ -36,13 +37,14 @@ public:
VariableHgcrocMap,
EventBuild
};
-
+ */
+
//BeSlinkSim(unsigned e, unsigned h=18, unsigned m=0) : fEcon(e) {
BeSlinkSim() {
}
- void boj(unsigned s, const SlinkArch &a) {
- fSlink=a.slinkNumber();
+ void boj(const SlinkArch &a) {
+ //fSlink=a.slinkNumber();
fSlinkArch=&a;
if(fPrintLevel>0) {
@@ -61,83 +63,88 @@ public:
const EconArch &econArch(fSlinkArch->econArch(e));
for(unsigned b(0);bslinkNumber(),e,b,econArch.hgcrocNumber(b));
+ fBlockPair[e][b].first=true;
}
}
+ }
+
+ void processL1Accept(uint64_t bx, uint64_t l1a) {
+ uint64_t d[2];
+ SlinkBoe sBoe(0xce00,bx&0xffffffff,l1a&0xffffffff,0xab);
+ sBoe.words(d);
+ assert(fSlinkBoeCb.writeAndIncrementPtr(d[0]));
+ assert(fSlinkBoeCb.writeAndIncrementPtr(d[1]));
+ if(fPrintLevel>4) {
+ std::cout << "BeSlinkSim[" << fSlinkArch->slinkNumber() << "]::processL1Accept(" << bx << "," << l1a << ") "
+ << "Saving Slink BOE" << std::endl;
+ sBoe.print();
+ }
+ }
- /*
- if(false) {
+ void processBx(uint64_t bx, const SlinkElinkData &d) {
- fNumberOfBlocks=1;
-
- for(unsigned h(0);h<18;h++) {
- fHgcrocNumber[0].push_back(h);
- }
-
- for(unsigned e(0);e<7;e++) {
- fElinkNumber[0].push_back(e);
- }
+ if((bx%2)==0) {
+ fSlinkElinkData=d;
- } else {
+ } else {
+ uint64_t word,word2;
+ for(unsigned e(0);enumberOfEcons();e++) {
+ const EconArch &econArch(fSlinkArch->econArch(e));
- fNumberOfBlocks=7;
+ for(unsigned b(0);b &elinkNumber(econArch.elinkNumber(b));
- for(unsigned h(0);h<18;h++) {
- fHgcrocNumber[h%7].push_back(h);
- }
+ unsigned eo(0);
+ for(unsigned w(0);weconArch(e).numberOfBlocks()==1?0:w].writeAndIncrementPtr(word));
+ if(word!=0) assert(fEventBuffer[e][b].writeAndIncrementPtr(word));
+ }
+ eo++;
+ }
+
+ for(unsigned w(0);weconArch(e).numberOfBlocks()==1?0:w].writeAndIncrementPtr(word));
+ if(word!=0) assert(fEventBuffer[e][b].writeAndIncrementPtr(word));
+ }
+ eo++;
+ }
+ /*
+ // DO BY ARCH PROPERLY!!!
+ for(unsigned w(0);weconArch(e).numberOfBlocks()==1?0:w].writeAndIncrementPtr(word));
+ }
- }
+ for(unsigned w(0);w1) {
- std::cout << "BeSlinkSim::ctor() "
- << "Number of blocks = " << fNumberOfBlocks << std::endl;
+ if(word!=0) assert(fEventBuffer[e][fSlinkArch->econArch(e).numberOfBlocks()==1?0:w].writeAndIncrementPtr(word));
+ }
+ */
+ }
- for(unsigned block(0);block4) {
- std::cout << "BeSlinkSim[" << fSlinkArch->slinkNumber() << "]::processL1Accept(" << bx << "," << l1a << ") "
- << "Writing Slink BOE" << std::endl;
- sboe.print();
}
- }
- void processBx(const SlinkElinkData &d) {
- for(unsigned e(0);enumberOfEcons();e++) processEconBx(e,d.fData[e]);
+ // Output to Slink
bool done(false);
uint128_t w;
@@ -153,9 +160,9 @@ public:
}
if(!fEventActive) {
- if(!cbBoe.empty()) {
- assert(cbBoe.readAndIncrementPtr(w.first));
- assert(cbBoe.readAndIncrementPtr(w.second));
+ if(!fSlinkBoeCb.empty()) {
+ assert(fSlinkBoeCb.readAndIncrementPtr(w.first));
+ assert(fSlinkBoeCb.readAndIncrementPtr(w.second));
fSlinkWord[fNumberOfSlinkWords]=std::pair(w,true);
fNumberOfSlinkWords++;
@@ -169,6 +176,7 @@ public:
fBlockRead=0;
fNumberOfEventWords=0;
fEventActive=true;
+
} else {
done=true;
}
@@ -190,28 +198,46 @@ public:
} else {
- for(unsigned i(0);i<4 && fEconReadnumberOfEcons() && fArrayWrite<4;i++) {
- if(!fEventBuffer[fEconRead][fBlockRead].empty()) {
-
- uint64_t d;
- assert(fEventBuffer[fEconRead][fBlockRead].readAndIncrementPtr(d));
- fArrayWord[fArrayWrite]=(d&0xffffffff);
- fArrayWrite++;
-
- if(fPrintLevel>5) {
- std::cout << "BeSlinkSim[" << fSlinkArch->slinkNumber() << "]::processBx() "
- << "Read buffer word = 0x" << std::hex << fArrayWord[fArrayWrite-1]
- << std::dec << std::endl;
+ for(unsigned i(0);/*i<4 &&*/ !done && fEconReadnumberOfEcons() && fArrayWrite<4;i++) {
+ if(!(fEventBuffer[fEconRead][fBlockRead].empty() && fBlockPair[fEconRead][fBlockRead].first)) {
+
+ uint32_t nextWord(0);
+ if(fBlockPair[fEconRead][fBlockRead].first) {
+ uint64_t d;
+ assert(fEventBuffer[fEconRead][fBlockRead].readAndIncrementPtr(d));
+ nextWord=(d&0xffffffff);
+ fBlockPair[fEconRead][fBlockRead].second=(d>>32);
+ fBlockPair[fEconRead][fBlockRead].first=false;
+ } else {
+ nextWord=fBlockPair[fEconRead][fBlockRead].second;
+ fBlockPair[fEconRead][fBlockRead].first=true;
}
+
+ //fArrayWord[fArrayWrite ]=(d&0xffffffff);
+ //fArrayWord[fArrayWrite+1]=(d>>32);
+ //fArrayWrite+=2;
- if(fBlockCheck[fEconRead][fBlockRead].processBx(fArrayWord[fArrayWrite-1])) fBlockRead++;
-
- if(fBlockRead==fSlinkArch->econArch(fEconRead).numberOfBlocks()) {
- fBlockRead=0;
- fEconRead++;
+ if(nextWord!=0) {
+ fArrayWord[fArrayWrite]=nextWord;
+ fArrayWrite++;
+
+ if(fPrintLevel>5) {
+ std::cout << "BeSlinkSim[" << fSlinkArch->slinkNumber() << "]::processBx() "
+ << "Read buffer words = 0x" << std::hex
+ //<< fArrayWord[fArrayWrite-2] << " "
+ << fArrayWord[fArrayWrite-1]
+ << std::dec << std::endl;
+ }
+
+ if(fBlockCheck[fEconRead][fBlockRead].processBx(fArrayWord[fArrayWrite-1])) fBlockRead++;
+
+ if(fBlockRead==fSlinkArch->econArch(fEconRead).numberOfBlocks()) {
+ fBlockRead=0;
+ fEconRead++;
+ }
+
+ if(fEconRead==fSlinkArch->numberOfEcons()) fArrayWrite=4;
}
-
- if(fEconRead==fSlinkArch->numberOfEcons()) fArrayWrite=4;
} else {
done=true;
@@ -243,13 +269,8 @@ public:
void processEconBx(unsigned ec, const uint32_t *d) {
- // Switch for different dataflow methods
-
- for(unsigned w(0);weconArch(ec).numberOfBlocks()==1?0:w].writeAndIncrementPtr(d[w]));
- }
-
return;
+#ifdef NOT_YET
uint32_t a[7];
@@ -257,7 +278,6 @@ public:
if(fDataFlowMethod==FixedHgcrocMap) {
-#ifdef NOT_YET
// 4 words per BX for 7 eLinks
unsigned nWords(4);
@@ -309,7 +329,6 @@ public:
}
}
-#endif
} else if(fDataFlowMethod==VariableHgcrocMap) {
@@ -418,6 +437,7 @@ public:
} else {
assert(false);
}
+#endif
}
unsigned numberOfSlinkWords() const {
@@ -429,13 +449,13 @@ public:
return fSlinkWord[n];
}
- unsigned econSlink() const {
- return fSlink;
+ unsigned slinkNumber() const {
+ return fSlinkArch->slinkNumber();
}
public:
static unsigned fPrintLevel;
-
+ /*
static DataRandomMethod fDataRandomMethod;
static DataFormatMethod fDataFormatMethod;
static DataFlowMethod fDataFlowMethod;
@@ -444,13 +464,15 @@ public:
double fTotalNum;
double fTotalMean;
double fTotalWords;
-
+ */
protected:
private:
- unsigned fSlink;
+ //unsigned fSlink;
const SlinkArch *fSlinkArch;
-
- unsigned fEcon;
+
+ SlinkElinkData fSlinkElinkData;
+
+ //unsigned fEcon;
EconFile fEconFile;
EconArch fEconArch;
@@ -458,13 +480,13 @@ private:
//unsigned fNumberOfHgcrocs;
//double fHgcrocMean[18];
- unsigned fHgcrocToElink[18];
+ //unsigned fHgcrocToElink[18];
CircularBuffer<1> fElink[7];
CircularBuffer<16> fEventBuffer[Dimensions::MaxNumberOfEconsPerSlink][Dimensions::MaxNumberOfBlocksPerEcon];
//PartitionedBuffer<7,16> fPartitionedBuffer[5];
- unsigned fNumberOfChannels[18];
- unsigned fNumberOfWords[18];
+ //unsigned fNumberOfChannels[18];
+ //unsigned fNumberOfWords[18];
bool fEventActive;
unsigned fEconRead;
@@ -474,12 +496,13 @@ private:
unsigned fNumberOfEventWords;
BlockCheck fBlockCheck[Dimensions::MaxNumberOfEconsPerSlink][Dimensions::MaxNumberOfBlocksPerEcon];
+ std::pair fBlockPair[Dimensions::MaxNumberOfEconsPerSlink][Dimensions::MaxNumberOfBlocksPerEcon];
//unsigned fReadHgcroc[NumberOfParallelBuffers];
//unsigned fReadWord[NumberOfParallelBuffers];
- unsigned fReadHgcrocNumber[NumberOfParallelBuffers][20];
- unsigned fReadWord[NumberOfParallelBuffers][20];
+ //unsigned fReadHgcrocNumber[NumberOfParallelBuffers][20];
+ //unsigned fReadWord[NumberOfParallelBuffers][20];
unsigned fWriteElink;
//unsigned fNumberOfBlocks;
@@ -487,18 +510,18 @@ private:
std::vector fElinkNumber[7];
unsigned fActiveInputBuffer;
- std::vector fFirstBuffer[NumberOfParallelBuffers][18];
+ //std::vector fFirstBuffer[NumberOfParallelBuffers][18];
- CircularBuffer<1> cbBoe;
+ CircularBuffer<1> fSlinkBoeCb;
unsigned fNumberOfSlinkWords;
std::pair fSlinkWord[3];
};
unsigned BeSlinkSim::fPrintLevel(1);
-
+/*
BeSlinkSim::DataRandomMethod BeSlinkSim::fDataRandomMethod(BeSlinkSim::Binomial);
BeSlinkSim::DataFormatMethod BeSlinkSim::fDataFormatMethod(BeSlinkSim::FixedChannelBitmap);
BeSlinkSim::DataFlowMethod BeSlinkSim::fDataFlowMethod(BeSlinkSim::FixedHgcrocMap);
unsigned BeSlinkSim::fFormatBreakEven(0);
-
+*/
#endif
diff --git a/interface/Buffering/BlockCheck.hh b/interface/Buffering/BlockCheck.hh
index 64bea49..ae9949d 100644
--- a/interface/Buffering/BlockCheck.hh
+++ b/interface/Buffering/BlockCheck.hh
@@ -41,6 +41,8 @@ public:
<< "Entered" << std::endl;
}
+ //if(a==0) return false;
+
if(!fActivePacket) {
if(a!=0) {
fActivePacket=true;
diff --git a/interface/Buffering/EconSim.hh b/interface/Buffering/EconSim.hh
index 6044a86..a357f1e 100644
--- a/interface/Buffering/EconSim.hh
+++ b/interface/Buffering/EconSim.hh
@@ -634,7 +634,7 @@ private:
//unsigned fNumberOfHgcrocs;
//double fHgcrocMean[18];
- unsigned fHgcrocToElink[18];
+ //unsigned fHgcrocToElink[18];
CircularBuffer<1> fElink[7];
CircularBuffer<16> fEventBuffer[7];
diff --git a/interface/Buffering/HgcrocAna.hh b/interface/Buffering/HgcrocAna.hh
index ad0e56b..08ccd08 100644
--- a/interface/Buffering/HgcrocAna.hh
+++ b/interface/Buffering/HgcrocAna.hh
@@ -87,7 +87,7 @@ public:
}
- void processEoj() {
+ void eoj() {
hCounts->SetBinContent(1,fNumberOfBx);
hCounts->SetBinContent(2,fNumberOfDeadtimeBx);
}
diff --git a/interface/Buffering/HgcrocBoe.hh b/interface/Buffering/HgcrocBoe.hh
index 070ab6f..3710519 100644
--- a/interface/Buffering/HgcrocBoe.hh
+++ b/interface/Buffering/HgcrocBoe.hh
@@ -15,7 +15,7 @@ public:
fWord=w;
}
- HgcrocBoe(uint8_t e, uint8_t h, uint8_t b, uint8_t l, uint8_t n, bool s=false) {
+ HgcrocBoe(uint8_t e, uint8_t h, uint8_t b, uint8_t l, uint8_t n, bool s=true) {
assert(n<64);
fWord=(b<<24)+((18*e+h)<<16)+(l<<8)+(n&0x3f)+(s?0x40:0);
}
diff --git a/interface/Buffering/LpGbtCheck.hh b/interface/Buffering/LpGbtCheck.hh
index 66ade3c..faddb9a 100644
--- a/interface/Buffering/LpGbtCheck.hh
+++ b/interface/Buffering/LpGbtCheck.hh
@@ -188,7 +188,7 @@ private:
BlockCheck fBlockCheck[7];
- unsigned fNumberOfHgcrocs;
+ //unsigned fNumberOfHgcrocs;
unsigned fHgcroc;
const EconArch *fEconArch;
@@ -199,7 +199,7 @@ private:
uint8_t fL1Accept;
uint8_t fBx;
HgcrocBoe fHgcrocBoe;
- unsigned fWords[7];
+ //unsigned fWords[7];
bool fHgcrocSeen[18];
};
diff --git a/interface/Buffering/SlinkCheck.hh b/interface/Buffering/SlinkCheck.hh
index 83deb35..62d4f37 100644
--- a/interface/Buffering/SlinkCheck.hh
+++ b/interface/Buffering/SlinkCheck.hh
@@ -61,6 +61,12 @@ public:
assert(fBoe.valid());
fL1Accept=(fL1Accept+1)&0xffffffff;
assert(fBoe.eventId()==fL1Accept);
+
+ fEventDump.resize(0);
+ fEventDump.push_back(w.first&0xffffffff);
+ fEventDump.push_back(w.first>>32);
+ fEventDump.push_back(w.second&0xffffffff);
+ fEventDump.push_back(w.second>>32);
fEventActive=true;
fEconRead=0;
@@ -77,6 +83,11 @@ public:
return;
}
+ fEventDump.push_back(w.first&0xffffffff);
+ fEventDump.push_back(w.first>>32);
+ fEventDump.push_back(w.second&0xffffffff);
+ fEventDump.push_back(w.second>>32);
+
if(be) {
fEoe.setWords(d);
@@ -93,6 +104,20 @@ public:
assert(fEoe.crc()==0xff);
assert(fEoe.eventLength()==nWords);
+ if(fPrintLevel>5) {
+ std::cout << std::endl << "SlinkCheck::processWord() "
+ << "Event dump for L1Accept " << fL1Accept << std::endl;
+
+ for(unsigned i(0);i4) {
std::cout << "SlinkCheck::processWord() "
@@ -228,6 +253,8 @@ private:
unsigned nHgcrocWords;
bool completedHgcroc[5][18];
+
+ std::vector fEventDump;
};
unsigned SlinkCheck::fPrintLevel(1);
diff --git a/src/DaqDaqBuffer.cpp b/src/DaqDaqBuffer.cpp
index 80ba301..12e2cc0 100644
--- a/src/DaqDaqBuffer.cpp
+++ b/src/DaqDaqBuffer.cpp
@@ -891,7 +891,7 @@ int main(int argc, char* argv[]) {
}
if(doingBe) {
- beSlinkSim[sl].boj(sl,slinkArch[sl]);
+ beSlinkSim[sl].boj(slinkArch[sl]);
beSlinkAna[sl].boj(beSlinkSim[sl],nHistory);
slinkCheck[sl].boj(slinkArch[sl]);
@@ -1046,7 +1046,7 @@ int main(int argc, char* argv[]) {
beSlinkAna[sl].analyseL1Accept(bx);
}
- beSlinkSim[sl].processBx(slinkElinkData[sl]);
+ beSlinkSim[sl].processBx(bx,slinkElinkData[sl]);
beSlinkAna[sl].analyseBx(bx);
for(unsigned w(0);w