// SPDX-License-Identifier: LGPL-3.0-or-other // Copyright (C) 2021 Contributors to the SLS Detector Package //#define TESTADC #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ctbAcquisition.h" #include "ctbDefs.h" #include "sls/Detector.h" #include "sls/sls_detector_defs.h" #include "ctbMain.h" #include "moench03CtbData.h" //#include "moench03TCtbData.h" //#include "moench03T1CtbData.h" #include "moench03CommonMode.h" #include "moench03T1ZmqDataNew.h" #include "moench02CtbData.h" //#include "jungfrau10ModuleData.h" #include "moenchCommonMode.h" #include "singlePhotonDetector.h" #include "Mythen3_01_jctbData.h" #include "Mythen3_02_jctbData.h" #include "adcSar2_jctbData.h" #include "moench04CtbZmqData.h" #include "moench04CtbZmq10GbData.h" #include "deserializer.h" #include "sls/detectorData.h" #include "imageZmq16bit.h" #include "imageZmq32bit.h" using namespace std; ctbAcquisition::ctbAcquisition(TGVerticalFrame *page, sls::Detector *det) : TGGroupFrame(page,"Acquisition",kVerticalFrame), myDet(det), myCanvas(NULL), globalPlot(0), tenG(0), nAnalogSamples(1), nDigitalSamples(1), dataStructure(NULL), photonFinder(NULL), cmSub(0), dBitMask(0xffffffffffffffff), deserializer(0) { adcFit=NULL; bitPlot=NULL; countsFit=NULL; page->AddFrame(this,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 10,10,10,10)); MapWindow(); TGHorizontalFrame *hframe=new TGHorizontalFrame(this, 800,50); AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 10,10,10,10)); hframe->MapWindow(); char tit[100]; cout << "outfile "<< endl; cFileSave= new TGCheckButton(hframe, "Output file: "); hframe->AddFrame(cFileSave,new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 5, 5, 5, 5)); cFileSave->MapWindow(); cFileSave->SetTextJustify(kTextRight); cFileSave->Connect("Toggled(Bool_t)","ctbAcquisition",this,"setFsave(Bool_t)"); std::string temp = "run"; try { temp = myDet->getFileNamePrefix().tsquash("Different values"); } CATCH_DISPLAY ("Could not get file name prefix.", "ctbAcquisition::ctbAcquisition") eFname = new TGTextEntry(hframe, temp.c_str()); hframe->AddFrame(eFname,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 5, 5, 5, 5)); eFname->MapWindow(); eFname->Resize(150,30); eFname->Connect("ReturnPressed()","ctbAcquisition",this,"setFname()"); TGLabel *label=new TGLabel(hframe,"index: "); hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); label->MapWindow(); label->SetTextJustify(kTextRight); eFindex = new TGNumberEntry(hframe, 0, 9,999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELNoLimits); hframe->AddFrame( eFindex,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 1, 1, 1, 1)); eFindex->MapWindow(); eFindex->Resize(150,30); TGTextEntry *e= eFindex->TGNumberEntry::GetNumberEntry(); e->Connect("ReturnPressed()","ctbAcquisition",this,"setFindex()"); cout << "outdir "<< endl; hframe=new TGHorizontalFrame(this, 800,50); AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 10,10,10,10)); hframe->MapWindow(); label=new TGLabel(hframe,"Output directory: "); hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); label->MapWindow(); label->SetTextJustify(kTextRight); temp = "/tmp/"; try { temp = myDet->getFilePath().tsquash("Different values"); } CATCH_DISPLAY ("Could not get file path.", "ctbAcquisition::ctbAcquisition") eOutdir = new TGTextEntry(hframe, temp.c_str()); hframe->AddFrame(eOutdir,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 5, 5, 5, 5)); eOutdir->MapWindow(); eOutdir->Resize(150,30); eOutdir->Connect("ReturnPressed()","ctbAcquisition",this,"setOutdir()"); hframe=new TGHorizontalFrame(this, 800,50); AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 10,10,10,10)); hframe->MapWindow(); cout << "meas "<< endl; label=new TGLabel(hframe,"Number of Measurements (fake): "); hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); label->MapWindow(); label->SetTextJustify(kTextRight); eMeasurements = new TGNumberEntry(hframe, 0, 9,999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELNoLimits); hframe->AddFrame( eMeasurements,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 1, 1, 1, 1)); eMeasurements->MapWindow(); eMeasurements->Resize(150,30); eMeasurements->SetNumber(1); e= eMeasurements->TGNumberEntry::GetNumberEntry(); e->Connect("ReturnPressed()","ctbAcquisition",this,"setMeasurements()"); hframe=new TGHorizontalFrame(this, 800,50); AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 10,10,10,10)); hframe->MapWindow(); cout << "pattern "<< endl; cCompile= new TGCheckButton(hframe, "Compile"); hframe->AddFrame(cCompile,new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 5, 5, 5, 5)); cCompile->MapWindow(); cCompile->SetOn(); // cCompile->Connect("Toggled(Bool_t)","ctbAcquisition",this,"setFsave(Bool_t)"); cLoad= new TGTextButton(hframe, "Load"); hframe->AddFrame(cLoad,new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 5, 5, 5, 5)); cLoad->MapWindow(); cLoad->Connect("Clicked()","ctbAcquisition",this,"loadPattern()"); // cRun= new TGCheckButton(hframe, "Run"); // hframe->AddFrame(cRun,new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 5, 5, 5, 5)); // cRun->MapWindow(); // // cCompile->Connect("Toggled(Bool_t)","ctbAcquisition",this,"setFsave(Bool_t)"); bStatus=new TGTextButton(hframe, "Start"); hframe->AddFrame(bStatus,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 5, 5, 5, 5)); bStatus->MapWindow(); bStatus->Connect("Clicked()","ctbAcquisition",this,"toggleAcquisition()"); cout << "plot "<< endl; hframe=new TGHorizontalFrame(this, 800,50); AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 10,10,10,10)); hframe->MapWindow(); label=new TGLabel(hframe,"Plot: "); hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); label->MapWindow(); label->SetTextJustify(kTextRight); TGButtonGroup *bgPlot = new TGButtonGroup(hframe); // horizontal->SetTitlePos(TGGroupFrame::kCenter); rbPlotOff=new TGRadioButton(hframe, "No plot"); rbWaveform=new TGRadioButton(hframe, "Waveform"); rbDistribution=new TGRadioButton(hframe, "Distribution"); rb2D=new TGRadioButton(hframe, "Image"); // rbScan=new TGRadioButton(hframe, "Scan"); cbDetType=new TGComboBox(hframe); // enum {DESERIALIZER, MOENCH04, MOENCH02, ADCSAR2, MYTHEN301, MYTHEN302, MAXDET}; cbDetType->AddEntry("Deserializer", DESERIALIZER); cbDetType->AddEntry("MOENCH02", MOENCH02); cbDetType->AddEntry("MOENCH04", MOENCH04); // cbDetType->AddEntry("JUNGFRAU1.0", 2); cbDetType->AddEntry("MOENCH03",MOENCH03); cbDetType->AddEntry("IMAGE32BIT",IMAGE32B); cbDetType->AddEntry("IMAGE16BIT",IMAGE16B); //cbDetType->AddEntry("MOENCH03", iiii++); // cbDetType->AddEntry("MYTHEN3 0.1", MYTHEN301); // cbDetType->AddEntry("ADCSAR2", ADCSAR2); // cbDetType->AddEntry("MYTHEN3 0.2", MYTHEN302); cbDetType->SetHeight(20); cbDetType->Select(0); bgPlot->Insert(rbPlotOff,0); bgPlot->Insert(rbWaveform,1); bgPlot->Insert(rbDistribution,2); bgPlot->Insert(rb2D,3); // bgPlot->Insert(rbScan,4); bgPlot->Connect("Clicked(Int_t)", "ctbAcquisition", this, "changePlot(Int_t)"); // hframe->AddFrame(bgPlot, new TGLayoutHints(kLHintsExpandX)); cbDetType->Connect("Selected(Int_t)", "ctbAcquisition",this, "changeDetector(Int_t)"); hframe->AddFrame(rbPlotOff, new TGLayoutHints(kLHintsTop | kLHintsExpandX)); hframe->AddFrame(rbWaveform, new TGLayoutHints(kLHintsTop | kLHintsExpandX)); hframe->AddFrame(rbDistribution, new TGLayoutHints(kLHintsTop | kLHintsExpandX)); hframe->AddFrame(rb2D, new TGLayoutHints(kLHintsTop | kLHintsExpandX)); // hframe->AddFrame(rbScan, new TGLayoutHints(kLHintsTop | kLHintsExpandX)); hframe->AddFrame(cbDetType, new TGLayoutHints(kLHintsTop | kLHintsExpandX| kLHintsExpandY)); bgPlot->SetExclusive(kTRUE); rbWaveform->SetOn(); rbPlotOff->MapWindow(); rbWaveform->MapWindow(); rbDistribution->MapWindow(); rb2D->MapWindow(); // rbScan->MapWindow(); cbDetType->MapWindow(); // cout << "off "<< endl; hframe=new TGHorizontalFrame(this, 800,50); AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 10,10,10,10)); hframe->MapWindow(); label=new TGLabel(hframe,"Serial offset:"); hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); label->MapWindow(); label->SetTextJustify(kTextRight); eSerOff=new TGNumberEntry(hframe, 0, 9,999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax,0,16535); hframe->AddFrame(eSerOff,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 1, 1, 1, 1)); eSerOff->MapWindow(); eSerOff->SetNumber(0); e= eSerOff->TGNumberEntry::GetNumberEntry(); eSerOff->Connect("ValueSet(Long_t)","ctbAcquisition",this,"ChangeSerialOffset(Long_t)"); e->Connect("ReturnPressed()","ctbAcquisition",this,"ChangeSerialOffset()"); label=new TGLabel(hframe,"N counters:"); hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); label->MapWindow(); label->SetTextJustify(kTextRight); eNumCount=new TGNumberEntry(hframe, 0, 9,999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax,0,16535); hframe->AddFrame(eNumCount,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 1, 1, 1, 1)); eNumCount->MapWindow();; eNumCount->SetNumber(128*3); e= eNumCount->TGNumberEntry::GetNumberEntry(); eNumCount->Connect("ValueSet(Long_t)","ctbAcquisition",this,"ChangeNumberOfChannels(Long_t)"); e->Connect("ReturnPressed()","ctbAcquisition",this,"ChangeNumberOfChannels()"); cout << "dr "<< endl; label=new TGLabel(hframe,"Dynamic Range:"); hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); label->MapWindow(); label->SetTextJustify(kTextRight); eDynRange=new TGNumberEntry(hframe, 0, 9,999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax,0,16535); hframe->AddFrame(eDynRange,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 1, 1, 1, 1)); eDynRange->MapWindow();; eDynRange->SetNumber(24); e= eDynRange->TGNumberEntry::GetNumberEntry(); eDynRange->Connect("ValueSet(Long_t)","ctbAcquisition",this,"ChangeDynamicRange(Long_t)"); e->Connect("ReturnPressed()","ctbAcquisition",this,"ChangeDynamicRange()"); hframe=new TGHorizontalFrame(this, 800,50); AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 10,10,10,10)); hframe->MapWindow(); label=new TGLabel(hframe,"Image Pixels"); hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); label->MapWindow(); label->SetTextJustify(kTextLeft); label=new TGLabel(hframe,"X: "); hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); label->MapWindow(); label->SetTextJustify(kTextRight); ePixX=new TGNumberEntry(hframe, 0, 9,999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax,0,16535); hframe->AddFrame(ePixX,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 1, 1, 1, 1)); ePixX->MapWindow(); ePixX->SetNumber(400); e= ePixX->TGNumberEntry::GetNumberEntry(); ePixX->Connect("ValueSet(Long_t)","ctbAcquisition",this,"ChangeImagePixels(Long_t)"); e->Connect("ReturnPressed()","ctbAcquisition",this,"ChangeImagePixels()"); label=new TGLabel(hframe,"Y: "); hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); label->MapWindow(); label->SetTextJustify(kTextRight); ePixY=new TGNumberEntry(hframe, 0, 9,999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax,0,16535); hframe->AddFrame(ePixY,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 1, 1, 1, 1)); ePixY->MapWindow(); ePixY->SetNumber(400); e= ePixY->TGNumberEntry::GetNumberEntry(); ePixY->Connect("ValueSet(Long_t)","ctbAcquisition",this,"ChangeImagePixels(Long_t)"); e->Connect("ReturnPressed()","ctbAcquisition",this,"ChangeImagePixels()"); hframe=new TGHorizontalFrame(this, 800,50); AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 10,10,10,10)); hframe->MapWindow(); label=new TGLabel(hframe,"Pedestal "); hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); label->MapWindow(); label->SetTextJustify(kTextRight); cbGetPedestal= new TGCheckButton(hframe, "Acquire"); hframe->AddFrame(cbGetPedestal,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); cbGetPedestal->MapWindow(); cbSubtractPedestal= new TGCheckButton(hframe, "Subtract"); hframe->AddFrame(cbSubtractPedestal,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); cbSubtractPedestal->MapWindow(); cbSubtractPedestal->Connect("Toggled(Bool_t)","ctbAcquisition",this,"TogglePedSub(Bool_t)"); cbCommonMode= new TGCheckButton(hframe, "Common Mode"); hframe->AddFrame(cbCommonMode,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); cbCommonMode->MapWindow(); cbCommonMode->Connect("Toggled(Bool_t)","ctbAcquisition",this,"ToggleCommonMode(Bool_t)"); bResetPedestal= new TGTextButton(hframe, "Reset"); hframe->AddFrame(bResetPedestal,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); bResetPedestal->MapWindow(); bResetPedestal->Connect("Clicked()","ctbAcquisition",this,"resetPedestal()"); hframe=new TGHorizontalFrame(this, 800,50); AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 10,10,10,10)); hframe->MapWindow(); cMinMaxRaw=new TGCheckButton(hframe,"Raw data "); hframe->AddFrame(cMinMaxRaw,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); cMinMaxRaw->MapWindow(); cMinMaxRaw->Connect("Toggled(Bool_t)","ctbAcquisition",this,"ChangeHistoLimitsRaw(Bool_t)"); label=new TGLabel(hframe,"Min: "); hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); label->MapWindow(); label->SetTextJustify(kTextRight); eMinRaw=new TGNumberEntry(hframe, 0, 9,999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax,0,16535); hframe->AddFrame(eMinRaw,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 1, 1, 1, 1)); eMinRaw->MapWindow();; eMinRaw->SetNumber(0); e= eMinRaw->TGNumberEntry::GetNumberEntry(); eMinRaw->Connect("ValueSet(Long_t)","ctbAcquisition",this,"ChangeHistoLimitsRaw(Long_t)"); e->Connect("ReturnPressed()","ctbAcquisition",this,"ChangeHistoLimitsRaw()"); label=new TGLabel(hframe,"Max: "); hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); label->MapWindow(); label->SetTextJustify(kTextRight); eMaxRaw=new TGNumberEntry(hframe, 0, 9,999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax,0,16535); hframe->AddFrame(eMaxRaw,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 1, 1, 1, 1)); eMaxRaw->MapWindow();; eMaxRaw->SetNumber(16535); e= eMaxRaw->TGNumberEntry::GetNumberEntry(); eMaxRaw->Connect("ValueSet(Long_t)","ctbAcquisition",this,"ChangeHistoLimitsRaw(Long_t)"); e->Connect("ReturnPressed()","ctbAcquisition",this,"ChangeHistoLimitsRaw()"); hframe=new TGHorizontalFrame(this, 800,50); AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 10,10,10,10)); hframe->MapWindow(); cMinMaxPedSub=new TGCheckButton(hframe,"Pedestal Subtracted "); hframe->AddFrame(cMinMaxPedSub,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); cMinMaxPedSub->MapWindow(); cMinMaxPedSub->Connect("Toggled(Bool_t)","ctbAcquisition",this,"ChangeHistoLimitsPedSub(Bool_t)"); label=new TGLabel(hframe,"Min: "); hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); label->MapWindow(); label->SetTextJustify(kTextRight); eMinPedSub=new TGNumberEntry(hframe, 0, 9,999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax,-16535,16535); hframe->AddFrame(eMinPedSub,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 1, 1, 1, 1)); eMinPedSub->MapWindow();; eMinPedSub->SetNumber(-100); e= eMinPedSub->TGNumberEntry::GetNumberEntry(); eMinPedSub->Connect("ValueSet(Long_t)","ctbAcquisition",this,"ChangeHistoLimitsPedSub(Long_t)"); e->Connect("ReturnPressed()","ctbAcquisition",this,"ChangeHistoLimitsPedSub()"); label=new TGLabel(hframe,"Max: "); hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); label->MapWindow(); label->SetTextJustify(kTextRight); eMaxPedSub=new TGNumberEntry(hframe,0, 9,999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax,-16535,16535); hframe->AddFrame(eMaxPedSub,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 1, 1, 1, 1)); eMaxPedSub->MapWindow();; eMaxPedSub->SetNumber(100); e= eMaxPedSub->TGNumberEntry::GetNumberEntry(); eMaxPedSub->Connect("ValueSet(Long_t)","ctbAcquisition",this,"ChangeHistoLimitsPedSub(Long_t)"); e->Connect("ReturnPressed()","ctbAcquisition",this,"ChangeHistoLimitsPedSub()"); hframe=new TGHorizontalFrame(this, 800,50); AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 10,10,10,10)); hframe->MapWindow(); TGTextButton *b= new TGTextButton(hframe, "Fit Panel ADC:"); hframe->AddFrame(b,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); b->MapWindow(); b->Connect("Clicked()","ctbAcquisition",this,"FitADC()"); eFitADC=new TGNumberEntry(hframe, 0, 9,999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax,0,31); hframe->AddFrame( eFitADC,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 1, 1, 1, 1)); eFitADC->MapWindow();; hframe=new TGHorizontalFrame(this, 800,50); AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 10,10,10,10)); hframe->MapWindow(); b= new TGTextButton(hframe, "Plot bit:"); hframe->AddFrame(b,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); b->MapWindow(); b->Connect("Clicked()","ctbAcquisition",this,"plotBit()"); eBitPlot=new TGNumberEntry(hframe, 0, 9,999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax,0,64); hframe->AddFrame( eBitPlot,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 1, 1, 1, 1)); eBitPlot->MapWindow();; hframe=new TGHorizontalFrame(this, 800,50); AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 10,10,10,10)); hframe->MapWindow(); label=new TGLabel(hframe,"X "); hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); label->MapWindow(); label->SetTextJustify(kTextRight); label=new TGLabel(hframe," "); hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); label->MapWindow(); label->SetTextJustify(kTextLeft); lClickX=label; label=new TGLabel(hframe,"Y "); hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); label->MapWindow(); label->SetTextJustify(kTextRight); label=new TGLabel(hframe," "); hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); label->MapWindow(); label->SetTextJustify(kTextLeft); lClickY=label; label=new TGLabel(hframe,"Value "); hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); label->MapWindow(); label->SetTextJustify(kTextRight); label=new TGLabel(hframe," "); hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); label->MapWindow(); label->SetTextJustify(kTextLeft); lClickValue=label; b= new TGTextButton(hframe, "Refresh"); hframe->AddFrame(b,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5)); b->MapWindow(); b->Connect("Clicked()","ctbAcquisition",this,"Draw()"); acqThread = new TThread("acqThread", ctbAcquisition::ThreadHandle,(void*)this); cout <<"Registering data callback" << endl; try { myDet->registerDataCallback(&dataCallback, (void*)this); } CATCH_DISPLAY ("Could not get register call back.", "ctbAcquisition::ctbAcquisition") try { myDet->setRxZmqDataStream(true); } CATCH_DISPLAY ("Could not get set RxZmqDataStream.", "ctbAcquisition::ctbAcquisition") cout <<"Done" << endl; // mgAdcs=new TMultiGraph(); adcStack=new THStack(); TH1F *h; int nSamples=nAnalogSamples; for (int i=0; iSetLineColor(i+1); h->SetLineWidth(2); adcStack->Add(h); adcHisto[i]=h; plotFlag[i]=0; // h->SetMinimum(-1); // h->SetMaximum(16385); } // mgAdcs=new TMultiGraph(); bitStack=new THStack(); // bitStack=adcStack; TH1F *hb; for (int i=0; iSetLineColor(i+1); hb->SetLineWidth(2); bitStack->Add(hb); bitHisto[i]=hb; bitOffset[i]=0; bitPlotFlag[i]=0; // h->SetMinimum(-1); // h->SetMaximum(16385); } countsStack=new THStack(); TH1F *h1; for (int i=0; iSetLineColor(i+1); h1->SetFillColor(i+1); h1->SetLineWidth(2); countsStack->Add(h1); countsHisto[i]=h1; } dataStructure=NULL; commonMode=NULL; photonFinder=NULL; h2DMapAn=NULL; h2DMapDig=NULL; //h2Scan=NULL; h1DMap=NULL; changeDetector(cbDetType->GetSelected()); // display could be updated with TTimer instead of with histogramfillthread: // plotTimer= new TTimer("ctbAcquisition::Draw()",100); // plotTimer->Connect("TurnOff()", "ctbAcquisition", this, "Draw()"); } void ctbAcquisition::canvasClicked() { int event = gPad->GetEvent(); if (event != 11) return; TObject *select = gPad->GetSelected(); if (!select) return; if (select->InheritsFrom("TH2")) { TH2* hh=(TH2*)select; int px = gPad->GetEventX(); int py = gPad->GetEventY(); Float_t upy = gPad->AbsPixeltoY(py); Float_t y = gPad->PadtoY(upy); Float_t upx = gPad->AbsPixeltoX(px); Float_t x = gPad->PadtoY(upx); // cout << "x: " << x << " y: " << y << " " << hh->GetBinContent(hh->GetXaxis()->FindBin(x), hh->GetYaxis()->FindBin(y)) << endl; lClickX->SetText(hh->GetXaxis()->FindBin(x)-1); lClickY->SetText( hh->GetYaxis()->FindBin(y)-1); lClickValue->SetText(hh->GetBinContent(hh->GetXaxis()->FindBin(x), hh->GetYaxis()->FindBin(y))); } else if (select->InheritsFrom("TH1")) { TH1* h1=(TH1*)select; int px = gPad->GetEventX(); Float_t upx = gPad->AbsPixeltoX(px); Float_t x = gPad->PadtoY(upx); // cout << "x: " << x << " y: " << y << " " << hh->GetBinContent(hh->GetXaxis()->FindBin(x), hh->GetYaxis()->FindBin(y)) << endl; lClickX->SetText(h1->GetXaxis()->FindBin(x)-1); lClickY->SetText(" "); lClickValue->SetText(h1->GetBinContent(h1->GetXaxis()->FindBin(x))); } else// if ((select->ClassName())=="THStack") { { int px = gPad->GetEventX(); int py = gPad->GetEventY(); Float_t upy = gPad->AbsPixeltoY(py); Float_t y = gPad->PadtoY(upy); Float_t upx = gPad->AbsPixeltoX(px); Float_t x = gPad->PadtoY(upx); lClickX->SetText(x); lClickY->SetText(y); lClickValue->SetText(""); } } void ctbAcquisition::setCanvas(TCanvas* c) { myCanvas=c; myCanvas->cd(); myCanvas->AddExec("dynamic",Form("((ctbAcquisition*)%p)->canvasClicked()",this)); // myCanvas->AddExec("ex","canvasClicked()"); } void ctbAcquisition::dataCallback(detectorData *data, long unsigned int index, unsigned int dum, void* pArgs) { // return ((ctbAcquisition*)pArgs)->plotData(data,index); } int ctbAcquisition::plotData(detectorData *data, int index) { /* ****************************************************************** When selecting dbit amount of data is nadc * nasamples * 16 bit + ndbitlist * ndsamples (bits) order of data analog: sample0 (adc0 + adc1 +...) sample1 (adc0 + adc1 +...) digital: dbit0 (sample0 + sample1 ...) dbit1 (sample0 + sample1..) when setting dbit to all amount of data: nadc * nasamples * 16 bit + 8 * ndsamples * 64 bit what you had before.. except analog first, then digital analog: sample0 (adc0 + adc1 +...) sample1 (adc0 + adc1 +...) digital: sample0 (dbit0 + dbit1 +...) sample1 (dbit0 + dbit1 +...)if (cmd == "rx_dbitlist") { if (action == PUT_ACTION) { std::vector dbitlist; // if not all digital bits enabled if (std::string(args[1]) != "all") { for (int i = 1; i < narg; ++i) { int temp = 0; if (!sscanf(args[i], "%d", &temp)) return std::string("Could not scan dbitlist value ") + std::string(args[i]); if (temp < 0 || temp > 63) return std::string("dbitlist value should be between 0 and 63 ") + std::string(args[i]); dbitlist.push_back(temp); } if (dbitlist.size() > 64) { return std::string("Max number of values for dbitlist is 64 "); } } myDet->setReceiverDbitList(dbitlist, detPos); } ****************************************************************** */ // cout << "plot data" << endl; // cout <<"global plot is " << globalPlot << endl; // cout << "*******************************************" <progressIndex << " nx:" << data->nx << " ny: " << data->ny << " " << data->fileName << " bytes: " << data->databytes << " dr:"<< data->dynamicRange << " fi: " << data ->fileIndex << endl; if (globalPlot || cbGetPedestal->IsOn()) { //#ifdef TESTADC // cout <<"------"<< index << " " << ip << " " << data->npoints << endl; //#endif int ig=0; int i, ii, ib; // TList *l= adcStack->GetHists(); // TList *l1= countsStack->GetHists(); TH1F *h; TH1F *h1; TH1F *hb; int x; double ped=0; int dsize=-1; int *val=NULL; int nx=1, ny=1; if (dataStructure) { dataStructure->getDetectorSize(nx,ny); cout << "Data structure: " << dataStructure << " size " << nx << " " << ny << endl; } int dr=24, soff=2; if (deserializer) { nx=eNumCount->GetIntNumber(); dr=eDynRange->GetIntNumber(); soff=eSerOff->GetIntNumber(); // cout <<"deserializer: " << endl; // cout << "Number of chans:\t" << nx << endl; // cout << "Serial Offset:\t" << soff << endl; // cout << "Dynamic range:\t" << dr << endl; } i=0; int nadc; int ndbit; tenG = 0; if (adclist.empty()) nadc=32; else nadc=adclist.size(); std::vector plotlist; if (dbitlist.empty()) { ndbit=64; dBitOffset=0; for (ib=0; ib<64; ib++){ if (bitPlotFlag[ib]) { plotlist.push_back(ib); } } } else ndbit=dbitlist.size(); if (tenG){ if (nDigitalSamples && nAnalogSamples){ if (nDigitalSamples>nAnalogSamples) dsize=nDigitalSamples*(32*2+8); else dsize=nAnalogSamples*(32*2+8); } else dsize=32*2*nAnalogSamples+8*nDigitalSamples; } else dsize=nadc*2*nAnalogSamples+ndbit*(nDigitalSamples-dBitOffset/8)/8; cout << "dataBytes is " << data->databytes << " expected " << dsize << endl; cout << "*******************************************" <data; else d_data = data->data+2*nadc*nAnalogSamples; char dval; if (dataStructure) { for (int x=0; xgetValue(data->data,x,y); //aval=dataStructure->getChannel(data->data,x,y); cout << x << " " <IsOn()) { if (photonFinder) { photonFinder->addToPedestal(aval,x,y); } } if (cbSubtractPedestal->IsOn()) { if (photonFinder) { ped=photonFinder->getPedestal(x,y,cmSub); } } if (h2DMapAn) h2DMapAn->SetBinContent(x+1,y+1,aval-ped); if (h2DMapDig) h2DMapDig->SetBinContent(x+1,y+1,dataStructure->getGain(data->data,x,y)); } } } else if (deserializer) { cout << "deserializer"<< endl; if (dbitlist.empty()) val=deserializer::deserializeAll(d_data,plotlist,dr,nx,soff);//dataStructure->getData(d_data); else val=deserializer::deserializeList(d_data,dbitlist,dr,nx,soff);//dataStructure->getData(d_data); if (val) { if (h1DMap){ for (x=0; xSetBinContent(x+1,val[x]); } } delete [] val; } else cout << "get val did not succeed"<getChannel(i); // else aval=data->getChannel(i);//*((uint16_t*)(data->cvalues+i*2));// if (plotFlag[ig]) { //if (enableFlag[ig]) { h=adcHisto[ig]; h1=countsHisto[ig]; //} // cout << data->getChannel(i) << endl; h->SetBinContent(ip+1,aval); h1->Fill(aval); } i++; } if (tenG) i+=4; } cout << "bit histo"<< endl; if (dbitlist.empty()) { for (ip=0; ipSetBinContent(ip+1,1+bitOffset[ib]); else hb->SetBinContent(ip+1,bitOffset[ib]); } } } } } else { ii=0; int iii=0; for (const auto &value : dbitlist) { ib=value; hb=bitHisto[ib]; // cout << dec <SetBinContent(iii,1+bitOffset[ib]); else hb->SetBinContent(iii,bitOffset[ib]); iii++; } } } ii++; } } } Draw(); // iScanStep++; if (photonFinder) photonFinder->newFrame(); } return 0; } void ctbAcquisition::Draw(){ if (globalPlot) { // TThread::Lock(); cout << "Draw" << endl; if (myCanvas) { if (adcPlot && dbitPlot) { myCanvas->cd(1); // myCanvas->Modified(); // myCanvas->Update(); gPad->Modified(); gPad->Update(); myCanvas->cd(2); // myCanvas->Modified(); // myCanvas->Update(); gPad->Modified(); gPad->Update(); } else { myCanvas->cd(); myCanvas->Modified(); myCanvas->Update(); } } // TThread::UnLock(); } } //here!! void ctbAcquisition::changePlot(){ if (rbPlotOff->IsOn()) { adcPlot=0; dbitPlot=0; try { myDet->registerDataCallback(nullptr, this); } CATCH_DISPLAY ("Could not get unregister call back.", "ctbAcquisition::ctbAcquisition") try { myDet->setRxZmqDataStream(false); } CATCH_DISPLAY ("Could not get unset RxZmqDataStream.", "ctbAcquisition::ctbAcquisition") } else { try { myDet->registerDataCallback(&dataCallback, (void*)this); } CATCH_DISPLAY ("Could not get register call back.", "ctbAcquisition::ctbAcquisition") try { myDet->setRxZmqDataStream(true); } CATCH_DISPLAY ("Could not get set RxZmqDataStream.", "ctbAcquisition::ctbAcquisition") adcPlot=0; dbitPlot=0; for (int ii=0; iiGetPad(1)==NULL || myCanvas->GetPad(2)==NULL) { myCanvas->Clear(); myCanvas->Divide(1,2); } else cout << "Pad already there" << endl; myCanvas->cd(1); } else { myCanvas->Clear(); // myCanvas->Divide(1,1); myCanvas->cd(); } if (adcPlot) { if (rbWaveform->IsOn()) if (adcStack) adcStack->Draw("NOSTACK"); else cout << "adcStack is NULL" << endl; else if (rbDistribution->IsOn()) if (countsStack) countsStack->Draw("NOSTACK"); else cout << "countsStack is NULL" << endl; else if (rb2D->IsOn()) { if (h2DMapAn) h2DMapAn->Draw("colz"); else if (h1DMap) h1DMap->Draw(); else cout << "h2DMap and h1DMap are NULL" << endl; } } if (dbitPlot) { if (adcPlot) myCanvas->cd(2); if (rb2D->IsOn()) { if (h2DMapDig) h2DMapDig->Draw("colz"); else if (h1DMap) h1DMap->Draw(); } else if (bitStack) bitStack->Draw("NOSTACK"); else cout << "bitStack is NULL" << endl; } // else if (rbScan->IsOn()) { // if (h2Scan) // h2Scan->Draw("colz"); // else // cout << "h2Scan is NULL" << endl; // } Draw(); } } void ctbAcquisition::changeDetector(){ // cout << "change detector " << i << " old " << cbDetType->GetSelected() << endl; if (dataStructure) delete dataStructure; if (commonMode) delete commonMode; if (photonFinder) delete photonFinder; if (h2DMapAn) delete h2DMapAn; if (h2DMapDig) delete h2DMapDig; if (h1DMap) delete h1DMap; // if (h2Scan) delete h2Scan; h2DMapAn=NULL; h2DMapDig=NULL; h1DMap=NULL; // h2Scan=NULL; photonFinder=NULL; dataStructure=NULL; commonMode=NULL; // TH2F *h2ScanOld=h2Scan; int nx,ny; int csize=3; int nsigma=5; commonModeSubtraction* cm=0; eNumCount->SetState(kFALSE); eDynRange->SetState(kFALSE); eSerOff->SetState(kFALSE); ePixX->SetState(kFALSE); ePixY->SetState(kFALSE); deserializer=0; if (rb2D->IsOn() ) {//|| rbScan->IsOn() switch (cbDetType->GetSelected()) { case DESERIALIZER: deserializer=1; cout << "DESERIALIZER!" << endl; // dataStructure=new moench03T1CtbData(); // commonMode=new moench03CommonMode(); break; case MOENCH04: try { auto retval = myDet->getTenGiga().tsquash("Different values"); if (retval) { dataStructure=new moench04CtbZmq10GbData(nAnalogSamples, nDigitalSamples); } else { dataStructure=new moench04CtbZmqData(nAnalogSamples, nDigitalSamples); } } CATCH_DISPLAY ("Could not get ten giga enable.", "ctbAcquisition::changeDetector") cout << "MOENCH 0.4!" << endl; commonMode=new moench03CommonMode(); break; case MOENCH03: //try { // auto retval = myDet->getTenGiga().tsquash("Different values"); // if (retval) { dataStructure=new moench03T1ZmqDataNew(nAnalogSamples); // } else { // dataStructure=new moench04CtbZmqData(nAnalogSamples, nDigitalSamples); // } //} CATCH_DISPLAY ("Could not get ten giga enable.", "ctbAcquisition::changeDetector") cout << "MOENCH 0.3! USE JUNGFRAU MODULE!" << endl; commonMode=new moench03CommonMode(); break; case IMAGE32B: //try { // auto retval = myDet->getTenGiga().tsquash("Different values"); // if (retval) { // if (deserializer) { ePixX->SetState(kTRUE); ePixY->SetState(kTRUE); // } dataStructure=new imageZmq32bit(ePixX->GetIntNumber(),ePixY->GetIntNumber()); // } else { // dataStructure=new moench04CtbZmqData(nAnalogSamples, nDigitalSamples); // } //} CATCH_DISPLAY ("Could not get ten giga enable.", "ctbAcquisition::changeDetector") cout << "Image 32bit, no channel shuffling" << endl; commonMode=NULL; break; case IMAGE16B: //try { // auto retval = myDet->getTenGiga().tsquash("Different values"); // if (retval) { // if (deserializer) { ePixX->SetState(kTRUE); ePixY->SetState(kTRUE); // } dataStructure=new imageZmq16bit(ePixX->GetIntNumber(),ePixY->GetIntNumber()); // } else { // dataStructure=new moench04CtbZmqData(nAnalogSamples, nDigitalSamples); // } //} CATCH_DISPLAY ("Could not get ten giga enable.", "ctbAcquisition::changeDetector") cout << "Image 16bit, no channel shuffling" << endl; commonMode=NULL; break; // case 1: // cout << "************** T!!!!!!!!!!" << endl; // dataStructure=new moench03TCtbData(); // commonMode=new moench03CommonMode(); // break; case MOENCH02: cout << "MOENCH 0.2" << endl; dataStructure=new moench02CtbData(); commonMode=new moenchCommonMode(); break; // case 2: // dataStructure=new jungfrau10ModuleData(); // commonMode=new commonModeSubtraction(); // break; // case 3: // cout << "************** Flat!!!!!!!!!!" << endl; // dataStructure=new moench03CtbData(); // commonMode=new moench03CommonMode(); // break; // case MYTHEN301: // deserializer=1; // cout << "MYTHEN 3 0.1" << endl; // dataStructure=new mythen3_01_jctbData(eNumCount->GetIntNumber(),eDynRange->GetIntNumber(),eSerOff->GetIntNumber()); // //( int nch=64*3,int dr=24, int off=5) // eNumCount->SetState(kTRUE); // eDynRange->SetState(kTRUE); // eSerOff->SetState(kTRUE); // commonMode=NULL; // dim=1; // break; // case ADCSAR2: // deserializer=1; // //adcsar2 // dataStructure=new adcSar2_jctbData(); // //need to use configurable number of counters, offset or dynamic range? // commonMode=NULL; // dim=1; // break; // case MYTHEN302: // deserializer=1; // cout << "MYTHEN 3 0.2" << endl; // dataStructure=new mythen3_02_jctbData(eNumCount->GetIntNumber(),eDynRange->GetIntNumber(),eSerOff->GetIntNumber()); // //( int nch=64*3,int dr=24, int off=5) // eNumCount->SetState(kTRUE); // eDynRange->SetState(kTRUE); // eSerOff->SetState(kTRUE); // commonMode=NULL; // dim=1; // break; default: dataStructure=NULL; commonMode=NULL; } if (cbCommonMode->IsOn()) cm=commonMode; } if (dataStructure || deserializer) { if (dataStructure) { photonFinder=new singlePhotonDetector(dataStructure,csize,nsigma,1,cm); //sign is positive - should correct with ADC mask, no common mode //photonFinder=new singlePhotonDetector(dataStructure,csize,nsigma,1,cm); //sign is positive - should correct with ADC mask, no common mode dataStructure->getDetectorSize(nx,ny); } if (deserializer) { ny=1; nx=eNumCount->GetIntNumber(); eNumCount->SetState(kTRUE); eDynRange->SetState(kTRUE); eSerOff->SetState(kTRUE); } // cout << "h size is " << nx << " " << ny << endl; int ymax=ny, xmax=nx; // if (ny>500) {ny=ny/2;} // if (nx>500) {nx=nx/2;} cout << "*** " << nx << " " << ny << endl; if (rb2D->IsOn()) { if (ny>1) { h2DMapAn=new TH2F("h2dmapAn","",nx,0,xmax,ny,0,ymax); h2DMapAn->SetStats(kFALSE); cout << "Created h2DMapAn"<< endl; if (dbitPlot && adcPlot){ h2DMapDig=new TH2F("h2dmapDig","",nx,0,xmax,ny,0,ymax); h2DMapDig->SetStats(kFALSE); cout << "Created h2DMapDig"<< endl; } } else { h1DMap=new TH1F("h1dmap","",nx,0,xmax); h1DMap->SetStats(kFALSE); cout << "Created h1DMap"<< endl; } } // else if (rbScan->IsOn()) { // int nsteps=0;//myDet->getScanSteps(0); // double stepmin=0, stepmax=1; // if (nsteps>0) { // stepmin=myDet->getScanStep(0,0); // stepmax=myDet->getScanStep(0,nsteps-1); // } // cout << "************ creating scan histogram " << nx*ny << " " << nsteps << " " << stepmin << " " << stepmax << endl; // if (nsteps<1) nsteps=1; // double hmin=stepmin, hmax=stepmax; // if (stepmin>stepmax) { // hmin=stepmax; // hmax=stepmin; // } // h2Scan=new TH2F("h2scan","",nx*ny,0,nx*ny,nsteps,hmin,hmax); // } } cout << "done " << endl; } void ctbAcquisition::changeDetector(int i){ changePlot(); changeDetector(); } void ctbAcquisition::changePlot(int i){ changePlot(); changeDetector(); } void ctbAcquisition::setGraph(int i ,int en, Pixel_t col) { char name[100]; // TList *l= mgAdcs->GetListOfGraphs(); sprintf(name,"adc%d",i); // TList *l= adcStack->GetHists(); TH1F *h=adcHisto[i];//(TH1F*)l->At(i);; TH1F *h1=countsHisto[i];//(TH1F*)(countsStack->GetHists()->At(i)); if (en) { plotFlag[i]=1; h->SetLineColor(TColor::GetColor(col)); h1->SetLineColor(TColor::GetColor(col)); h1->SetFillColor(TColor::GetColor(col)); if (adcStack->GetHists()) // if (adcStack->GetHists()->GetEntries()) if (adcStack->GetHists()->Contains(h)==0) adcStack->Add(h); if (countsStack->GetHists()) if (countsStack->GetHists()->Contains(h1)==0) countsStack->Add(h1); cout << "Enable plot " << i << " color " << col << endl; } else { cout << "Disable plot " << i << endl; plotFlag[i]=0; if (adcStack->GetHists()) // if (adcStack->GetHists()->GetEntries()) if (adcStack->GetHists()->Contains(h)) adcStack->RecursiveRemove(h); if (countsStack->GetHists()) if (countsStack->GetHists()->Contains(h1)) countsStack->RecursiveRemove(h1); } cout << countsStack->GetHists()->GetEntries() << endl; cout << "Number of histos " << adcStack->GetHists()->GetEntries() << endl; changePlot(); // globalPlot=0; // for (int ii=0; iiGetListOfGraphs(); sprintf(name,"bit%d",i); // TList *l= adcStack->GetHists(); TH1F *h=bitHisto[i];//(TH1F*)l->At(i);; if (en) { //cout<< "enabling plot of bit "<SetLineColor(TColor::GetColor(col)); if (bitStack->GetHists()) //if (bitStack->GetHists()->GetEntries()) if (bitStack->GetHists()->Contains(h)==0) bitStack->Add(h); cout << "Enable bit plot " << i << " color " << col << endl; } else { cout << "Disable bit plot " << i << endl; bitPlotFlag[i]=0; if (bitStack->GetHists()) // if (bitStack->GetHists()->GetEntries()) if (bitStack->GetHists()->Contains(h)) bitStack->RecursiveRemove(h); } cout << "Number of histos " << bitStack->GetHists()->GetEntries() << endl; changePlot(); float off=0; for (int ii=0; ii(1.5); cout << "bit " << ii << " offset " << bitOffset[ii] << endl; } } // globalPlot=0; // for (int ii=0; iisetFilePath(eOutdir->GetText()); } CATCH_DISPLAY ("Could not set file path", "ctbAcquisition::setOutdir") } void ctbAcquisition::setFname() { try { myDet->setFileNamePrefix(eFname->GetText()); } CATCH_DISPLAY ("Could not set file name prefix", "ctbAcquisition::setFname") } void ctbAcquisition::setFindex() { try { myDet->setAcquisitionIndex(eFindex->GetNumber()); } CATCH_DISPLAY ("Could not set acquisition index", "ctbAcquisition::setFindex") } void ctbAcquisition::setFsave(Bool_t b) { try { myDet->setFileWrite(b); eFname->SetState(b); eOutdir->SetState(b); } CATCH_DISPLAY ("Could not set file write", "ctbAcquisition::setFsave") } void ctbAcquisition::update() { try { auto retval = myDet->getFileNamePrefix().tsquash("Different values"); eFname->SetText(retval.c_str()); } CATCH_DISPLAY ("Could not get file name prefix", "ctbAcquisition::update") try { auto retval = myDet->getAcquisitionIndex().tsquash("Different values"); eFindex->SetNumber(retval); } CATCH_DISPLAY ("Could not get acquisition index", "ctbAcquisition::update") try { auto retval = myDet->getFileWrite().tsquash("Different values"); cFileSave->SetOn(retval); } CATCH_DISPLAY ("Could not get file write", "ctbAcquisition::update") eFname->SetState(cFileSave->IsOn()); eOutdir->SetState(cFileSave->IsOn()); eFindex->SetState(cFileSave->IsOn()); try { auto retval = myDet->getNumberOfAnalogSamples().tsquash("Different values"); setAnalogSamples(retval); } CATCH_DISPLAY ("Could not get number of analog samples", "ctbAcquisition::update") try { auto retval = myDet->getNumberOfDigitalSamples().tsquash("Different values"); setDigitalSamples(retval); } CATCH_DISPLAY ("Could not get number of digital samples", "ctbAcquisition::update") try { roMode = static_cast(myDet->getReadoutMode().tsquash("Different values")); setReadoutMode(roMode); } CATCH_DISPLAY ("Could not get readout mode", "ctbAcquisition::update") updateChans(); if (dataStructure) { cout << cbDetType->GetSelected()<< endl; // if (cbDetType->GetSelected()==MYTHEN301 || cbDetType->GetSelected()==MYTHEN302){ // cout << "settings deserialiation parameters for MYTHEN" << endl; // mythen3_01_jctbData* ms=(mythen3_01_jctbData*)dataStructure; // eSerOff->SetNumber( ms->setSerialOffset(-1)); // eDynRange->SetNumber( ms->setDynamicRange(-1)); // eNumCount->SetNumber( ms->setNumberOfCounters(-1)); // } } if (myDet->getDetectorType().squash() == slsDetectorDefs::MOENCH) { dBitOffset = 0; } else { try { dBitOffset = myDet->getRxDbitOffset().tsquash("Different values"); } CATCH_DISPLAY ("Could not get receiver dbit offset", "ctbAcquisition::update") } try { tenG = myDet->getTenGiga().tsquash("Different values"); } CATCH_DISPLAY ("Could not get ten giga enable", "ctbAcquisition::update") // char aargs[10][100]; // char *args[10]; // for (int i=0; i<10; i++) // args[i]=aargs[i]; // string retval; // sprintf(args[0],"adcdisable"); // slsDetectorCommand *cmd=new slsDetectorCommand(myDet); // retval=cmd->executeLine(1,args,slsDetectorDefs::GET_ACTION); // delete cmd; // int mask; // sscanf(retval.c_str(),"adcdisable %d",&mask); // for (int i=0; iGetState()==1 || acqThread->GetState()==6) { if (cCompile->IsOn()) { sprintf(fname,"%s %s",patternCompiler,patternFile); cout << "Compile: " << fname << endl; strcpy(currdir,gSystem->pwd()); std::size_t found = string(patternCompiler).rfind('/'); if (found!=std::string::npos) gSystem->cd(string(patternCompiler).substr(0,found).c_str()); gSystem->cd(cdir); system(fname); gSystem->cd(currdir); } if (string(patternCompiler).rfind(".pat")!=std::string::npos) strcpy(fname,patternFile); else if (string(patternCompiler).rfind(".npat")!=std::string::npos) strcpy(fname,patternFile); else sprintf(fname,"%sat",patternFile); cout << "Load: " << fname << endl; try { myDet->loadParameters(fname); } CATCH_DISPLAY ("Could not load parameters", "ctbAcquisition::loadPattern") } } void ctbAcquisition::toggleAcquisition() { if (acqThread->GetState()==1 || acqThread->GetState()==6) { /** update all infos useful for the acquisition! */ try { auto retval = myDet->getNumberOfAnalogSamples().tsquash("Different values"); setAnalogSamples(retval); } CATCH_DISPLAY ("Could not get number of analog samples", "ctbAcquisition::toggleAcquisition") try { auto retval = myDet->getNumberOfDigitalSamples().tsquash("Different values"); setDigitalSamples(retval); } CATCH_DISPLAY ("Could not get number of digital samples", "ctbAcquisition::toggleAcquisition") if (myDet->getDetectorType().squash() == slsDetectorDefs::MOENCH) { dBitOffset = 0; } else { try { dBitOffset = myDet->getRxDbitOffset().tsquash("Different values"); } CATCH_DISPLAY ("Could not get receiver dbit offset", "ctbAcquisition::toggleAcquisition") } try { roMode = static_cast(myDet->getReadoutMode().tsquash("Different values")); setReadoutMode(roMode); } CATCH_DISPLAY ("Could not get readout mode", "ctbAcquisition::toggleAcquisition") cout << "Run" << endl; bStatus->SetText("Stop"); ip=0; for (int i=0; iGetListOfFunctions()) adcHisto[i]->GetListOfFunctions()->Delete(); adcHisto[i]->Reset(); if (countsHisto[i]->GetListOfFunctions()) countsHisto[i]->GetListOfFunctions()->Delete(); countsHisto[i]->Reset(); // ((TH1F*)adcStack->GetHists()->At(i))->Reset(); // ((TH1F*)countsStack->GetHists()->At(i))->Reset(); } for (int i=0; iReset(); } cout << "reset 2d an" << endl;; if (h2DMapAn) h2DMapAn->Reset(); cout << "reset 2d dig" << endl;; if (h2DMapDig) h2DMapDig->Reset(); cout << "reset 1d" << endl;; if (h1DMap) h1DMap->Reset(); cout << "done" << endl;; // if (h2Scan) h2Scan->Reset(); // cout << "reset 1d" << endl;; // if (rbWaveform->IsOn()) // adcStack->Draw("NOSTACK"); // else if (rbDistribution->IsOn()) // countsStack->Draw("NOSTACK"); // else if (rb2D->IsOn()) // h2DMap->Draw("colz"); // cout << "timer" << endl; changePlot(); // plotTimer->TurnOn(); // cout << "thread" << endl; acqThread->Run(); StopFlag=0; } else { StopFlag=1; try{ myDet->stopDetector(); } CATCH_DISPLAY ("Could not stop acquisition", "ctbAcquisition::toggleAcquisition") stop=1; bStatus->SetText("Start"); // acqThread->Kill(); } } void ctbAcquisition::acquisitionFinished() { bStatus->SetText("Start"); cout << "finished " << endl; // plotTimer->TurnOff(); Draw(); } void ctbAcquisition::startAcquisition(){ cout << "Detector started " <GetNumber()<< endl; stop=0; try { tenG = myDet->getTenGiga().tsquash("Different values"); } CATCH_DISPLAY ("Could not get ten giga enable", "ctbAcquisition::startAcquisition") for (int im=0; imGetNumber(); im++) { try { myDet->acquire(); } CATCH_DISPLAY ("Could not acquire", "ctbAcquisition::startAcquisition") cout << im << endl; if (stop) break; } } void* ctbAcquisition::ThreadHandle(void *arg) { ctbAcquisition *acq = static_cast(arg); acq->startAcquisition(); acq->acquisitionFinished(); return nullptr; } void ctbAcquisition::progressCallback(double f,void* arg) { // ctbAcquisition *acq = static_cast(arg); cout << "*********" << f << "*******" << endl; } void ctbAcquisition::setPatternFile(const char* t) { cout << "New pattern is " << t << endl; strcpy(patternFile,t); } void ctbAcquisition::setPatternCompiler(const char* t) { cout << "New compiler is " << t << endl; strcpy(patternCompiler,t); } void ctbAcquisition::setMeasurements() { } void ctbAcquisition::setAnalogSamples(int n) { cout<< "Set number of analog samples to " << dec<< n << endl; if (n>0 && n<8192) nAnalogSamples=n; // TList *l= adcStack->GetHists(); TH1 *h; // if (l) { for (int i=0; iAt(i); if (h) { h->SetBins(nAnalogSamples,0,nAnalogSamples); } } h=adcStack->GetHistogram(); if (h) h->SetBins(nAnalogSamples,0,nAnalogSamples); } void ctbAcquisition::setDigitalSamples(int n) { cout<< "Set number of digital samples to " << dec<< n << endl; if (n>0 && n<8192) nDigitalSamples=n; TH1 *h; for (int i=0; iAt(i); if (h) { h->SetBins(nDigitalSamples,0,nDigitalSamples); } } // cout<< "histos resized " << dec<< h->GetNbinsX() << endl; h=bitStack->GetHistogram(); if (h) h->SetBins(nDigitalSamples,0,nDigitalSamples); } void ctbAcquisition::setReadoutMode(int f) { roMode=f; slsDetectorDefs::readoutMode flag=(slsDetectorDefs::readoutMode)f; if (flag == slsDetectorDefs::DIGITAL_ONLY) { nAnalogSamples=0; adclist.clear(); } else if (flag ==slsDetectorDefs::ANALOG_AND_DIGITAL) { ; } else { nDigitalSamples=0; dbitlist.clear(); } // for (int i=0; igetDetectorType().squash() == slsDetectorDefs::MOENCH) { dbitlist.clear(); } else { try { auto retval = myDet->getRxDbitList().tsquash("Different values"); dbitlist.clear(); if (!retval.empty()) { for (const auto &value : retval) dbitlist.push_back(value); } } CATCH_DISPLAY ("Could not get receiver dbit list.", "ctbAcquisition::updateChans") } // adc mask try { auto retval = myDet->getADCEnableMask().tsquash("Different values"); adclist.clear(); if (retval!=0xffffffff) { for (int i=0; inewDataSet(); }; } void ctbAcquisition::ToggleCommonMode(Bool_t b) { if (photonFinder) { if (b) { photonFinder->setCommonModeSubtraction(commonMode); cmSub=1; cout << "Enable common mode" << endl; } else { photonFinder->setCommonModeSubtraction(NULL); cmSub=0; cout << "Disable common mode" << endl; } } } void ctbAcquisition::TogglePedSub(Bool_t b) { if (b) { ChangeHistoLimitsPedSub(); } else { ChangeHistoLimitsRaw(); } } void ctbAcquisition::FitADC() { int iadc=eFitADC->GetNumber(); if (iadc<0 || iadc>=NADCS) return; cout << "fit panel for adc " << eFitADC->GetNumber() << endl; if (rbWaveform->IsOn()) { if (adcHisto[iadc]==NULL) return; new TCanvas("Cadcfit"); if (adcFit) { delete adcFit; adcFit=NULL; } adcFit=(TH1F*)(adcHisto[iadc]->Clone("adcfit")); adcFit->Draw(); adcFit->FitPanel(); } else if (rbDistribution->IsOn()) { if (countsHisto[iadc]==NULL) return; new TCanvas("Ccountsfit"); if (countsFit) { delete countsFit; countsFit=NULL; } countsFit=(TH1F*)(countsHisto[iadc]->Clone("countsfit")); countsFit->Draw(); countsFit->FitPanel(); } } void ctbAcquisition::plotBit() { int iadc=eBitPlot->GetNumber(); if (iadc<0 || iadc>=NSIGNALS) return; cout << "plot panel for bit " << eBitPlot->GetNumber() << endl; if (bitHisto[iadc]==NULL) return; new TCanvas("Cbitplot"); if (bitPlot) { delete bitPlot; bitPlot=NULL; } bitPlot=(TH1F*)(bitHisto[iadc]->Clone("bitplot")); bitPlot->Draw(); } void ctbAcquisition::ChangeSerialOffset(Long_t a){ ChangeSerialOffset(); }; void ctbAcquisition::ChangeDynamicRange(Long_t a){ ChangeDynamicRange(); }; void ctbAcquisition::ChangeNumberOfChannels(Long_t a){ ChangeNumberOfChannels(); }; void ctbAcquisition::ChangeSerialOffset(){ changeDetector(); // if (dataStructure) { // cout << cbDetType->GetSelected()<< endl; // if (cbDetType->GetSelected()==MYTHEN301 || cbDetType->GetSelected()==MYTHEN302 ){ // cout << "settings offsets for MYTHEN" << endl; // mythen3_01_jctbData* ms=(mythen3_01_jctbData*)dataStructure; // ms->setSerialOffset(eSerOff->GetIntNumber()); // } // } }; void ctbAcquisition::ChangeDynamicRange(){ changeDetector(); // if (dataStructure) { // cout << cbDetType->GetSelected()<< endl; // if (cbDetType->GetSelected()==MYTHEN301 || cbDetType->GetSelected()==MYTHEN302){ // cout << "settings dynamic range for MYTHEN" << endl; // mythen3_01_jctbData* ms=(mythen3_01_jctbData*)dataStructure; // ms->setDynamicRange(eDynRange->GetIntNumber()); // } // } }; void ctbAcquisition::ChangeNumberOfChannels(){ changeDetector(); // if (dataStructure) { // cout << cbDetType->GetSelected()<< endl; // if (cbDetType->GetSelected()==MYTHEN301 || cbDetType->GetSelected()==MYTHEN302){ // cout << "settings number of channels for MYTHEN" << endl; // mythen3_01_jctbData* ms=(mythen3_01_jctbData*)dataStructure; // ms->setNumberOfCounters(eNumCount->GetIntNumber()); // } // } if (deserializer) changePlot(); }; void ctbAcquisition::ChangeImagePixels(Long_t a){ ChangeImagePixels(); }; void ctbAcquisition::ChangeImagePixels(){ changeDetector(); // if (dataStructure) { // cout << cbDetType->GetSelected()<< endl; // if (cbDetType->GetSelected()==MYTHEN301 || cbDetType->GetSelected()==MYTHEN302){ // cout << "settings number of channels for MYTHEN" << endl; // mythen3_01_jctbData* ms=(mythen3_01_jctbData*)dataStructure; // ms->setNumberOfCounters(eNumCount->GetIntNumber()); // } // } // if (deserializer) // changePlot(); }; void ctbAcquisition::ChangeHistoLimitsPedSub(Long_t a){ ChangeHistoLimitsPedSub(); }; void ctbAcquisition::ChangeHistoLimitsRaw(Long_t a){ ChangeHistoLimitsRaw(); } void ctbAcquisition::ChangeHistoLimitsPedSub(Bool_t a){ ChangeHistoLimitsPedSub(); }; void ctbAcquisition::ChangeHistoLimitsRaw(Bool_t a){ ChangeHistoLimitsRaw(); } void ctbAcquisition::ChangeHistoLimitsPedSub(){ cout << "set Limits ped sub hist " << eMinPedSub->GetNumber() << " " << eMaxPedSub->GetNumber() << endl; if (eMinPedSub->GetNumber()>eMaxPedSub->GetNumber()) return; if (cbSubtractPedestal->IsOn()) { if (cMinMaxPedSub->IsOn()) { adcStack->SetMaximum( eMaxPedSub->GetNumber()); adcStack->SetMinimum( eMinPedSub->GetNumber()); if (h2DMapAn) { h2DMapAn->SetMaximum( eMaxPedSub->GetNumber()); h2DMapAn->SetMinimum( eMinPedSub->GetNumber()); } if (h1DMap) { h1DMap->SetMaximum( eMaxPedSub->GetNumber()); h1DMap->SetMinimum( eMinPedSub->GetNumber()); } if (countsStack->GetHistogram()) countsStack->GetHistogram()->GetXaxis()->SetRangeUser(eMinPedSub->GetNumber(), eMaxPedSub->GetNumber()); } else { if (adcStack->GetHistogram()) adcStack->GetHistogram()->GetYaxis()->UnZoom(); if (h2DMapAn) { h2DMapAn->GetZaxis()->UnZoom(); } if (h1DMap) { h1DMap->GetYaxis()->UnZoom(); } if (countsStack->GetHistogram()) countsStack->GetHistogram()->GetXaxis()->UnZoom(); } } }; void ctbAcquisition::ChangeHistoLimitsRaw(){ cout << "set Limits raw hist " << eMinRaw->GetNumber() << " " << eMaxRaw->GetNumber() << endl; if (eMinRaw->GetNumber()>eMaxRaw->GetNumber()) return; if (cbSubtractPedestal->IsOn()==0) { if (cMinMaxRaw->IsOn()) { adcStack->SetMaximum( eMaxRaw->GetNumber()); adcStack->SetMinimum( eMinRaw->GetNumber()); if (h2DMapAn) { h2DMapAn->SetMaximum( eMaxRaw->GetNumber()); h2DMapAn->SetMinimum( eMinRaw->GetNumber()); } if (h1DMap) { h1DMap->SetMaximum( eMaxRaw->GetNumber()); h1DMap->SetMinimum( eMinRaw->GetNumber()); } if (countsStack->GetHistogram()) countsStack->GetHistogram()->GetXaxis()->SetRangeUser(eMinRaw->GetNumber(), eMaxRaw->GetNumber()); } else { if (adcStack->GetHistogram()) adcStack->GetHistogram()->GetYaxis()->UnZoom(); if (h2DMapAn) { h2DMapAn->GetZaxis()->UnZoom(); } if (h1DMap) { h1DMap->GetYaxis()->UnZoom(); } if (countsStack->GetHistogram()) countsStack->GetHistogram()->GetXaxis()->UnZoom(); } } }