14 #include <FairLogger.h>
17 #include <TClonesArray.h>
44 : fFrameInfoArray(nullptr), fCoboFrameInfoArray(nullptr), fFrameInfo(nullptr), fCoboFrameInfo(nullptr),
45 fHeaderBase(nullptr), fBasicFrameHeader(nullptr), fLayerHeader(nullptr), fTopologyFrame(nullptr),
46 fBasicFrame(nullptr), fCoboFrame(nullptr), fLayeredFrame(nullptr)
57 : fFrameInfoArray(nullptr), fCoboFrameInfoArray(nullptr), fFrameInfo(nullptr), fCoboFrameInfo(nullptr),
58 fHeaderBase(nullptr), fBasicFrameHeader(nullptr), fLayerHeader(nullptr), fTopologyFrame(nullptr),
59 fBasicFrame(nullptr), fCoboFrame(nullptr), fLayeredFrame(nullptr)
71 void GETDecoder2::Initialize()
77 fIsPositivePolarity = kFALSE;
79 fIsDoneAnalyzing = kFALSE;
81 fIsContinuousData = kTRUE;
88 fCoboFrameInfoIdx = 0;
89 fTargetFrameInfoIdx = -1;
94 if (fFrameInfoArray ==
nullptr)
95 fFrameInfoArray =
new TClonesArray(
"GETFrameInfo", 10000);
96 fFrameInfoArray->Clear(
"C");
98 if (fCoboFrameInfoArray ==
nullptr)
99 fCoboFrameInfoArray =
new TClonesArray(
"GETFrameInfo", 10000);
100 fCoboFrameInfoArray->Clear(
"C");
102 if (fHeaderBase ==
nullptr)
105 fHeaderBase->
Clear();
107 if (fBasicFrameHeader ==
nullptr)
110 fBasicFrameHeader->
Clear();
112 if (fLayerHeader ==
nullptr)
115 fLayerHeader->
Clear();
117 if (fTopologyFrame ==
nullptr)
120 fTopologyFrame->
Clear();
122 if (fBasicFrame ==
nullptr)
125 fBasicFrame->
Clear();
127 if (fCoboFrame ==
nullptr)
132 if (fLayeredFrame ==
nullptr)
135 fLayeredFrame->
Clear();
145 fIsDoneAnalyzing = kFALSE;
146 fIsDataInfo = kFALSE;
152 fCoboFrameInfoIdx = 0;
153 fTargetFrameInfoIdx = -1;
158 fFrameInfoArray->Clear(
"C");
159 fCoboFrameInfoArray->Clear(
"C");
161 fHeaderBase->
Clear();
162 fBasicFrameHeader->
Clear();
163 fLayerHeader->
Clear();
164 fTopologyFrame->
Clear();
165 fBasicFrame->
Clear();
167 fLayeredFrame->
Clear();
169 if (fIsContinuousData) {
172 std::cout <<
"== [GETDecoder] Discontinuous data set is set. Leave data list intact!" << std::endl;
191 if (!nextData.EqualTo(
"")) {
192 Bool_t isExist =
false;
193 for (Int_t iIdx = 0; iIdx < fDataList.size(); iIdx++) {
194 if (fDataList.at(0).EqualTo(nextData)) {
195 std::cout <<
"== [GETDecoder] The file already exists in the list!" << std::endl;
201 fDataList.push_back(nextData);
212 if (!fIsContinuousData) {
215 std::cout <<
"== [GETDecoder] Discontinuous data set is set. Clear info!" << std::endl;
221 if (index >= fDataList.size()) {
222 std::cout <<
"== [GETDecoder] End of data list!" << std::endl;
230 TString filename = fDataList.at(index);
232 fData.open(filename.Data(), std::ios::ate | std::ios::binary);
234 if (!(fData.is_open())) {
235 std::cout <<
"== [GETDecoder] Data file open error! Check it exists!" << std::endl;
240 fDataSize = fData.tellg();
242 std::cout <<
"== [GETDecoder] " << filename <<
" is opened!" << std::endl;
247 fHeaderBase->
Read(fData, kTRUE);
249 if (fHeaderBase->
IsBlob())
250 fTopologyFrame->
Read(fData);
252 std::cout <<
"== [GETDecoder] Frame Type: ";
253 if (fTopologyFrame->
IsBlob()) {
255 std::cout <<
"Cobo frame (Max. 4 frames)" << std::endl;
257 fHeaderBase->
Read(fData, kTRUE);
261 std::cout <<
"Event ID merged frame" << std::endl;
266 std::cout <<
"Event time merged frame" << std::endl;
271 std::cout <<
"Basic frame" << std::endl;
278 fHeaderBase->
Read(fData, kTRUE);
280 if (fHeaderBase->
IsBlob())
281 fTopologyFrame->
Read(fData);
284 fCurrentDataID = index;
291 fIsContinuousData = !value;
295 if (fIsContinuousData)
296 return SetData(fCurrentDataID + 1);
302 fIsPositivePolarity = value;
307 std::cout <<
"== [GETDecoder] Index Data file" << std::endl;
308 for (Int_t iItem = 0; iItem < fDataList.size(); iItem++) {
309 if (iItem == fCurrentDataID)
310 std::cout <<
" *" << std::setw(6);
312 std::cout << std::setw(8);
314 std::cout << iItem <<
" " << fDataList.at(iItem) << std::endl;
320 return fDataList.size();
325 if (index >= fDataList.size()) {
326 std::cout <<
"== [GETDecoder] Size of the list is " << fDataList.size() <<
"!" << std::endl;
331 return fDataList.at(index);
345 if (fIsDoneAnalyzing)
346 switch (fFrameType) {
349 case kMergedTime:
return fFrameInfoArray->GetEntriesFast();
break;
351 case kCobo:
return fCoboFrameInfoArray->GetEntriesFast();
break;
360 fTargetFrameInfoIdx++;
362 fTargetFrameInfoIdx = frameID;
367 if (fIsDoneAnalyzing)
368 if (fTargetFrameInfoIdx > fFrameInfoArray->GetLast())
371 if (fFrameInfoIdx > fTargetFrameInfoIdx)
372 fFrameInfoIdx = fTargetFrameInfoIdx;
374 fFrameInfo = (
GETFrameInfo *)fFrameInfoArray->ConstructedAt(fFrameInfoIdx);
375 while (fFrameInfo->
IsFill()) {
377 LOG(debug) <<
"fFrameInfoIdx: " << fFrameInfoIdx <<
" fTargetFrameInfoIdx: " << fTargetFrameInfoIdx;
379 if (fFrameInfoIdx == fTargetFrameInfoIdx) {
382 if (fFrameInfo->
GetDataID() != fCurrentDataID) {
383 LOG(info) <<
"Changing from " << fFrameInfo->
GetDataID() <<
" to " << fCurrentDataID
384 <<
" at fFrameInfoIdx: " << fFrameInfoIdx
385 <<
" of fTargetFrameInfoIdx: " << fTargetFrameInfoIdx;
390 fBasicFrame->
Read(fData);
394 LOG(debug) <<
"Returned event ID: " << fBasicFrame->
GetEventID();
398 fFrameInfo = (
GETFrameInfo *)fFrameInfoArray->ConstructedAt(++fFrameInfoIdx);
401 ULong64_t startByte = fData.tellg();
403 fBasicFrameHeader->
Read(fData);
406 ULong64_t endByte = startByte + fBasicFrameHeader->
GetFrameSize();
422 fTargetFrameInfoIdx++;
424 fTargetFrameInfoIdx = frameID;
429 if (fIsDoneAnalyzing)
430 if (fTargetFrameInfoIdx > fCoboFrameInfoArray->GetLast())
433 if (fCoboFrameInfoIdx > fTargetFrameInfoIdx)
434 fCoboFrameInfoIdx = fTargetFrameInfoIdx;
436 fCoboFrameInfo = (
GETFrameInfo *)fCoboFrameInfoArray->ConstructedAt(fCoboFrameInfoIdx);
437 while (fCoboFrameInfo->
IsFill()) {
440 cout <<
"fFrameInfoIdx: " << fFrameInfoIdx <<
" fCoboFrameInfoIdx: " << fCoboFrameInfoIdx
441 <<
" fTargetFrameInfoIdx: " << fTargetFrameInfoIdx << endl;
445 cout <<
"fCoboFrameInfo -> GetNumFrames(): " << fCoboFrameInfo->
GetNumFrames()
446 <<
" fTopologyFrame -> GetAsadMask().count(): " << fTopologyFrame->
GetAsadMask().count() << endl;
450 if (fCoboFrameInfoIdx == fTargetFrameInfoIdx) {
455 fCoboFrameInfo = (
GETFrameInfo *)fCoboFrameInfoArray->ConstructedAt(fCoboFrameInfoIdx);
457 for (Int_t iFrame = 0; iFrame < fTopologyFrame->
GetAsadMask().count(); iFrame++) {
458 if (fCoboFrameInfo->
GetDataID() != fCurrentDataID) {
469 cout <<
"Returned fCoboFrameInfoIdx: " << fCoboFrameInfoIdx
475 fCoboFrameInfo = (
GETFrameInfo *)fCoboFrameInfoArray->ConstructedAt(++fCoboFrameInfoIdx);
481 cout <<
"Not full in fCoboFrameInfoIdx: " << fCoboFrameInfoIdx <<
", reading fFrameInfoIdx: " << fFrameInfoIdx
485 ULong64_t startByte = fData.tellg();
487 fBasicFrameHeader->
Read(fData);
490 ULong64_t endByte = startByte + fBasicFrameHeader->
GetFrameSize();
492 fFrameInfo = (
GETFrameInfo *)fFrameInfoArray->ConstructedAt(fFrameInfoIdx++);
503 fCoboFrameInfo->
Copy(fFrameInfo);
507 Int_t iChecker = (fCoboFrameInfoIdx - 10 < 0 ? 0 : fCoboFrameInfoIdx - 10);
508 while (
auto *checkCoboFrameInfo = (
GETFrameInfo *)fCoboFrameInfoArray->ConstructedAt(iChecker)) {
509 if (checkCoboFrameInfo->IsFill()) {
510 if (checkCoboFrameInfo->GetEventID() == fFrameInfo->
GetEventID()) {
511 checkCoboFrameInfo->SetNextInfo(fFrameInfo);
516 checkCoboFrameInfo->Copy(fFrameInfo);
529 fTargetFrameInfoIdx++;
531 fTargetFrameInfoIdx = frameID;
536 if (fIsDoneAnalyzing)
537 if (fTargetFrameInfoIdx > fFrameInfoArray->GetLast())
540 if (fFrameInfoIdx > fTargetFrameInfoIdx)
541 fFrameInfoIdx = fTargetFrameInfoIdx;
543 fFrameInfo = (
GETFrameInfo *)fFrameInfoArray->ConstructedAt(fFrameInfoIdx);
544 while (fFrameInfo->
IsFill()) {
547 cout <<
"fFrameInfoIdx: " << fFrameInfoIdx <<
" fTargetFrameInfoIdx: " << fTargetFrameInfoIdx << endl;
550 if (fFrameInfoIdx == fTargetFrameInfoIdx) {
553 if (fFrameInfo->
GetDataID() != fCurrentDataID) {
558 fLayeredFrame->
Read(fData);
563 cout <<
"Returned event ID: " << fLayeredFrame->
GetEventID() << endl;
566 return fLayeredFrame;
568 fFrameInfo = (
GETFrameInfo *)fFrameInfoArray->ConstructedAt(++fFrameInfoIdx);
571 ULong64_t startByte = fData.tellg();
573 fLayerHeader->
Read(fData);
576 ULong64_t endByte = startByte + fLayerHeader->
GetFrameSize();
581 switch (fFrameType) {
590 case kCobo: std::cerr <<
"== " << __func__ <<
" This is serious error!" << std::endl;
break;
602 for (Int_t iEntry = 0; iEntry < fFrameInfoArray->GetEntriesFast(); iEntry++)
605 ((
GETFrameInfo *)fFrameInfoArray->At(frameID))->Print();
611 for (Int_t iEntry = 0; iEntry < fCoboFrameInfoArray->GetEntriesFast(); iEntry++) {
612 auto *frameInfo = (
GETFrameInfo *)fCoboFrameInfoArray->At(iEntry);
615 frameInfo = frameInfo->GetNextInfo();
619 auto *frameInfo = (
GETFrameInfo *)fCoboFrameInfoArray->At(frameID);
622 frameInfo = frameInfo->GetNextInfo();
630 if (!fWriteFile.IsNull() && !overwrite) {
631 std::cout <<
"== [GETDecoder] The file you specified already exists!" << std::endl;
632 std::cout <<
" If you want to overwrite it, give kTRUE as a second argument." << std::endl;
639 fWriteFile = filename;
640 std::ofstream dummy(fWriteFile.Data(), std::ios::trunc);
643 if (fBuffer ==
nullptr)
644 fBuffer =
new Char_t[14000000];
646 if (fFrameType ==
kCobo) {
648 if (fCurrentDataID != 0)
651 std::ofstream outFile(fWriteFile.Data(), std::ios::ate | std::ios::binary | std::ios::app);
659 std::cout <<
"== [GETDecoder] Topology frame is written!" << std::endl;
667 if (fWriteFile.IsNull()) {
668 std::cout <<
"== [GETDecoder] Write file is not set. Use SetWriteFile() first!" << std::endl;
675 std::ofstream outFile(fWriteFile.Data(), std::ios::ate | std::ios::binary | std::ios::app);
676 switch (fFrameType) {
678 fCoboFrameInfo = (
GETFrameInfo *)fCoboFrameInfoArray->At(fTargetFrameInfoIdx);
680 if (fCurrentDataID != fCoboFrameInfo->
GetDataID())
685 fData.read(fBuffer, frameSize);
686 outFile.write(fBuffer, frameSize);
688 }
while (fCoboFrameInfo);
692 fFrameInfo = (
GETFrameInfo *)fFrameInfoArray->At(fTargetFrameInfoIdx);
694 if (fCurrentDataID != fCoboFrameInfo->
GetDataID())
699 fData.read(fBuffer, frameSize);
700 outFile.write(fBuffer, frameSize);
710 if (!fIsMetaData && fFrameInfo->
GetEndByte() == fDataSize)
711 if (!
NextData() && !fIsDoneAnalyzing) {
714 std::cout <<
" == [GETDecoder] File ended!" << std::endl;
717 fIsDoneAnalyzing = kTRUE;
726 fPrevDataID = fCurrentDataID;
727 fPrevPosition = fData.tellg();
732 if (fIsDoneAnalyzing)
735 if (fPrevDataID != fCurrentDataID)
738 fData.seekg(fPrevPosition);
743 Char_t bytes[] = {0x40, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x07, 0x00, 0x00, (Char_t)(asadMask & 0xf), 0x00, 0x00};
744 std::stringstream topology(std::string(std::begin(bytes), std::end(bytes)));
746 fTopologyFrame->
Read(*((ifstream *)&topology));
748 fTopologyFrame->
Print();