507 std::shared_ptr<TFragment> eventFrag = std::make_shared<TFragment>();
513 bool multipleErrors =
false;
529 eventFrag->SetDaqTimeStamp(midasTime);
530 eventFrag->SetDaqId(midasSerialNumber);
534 if((eventFrag->GetModuleType() == 1 || eventFrag->GetModuleType() == 4) && eventFrag->GetAddress() == 0xffff) {
538 if(eventFrag->GetDetectorType() == 0xf) {
542 if((chan !=
nullptr) && strncmp(
"RF", chan->GetName(), 2) == 0) {
555 multipleErrors =
true;
565 for(; x < size; x++) {
566 if((data[x] >> 28) == 0xe) {
return x; }
595 multipleErrors =
true;
611 multipleErrors =
true;
621 multipleErrors =
true;
625 std::vector<Int_t> tmpCharge;
626 std::vector<Short_t> tmpIntLength;
627 std::vector<Int_t> tmpCfd;
629 for(; x < size; x++) {
630 uint32_t dword = data[x];
631 uint32_t packet = dword >> 28;
632 uint32_t value = dword & 0x0fffffff;
645 multipleErrors =
true;
647 Push(*
BadOutputQueue(), std::make_shared<TBadFragment>(*eventFrag, data, size, failedWord, multipleErrors));
661 if((value & 0x3fff) == (eventFrag->GetChannelId() & 0x3fff)) {
662 if(!
Options()->SuppressErrors() && (eventFrag->GetModuleType() == 2) && (bank <
EBank::kGRF3)) {
664 if(((value >> 14) & 0x1) == 0x1) {
665 if(((value >> 16) & 0xff) != 0) {
666 std::cout <<
BLUE <<
hex(eventFrag->GetAddress(), 4) <<
": NIOS code finished with error " <<
hex((value >> 16) & 0xff, 2) <<
RESET_COLOR << std::endl;
671 if((eventFrag->GetModuleType() == 1) || (bank >
EBank::kGRF2)) {
672 eventFrag->SetAcceptedChannelId((value >> 14) & 0x3fff);
674 eventFrag->SetAcceptedChannelId(0);
681 if(
Options()->WordOffset() >= 0 && eventFrag->GetNumberOfWords() > 0 && !eventFrag->HasWave() && eventFrag->GetNumberOfWords() != x +
Options()->WordOffset()) {
686 multipleErrors =
true;
688 Push(*
BadOutputQueue(), std::make_shared<TBadFragment>(*eventFrag, data, size, failedWord, multipleErrors));
702 if(eventFrag->GetModuleType() == 1 && bank ==
EBank::kGRF4) {
703 if(tmpCfd.size() != 1) {
711 multipleErrors =
true;
713 Push(*
BadOutputQueue(), std::make_shared<TBadFragment>(*eventFrag, data, size, failedWord, multipleErrors));
716 eventFrag->SetCfd(tmpCfd[0]);
723 if(tmpCharge.size() != tmpIntLength.size() || tmpCharge.size() != tmpCfd.size()) {
731 multipleErrors =
true;
733 Push(*
BadOutputQueue(), std::make_shared<TBadFragment>(*eventFrag, data, size, failedWord, multipleErrors));
736 for(
size_t h = 0; h < tmpCharge.size(); ++h) {
737 eventFrag->SetCharge(tmpCharge[h]);
738 eventFrag->SetKValue(tmpIntLength[h]);
739 eventFrag->SetCfd(tmpCfd[h]);
744 if(
Options()->ReconstructTimeStamp()) {
754 if((eventFrag->GetTimeStamp() & 0x0fffffff) <
758 eventFrag->AppendTimeStamp(((
LastTimeStampMap()[eventFrag->GetAddress()] >> 28) + 1) << 28);
760 eventFrag->AppendTimeStamp(
LastTimeStampMap()[eventFrag->GetAddress()] & 0x3fff0000000);
767 Push(*
BadOutputQueue(), std::make_shared<TBadFragment>(*eventFrag, data, size, failedWord, multipleErrors));
780 multipleErrors =
true;
782 Push(*
BadOutputQueue(), std::make_shared<TBadFragment>(*eventFrag, data, size, failedWord, multipleErrors));
794 multipleErrors =
true;
796 Push(*
BadOutputQueue(), std::make_shared<TBadFragment>(*eventFrag, data, size, failedWord, multipleErrors));
811 multipleErrors =
true;
813 Push(*
BadOutputQueue(), std::make_shared<TBadFragment>(*eventFrag, data, size, failedWord, multipleErrors));
824 multipleErrors =
true;
826 Push(*
BadOutputQueue(), std::make_shared<TBadFragment>(*eventFrag, data, size, failedWord, multipleErrors));
830 std::cout <<
"This bank not yet defined." << std::endl;
837 switch(eventFrag->GetModuleType()) {
844 if(((data[x] & 0x80000000) == 0x0) && x + 1 < size && (data[x + 1] & 0x80000000) == 0x0) {
845 Short_t tmp = (data[x] & 0x7c000000) >> 21;
846 tmpCharge.push_back((data[x] & 0x03ffffff) | (((data[x] & 0x02000000) == 0x02000000)
850 tmpIntLength.push_back(tmp | ((data[x] & 0x7c000000) >> 26));
851 tmpCfd.push_back(data[x] & 0x03ffffff);
858 multipleErrors =
true;
860 Push(*
BadOutputQueue(), std::make_shared<TBadFragment>(*eventFrag, data, size, failedWord, multipleErrors));
866 (data[x + 1] & 0x80000000) == 0x0) {
867 Short_t tmp = (data[x] & 0x7c000000) >> 17;
868 tmpCharge.push_back((data[x] & 0x03ffffff) | (((data[x] & 0x02000000) == 0x02000000)
872 tmpIntLength.push_back(tmp | ((data[x] & 0x7fc00000) >> 22));
873 tmpCfd.push_back(data[x] & 0x003fffff);
881 multipleErrors =
true;
883 Push(*
BadOutputQueue(), std::make_shared<TBadFragment>(*eventFrag, data, size, failedWord, multipleErrors));
890 if((data[x] & 0x80000000) == 0x0 && x + 1 < size &&
891 (data[x + 1] & 0x80000000) == 0x0) {
892 Short_t tmp = ((data[x] & 0x7c000000) >> 17) |
893 (((data[x] & 0x40000000) == 0x40000000) ? 0xc000 : 0x0);
897 tmpCharge.push_back((data[x] & 0x01ffffff) |
898 (((data[x] & 0x01000000) == 0x01000000)
902 tmpIntLength.push_back(tmp | ((data[x] & 0x7fc00000) >> 22));
903 tmpCfd.push_back(data[x] & 0x003fffff);
906 if(x + 2 < size && (data[x + 1] & 0x80000000) == 0x0 && (data[x + 2] & 0x80000000) == 0x0) {
908 tmpIntLength.push_back((data[x] & 0x3fff) | (((data[x] & 0x2000) == 0x2000) ? 0xc000 : 0x0));
911 if((data[x] & 0x02000000) == 0x02000000) {
912 tmpCharge.push_back(std::numeric_limits<int>::max());
914 tmpCharge.push_back((data[x] & 0x01ffffff) |
915 (((data[x] & 0x01000000) == 0x01000000)
921 if(x + 2 < size && (data[x + 1] & 0x80000000) == 0x0 && (data[x + 2] & 0x80000000) == 0x0) {
923 tmpIntLength.push_back((data[x] & 0x3fff) | (((data[x] & 0x2000) == 0x2000) ? 0xc000 : 0x0));
924 tmpIntLength.push_back((data[x] >> 16) |
925 (((data[x] & 0x20000000) == 0x20000000) ? 0xc000 : 0x0));
927 if((data[x] & 0x02000000) == 0x02000000) {
928 tmpCharge.push_back(std::numeric_limits<int>::max());
930 tmpCharge.push_back((data[x] & 0x01ffffff) |
931 (((data[x] & 0x01000000) == 0x01000000)
937 if(x + 1 < size && (data[x + 1] & 0x80000000) == 0x0) {
939 if((data[x] & 0x02000000) == 0x02000000) {
940 tmpCharge.push_back(std::numeric_limits<int>::max());
942 tmpCharge.push_back((data[x] & 0x01ffffff) |
943 (((data[x] & 0x01000000) == 0x01000000)
948 tmpIntLength.pop_back();
950 }
else if((data[x + 1] & 0x80000000) == 0x0) {
953 }
else if((data[x + 1] & 0x80000000) == 0x0) {
960 while(x < size && (data[x] & 0xf0000000) != 0xe0000000) {
968 multipleErrors =
true;
970 Push(*
BadOutputQueue(), std::make_shared<TBadFragment>(*eventFrag, data, size, failedWord, multipleErrors));
975 if(!
Options()->SuppressErrors()) {
976 std::cout <<
DRED <<
"Error, bank type " <<
static_cast<std::underlying_type<EBank>::type
>(bank) <<
" not implemented yet" <<
RESET_COLOR << std::endl;
983 multipleErrors =
true;
985 Push(*
BadOutputQueue(), std::make_shared<TBadFragment>(*eventFrag, data, size, failedWord, multipleErrors));
992 if(x + 1 < size && (data[x + 1] & 0x80000000) == 0x0) {
993 Short_t tmp = (data[x] & 0x7c000000) >> 21;
994 tmpCharge.push_back((data[x] & 0x03ffffff) | (((data[x] & 0x02000000) == 0x02000000)
998 tmpIntLength.push_back(tmp | ((data[x] & 0x7c000000) >> 26));
999 tmpCfd.push_back(data[x] & 0x03ffffff);
1006 multipleErrors =
true;
1008 Push(*
BadOutputQueue(), std::make_shared<TBadFragment>(*eventFrag, data, size, failedWord, multipleErrors));
1013 if(bank >
EBank::kGRF2 && (eventFrag->GetDetectorType() == 6 || eventFrag->GetDetectorType() == 10 ||
1014 eventFrag->GetDetectorType() == 11)) {
1016 if(x + 1 < size && (data[x + 1] & 0x80000000) == 0x0) {
1027 multipleErrors =
true;
1029 Push(*
BadOutputQueue(), std::make_shared<TBadFragment>(*eventFrag, data, size, failedWord, multipleErrors));
1035 if(!
Options()->SuppressErrors()) {
1036 std::cout <<
DRED <<
"Error, module type " << eventFrag->GetModuleType() <<
" not implemented yet" <<
RESET_COLOR << std::endl;
1043 multipleErrors =
true;
1045 Push(*
BadOutputQueue(), std::make_shared<TBadFragment>(*eventFrag, data, size, failedWord, multipleErrors));
1057 multipleErrors =
true;
1059 Push(*
BadOutputQueue(), std::make_shared<TBadFragment>(*eventFrag, data, size, failedWord, multipleErrors));
1246 ULong64_t tshigh = 0;
1247 double rfFreq = -1.0;
1248 std::array<double, 4> rfPar;
1249 bool freqSet =
false;
1251 int failedWord = -1;
1254 for(
int i = 0; i < size; i++) {
1261 uint32_t dword = data[x];
1262 uint32_t packet = dword >> 28;
1263 uint32_t value = dword & 0x0fffffff;
1268 rfFreq =
static_cast<double>(value);
1276 if((data[x] >> 28) == 0xb) {
1278 ts |= ((tshigh & 0x00003fff) << 28);
1284 Push(*
BadOutputQueue(), std::make_shared<TBadFragment>(*frag, data, size, failedWord,
false));
1294 Push(*
BadOutputQueue(), std::make_shared<TBadFragment>(*frag, data, size, failedWord,
false));
1301 if(freqSet && tsSet) {
break; }
1309 Push(*
BadOutputQueue(), std::make_shared<TBadFragment>(*frag, data, size, failedWord,
false));
1313 frag->SetTimeStamp(ts);
1315 if(!(x < size - 3)) {
1320 Push(*
BadOutputQueue(), std::make_shared<TBadFragment>(*frag, data, size, failedWord,
false));
1323 if((data[x] == data[x + 1]) && (data[x] == data[x + 2]) && (data[x] == data[x + 3])) {
1328 Push(*
BadOutputQueue(), std::make_shared<TBadFragment>(*frag, data, size, failedWord,
false));
1333 for(
int i = 0; i < 4; i++) {
1335 uint32_t dword = data[x];
1336 uint32_t packet = dword >> 28;
1339 if((packet) == 0xe) {
1344 Push(*
BadOutputQueue(), std::make_shared<TBadFragment>(*frag, data, size, failedWord,
false));
1347 if((i != 2) && (dword == 0)) {
1352 Push(*
BadOutputQueue(), std::make_shared<TBadFragment>(*frag, data, size, failedWord,
false));
1356 if((dword & (1 << 29)) != 0x0) {
1359 for(
int j = 0; j < 30; j++) {
1360 if((dword & (1 << j)) != 0x0) {
1365 for(
int j = pos + 1; j < 30; j++) {
1368 rfPar[i] =
static_cast<double>(-1.0 * (dword & 0x03ffffff));
1370 rfPar[i] =
static_cast<double>(dword & 0x03ffffff);
1380 rfPar[0] = rfPar[0] / rfPar[3];
1381 rfPar[1] = rfPar[1] / rfPar[3];
1382 rfPar[2] = rfPar[2] / rfPar[3];
1383 double T = 1.34217728E9 / rfFreq;
1384 double A = sqrt(rfPar[1] * rfPar[1] + rfPar[0] * rfPar[0]);
1385 double s = -rfPar[0] / A;
1386 double c = rfPar[1] / A;
1387 double rfPhaseShift = 0.;
1389 rfPhaseShift = acos(c) * T / (2 * TMath::Pi());
1391 rfPhaseShift = (1 - acos(c) / (2 * TMath::Pi())) * T;
1396 frag->SetCharge(
static_cast<float>(T));
1397 frag->SetCfd(
static_cast<float>(rfPhaseShift) * 1.6f);
1597 std::shared_ptr<TFragment> eventFrag = std::make_shared<TFragment>();
1599 int nofFragments = 0;
1605 for(
int board = 0; w < size; ++board) {
1607 if(data[w] >> 28 != 0xa) {
1608 if(data[w] == 0x0) {
1610 if(data[w++] != 0x0) {
1611 if(!
Options()->SuppressErrors()) {
1612 std::cerr << board <<
". board - failed on first word, found empty word, but not all following words were empty: " << w - 1 <<
" 0x" << std::hex << std::setw(8) << std::setfill(
'0') << data[w - 1] << std::dec << std::setfill(
' ') << std::endl;
1617 return nofFragments;
1619 if(!
Options()->SuppressErrors()) {
1620 std::cerr << board <<
". board - failed on first word 0x" << std::hex << std::setw(8) << std::setfill(
'0') << data[w] << std::dec << std::setfill(
' ') <<
", highest nibble should have been 0xa!" << std::endl;
1624 int32_t numWordsBoard = data[w++] & 0xfffffff;
1625 if(w - 1 + numWordsBoard > size) {
1626 if(!
Options()->SuppressErrors()) {
1627 std::cerr <<
"0 - Missing words, at word " << w - 1 <<
", expecting " << numWordsBoard <<
" more words for board " << board <<
" (bank size " << size <<
")" << std::endl;
1631 uint8_t boardId = data[w] >> 27;
1633 uint8_t channelMask = data[w++] & 0xff;
1635 uint32_t boardTime = data[w++];
1642 for(uint8_t channel = 0; channel < 16; channel += 2) {
1643 if(((channelMask >> (channel / 2)) & 0x1) == 0x0) {
1647 if(data[w] >> 31 != 0x1) {
1648 if(!
Options()->SuppressErrors()) {
1649 std::cerr <<
"Failed on first word 0x" << std::hex << std::setw(8) << std::setfill(
'0') << data[w] << std::dec << std::setfill(
' ') <<
", highest bit should have been set!" << std::endl;
1653 int32_t numWords = data[w++] & 0x3fffff;
1655 if(!
Options()->SuppressErrors()) {
1656 std::cerr <<
"1 - Missing words, got only " << w - 1 <<
" words for channel " << channel <<
" (bank size " << size <<
")" << std::endl;
1660 if(((data[w] >> 29) & 0x3) != 0x3) {
1661 if(!
Options()->SuppressErrors()) {
1662 std::cerr <<
"Failed on second word 0x" << std::hex << std::setw(8) << std::setfill(
'0') << data[w] << std::dec << std::setfill(
' ') <<
", bits 29 and 30 should have been set!" << std::endl;
1666 bool dualTrace = ((data[w] >> 31) == 0x1);
1667 bool extras = (((data[w] >> 28) & 0x1) == 0x1);
1668 bool waveform = (((data[w] >> 27) & 0x1) == 0x1);
1669 uint8_t extraFormat = ((data[w] >> 24) & 0x7);
1675 int numSampleWords = 4 * (data[w++] & 0xffff);
1677 if(!
Options()->SuppressErrors()) {
1678 std::cerr <<
"2 - Missing words, got only " << w - 1 <<
" words for channel " << channel <<
" (bank size " << size <<
")" << std::endl;
1682 int eventSize = numSampleWords + 2;
1683 if(extras) { ++eventSize; }
1684 if(numWords % eventSize != 2 && !(eventSize == 2 && numWords % eventSize == 0)) {
1685 if(!
Options()->SuppressErrors()) {
1686 std::cerr << numWords <<
" words in channel aggregate, event size is " << eventSize <<
" => " <<
static_cast<double>(numWords - 2.) /
static_cast<double>(eventSize) <<
" events?" << std::endl;
1692 for(
int ev = 0; ev < (numWords - 2) / eventSize; ++ev) {
1693 eventFrag->SetDaqTimeStamp(boardTime);
1694 eventFrag->SetAddress(0x8000 + (boardId * 0x100) + channel + (data[w] >> 31));
1695 if(eventFrag->GetAddress() == 0x8000) {
1696 eventFrag->SetDetectorType(9);
1698 eventFrag->SetDetectorType(6);
1701 eventFrag->SetTimeStamp(data[w] & 0x7fffffff);
1704 if(w + numSampleWords >= size) {
1705 if(!
Options()->SuppressErrors()) {
1706 std::cerr <<
"3 - Missing " << numSampleWords <<
" waveform words, got only " << w - 1 <<
" words for channel " << channel <<
" (bank size " << size <<
")" << std::endl;
1710 for(
int s = 0; s < numSampleWords && w < size; ++s, ++w) {
1717 eventFrag->AddWaveformSample(data[w] & 0xffff);
1718 eventFrag->AddWaveformSample((data[w] >> 16) & 0xffff);
1723 eventFrag->AddWaveformSample(data[w] & 0xffff);
1724 eventFrag->AddWaveformSample((data[w] >> 16) & 0xffff);
1731 if(!
Options()->SuppressErrors()) {
1732 std::cerr <<
"3 - Missing words, got only " << w - 1 <<
" words for channel " << channel <<
" (bank size " << size <<
")" << std::endl;
1739 switch(extraFormat) {
1742 eventFrag->SetTimeStamp(eventFrag->GetTimeStamp() |
static_cast<uint64_t
>(data[w] & 0xffff0000) << 15);
1745 eventFrag->SetNetworkPacketNumber((data[w] >> 12) & 0xf);
1750 eventFrag->SetTimeStamp(eventFrag->GetTimeStamp() |
static_cast<uint64_t
>(data[w] & 0xffff0000) << 15);
1753 eventFrag->SetTimeStamp(eventFrag->GetTimeStamp() |
static_cast<uint64_t
>(data[w] & 0xffff0000) << 15);
1754 eventFrag->SetCfd(data[w] & 0x3ff);
1755 eventFrag->SetNetworkPacketNumber((data[w] >> 12) & 0xf);
1762 eventFrag->SetAcceptedChannelId(data[w] & 0xffff);
1763 eventFrag->SetChannelId(data[w] >> 16);
1771 if(data[w] != 0x12345678) {
1772 if(!
Options()->SuppressErrors()) {
1773 std::cerr <<
"Failed to get debug data word 0x12345678, got " << std::hex << std::setw(8) << std::setfill(
'0') << data[w] << std::dec << std::setfill(
' ') << std::endl;
1783 eventFrag->SetCcShort(data[w] & 0x7fff);
1784 eventFrag->SetCcLong((data[w] >> 15) & 0x1);
1785 eventFrag->SetCharge(
static_cast<Int_t
>(data[w++] >> 16));
1789 event->IncrementGoodFrags();
1794 return nofFragments;
1800 std::shared_ptr<TFragment> eventFrag = std::make_shared<TFragment>();
1802 int nofFragments = 0;
1808 for(
int board = 0; w < size; ++board) {
1810 if(data[w] >> 28 != 0xa) {
1811 if(data[w] == 0x0) {
1813 if(data[w++] != 0x0) {
1814 if(!
Options()->SuppressErrors()) {
1815 std::cerr << board <<
". board - failed on first word, found empty word, but not all following words were empty: " << w - 1 <<
" 0x" << std::hex << std::setw(8) << std::setfill(
'0') << data[w - 1] << std::dec << std::setfill(
' ') << std::endl;
1820 return nofFragments;
1822 if(!
Options()->SuppressErrors()) {
1823 std::cerr << board <<
". board - failed on first word 0x" << std::hex << std::setw(8) << std::setfill(
'0') << data[w] << std::dec << std::setfill(
' ') <<
", highest nibble should have been 0xa!" << std::endl;
1827 int32_t numWordsBoard = data[w++] & 0xfffffff;
1828 if(w - 1 + numWordsBoard > size) {
1829 if(!
Options()->SuppressErrors()) {
1830 std::cerr <<
"0 - Missing words, at word " << w - 1 <<
", expecting " << numWordsBoard <<
" more words for board " << board <<
" (bank size " << size <<
")" << std::endl;
1834 uint8_t boardId = data[w] >> 27;
1837 uint8_t channelMask = data[w++] & 0xff;
1839 uint32_t boardTime = data[w++];
1846 for(uint8_t channel = 0; channel < 8; ++channel) {
1848 if(((channelMask >> channel) & 0x1) == 0x0) {
1852 if(data[w] >> 31 != 0x1) {
1853 if(!
Options()->SuppressErrors()) {
1854 std::cerr <<
"Failed on first word 0x" << std::hex << std::setw(8) << std::setfill(
'0') << data[w] << std::dec << std::setfill(
' ') <<
", highest bit should have been set (to get format info)!" << std::endl;
1858 int32_t numWords = data[w++] & 0x7fffffff;
1860 if(!
Options()->SuppressErrors()) {
1861 std::cerr <<
"1 - Missing words, got only " << w - 1 <<
" words for channel " << channel <<
" (bank size " << size <<
")" << std::endl;
1868 bool extras = (((data[w] >> 28) & 0x1) == 0x1);
1869 bool waveform = (((data[w] >> 27) & 0x1) == 0x1);
1870 uint8_t extraFormat = ((data[w] >> 24) & 0x7);
1887 int numSampleWords = 4 * (data[w++] & 0xffff);
1889 if(!
Options()->SuppressErrors()) {
1890 std::cerr <<
"2 - Missing words, got only " << w - 1 <<
" words for channel " << channel <<
" (bank size " << size <<
")" << std::endl;
1894 int eventSize = numSampleWords + 2;
1895 if(extras) { ++eventSize; }
1896 if(numWords % eventSize != 2 && !(eventSize == 2 && numWords % eventSize == 0)) {
1897 if(!
Options()->SuppressErrors()) {
1898 std::cerr << numWords <<
" words in channel aggregate, event size is " << eventSize <<
" (" << numWords % eventSize <<
") => " <<
static_cast<double>(numWords - 2.) /
static_cast<double>(eventSize) <<
" events?" << std::endl;
1904 for(
int ev = 0; ev < (numWords - 2) / eventSize; ++ev) {
1905 eventFrag->SetDaqTimeStamp(boardTime);
1906 eventFrag->SetAddress(0x8000 + (boardId * 0x100) + channel + (data[w] >> 31));
1907 eventFrag->SetDetectorType(0);
1909 eventFrag->SetTimeStamp(data[w++] & 0x7fffffff);
1911 if(w + numSampleWords >= size) {
1912 if(!
Options()->SuppressErrors()) {
1913 std::cerr <<
"3 - Missing " << numSampleWords <<
" waveform words, got only " << w - 1 <<
" words for channel " << channel <<
" (bank size " << size <<
")" << std::endl;
1917 for(
int s = 0; s < numSampleWords && w < size; ++s, ++w) {
1921 eventFrag->AddWaveformSample(data[w] & 0xffff);
1922 eventFrag->AddWaveformSample((data[w] >> 16) & 0xffff);
1926 if(!
Options()->SuppressErrors()) {
1927 std::cerr <<
"3 - Missing words, got only " << w - 1 <<
" words for channel " << channel <<
" (bank size " << size <<
")" << std::endl;
1934 switch(extraFormat) {
1937 eventFrag->SetTimeStamp(eventFrag->GetTimeStamp() |
static_cast<uint64_t
>(data[w] & 0xffff0000) << 15);
1940 eventFrag->SetTimeStamp(eventFrag->GetTimeStamp() |
static_cast<uint64_t
>(data[w] & 0xffff0000) << 15);
1941 eventFrag->SetCfd(data[w] & 0xffff);
1944 eventFrag->SetAcceptedChannelId(data[w] & 0xffff);
1945 eventFrag->SetChannelId(data[w] >> 16);
1962 eventFrag->SetCharge(
static_cast<Int_t
>(data[w] & 0xffff));
1977 event->IncrementGoodFrags();
1982 return nofFragments;
2094 int numFragsFound = 0;
2095 std::shared_ptr<TFragment> eventFrag = std::make_shared<TFragment>();
2096 eventFrag->SetDaqTimeStamp(event->GetTimeStamp());
2097 eventFrag->SetDaqId(event->GetSerialNumber());
2098 eventFrag->SetDetectorType(13);
2101 int failedWord = -1;
2103 bool multipleErrors =
false;
2104 uint32_t tmpTimestamp = 0;
2105 uint32_t tmpAddress = 0;
2108 std::vector<uint32_t> addresses;
2109 std::vector<uint32_t> charges;
2112 for(x = 0; x < size; ++x) {
2113 switch((data[x] >> 27) & 0x1F) {
2115 eventFrag->SetModuleType(data[x] & 0x1f);
2116 eventFrag->SetAcceptedChannelId((data[x] >> 5) & 0x3fffff);
2119 tmpAddress = (data[x] >> 16) & 0x300;
2120 eventFrag->SetChannelId((data[x] >> 12) & 0xfff);
2121 eventFrag->SetNetworkPacketNumber(data[x] & 0xfff);
2129 addresses.push_back(0x900000 + ((data[x] >> 19) & 0xff));
2130 charges.push_back(data[x] & 0x7ffff);
2133 if((tmpAddress != ((data[x] >> 16) & 0x300)) || (eventFrag->GetChannelId() != ((data[x] >> 12) & 0xfff))) {
2140 multipleErrors =
true;
2142 Push(*
BadOutputQueue(), std::make_shared<TBadFragment>(*eventFrag, data, size, failedWord, multipleErrors));
2144 eventFrag->SetNumberOfPileups(data[x] & 0xfff);
2147 eventFrag->SetAddress((data[x] >> 16) & 0x300);
2148 eventFrag->SetCharge(
static_cast<Int_t
>((data[x]) & 0xFFF));
2154 multipleErrors =
true;
2156 Push(*
BadOutputQueue(), std::make_shared<TBadFragment>(*eventFrag, data, size, failedWord, multipleErrors));
2159 tmpTimestamp = (data[x] & 0x7FFFFFF) << 5;
2166 tmpTimestamp = tmpTimestamp | ((data[x]) & 0x1f);
2174 ts +=
static_cast<Long64_t
>(0x100000000) *
static_cast<Long64_t
>(
wraparoundcounter);
2175 ts = ts *
static_cast<Long64_t
>(5);
2180 if((event->GetSerialNumber() ==
xfermidsn) && (event->GetTimeStamp() ==
xfermidts)) {
2183 eventFrag->SetTimeStamp(ts);
2186 if(addresses.size() != charges.size()) {
2187 std::cout <<
"Something went horribly wrong, the number of addresses read " << addresses.size() <<
" doesn't match the number of charges read " << charges.size() << std::endl;
2190 for(
size_t i = 0; i < addresses.size(); ++i) {
2193 for(
size_t j = 0; j < i; j++) {
2194 if(addresses[i] == addresses[j]) {
2200 eventFrag->SetAddress(addresses[i]);
2201 eventFrag->SetCharge(
static_cast<Int_t
>(charges[i]));
2219 multipleErrors =
true;
2221 Push(*
BadOutputQueue(), std::make_shared<TBadFragment>(*eventFrag, data, size, failedWord, multipleErrors));
2225 return numFragsFound;