9 #include <FairLogger.h>
18 constexpr
auto cRED =
"\033[1;31m";
21 constexpr
auto cGREEN =
"\033[1;32m";
37 : AtPadCoordArr(boost::extents[3174][3][2]), fMap(map)
45 : AtPadCoordArr(boost::extents[3174][3][2])
67 for (Int_t iCobo = 1; iCobo < 16; iCobo++)
68 fPedestalPtr[iCobo] = NULL;
74 fPadArray =
new TClonesArray(
"AtPad", 3174);
77 fFPNSigmaThreshold = 5;
85 memset(fCurrentEventID, 0,
sizeof(Int_t) * 16);
87 fIsSeparatedData = kFALSE;
97 for (Int_t i = 0; i < fNumCobo; i++) {
98 fIsPadPlaneCobo[i] = kTRUE;
99 fIsNegativePolarity[i] = kTRUE;
157 fFileName = filename;
158 return fDecoderPtr[coboIdx]->
AddData(filename);
163 for (Int_t i = 0; i < fNumCobo; i++) {
164 fIsNegativePolarity[i] = !(value[i]);
170 fIsData = fDecoderPtr[0]->
SetData(value);
173 if (fIsSeparatedData) {
174 for (Int_t iCobo = 1; iCobo < fNumCobo; iCobo++) {
175 if (fPedestalPtr[iCobo] ==
nullptr)
178 fIsData &= fDecoderPtr[iCobo]->
SetData(value);
195 memset(fCurrentEventID, 0,
sizeof(Int_t) * 16);
215 if (fIsSeparatedData)
216 for (Int_t iCobo = 1; iCobo < fNumCobo; iCobo++)
222 fFPNSigmaThreshold = sigmaThreshold;
224 std::cout <<
"== [AtCoreSpecMAT] Using FPN pedestal is set!" << std::endl;
229 for (Int_t i = 0; i < fNumCobo; i++) {
230 fIsPadPlaneCobo[i] = IsPadPlane[i];
242 std::vector<int> ChannelsFPNpp = {11, 22, 45, 56};
244 std::vector<int> ChannelsFPNsc = {43, 44, 46, 47};
245 Int_t Nr_fpn_found{0};
247 LOG(debug) <<
"Opening " << fFileName;
248 TFile *RawDataTreeFile =
new TFile(fFileName,
"READ");
249 if (RawDataTreeFile->IsZombie()) {
251 <<
"[AtCoreSpecMAT] File containing tree not found, check if "
252 "input file name is correct ("
253 << fFileName <<
")" <<
cNORMAL << std::endl;
256 TTree *RawDataTree = (TTree *)RawDataTreeFile->Get(
"EventDataTree");
259 <<
"[AtCoreSpecMAT] File does not contain raw data ttree (must "
260 "be named EventDataTree)"
262 std::cout <<
"Input file " << fFileName <<
" contains: " << std::endl;
263 RawDataTreeFile->ls();
268 TTreeReader myReader(RawDataTree);
271 TTreeReaderValue<Int_t> myInternalEventNr(myReader,
"InternalEventNr");
272 TTreeReaderValue<UChar_t> myCoboNr(myReader,
"CoboNr");
273 TTreeReaderValue<UChar_t> myAsadNr(myReader,
"AsadNr");
274 TTreeReaderValue<UChar_t> myAgetNr(myReader,
"AgetNr");
275 TTreeReaderValue<UChar_t> myChannelNr(myReader,
"ChannelNr");
276 TTreeReaderArray<UShort_t> mySamples(myReader,
"Samples");
279 Bool_t EventCompleted =
false;
280 while (myReader.Next() && (!EventCompleted)) {
281 if (*myInternalEventNr == eventID) {
282 PadReference PadRef = {*myCoboNr, *myAsadNr, *myAgetNr, *myChannelNr};
283 for (Int_t i = 0; i < 4; i++) {
284 if ((PadRef.ch == ChannelsFPNpp[i]) && fIsPadPlaneCobo[PadRef.cobo]) {
290 for (Int_t j = 0; j < 512; j++) {
291 fFPNChannels[i][PadRef.cobo][PadRef.asad][PadRef.aget][j] = mySamples[j];
293 }
else if ((PadRef.ch == ChannelsFPNsc[i]) && !(fIsPadPlaneCobo[PadRef.cobo])) {
299 for (Int_t j = 0; j < 512; j++) {
300 fFPNChannels[i][PadRef.cobo][PadRef.asad][PadRef.aget][j] = mySamples[j];
305 }
else if (*myInternalEventNr > eventID) {
306 EventCompleted =
true;
309 std::cout <<
"A total of " << Nr_fpn_found <<
" fpn channels were found for event nr " << eventID << std::endl;
317 TFile *RawDataTreeFile =
new TFile(fFileName,
"READ");
318 if (RawDataTreeFile->IsZombie()) {
320 <<
"[AtCoreSpecMAT] File containing tree not found, check if "
321 "input file name is correct ("
322 << fFileName <<
")" <<
cNORMAL << std::endl;
325 TTree *RawDataTree = (TTree *)RawDataTreeFile->Get(
"EventDataTree");
328 <<
"[AtCoreSpecMAT] File does not contain raw data ttree (must "
329 "be named EventDataTree)"
335 TTreeReader myReader(RawDataTree);
338 TTreeReaderValue<Int_t> myInternalEventNr(myReader,
"InternalEventNr");
339 TTreeReaderValue<UChar_t> myCoboNr(myReader,
"CoboNr");
340 TTreeReaderValue<UChar_t> myAsadNr(myReader,
"AsadNr");
341 TTreeReaderValue<UChar_t> myAgetNr(myReader,
"AgetNr");
342 TTreeReaderValue<UChar_t> myChannelNr(myReader,
"ChannelNr");
343 TTreeReaderArray<UShort_t> mySamples(myReader,
"Samples");
346 Bool_t EventCompleted =
false;
347 while (myReader.Next() && (!EventCompleted)) {
350 if (*myInternalEventNr == eventID) {
351 PadReference PadRef = {*myCoboNr, *myAsadNr, *myAgetNr, *myChannelNr};
352 fCurrentEventID[0] = *myInternalEventNr;
353 Int_t PadRefNum = fMap->GetPadNum(PadRef);
358 auto PadCenterCoord = fMap->CalcPadCenter(PadRefNum);
359 Bool_t IsInhibited = fMap->IsInhibited(PadRefNum);
361 if (PadRefNum != -1 && !IsInhibited) {
369 if ((PadRefNum == -1) || IsInhibited)
374 Int_t rawadc[512] = {0};
375 for (
int i = 0; i < 512; i++) {
376 rawadc[i] = mySamples[i];
379 for (Int_t iTb = 0; iTb < fNumTbs; iTb++)
383 Double_t adc[512] = {0};
384 Int_t fpn_adc[512] = {0};
385 for (
int i = 0; i < 512; i++) {
386 fpn_adc[i] = (fFPNChannels[0][PadRef.cobo][PadRef.asad][PadRef.aget][i] +
387 fFPNChannels[1][PadRef.cobo][PadRef.asad][PadRef.aget][i] +
388 fFPNChannels[2][PadRef.cobo][PadRef.asad][PadRef.aget][i] +
389 fFPNChannels[3][PadRef.cobo][PadRef.asad][PadRef.aget][i]) /
392 Bool_t good = fPedestalPtr[0]->
SubtractPedestal(fNumTbs, fpn_adc, rawadc, adc, 5,
393 fIsNegativePolarity[PadRef.cobo], 5, 20);
396 for (Int_t iTb = 0; iTb < fNumTbs; iTb++) {
397 pad->
SetADC(iTb, adc[iTb]);
404 }
else if (*myInternalEventNr > eventID) {
405 EventCompleted =
true;
412 return fDecoderPtr[coboIdx]->
SetWriteFile(filename, overwrite);
417 if (fRawEventPtr == NULL) {
418 std::cout <<
"== [AtCore] Call this method after GetRawEvent()!" << std::endl;
423 if (fIsSeparatedData) {
424 for (Int_t iCobo = 0; iCobo < fNumCobo; iCobo++) {
436 std::cout <<
cRED <<
"== [AtCore] Data file is not set!" <<
cNORMAL << std::endl;
441 fRawEventPtr->
Clear();
442 fPadArray->Clear(
"C");
447 fTargetFrameID = eventID;
449 std::cout <<
"Start processing event " << eventID + 1 << std::endl;
450 std::cout <<
"Getting fpn channels " << std::endl;
452 std::cout <<
"Getting raw data " << std::endl;
454 std::cout <<
"finished getting event from root file" << std::endl;
480 return fDecoderPtr[coboIdx]->
GetNumTbs();
501 for (Int_t i = 0; i < fNumCobo; i++)