GRSISort "v4.0.0.5"
An extension of the ROOT analysis Framework
Loading...
Searching...
No Matches
TTdrDataParser.cxx
Go to the documentation of this file.
1#include "TTdrDataParser.h"
3
4#include "TChannel.h"
5#include "Globals.h"
6
7#include "TScalerQueue.h"
8#include "TTdrMnemonic.h"
9#include "TEpicsFrag.h"
10#include "TParsingDiagnostics.h"
11
12#include "Rtypes.h"
13
14#include "TFragment.h"
15#include "TBadFragment.h"
16
22
26
27int TTdrDataParser::Process(std::shared_ptr<TRawEvent> rawEvent)
28{
29 /// Process this TTdrEvent using the provided data parser.
30 /// Returns the total number of fragments read (good and bad).
31 // right now the parser only returns the total number of fragments read
32 // so we assume (for now) that all fragments are good fragments
33 std::shared_ptr<TTdrEvent> event = std::static_pointer_cast<TTdrEvent>(rawEvent);
34 return TdrToFragment(event->GetData(), event->GetDataSize());
35}
36
37int TTdrDataParser::TdrToFragment(char* data, uint32_t size)
38{
39 uint64_t* ptr = reinterpret_cast<uint64_t*>(data);
40
41 int totalEventsRead = 0;
42 static uint64_t timeStampHighBits = 0;
43 std::shared_ptr<TFragment> eventFrag = std::make_shared<TFragment>();
44 IncrementInputSize(size / 8); // words of 8 bytes each
45
46 for(size_t i = 0; i < size / 8; ++i) {
47 eventFrag->Clear();
50 //std::cout<<"0x"<<std::setw(16)<<ptr[i]<<std::endl;
51 switch(ptr[i] >> 62) {
52 case 0:
53 std::cout << "unknown word" << std::endl;
54 break;
55 case 1:
56 std::cout << "trace word" << std::endl;
57 break;
58 case 2:
59 // this word gives us the extended timestamp (and a moduleNumber and channelNumber)
60 // the only thing we really care about is the high timestamp bits
61 {
62 //short moduleNumber = (ptr[i]>>56)&0x3f;
63 short infoCode = (ptr[i] >> 52) & 0xf;
64 if(((ptr[i] >> 28) & 0xf) != 0x0) {
65 std::cout << "not a proper word!" << std::endl;
66 }
67 //uint64_t timeStamp = ptr[i]&0xfffffff;
68 //uint32_t channelNumber = 0;
69 switch(infoCode) {
70 case 0:
71 std::cout << "undefined infoCode " << infoCode << std::endl;
72 break;
73 case 1:
74 //channelNumber = (ptr[i]>>32)&0xfffff;
75 break;
76 case 2:
77 case 3:
78 case 4:
79 case 7:
80 //timeStamp |= ptr[i]&0xfffff00000000>>4;
81 timeStampHighBits = (ptr[i] >> 32) & 0xfffff;
82 break;
83 case 5:
84 //timeStamp |= (ptr[i]&0xfffff00000000)<<20;
85 timeStampHighBits = (ptr[i] >> 12) & 0xfffff00000;
86 break;
87 default:
88 std::cout << "infoCode " << infoCode << std::endl;
89 break;
90 }
91 //std::cout<<"moduleNumber "<<moduleNumber<<", channelNumber "<<channelNumber<<", timeStamp "<<timeStamp<<std::endl;
92 break;
93 }
94 case 3: {
95 // data word with channelNumber, adcData, and 28 low bits of timestamp
96 // check if this is the tape-move event
97 auto channel = TChannel::GetChannel((ptr[i] >> 48) & 0xfff);
98 if(channel != nullptr && static_cast<EDigitizer>(channel->GetDigitizerType()) == EDigitizer::kPixieTapeMove) {
99 //PPG
100 auto* ppgEvent = new TPPGData;
101 switch(channel->GetDetectorNumber()) {
102 case 1:
103 // tape move for "normal" experiments
104 // target finished moving in front of detector for PR294
105 ppgEvent->SetNewPPG(EPpgPattern::kTapeMove);
106 break;
107 case 2:
108 // unused for "normal" experiments
109 // target moving away from detector for PR294
110 ppgEvent->SetNewPPG(EPpgPattern::kBackground);
111 break;
112 default:
113 ppgEvent->SetNewPPG(EPpgPattern::kJunk);
114 break;
115 }
116 ppgEvent->SetLowTimeStamp(ptr[i] & 0xfffffff);
117 ppgEvent->SetHighTimeStamp(timeStampHighBits);
118 ppgEvent->SetNetworkPacketId(static_cast<Int_t>((ptr[i] >> 32) & 0xffff));
119 TPPG::Get()->AddData(ppgEvent);
120 continue;
121 }
122 eventFrag->SetAddress((ptr[i] >> 48) & 0xfff);
123 eventFrag->SetTimeStamp((ptr[i] & 0xfffffff) | (timeStampHighBits << 28));
124 ++totalEventsRead;
125 // charge is a 14bit signed integer (despite being reported as 16 bits) so we extend the sign bit for an Int_t (4 bytes)
126 //eventFrag->SetCharge(static_cast<Int_t>(((ptr[i]>>32)&0xffff) | ((((ptr[i]>>32)&0x2000) == 0x2000) ? 0xffffc000 : 0x0)));
127 eventFrag->SetCharge(static_cast<Int_t>((ptr[i] >> 32) & 0xffff));
128 //std::cout<<std::hex<<std::setfill('0');
129 //std::cout<<std::setw(16)<<ptr[i]<<": addr "<<eventFrag->GetAddress()<<", ts "<<eventFrag->GetTimeStamp()<<", charge "<<eventFrag->Charge()<<std::endl;
130 //std::cout<<std::dec<<std::setfill(' ');
131 // we expect a second word from the channel+16 with the same timestamp
132 ++i;
133 if(i >= size / 8) {
134 if(RecordDiag()) {
136 }
137 Push(*BadOutputQueue(), std::make_shared<TBadFragment>(*eventFrag, reinterpret_cast<uint32_t*>(data), size / 4, i, false));
138 continue;
139 }
140 // check address
141 if(((ptr[i] >> 48) & 0xfff) != eventFrag->GetAddress() + 16) {
142 //std::cout<<"Address mismatch "<<((ptr[i]>>48)&0xfff)<<" != "<<eventFrag->GetAddress()<<std::endl;
143 if(RecordDiag()) {
145 }
146 Push(*BadOutputQueue(), std::make_shared<TBadFragment>(*eventFrag, reinterpret_cast<uint32_t*>(data), size / 4, i, false));
147 // re-try this word
148 --i;
149 continue;
150 }
151 // check timestamp
152 if(static_cast<Long64_t>((ptr[i] & 0xfffffff) | (timeStampHighBits << 28)) != eventFrag->GetTimeStamp()) {
153 //std::cout<<"Timestamp mismatch "<<((ptr[i]&0xfffffff) | (timeStampHighBits<<28))<<" != "<<eventFrag->GetTimeStamp()<<std::endl;
154 if(RecordDiag()) {
156 }
157 Push(*BadOutputQueue(), std::make_shared<TBadFragment>(*eventFrag, reinterpret_cast<uint32_t*>(data), size / 4, i, false));
158 // re-try this word
159 --i;
160 continue;
161 }
162 DecrementInputSize(); // we just read another word from the input
163 // set Cfd ???
164 eventFrag->SetCfd(static_cast<Int_t>((ptr[i] >> 32) & 0xffff));
165 //std::cout<<std::hex<<std::setfill('0');
166 //std::cout<<std::setw(16)<<ptr[i]<<": addr "<<eventFrag->GetAddress()<<", ts "<<eventFrag->GetTimeStamp()<<", cfd "<<eventFrag->GetCfd()<<std::endl;
167 //std::cout<<std::dec<<std::setfill(' ');
168 if(RecordDiag()) {
170 }
171 Push(GoodOutputQueues(), std::make_shared<TFragment>(*eventFrag));
172 break;
173 }
174 }
175 }
176
177 return totalEventsRead;
178}
EDigitizer
static TChannel * GetChannel(unsigned int temp_address, bool warn=false)
Definition TChannel.cxx:459
std::vector< std::shared_ptr< ThreadsafeQueue< std::shared_ptr< const TFragment > > > > & GoodOutputQueues()
void DecrementInputSize()
virtual std::shared_ptr< ThreadsafeQueue< std::shared_ptr< const TBadFragment > > > & BadOutputQueue()
Definition TDataParser.h:73
void Push(ThreadsafeQueue< std::shared_ptr< const TBadFragment > > &queue, const std::shared_ptr< TBadFragment > &frag)
bool RecordDiag() const
void IncrementItemsPopped()
void IncrementInputSize()
void SetLowTimeStamp(UInt_t lowTime)
Definition TPPG.h:63
void AddData(TPPGData *pat)
Definition TPPG.cxx:121
void BadFragment(Short_t detType)
void GoodFragment(const std::shared_ptr< const TFragment > &)
static TPPG * Get(bool verbose=false)
Definition TSingleton.h:33
int TdrToFragment(char *data, uint32_t size)
int Process(std::shared_ptr< TRawEvent >) override
EDataParserState fState