slsDetectorPackage/ctbGui/ctbAcquisition.cpp

2092 lines
54 KiB
C++
Executable File

//#define TESTADC
#include <TGButtonGroup.h>
#include <TGButton.h>
#include <TGNumberEntry.h>
#include <TGComboBox.h>
#include <TGLabel.h>
#include <TList.h>
#include <TThread.h>
#include <TGraph.h>
#include <TMultiGraph.h>
#include <TCanvas.h>
#include <TROOT.h>
#include <THStack.h>
#include <TColor.h>
#include <TTimer.h>
#include <TH2F.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include "ctbAcquisition.h"
#include "multiSlsDetector.h"
#include "sls_detector_defs.h"
#include "ctbMain.h"
#include "moench03CtbData.h"
#include "moench03TCtbData.h"
#include "moench03T1CtbData.h"
#include "moench03CommonMode.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 "moench04CtbReceiverData.h"
#include "deserializer.h"
#include "detectorData.h"
using namespace std;
ctbAcquisition::ctbAcquisition(TGVerticalFrame *page, multiSlsDetector *det) : TGGroupFrame(page,"Acquisition",kVerticalFrame), myDet(det), myCanvas(NULL), globalPlot(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)");
eFname = new TGTextEntry(hframe, (myDet->getFileName()).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);
eOutdir = new TGTextEntry(hframe, (myDet->getFilePath()).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 T", iiii++);
//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(5);
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(64*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,"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);
// acqThread->Run();
cout <<"Registering progress callback" << endl;
try {
myDet->registerProgressCallback(&progressCallback,(void*)this);
} catch (...) {
cout << "Do nothing for this error" << endl;
}
cout <<"Registering data callback" << endl;
try{
myDet->registerDataCallback(&dataCallback, (void*)this);
} catch (...) {
cout << "Do nothing for this error" << endl;
}
cout <<"Done" << endl;
// mgAdcs=new TMultiGraph();
adcStack=new THStack();
TH1F *h;
int nSamples=nAnalogSamples;
for (int i=0; i<NADCS; i++) {
sprintf(tit,"adc%d",i);
nSamples=nAnalogSamples;
h=new TH1F(tit,tit,nSamples,0,nSamples);
h->SetLineColor(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; i<NSIGNALS; i++) {
sprintf(tit,"bit%d",i);
nSamples=nDigitalSamples;
hb=new TH1F(tit,tit,nSamples,0,nSamples);
hb->SetLineColor(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; i<NADCS; i++) {
sprintf(tit,"Fadc%d",i);
h1=new TH1F(tit,tit,2*16386,-16385,16385);
h1->SetLineColor(i+1);
h1->SetFillColor(i+1);
h1->SetLineWidth(2);
countsStack->Add(h1);
countsHisto[i]=h1;
}
int nx,ny;
int csize=3;
int nsigma=5;
dataStructure=NULL;
commonMode=NULL;
photonFinder=NULL;
h2DMap=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*)0x%x)->canvasClicked()",this));
// myCanvas->AddExec("ex","canvasClicked()");
}
int ctbAcquisition::dataCallback(detectorData *data, int index, 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") {
myDet->setReceiverOnline(ONLINE_FLAG, detPos);
if (action == PUT_ACTION) {
std::vector <int> 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 << "*******************************************" <<endl;
cout <<"------Plot: "<< index << " prog:" << data->progressIndex << " npoints:" << data->npoints << " npy: " << data->npy << " " << 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, ich=0, ib, vv;
// TList *l= adcStack->GetHists();
// TList *l1= countsStack->GetHists();
TH1F *h;
TH1F *h1;
TH1F *hb;
int nb, x,y;
double ped=0;
int vv1,vv2;
int dsize=-1;
int *val=NULL;
int nx=1, ny=1, jj;
short unsigned int *va;
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();
}
i=0;
int nadc;
int ndbit;
if (adclist.empty())
nadc=32;
else
nadc=adclist.size();
std::vector <int> 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();
dsize=nadc*2*nAnalogSamples+ndbit*(nDigitalSamples-dBitOffset/8)/8;
cout << "dataBytes is " << data->databytes << " expected " << dsize << endl;
cout << "*******************************************" <<endl;
uint16_t aval;
i=0;
for (ip=0; ip<nAnalogSamples; ip++) {
for (ii=0; ii<nadc; ii++) {
//for (ip=0; ip<adclist.size(); ip++) {
if (adclist.empty())
ig=ii;
else
ig=adclist.at(ii);
aval=data->getChannel(i);//*((uint16_t*)(data->cvalues+i*2));//
// cout << "asample " << ip << " adc " << ig << " " << i << " " << aval << endl;
ped=0;
if (dataStructure) {
dataStructure->getPixel(i,x,y);
if (cbGetPedestal->IsOn()) {
if (photonFinder) {
photonFinder->addToPedestal(aval,x,y);
}
}
if (plotFlag[ig]) {
if (cbSubtractPedestal->IsOn()) {
if (photonFinder) {
ped=photonFinder->getPedestal(x,y,cmSub);
}
}
//normal filling except when deserializer
if (h2DMap)
h2DMap->SetBinContent(x+1,y+1,aval-ped);
if (h1DMap){
h1DMap->SetBinContent(x+1,aval-ped);
// cout << "plotting 1D " << endl;
}
// if (h2Scan) {
// //cout << "plotting Scan " << endl;
// h2Scan->SetBinContent((x+1)+y*nx,iScanStep+1,data->getChannel(i)-ped);
// } else
// cout << "No scan (analog)" << endl;
}
}
//if (enableFlag[ig]) {
h=adcHisto[ig];
h1=countsHisto[ig];
//}
if (plotFlag[ig]) {
// cout << data->getChannel(i) << endl;
h->SetBinContent(ip+1,aval-ped);
h1->Fill(aval-ped);
}
i++;
}
}
char *d_data= data->cvalues+2*nadc*nAnalogSamples;
char dval;
/**** Digital Samples ****/
if (deserializer) {
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 (h2DMap) {
// for (x=0; x<nx; x++) {
// for (y=0; y<ny; y++) {
// h2DMap->SetBinContent(x+1,y+1,val[y][x]);
// }
// }
// }
if (h1DMap){
for (x=0; x<nx; x++) {
h1DMap->SetBinContent(x+1,val[x]);
// cout << dec << x << " " << val[0][x] << endl;
}
}
// if (h2Scan) {
// for (x=0; x<nx; x++) {
// for (y=0; y<ny; y++) {
// //cout << "plotting Scan " << (x+1)+y*nx << " " << iScanStep+1 << " " << val[y][x] << endl;
// h2Scan->SetBinContent((x+1)+y*nx,iScanStep+1,val[y][x]);
// }
// }
// } else
// cout << "No scan (digital)" << endl;
delete [] val;
} else
cout << "get val did not succeed"<<endl;
}
if (dbitlist.empty()) {
for (ip=0; ip<nDigitalSamples; ip++) {
for (ig=0; ig<8; ig++) {
dval=*(d_data+ip*8+ig);
for (ib=(ig)*8; ib<(ig+1)*8; ib++) {
// cout << "dsample " << ip << " bit " << ib << endl;
// cout << "Bit number " << ib << endl;
if (bitPlotFlag[ib]) {
hb=bitHisto[ib];
// if (bitStack->GetHists()->Contains(hb)==0) cout << "ERROR!" << endl;
//#define ADCSAR2
// #ifdef ADCSAR2
// if (ib==0) vv1=dval;
// if (ib==16) vv2=dval;
// cout << ib << " " << hex << vv << dec << endl;
// #endif
if (dval&(1<<(ib%8)))
hb->SetBinContent(ip+1,1+bitOffset[ib]);
else
hb->SetBinContent(ip+1,bitOffset[ib]);
}
}
// #ifdef ADCSAR2
// //this is a deserializer similar to MYTHEN!
// hb=bitHisto[0];
// int adcvalue=0;
// // int startbit= ig;
// for (int jj=0;jj<8;jj++){
// adcvalue=adcvalue+ (((vv1>>(jj*2)) & 0x1)<<(jj));
// }
// for (int jj=0;jj<4;jj++){
// adcvalue=adcvalue+ (((vv2>>(jj*2)) & 0x1)<<(jj+8));
// }
// hb->SetBinContent(ip+1, adcvalue);
// printf(" %d 0x%x 0x%x adc=%d \n", i, vv1, vv2, adcvalue);
// #endif
}
}
} else {
ii=0;
int iii=0;
int nb=dbitlist.size();
for (const auto &value : dbitlist) {
ib=value;
hb=bitHisto[ib];
cout << dec <<endl << "Bit " << ib << " " << (nDigitalSamples-dBitOffset)/8 << endl;
iii=0;
for (ip=0; ip<(nDigitalSamples-dBitOffset)/8; ip++) {
if (bitPlotFlag[ib]) {
dval=*(d_data+ii*nDigitalSamples/8+ip);
for (int jj=0; jj<8; jj++) {
if (dval&(1<<jj))
hb->SetBinContent(iii,1+bitOffset[ib]);
else
hb->SetBinContent(iii,bitOffset[ib]);
iii++;
}
}
}
ii++;
}
}
Draw();
// iScanStep++;
if (photonFinder)
photonFinder->newFrame();
return i;
}
return 0;
}
void ctbAcquisition::Draw(){
if (globalPlot) {
// TThread::Lock();
cout << "Draw" << endl;
if (myCanvas && globalPlot!=0) {
myCanvas->cd();
myCanvas->Modified();
myCanvas->Update();
}
// TThread::UnLock();
}
}
void ctbAcquisition::changePlot(){
if (rbPlotOff->IsOn()) {
globalPlot=0;
} else {
globalPlot=0;
for (int ii=0; ii<NADCS; ii++)
if (plotFlag[ii]==1) globalPlot=1;
for (int ii=0; ii<NSIGNALS; ii++)
if (bitPlotFlag[ii]==1) globalPlot=1;
}
if (globalPlot!=0 && myCanvas) {
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 (h2DMap)
h2DMap->Draw("colz");
else if (h1DMap)
h1DMap->Draw();
else
cout << "h2DMap and h1DMap are 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 (h2DMap) delete h2DMap;
if (h1DMap) delete h1DMap;
// if (h2Scan) delete h2Scan;
h2DMap=NULL;
h1DMap=NULL;
// h2Scan=NULL;
photonFinder=NULL;
dataStructure=NULL;
commonMode=NULL;
TH2F *h2DMapOld=h2DMap;
// TH2F *h2ScanOld=h2Scan;
TH1F *h1DMapOld=h1DMap;
int dim=2;
int nx,ny;
int csize=3;
int nsigma=5;
commonModeSubtraction* cm=0;
eNumCount->SetState(kFALSE);
eDynRange->SetState(kFALSE);
eSerOff->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:
dataStructure=new moench04CtbReceiverData();
cout << "MOENCH 0.4!" << endl;
commonMode=new moench03CommonMode();
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();
}
// 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) {
h2DMap=new TH2F("h2dmap","",nx,0,xmax,ny,0,ymax);
h2DMap->SetStats(kFALSE);
cout << "Created h2DMap"<< 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; ii<NADCS; ii++)
// if (plotFlag[ii]==1) globalPlot=1;
// // if (globalPlot) Draw();
}
void ctbAcquisition::setBitGraph(int i ,int en, Pixel_t col) {
char name[100];
// TList *l= mgAdcs->GetListOfGraphs();
sprintf(name,"bit%d",i);
// TList *l= adcStack->GetHists();
TH1F *h=bitHisto[i];//(TH1F*)l->At(i);;
if (en) {
//cout<< "enabling plot of bit "<<i << endl;
bitPlotFlag[i]=1;
h->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<NSIGNALS; ii++) {
if (bitPlotFlag[ii]) {bitOffset[ii]=off;
off+=1.5;
cout << "bit " << ii << " offset " << bitOffset[ii] << endl;
}
}
// globalPlot=0;
// for (int ii=0; ii<NADCS; ii++)
// if (plotFlag[ii]==1) globalPlot=1;
// // if (globalPlot) Draw();
}
void ctbAcquisition::setOutdir() {
try {
myDet->setFilePath(eOutdir->GetText());
} catch (...) {
cout << "Do nothing for this error" << endl;
}
// // cout << "setting dac! "<< id << endl;
// myDet->setDAC(dacsEntry->GetIntNumber(), (slsDetectorDefs::dacIndex)id, dacsUnit->IsOn());
// getValue();
}
void ctbAcquisition::setFname() {
try {
myDet->setFileName(eFname->GetText());
} catch (...) {
cout << "Do nothing for this error" << endl;
}
// int val=myDet->setDAC(-1, (slsDetectorDefs::dacIndex)id, dacsUnit->IsOn());
// char s[100];
// sprintf(s,"%d",val);
// dacsValue->SetText(s);
// return val;
}
void ctbAcquisition::setFindex() {
try {
myDet->setFileIndex(eFindex->GetNumber());
} catch (...) {
cout << "Do nothing for this error" << endl;
}
}
void ctbAcquisition::setFsave(Bool_t b) {
try {
myDet->setFileWrite(b);
} catch (...) {
cout << "Do nothing for this error" << endl;
}
eFname->SetState(b);
eOutdir->SetState(b);
}
void ctbAcquisition::update() {
eFname->SetText((myDet->getFileName()).c_str());
eOutdir->SetText((myDet->getFilePath()).c_str());
eFindex->SetNumber(myDet->getFileIndex());
cFileSave->SetOn(myDet->getFileWrite());
eFname->SetState(cFileSave->IsOn());
eOutdir->SetState(cFileSave->IsOn());
eFindex->SetState(cFileSave->IsOn());
// eMeasurements->SetNumber(myDet->setTimer(slsDetectorDefs::MEASUREMENTS_NUMBER,-1));
setAnalogSamples(myDet->setTimer(slsDetectorDefs::ANALOG_SAMPLES,-1));
setDigitalSamples(myDet->setTimer(slsDetectorDefs::DIGITAL_SAMPLES,-1));
roMode=myDet->setReadOutFlags();
setReadoutMode(roMode);
//nChannels=myDet->getTotalNumberOfChannels();
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));
}
}
dBitOffset=myDet->getReceiverDbitOffset();
// 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; i<NADCS; i++){
// if (mask&(1<<i))
// enableFlag[i]=0;
// else
// enableFlag[i]=1;
// }
}
void ctbAcquisition::loadPattern() {
char fname[10000];
char currdir[10000];
char cdir[10000];
cout << "Load Pattern " << endl;
if (acqThread->GetState()==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->retrieveDetectorSetup(fname);
} catch (...) {
cout << "Do nothing for this error" << endl;
}
}
}
void ctbAcquisition::toggleAcquisition() {
if (acqThread->GetState()==1 || acqThread->GetState()==6) {
/** update all infos useful for the acquisition! */
setAnalogSamples(myDet->setTimer(slsDetectorDefs::ANALOG_SAMPLES,-1));
setDigitalSamples(myDet->setTimer(slsDetectorDefs::DIGITAL_SAMPLES,-1));
dBitOffset=myDet->getReceiverDbitOffset();
roMode=myDet->setReadOutFlags();
setReadoutMode(roMode);
// iScanStep=0;
cout << "Run" << endl;
bStatus->SetText("Stop");
ip=0;
for (int i=0; i<NADCS; i++) {
// cout << "reset " << i << endl;
if (adcHisto[i]->GetListOfFunctions())
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; i<NSIGNALS; i++) {
bitHisto[i]->Reset();
}
cout << "reset 2d" << endl;;
if (h2DMap) h2DMap->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->stopAcquisition();
} catch (...) {
cout << "Do nothing for this error" << endl;
}
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 " <<eMeasurements->GetNumber()<< endl;
stop=0;
for (int im=0; im<eMeasurements->GetNumber(); im++) {
try {
myDet->acquire();
} catch (...) {
cout << "Do nothing for this error" << endl;
}
cout << im << endl;
if (stop) break;
}
}
void* ctbAcquisition::ThreadHandle(void *arg)
{
ctbAcquisition *acq = static_cast<ctbAcquisition*>(arg);
int i=0;
acq->startAcquisition();
acq->acquisitionFinished();
}
int ctbAcquisition::progressCallback(double f,void* arg) {
// ctbAcquisition *acq = static_cast<ctbAcquisition*>(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() {
// myDet->setTimer(slsDetectorDefs::MEASUREMENTS_NUMBER,eMeasurements->GetNumber());
}
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; i<NADCS; i++) {
h=adcHisto[i];//(TH1F*)l->At(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; i<NSIGNALS; i++) {
h=bitHisto[i];//(TH1F*)l->At(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::readOutFlags flags=(slsDetectorDefs::readOutFlags)f;
if (flags&slsDetectorDefs::DIGITAL_ONLY) {
nAnalogSamples=0;
adclist.clear();
} else if (flags&slsDetectorDefs::ANALOG_AND_DIGITAL) {
;
}
else {
nDigitalSamples=0;
dbitlist.clear();
}
// for (int i=0; i<NADCS; i++) {
// if (flags&slsDetectorDefs::DIGITAL_ONLY) enableFlag[i]=0;
// //else enableFlag[i+NADCS]=1;
// }
// for (int i=0; i<4; i++) {
// if (flags&slsDetectorDefs::ANALOG_AND_DIGITAL) enableFlag[i+NADCS]=1;
// else enableFlag[i+NADCS]=0;
// }
updateChans();
}
void ctbAcquisition::setADCEnable(Int_t reg){
updateChans();
// int chanEnable;
}
void ctbAcquisition::setDbitEnable(Int_t reg){
updateChans();
// int chanEnable;
}
void ctbAcquisition::updateChans() {
/** dbitlist updated */
std::vector <int> dbl;
try {
dbl = myDet->getReceiverDbitList();
} catch (...) {
cout << "Do nothing for this error" << endl;
}
dbitlist.clear();
if (dbl.empty())
;
else {
for (const auto &value : dbl)
dbitlist.push_back(value);
}
uint32_t reg;
try {
reg=myDet->getADCEnableMask();
} catch (...) {
cout << "Do nothing for this error" << endl;
}
/* adc updated */
adclist.clear();
// // updateChans();
if (reg!=0xffffffff) {
for (int i=0; i<NADCS; i++) {
if (reg&(1<<i))
adclist.push_back(i);
// // else enableFlag[i]=1;
}
}
}
void ctbAcquisition::resetPedestal() {
if (photonFinder) {
photonFinder->newDataSet();
};
}
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(){
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(){
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(){
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());
}
}
};
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 (h2DMap) {
h2DMap->SetMaximum( eMaxPedSub->GetNumber());
h2DMap->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 (h2DMap) {
h2DMap->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 (h2DMap) {
h2DMap->SetMaximum( eMaxRaw->GetNumber());
h2DMap->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 (h2DMap) {
h2DMap->GetZaxis()->UnZoom();
}
if (h1DMap) {
h1DMap->GetYaxis()->UnZoom();
}
if (countsStack->GetHistogram())
countsStack->GetHistogram()->GetXaxis()->UnZoom();
}
}
}