BmnRoot
Loading...
Searching...
No Matches
BmnProfilometerSource.cxx
Go to the documentation of this file.
2
3BmnProfilometerSource::BmnProfilometerSource(vector<string> addr, vector<string> boardIds)
4: fFirstEvent(kTRUE),
5 keepWorking(kTRUE),
6 isReceiving(kTRUE),
7 fRunId(0),
8 fPeriodId(8),
9 fVerbosity(0),
10 iEventNumber(0),
11 isSpillStart(true),
12 fArr(nullptr),
13 fArrTemp(nullptr),
14 fAddrs(move(addr)),
15 fBoardIds(move(boardIds))
16{}
17
19 for (auto &it : fBoardsMap)
20 delete it.second;
21}
22
24 printf("BmnProfilometerSource::Init()\n");
25 _ctx = zmq_ctx_new();
26 // _rawSocket = zmq_socket(_ctx, ZMQ_SUB);
27 for (string &addr : fAddrs) {
28 void * raw_socket = zmq_socket(_ctx, ZMQ_SUB);
29 fRawSockets.push_back(raw_socket);
30 if (zmq_connect(raw_socket, addr.c_str()) != 0) {
31 //DBGERR("zmq connect")
32 fprintf(stderr, "Error connecting to ZMQ socket: %s\n", strerror(errno));
33 return kFALSE;
34 } else {
35 printf("connected to %s\n", addr.c_str());
36 if (zmq_setsockopt(raw_socket, ZMQ_SUBSCRIBE, NULL, 0) == -1) {
37 //DBGERR("zmq subscribe")
38 fprintf(stderr, "Error subscribing to ZMQ socket: %s\n", strerror(errno));
39 return kFALSE;
40 }
41 }
42 }
43
44 FairRootManager* ioman = FairRootManager::Instance();
45 fArr = new TClonesArray(BmnADCDigit::Class());
46 fArrTemp = new TClonesArray(BmnADCDigit::Class());
47 ioman->RegisterInputObject("ADC192ASIC", fArr);
48 fEventHead = new BmnEventHeader();
49 ioman->RegisterInputObject("BmnEventHeader.", fEventHead);
50 TPRegexp re("\\w+(\\d+)");
51 for (string &id : fBoardIds) {
52 ProfBoard* b = new ProfBoard();
53 TString str(id);
54 re.Substitute(str, "$1");
55 b->board_id = str.Atoi();
56 fBoardsMap.insert(make_pair(id, b));
57 }
58 return kTRUE;
59}
60
62 for (void * rs : fRawSockets)
63 zmq_close(rs);
64 zmq_ctx_destroy(_ctx);
65 _ctx = NULL;
66}
67
69 fArr->Delete();
70 if (fArrTemp->GetEntriesFast() == 0) {
71 if (fVerbosity)
72 printf("Empty\n");
73 ReceiveSpill();
74 isSpillStart = true;
75 iEventNumber = 0;
76
77 }
78 // printf("entries before %d\n", fArrTemp->GetEntriesFast());
79 fArr->AbsorbObjects(fArrTemp, 0, 0);
80 ++iEventNumber;
81 fEventHead->SetEventId(iEventNumber);
82 fEventHead->SetSpillStart(isSpillStart);
83 if (isSpillStart)
84 isSpillStart = false;
85 // printf("entries after %d\n", fArrTemp->GetEntriesFast());
86 return 0;
87}
88
89void BmnProfilometerSource::FillEventHeader(FairEventHeader* feh) {
90 return;
91}
92
93BmnStatus BmnProfilometerSource::ProcessBuffer(uint32_t *word, size_t len, ProfBoard * board) {
94 uint32_t holdb_temp = 0;
95 uint32_t holdb = 0;
96 // string str(reinterpret_cast<char*> (word), 6);
97 // printf("str %s\n", str.c_str());
98 for (uint32_t i = 0; i < len; i++) {
99 uint32_t data = word[i];
100 // printf("data %08X i = %05u\n",data, i);
101 // Check is it data or a trigger:
103 holdb = BmnProfRawTools::holdb_cntr(data); //get holdb counter
104 if (holdb_temp == holdb) {
105 // printf("data %08X\n", data);
106 // Divide ADC0 and ADC1 data
107 if (!BmnProfRawTools::adc_num(data)) { // 1st ADC
108 board->adc1_word.push_back(data);
109 } else if (BmnProfRawTools::adc_num(data)) { // 2nd ADC
110 board->adc2_word.push_back(data);
111 }
112 } else {
113 if (board->adc1_word.size() == BmnProfRawTools::ChannelDigitCnt())
114 new((*fArrTemp)[fArrTemp->GetEntriesFast()]) BmnADCDigit(board->board_id, 0, BmnProfRawTools::ChannelDigitCnt(), board->adc1_word);
115 // if (board->adc2_word.size() == BmnProfRawTools::ChannelDigitCnt())
116 // new((*fArr)[fArr->GetEntriesFast()]) BmnADCDigit(board->board_id, 1, BmnProfRawTools::ChannelDigitCnt(), board->adc2_word);
117 // printf("adc1_word %lu\n", adc1_word.size());
118 // printf("adc1 %lu\n", adc1.size());
119 board->adc1_word.clear();
120 board->adc2_word.clear();
121 // Divide ADC0 and ADC1 data
122 if (!BmnProfRawTools::adc_num(data)) { // 1st ADC
123 board->adc1_word.push_back(data);
124 } else { // 2nd ADC
125 board->adc2_word.push_back(data);
126 }
127 holdb_temp = holdb;
128 }
129 } else {
130 // if (BmnProfRawTools::trig_psd(data)) {
131 // trigger_pside.push_back(data);
132 // } else if (BmnProfRawTools::trig_nsd(data)) {
133 // trigger_nside.push_back(data);
134 // }
135 }
136 }
137 return kBMNSUCCESS;
138}
139
140BmnStatus BmnProfilometerSource::ReceiveSpill() {
141 const Int_t MaxStrLen = 100;
142 bool isIdFound = kFALSE;
143 bool isHeaderFound = kFALSE;
144 bool isTrailerFound = kFALSE;
145 string BoardName;
146 ProfBoard * Board = nullptr;
147 do {
148 Int_t recv_more = 0;
149 isIdFound = kFALSE;
150 do {
151 // gSystem->ProcessEvents();
152 // fServer->ProcessRequests();
153 for (void *rs : fRawSockets) {
154 zmq_msg_t msg;
155 zmq_msg_init(&msg);
156 Int_t frame_size = zmq_msg_recv(&msg, rs, ZMQ_DONTWAIT); // ZMQ_DONTWAIT
157 // printf("recv %d\n", frame_size);
158 if (frame_size == -1) {
159 // printf("Receive error # %d #%s\n", errno, zmq_strerror(errno));
160 switch (errno) {
161 case EAGAIN:
162 // printf("EAGAIN\n");
163 usleep(50000);
164 break;
165 case EINTR:
166 if (fVerbosity)
167 printf("EINTR\n");
168 isReceiving = kFALSE;
169 keepWorking = kFALSE;
170 if (fVerbosity)
171 printf("Exit!\n");
172 break;
173 case EFAULT:
174 if (fVerbosity)
175 printf("EFAULT\n");
176 zmq_close(rs);
177 isReceiving = kFALSE;
178 keepWorking = kFALSE;
179 break;
180 default:
181 break;
182 }
183 } else {
184 if (frame_size < MaxStrLen) {
185 string str(static_cast<char*> (zmq_msg_data(&msg)), zmq_msg_size(&msg));
186 // printf("str %s\n", str.c_str());
187 if (isIdFound) {
188 if (str == DataTrailer) {
189 isTrailerFound = kTRUE;
190 if (fVerbosity)
191 printf("trailer\n");
192 keepWorking = kFALSE;
193 }
194 if (str == DataHeader) {
195 isHeaderFound = kTRUE;
196 if (fVerbosity)
197 printf("header\n");
198 }
199 } else {
200 // if (str == TargetBoardId) {
201 BoardName = str;
202 auto it = fBoardsMap.find(BoardName);
203 if (it != fBoardsMap.end())
204 Board = it->second;
205 isIdFound = kTRUE;
206 if (fVerbosity)
207 printf("id %s\n", str.c_str());
208 // }
209 }
210 } else {
211 if (isHeaderFound && Board) {
212 ProcessBuffer(static_cast<uint32_t*> (zmq_msg_data(&msg)), zmq_msg_size(&msg) / 4, Board);
213 }
214 }
215 }
216 size_t opt_size = sizeof (recv_more);
217 if (zmq_getsockopt(rs, ZMQ_RCVMORE, &recv_more, &opt_size) == -1) {
218 printf("ZMQ socket options error #%s\n", zmq_strerror(errno));
219 return kBMNERROR;
220 }
221 // printf("ZMQ rcvmore = %d\n", recv_more);
222 zmq_msg_close(&msg);
223 }
224 } while (recv_more && isReceiving && (!isTrailerFound));
225 } while (keepWorking);
226 if (fVerbosity)
227 printf("FullReceive\n");
228 if (isTrailerFound) {
229 if (fVerbosity)
230 printf("SPILLEND for %s\n", BoardName.c_str());
231 isHeaderFound = kFALSE;
232 isTrailerFound = kFALSE;
233 }
234 return kBMNSUCCESS;
235}
int i
Definition P4_F32vec4.h:22
BmnStatus
Definition BmnEnums.h:24
@ kBMNERROR
Definition BmnEnums.h:26
@ kBMNSUCCESS
Definition BmnEnums.h:25
void SetSpillStart(Bool_t flag)
void SetEventId(UInt_t event_id)
static bool data_or_trig(const uint32_t &word)
static constexpr const size_t ChannelDigitCnt()
static uint32_t holdb_cntr(const uint32_t &word)
static bool adc_num(const bitset< 32 > &word)
BmnProfilometerSource(vector< string > addr={"tcp://159.93.49.126:5601", "tcp://159.93.49.126:5602"}, vector< string > boardIds={"board1", "board2"})
void FillEventHeader(FairEventHeader *feh)
vector< uint16_t > adc2_word
vector< uint16_t > adc1_word