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 IncrementInputSize(event->GetDataSize() / 16); // 16 bytes per event, number of bytes in 32bits
41
42 for(size_t i = 0; i + 3 < size / 4; i += 4) {
43 if(event->GetLstVersion() == 1) {
44 EventsProcessed += V1SingleFippsEventToFragment(EvntData + i);
45 } else {
46 EventsProcessed += V2SingleFippsEventToFragment(EvntData + i);
47 }
50 }
51
52 return EventsProcessed;
53}
54
56{
57 std::shared_ptr<TFragment> eventFrag = std::make_shared<TFragment>();
58 Long64_t tmpTimestamp;
59
60 // address is 4 bit crate, 6 bit board, and 6 bit channel
61 eventFrag->SetAddress((data[0] >> 16) & 0xffff);
62
63 // Rollover, constant beween boards
64 tmpTimestamp = data[0] & 0xffff;
65
66 // Concatenate timestamp informatioan based on board type
67 if(eventFrag->GetChannel() != nullptr) {
68 switch(eventFrag->GetChannel()->GetDigitizerType()) {
70 tmpTimestamp = tmpTimestamp << 30;
71 tmpTimestamp |= data[1] & 0x3fffffff; // 30 bit timestamp
72 break;
74 tmpTimestamp = tmpTimestamp << 31;
75 tmpTimestamp |= data[1] & 0x7fffffff; // 31 bit timestamp
76 break;
77 default:
78 tmpTimestamp = tmpTimestamp << 32;
79 tmpTimestamp |= data[1] & 0xffffffff; // 32 bit timestamp
80 break;
81 }
82 } else {
83 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;
84 tmpTimestamp = tmpTimestamp << 32;
85 tmpTimestamp |= data[1] & 0xffffffff; // 32 bit timestamp
86 }
87 eventFrag->SetTimeStamp(tmpTimestamp);
88
89 int32_t Charge = (data[2] & 0x7fff);
90 // Discriminate bad fragments
91 if(Charge == 0 || Charge == 0x8000) {
92 if(RecordDiag()) {
94 }
95 Push(*BadOutputQueue(), std::make_shared<TBadFragment>(*eventFrag, data, 4, 2, false));
96 return 1;
97 }
98 // Good event
99 eventFrag->SetCharge(static_cast<int32_t>(Charge));
100 if(RecordDiag()) {
102 }
103 Push(GoodOutputQueues(), std::make_shared<TFragment>(*eventFrag));
104 return 1;
105}
106
108{
109 std::shared_ptr<TFragment> eventFrag = std::make_shared<TFragment>();
110 Long64_t tmpTimestamp;
111
112 eventFrag->SetAddress((data[0] >> 16) & 0xffff);
113
114 // Rollover, constant beween boards
115 tmpTimestamp = data[0] & 0xffff;
116 tmpTimestamp = tmpTimestamp << 32;
117 tmpTimestamp |= data[1] & 0xffffffff; // 32 bit timestamp
118 eventFrag->SetTimeStamp(tmpTimestamp);
119
120 int32_t Charge = (data[2] & 0x7fff);
121 // Discriminate bad fragments
122 if(Charge == 0 || Charge == 0x8000) {
123 if(RecordDiag()) {
125 }
126 Push(*BadOutputQueue(), std::make_shared<TBadFragment>(*eventFrag, data, 4, 2, false));
127 return 1;
128 }
129 // Good event
130 eventFrag->SetCharge(static_cast<int32_t>(Charge));
131 if(RecordDiag()) {
133 }
134 Push(GoodOutputQueues(), std::make_shared<TFragment>(*eventFrag));
135 return 1;
136}
#define DRED
Definition Globals.h:18
std::string hex(T val, int width=-1)
Definition Globals.h:129
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()
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