44#include < boost/tokenizer.hpp>
55#include < boost/lexical_cast.hpp>
66#include < iostream>
7+ #include < bitset>
78#include < queue>
89
910#include " TPCReconstruction/RawReader.h"
1011#include " TPCReconstruction/GBTFrame.h"
1112#include " TPCReconstruction/SyncPatternMonitor.h"
13+ #include " TPCReconstruction/AdcClockMonitor.h"
1214#include " TPCBase/Mapper.h"
1315
1416#include " FairLogger.h"
@@ -21,6 +23,7 @@ RawReader::RawReader(int region, int link)
2123 , mLastEvent(-1 )
2224 , mUseRawInMode3(true )
2325 , mApplyChannelMask(false )
26+ , mCheckAdcClock(true )
2427 , mTimestampOfFirstData({0 ,0 ,0 ,0 ,0 })
2528 , mEvents()
2629 , mData()
@@ -291,10 +294,17 @@ bool RawReader::decodeRawGBTFrames(EventInfo eventInfo) {
291294
292295 std::array<SyncPatternMonitor,5 > syncMon{
293296 SyncPatternMonitor (0 ,0 ),
294- SyncPatternMonitor (0 ,1 ),
295- SyncPatternMonitor (1 ,0 ),
296- SyncPatternMonitor (1 ,1 ),
297- SyncPatternMonitor (2 ,0 )};
297+ SyncPatternMonitor (0 ,1 ),
298+ SyncPatternMonitor (1 ,0 ),
299+ SyncPatternMonitor (1 ,1 ),
300+ SyncPatternMonitor (2 ,0 )};
301+ std::array<AdcClockMonitor,3 > adcClockMon{
302+ AdcClockMonitor (0 ),
303+ AdcClockMonitor (1 ),
304+ AdcClockMonitor (2 )};
305+ std::array<bool ,3 > adcClockFound{false , false , false };
306+ std::array<uint64_t ,3 > adcSequence{0 ,0 ,0 };
307+
298308 std::array<short ,5 > lastSyncPos;
299309 std::array<std::queue<uint16_t >,5 > adcValues;
300310 GBTFrame frame;
@@ -363,6 +373,39 @@ bool RawReader::decodeRawGBTFrames(EventInfo eventInfo) {
363373 frame.getHalfWord (2 ,2 ),
364374 frame.getHalfWord (2 ,3 ))) mSyncPos [4 ] = syncMon[4 ].getPosition ();
365375
376+ if (mCheckAdcClock ) {
377+ adcSequence[0 ] = (adcSequence[0 ] << 4 ) | (frame.getAdcClock (0 ) & 0xF );
378+ adcSequence[1 ] = (adcSequence[1 ] << 4 ) | (frame.getAdcClock (1 ) & 0xF );
379+ adcSequence[2 ] = (adcSequence[2 ] << 4 ) | (frame.getAdcClock (2 ) & 0xF );
380+ // std::cout << std::bitset<4>(frame.getAdcClock(0)) << "\t"
381+ // << std::bitset<4>(frame.getAdcClock(1)) << "\t"
382+ // << std::bitset<4>(frame.getAdcClock(2)) << std::endl;
383+
384+ bool adcCheckErr0 = adcClockMon[0 ].addSequence (frame.getAdcClock (0 ));
385+ bool adcCheckErr1 = adcClockMon[1 ].addSequence (frame.getAdcClock (1 ));
386+ bool adcCheckErr2 = adcClockMon[2 ].addSequence (frame.getAdcClock (2 ));
387+ // std::cout << adcCheckErr0 << " " << adcCheckErr1 << " " << adcCheckErr2 << std::endl;
388+ if (mSyncPos [0 ] >= 0 ) adcClockFound[0 ] = adcClockFound[0 ] | !adcCheckErr0;
389+ if (mSyncPos [2 ] >= 0 ) adcClockFound[1 ] = adcClockFound[1 ] | !adcCheckErr1;
390+ if (mSyncPos [4 ] >= 0 ) adcClockFound[2 ] = adcClockFound[2 ] | !adcCheckErr2;
391+ // std::cout << adcClockFound[0] << " " << adcClockFound[1] << " " << adcClockFound[2] << std::endl;
392+ if (adcClockFound[0 ] & adcCheckErr0) {
393+ // adcClockFound[0] = false;
394+ LOG (DEBUG) << " ADC clock 0 mon error in " << i << FairLogger::endl;
395+ std::cout << std::bitset<64 >(adcSequence[0 ]) << std::endl;
396+ };
397+ if (adcClockFound[1 ] & adcCheckErr1) {
398+ // adcClockFound[1] = false;
399+ LOG (DEBUG) << " ADC clock 1 mon error in " << i << FairLogger::endl;
400+ std::cout << std::bitset<64 >(adcSequence[1 ]) << std::endl;
401+ };
402+ if (adcClockFound[2 ] & adcCheckErr2) {
403+ // adcClockFound[2] = false;
404+ LOG (DEBUG) << " ADC clock 2 mon error in " << i << FairLogger::endl;
405+ std::cout << std::bitset<64 >(adcSequence[2 ]) << std::endl;
406+ };
407+ }
408+
366409 short value1;
367410 short value2;
368411 for (short iHalfSampa = 0 ; iHalfSampa < 5 ; ++iHalfSampa) {
0 commit comments