GRSISort "v4.0.0.5"
An extension of the ROOT analysis Framework
Loading...
Searching...
No Matches
TILLDataParser.cxx
Go to the documentation of this file.
1#include "TILLDataParser.h"
3
4#include "TChannel.h"
5#include "Globals.h"
6
7#include "TScalerQueue.h"
8
9#include "TEpicsFrag.h"
10#include "TParsingDiagnostics.h"
11
12#include "Rtypes.h"
13
14#include "TFragment.h"
15#include "TBadFragment.h"
16
17#include "TILLMnemonic.h"
18
24
28
29int TILLDataParser::Process(std::shared_ptr<TRawEvent> rawEvent)
30{
31 std::shared_ptr<TLstEvent> event = std::static_pointer_cast<TLstEvent>(rawEvent);
32 /// Process this TLstEvent using the provided data parser.
33 /// Returns the total number of fragments read (good and bad).
34 // right now the parser only returns the total number of fragments read
35 // so we assume (for now) that all fragments are good fragments
36 int EventsProcessed = 0;
37 uint32_t size = event->GetDataSize();
38 uint32_t* EvntData = reinterpret_cast<uint32_t*>(event->GetData());
39
40 if(fInputSize != nullptr) *fInputSize += event->GetDataSize()/16; // 16 bytes per event, number of bytes in 32bits
41
42 if(event->GetLstVersion() == 1) {
43 for(size_t i = 0; i + 3 < size/4; i += 4) {
44 EventsProcessed += V1SingleFippsEventToFragment(EvntData + i);
45 if(fItemsPopped != nullptr && fInputSize != nullptr) {
46 ++(*fItemsPopped);
47 --(*fInputSize);
48 }
49 }
50 } else {
51 for(size_t i = 0; i + 3 < size / 4; i += 4) {
52 EventsProcessed += V2SingleFippsEventToFragment(EvntData + i);
53 if(fItemsPopped != nullptr && fInputSize != nullptr) {
54 ++(*fItemsPopped);
55 --(*fInputSize);
56 }
57 }
58 }
59
60 return EventsProcessed;
61}
62
64{
65 std::shared_ptr<TFragment> eventFrag = std::make_shared<TFragment>();
66 Long64_t tmpTimestamp;
67
68 // address is 4 bit crate, 6 bit board, and 6 bit channel
69 eventFrag->SetAddress((data[0] >> 16) & 0xffff);
70
71 // Rollover, constant beween boards
72 tmpTimestamp = data[0] & 0xffff;
73
74 // Concatenate timestamp informatioan based on board type
75 if(eventFrag->GetChannel() != nullptr) {
76 switch(eventFrag->GetChannel()->GetDigitizerType()) {
78 tmpTimestamp = tmpTimestamp<<30;
79 tmpTimestamp |= data[1] & 0x3fffffff; // 30 bit timestamp
80 break;
82 tmpTimestamp = tmpTimestamp<<31;
83 tmpTimestamp |= data[1] & 0x7fffffff; // 31 bit timestamp
84 break;
85 default:
86 tmpTimestamp = tmpTimestamp<<32;
87 tmpTimestamp |= data[1] & 0xffffffff; // 32 bit timestamp
88 break;
89 }
90 } else {
91 std::cerr<<DRED<<"Failed to find channel for address "<<hex(eventFrag->GetAddress(),4)<<" using default 32bit timestamp format, times might be wrong for this channel!"<<std::endl;
92 tmpTimestamp = tmpTimestamp<<32;
93 tmpTimestamp |= data[1] & 0xffffffff; // 32 bit timestamp
94 }
95 eventFrag->SetTimeStamp(tmpTimestamp);
96
97 int32_t Charge = (data[2] & 0x7fff);
98 // Discriminate bad fragments
99 if(Charge == 0 || Charge == 0x8000) {
100 if(fRecordDiag) {
102 }
103 Push(*fBadOutputQueue, std::make_shared<TBadFragment>(*eventFrag, data, 4, 2, false));
104 return 1;
105 }
106 // Good event
107 eventFrag->SetCharge(static_cast<int32_t>(Charge));
108 if(fRecordDiag) {
110 }
111 Push(fGoodOutputQueues, std::make_shared<TFragment>(*eventFrag));
112 return 1;
113}
114
116{
117 std::shared_ptr<TFragment> eventFrag = std::make_shared<TFragment>();
118 Long64_t tmpTimestamp;
119
120 eventFrag->SetAddress((data[0] >> 16) & 0xffff);
121
122 // Rollover, constant beween boards
123 tmpTimestamp = data[0] & 0xffff;
124 tmpTimestamp = tmpTimestamp<<32;
125 tmpTimestamp |= data[1] & 0xffffffff; // 32 bit timestamp
126 eventFrag->SetTimeStamp(tmpTimestamp);
127
128 int32_t Charge = (data[2] & 0x7fff);
129 // Discriminate bad fragments
130 if(Charge == 0 || Charge == 0x8000) {
131 if(fRecordDiag) {
133 }
134 Push(*fBadOutputQueue, std::make_shared<TBadFragment>(*eventFrag, data, 4, 2, false));
135 return 1;
136 }
137 // Good event
138 eventFrag->SetCharge(static_cast<int32_t>(Charge));
139 if(fRecordDiag) {
141 }
142 Push(fGoodOutputQueues, std::make_shared<TFragment>(*eventFrag));
143 return 1;
144}
#define DRED
Definition Globals.h:18
std::string hex(T val, int width=-1)
Definition Globals.h:129
bool fRecordDiag
The flag to turn on diagnostics recording.
void Push(ThreadsafeQueue< std::shared_ptr< const TBadFragment > > &queue, const std::shared_ptr< TBadFragment > &frag)
std::shared_ptr< ThreadsafeQueue< std::shared_ptr< const TBadFragment > > > fBadOutputQueue
std::atomic_long * fInputSize
std::vector< std::shared_ptr< ThreadsafeQueue< std::shared_ptr< const TFragment > > > > fGoodOutputQueues
std::atomic_size_t * fItemsPopped
int V2SingleFippsEventToFragment(uint32_t *data)
int V1SingleFippsEventToFragment(uint32_t *data)
int Process(std::shared_ptr< TRawEvent >) override
EDataParserState fState
void BadFragment(Short_t detType)
void GoodFragment(const std::shared_ptr< const TFragment > &)
static TParsingDiagnostics * Get(bool verbose=false)
Definition TSingleton.h:33