9 #include <FairLogger.h>
19 constexpr
auto cRED =
"\033[1;31m";
22 constexpr
auto cGREEN =
"\033[1;32m";
37 AtCore2::AtCore2(std::shared_ptr<AtMap> map, Int_t numCobos) : fNumCobo(numCobos), fMap(map)
50 AtCore2::AtCore2(TString filename, Int_t numTbs, Int_t windowNumTbs, Int_t windowStartTb)
62 std::cout <<
" ======= AtCore2::Initialize "
67 fIsNegativePolarity = kTRUE;
69 for (Int_t iCobo = 1; iCobo < fNumCobo; iCobo++)
70 fPedestalPtr[iCobo] =
nullptr;
76 fFPNSigmaThreshold = 5;
81 memset(fCurrentEventID, 0,
sizeof(Int_t) * fNumCobo);
83 fIsSeparatedData = kFALSE;
85 std::cout <<
" =========== End of AtCore2 Initialization. Number of Cobo/AsAd : " << fNumCobo <<
"\n";
91 return fDecoderPtr[coboIdx]->
AddData(filename);
96 fIsNegativePolarity = !value;
101 fIsData = fDecoderPtr[0]->
SetData(value);
104 if (fIsSeparatedData) {
105 for (Int_t iCobo = 1; iCobo < fNumCobo; iCobo++) {
106 if (fPedestalPtr[iCobo] ==
nullptr)
109 fIsData &= fDecoderPtr[iCobo]->
SetData(value);
125 memset(fCurrentEventID, 0,
sizeof(Int_t) * fNumCobo);
133 if (fIsSeparatedData)
134 for (Int_t iCobo = 1; iCobo < fNumCobo; iCobo++)
153 if (fIsSeparatedData)
154 for (Int_t iCobo = 1; iCobo < fNumCobo; iCobo++)
160 fFPNSigmaThreshold = sigmaThreshold;
162 std::cout <<
"== [AtCore] Using FPN pedestal is set!" << std::endl;
170 if (coboFrame ==
nullptr) {
172 std::cout <<
" Null frame! CoboIdx " << coboIdx <<
"\n";
176 fCurrentEventID[coboIdx] = coboFrame->
GetEventID();
179 for (Int_t iFrame = 0; iFrame < numFrames; iFrame++) {
185 for (Int_t iAget = 0; iAget < 4; iAget++) {
186 for (Int_t iCh = 0; iCh < 68; iCh++) {
189 Int_t PadRefNum = fMap->GetPadNum(PadRef);
190 auto PadCenterCoord = fMap->CalcPadCenter(PadRefNum);
191 Bool_t IsInhibited = fMap->IsInhibited(PadRefNum);
193 if (PadRefNum != -1 && !fMap->IsInhibited(PadRefNum)) {
196 std::lock_guard<std::mutex> lk(fRawEventMutex);
198 pad = fRawEventPtr->
AddPad(PadRefNum);
207 Int_t *rawadc = frame->
GetSample(iAget, iCh);
208 for (Int_t iTb = 0; iTb < fNumTbs; iTb++)
212 Double_t adc[512] = {0};
216 for (Int_t iTb = 0; iTb < fNumTbs; iTb++)
217 pad->
SetADC(iTb, adc[iTb]);
231 if (basicFrame ==
nullptr) {
240 for (Int_t iAget = 0; iAget < 4; iAget++) {
241 for (Int_t iCh = 0; iCh < 68; iCh++) {
244 auto PadRefNum = fMap->GetPadNum(PadRef);
245 auto PadCenterCoord = fMap->CalcPadCenter(PadRefNum);
246 Bool_t IsInhibited = fMap->IsInhibited(PadRefNum);
248 if (PadRefNum != -1 && !fMap->IsInhibited(PadRefNum)) {
249 AtPad *pad =
nullptr;
252 std::lock_guard<std::mutex> lk(fRawEventMutex);
253 pad = fRawEventPtr->
AddPad(PadRefNum);
259 Int_t *rawadc = basicFrame->
GetSample(iAget, iCh);
261 for (Int_t iTb = 0; iTb < fNumTbs; iTb++) {
267 Double_t adc[512] = {0};
271 for (Int_t iTb = 0; iTb < fNumTbs; iTb++)
272 pad->
SetADC(iTb, adc[iTb]);
282 return fDecoderPtr[coboIdx]->
SetWriteFile(filename, overwrite);
287 if (fRawEventPtr ==
nullptr) {
288 std::cout <<
"== [AtCore] Call this method after GetRawEvent()!" << std::endl;
293 if (fIsSeparatedData) {
294 for (Int_t iCobo = 0; iCobo < fNumCobo; iCobo++) {
306 std::cout <<
cRED <<
"== [AtCore] Data file is not set!" <<
cNORMAL << std::endl;
311 if (fIsSeparatedData) {
312 fRawEventPtr->
Clear();
318 fTargetFrameID = frameID;
320 std::thread *cobo =
new std::thread[fNumCobo];
322 for (Int_t iCobo = 0; iCobo < fNumCobo; iCobo++) {
323 cobo[iCobo] = std::thread([
this](Int_t coboIdx) { this->
ProcessBasicCobo(coboIdx); }, iCobo);
326 for (Int_t iCobo = 0; iCobo < fNumCobo; iCobo++)
334 for (Int_t iCobo = 0; iCobo < fNumCobo; iCobo++)
335 if (fCurrentEventID[0] != fCurrentEventID[iCobo]) {
336 std::cout <<
"== [AtCore] Event IDs don't match between CoBos! fCurrentEventID[0]: " << fCurrentEventID[0]
337 <<
" fCurrentEventID[" << iCobo <<
"]: " << fCurrentEventID[iCobo] << std::endl;
352 fRawEventPtr->
Clear();
358 fTargetFrameID = frameID;
360 if (
dynamic_cast<AtTpcMap *
>(fMap.get()) !=
nullptr) {
362 if (layeredFrame ==
nullptr)
365 }
else if (
dynamic_cast<AtTpcProtoMap *
>(fMap.get()) !=
nullptr) {
367 if (basicFrame ==
nullptr)
385 return fDecoderPtr[coboIdx]->
GetNumTbs();
390 fIsSeparatedData = value;
392 if (fIsSeparatedData) {
393 std::cout <<
cYELLOW <<
"== [AtCore] You set the decoder to analyze seperated data files." << std::endl;
394 std::cout <<
" Make sure to call this method right after the instance created!" <<
cNORMAL
397 for (Int_t iCobo = 1; iCobo < fNumCobo; iCobo++) {
421 for (Int_t i = 0; i < fNumCobo; i++)
430 Int_t numFrames = layeredFrame->
GetNItems();
431 for (Int_t iFrame = 0; iFrame < numFrames; iFrame++) {
437 for (Int_t iAget = 0; iAget < 4; iAget++) {
438 for (Int_t iCh = 0; iCh < 68; iCh++) {
441 Int_t PadRefNum = fMap->GetPadNum(PadRef);
442 auto PadCenterCoord = fMap->CalcPadCenter(PadRefNum);
444 if (PadRefNum != -1) {
447 std::lock_guard<std::mutex> lk(fRawEventMutex);
449 pad = fRawEventPtr->
AddPad(PadRefNum);
459 Int_t *rawadc = frame->
GetSample(iAget, iCh);
460 for (Int_t iTb = 0; iTb < fNumTbs; iTb++)
464 Double_t adc[512] = {0};
468 for (Int_t iTb = 0; iTb < fNumTbs; iTb++)
469 pad->
SetADC(iTb, adc[iTb]);
485 for (Int_t iAget = 0; iAget < 4; iAget++) {
486 for (Int_t iCh = 0; iCh < 68; iCh++) {
489 Int_t PadRefNum = fMap->GetPadNum(PadRef);
490 auto PadCenterCoord = fMap->CalcPadCenter(PadRefNum);
492 if (PadRefNum != -1) {
495 if (fMap->IsAuxPad(PadRef)) {
496 std::lock_guard<std::mutex> lk(fRawEventMutex);
497 pad = fRawEventPtr->
AddAuxPad(fMap->GetAuxName(PadRef)).first;
499 std::lock_guard<std::mutex> lk(fRawEventMutex);
500 pad = fRawEventPtr->
AddPad(PadRefNum);
510 Int_t *rawadc = basicFrame->
GetSample(iAget, iCh);
511 for (Int_t iTb = 0; iTb < fNumTbs; iTb++) {
517 Double_t adc[512] = {0};
521 for (Int_t iTb = 0; iTb < fNumTbs; iTb++)
522 pad->
SetADC(iTb, adc[iTb]);