diff --git a/ClassData.h b/ClassData.h index b08d0af..3683e8c 100644 --- a/ClassData.h +++ b/ClassData.h @@ -23,10 +23,9 @@ class Data{ unsigned short boardSN; float ch2ns; - unsigned int nByte; /// number of byte + unsigned int nByte; /// number of byte from read buffer char *buffer; /// readout buffer - uint32_t AllocatedSize; - uint32_t BufferSize; + uint32_t AllocatedSize; double TriggerRate[MaxNChannels]; /// Hz unsigned long TotNumEvents[MaxNChannels]; @@ -52,7 +51,7 @@ class Data{ Data(); ~Data(); - void Allocate10MBMemory(); + void Allocate80MBMemory(); void AllocateMemory(uint32_t size); void SetSaveWaveToMemory(bool OnOff) { this->SaveWaveToMemory = OnOff; } @@ -61,6 +60,8 @@ class Data{ void ClearTriggerRate(); void ClearBuffer(); + void CopyBuffer( const char * buffer, const unsigned int size); + void SaveBuffer(const char * fileName); unsigned int GetPresentFileSize() {return presentFileSizeByte;} @@ -115,15 +116,14 @@ inline Data::~Data(){ } inline void Data::AllocateMemory(uint32_t size){ - delete buffer; - printf("===== size : %u \n", size); - BufferSize = size; - buffer = (char *) malloc( BufferSize); - printf("Allocated %u byte for buffer = %u words\n", BufferSize, BufferSize / 4); + ClearBuffer(); + AllocatedSize = size; + buffer = (char *) malloc( AllocatedSize); + printf("Allocated %u byte for buffer = %u words\n", AllocatedSize, AllocatedSize / 4); } -inline void Data::Allocate10MBMemory(){ - AllocateMemory( 10 * 1024 * 1024 ); /// 10 M Byte +inline void Data::Allocate80MBMemory(){ + AllocateMemory( 80 * 1024 * 1024 ); /// 80 M Byte } inline void Data::ClearTriggerRate(){ @@ -136,7 +136,6 @@ inline void Data::ClearTriggerRate(){ inline void Data::ClearData(){ nByte = 0; AllocatedSize = 0; - BufferSize = 0; IsNotRollOverFakeAgg = true; for( int i = 0 ; i < MaxNChannels; i++){ NumEvents[i] = 0; @@ -162,10 +161,14 @@ inline void Data::ClearData(){ inline void Data::ClearBuffer(){ delete buffer; - BufferSize = 0; + AllocatedSize = 0; nByte = 0; } +inline void Data::CopyBuffer(const char * buffer, const unsigned int size){ + std::memcpy(this->buffer, buffer, size); +} + inline void Data::SaveBuffer(const char * fileName){ char saveFileName[100]; @@ -186,6 +189,7 @@ inline void Data::SaveBuffer(const char * fileName){ fwrite(buffer, nByte, 1, haha); presentFileSizeByte = ftell(haha); + printf("=========== file Size : %u Byte = %.2f MB\n", presentFileSizeByte, presentFileSizeByte/1024./1024.); fclose(haha); } @@ -259,7 +263,7 @@ inline void Data::DecodeBuffer(bool fastDecode, int verbose){ unsigned int word = ReadBuffer(nw, verbose); if( ( (word >> 28) & 0xF ) == 0xA ) { /// start of Board Agg unsigned int nWord = word & 0x0FFFFFFF ; - if( verbose >= 1 ) printf("Number of words in this Agg : %u \n", nWord); + if( verbose >= 1 ) printf("Number of words in this Agg : %u = %u Byte\n", nWord, nWord * 4); nw = nw + 1; word = ReadBuffer(nw, verbose); unsigned int BoardID = ((word >> 27) & 0x1F); @@ -330,7 +334,7 @@ inline int Data::DecodePHADualChannelBlock(unsigned int ChannelMask, bool fastDe nSample = ( word & 0xFFFF ) * 8; extra2Option = ( (word >> 24 ) & 0x7 ); hasExtra2 = ( (word >> 28 ) & 0x1 ); - if( !fastDecode) { + if( !fastDecode || verbose >= 2){ unsigned int digitalProbe = ( (word >> 16 ) & 0xF ); unsigned int analogProbe2 = ( (word >> 20 ) & 0x3 ); unsigned int analogProbe1 = ( (word >> 22 ) & 0x3 ); @@ -389,7 +393,7 @@ inline int Data::DecodePHADualChannelBlock(unsigned int ChannelMask, bool fastDe } } } - nEvents = aggSize / (nSample/2 + 2 + hasExtra2 ); + nEvents = (aggSize - 2) / (nSample/2 + 2 + hasExtra2 ); if( verbose >= 2 ) printf("-------------------nEvents : %d \n", nEvents); }else{ if( verbose >= 2 ) printf("does not has format info. unable to read buffer.\n"); @@ -418,33 +422,40 @@ inline int Data::DecodePHADualChannelBlock(unsigned int ChannelMask, bool fastDe nw += nSample/2; }else{ for( int wi = 0; wi < nSample/2; wi++){ - nw = nw +1 ; word = ReadBuffer(nw, verbose - 2); + nw = nw +1 ; word = ReadBuffer(nw, verbose-2); + ///The CAEN manual is wrong, the bit [31:16] is anaprobe 1 bool isTrigger1 = (( word >> 31 ) & 0x1 ); bool dp1 = (( word >> 30 ) & 0x1 ); unsigned short wave1 = (( word >> 16) & 0x3FFF); - + ///The CAEN manual is wrong, the bit [31:16] is anaprobe 2 bool isTrigger0 = (( word >> 15 ) & 0x1 ); bool dp0 = (( word >> 14 ) & 0x1 ); unsigned short wave0 = ( word & 0x3FFF); + if( wave0 >= 0x3FF0 ) wave0 = 0; if( SaveWaveToMemory){ if( hasDualTrace ){ - tempWaveform1.push_back(wave0); - tempWaveform2.push_back(wave1); + tempWaveform1.push_back(wave1); + tempWaveform2.push_back(wave0); + tempDigiWaveform1.push_back(dp0); }else{ - tempWaveform1.push_back(wave0); tempWaveform1.push_back(wave1); + tempWaveform1.push_back(wave0); + tempDigiWaveform1.push_back(dp0); + tempDigiWaveform1.push_back(dp1); } - tempDigiWaveform1.push_back(dp0); - tempDigiWaveform1.push_back(dp1); } if( isTrigger0 == 1 ) triggerAtSample = 2*wi ; if( isTrigger1 == 1 ) triggerAtSample = 2*wi + 1; if( verbose >= 4 && ev == 0 ){ - printf("%4d| %5d, %d, %d \n", 2*wi, wave0, dp0, isTrigger0); - printf("%4d| %5d, %d, %d \n", 2*wi+1, wave1, dp1, isTrigger1); + if( !hasDualTrace ){ + printf("%4d| %5d, %d, %d \n", 2*wi, wave0, dp0, isTrigger0); + printf("%4d| %5d, %d, %d \n", 2*wi+1, wave1, dp1, isTrigger1); + }else{ + printf("%4d| %5d, %5d | %d, %d | %d %d\n", wi, wave0, wave1, dp0, dp1, isTrigger0, isTrigger1); + } } } @@ -469,7 +480,7 @@ inline int Data::DecodePHADualChannelBlock(unsigned int ChannelMask, bool fastDe unsigned long long timeStamp = (extTimeStamp << 31) ; timeStamp = timeStamp + timeStamp0; - if( verbose >= 2) printf("extra2 : 0x%0X, TimeStamp : %llu\n", extra2, timeStamp); + if( verbose >= 2 && hasExtra2 ) printf("extra2 : 0x%0X, TimeStamp : %llu\n", extra2, timeStamp); nw = nw +1 ; word = ReadBuffer(nw, verbose); unsigned int extra = (( word >> 16) & 0x3FF); unsigned int energy = (word & 0x7FFF); @@ -589,7 +600,7 @@ inline int Data::DecodePSDDualChannelBlock(unsigned int ChannelMask, bool fastDe } } - nEvents = aggSize / (nSample/2 + 2 + hasExtra ); + nEvents = (aggSize -2) / (nSample/2 + 2 + hasExtra ); if( verbose >= 2 ) printf("----------------- nEvents : %d \n", nEvents); ///========= Decode an event diff --git a/ClassDigitizer.cpp b/ClassDigitizer.cpp index a9a504f..4afe647 100644 --- a/ClassDigitizer.cpp +++ b/ClassDigitizer.cpp @@ -306,9 +306,9 @@ int Digitizer::ProgramPHABoard(){ ret |= CAEN_DGTZ_WriteRegister(handle, (uint32_t)(Register::DPP::PreTrigger) + 0x7000 , 124 ); ret |= CAEN_DGTZ_WriteRegister(handle, (uint32_t)(Register::DPP::InputDynamicRange) + 0x7000 , 0x0 ); - ret |= CAEN_DGTZ_WriteRegister(handle, (int32_t)(Register::DPP::NumberEventsPerAggregate_G) + 0x7000, 10); + ret |= CAEN_DGTZ_WriteRegister(handle, (int32_t)(Register::DPP::NumberEventsPerAggregate_G) + 0x7000, 511); ret |= CAEN_DGTZ_WriteRegister(handle, (int32_t)(Register::DPP::AggregateOrganization), 0); - ret |= CAEN_DGTZ_WriteRegister(handle, (int32_t)(Register::DPP::MaxAggregatePerBlockTransfer), 200); + ret |= CAEN_DGTZ_WriteRegister(handle, (int32_t)(Register::DPP::MaxAggregatePerBlockTransfer), 4); ret |= CAEN_DGTZ_WriteRegister(handle, (int32_t)(Register::DPP::DPPAlgorithmControl) + 0x7000, 0xe30200f); if( ret != 0 ) { printf("==== set channels error.\n"); return 0;} @@ -325,7 +325,13 @@ int Digitizer::ProgramPHABoard(){ void Digitizer::StartACQ(){ if ( AcqRun ) return; - data->AllocateMemory(CalByteForBuffer()); + unsigned int bufferSize = CalByteForBuffer(); + if( bufferSize > 80 * 1024 * 1024 ){ + printf("============= buffer size bigger than 80 MB"); + return; + } + + data->AllocateMemory(bufferSize); ret = CAEN_DGTZ_SWStartAcquisition(handle); if( ret != 0 ) { @@ -352,11 +358,13 @@ unsigned int Digitizer::CalByteForBuffer(){ unsigned int boardCfg ; unsigned int eventAgg[NChannel/2]; unsigned int recordLength[NChannel/2]; + unsigned int aggOrgan; if( isConnected ){ numAggBLT = ReadRegister(Register::DPP::MaxAggregatePerBlockTransfer, 0, false); chMask = ReadRegister(Register::DPP::ChannelEnableMask, 0, false); boardCfg = ReadRegister(Register::DPP::BoardConfiguration, 0, false); + aggOrgan = ReadRegister(Register::DPP::AggregateOrganization, 0, false); for( int pCh = 0; pCh < NChannel/2; pCh++){ eventAgg[pCh] = ReadRegister(Register::DPP::NumberEventsPerAggregate_G, pCh * 2 , false); @@ -366,33 +374,37 @@ unsigned int Digitizer::CalByteForBuffer(){ numAggBLT = GetSettingFromMemory(Register::DPP::MaxAggregatePerBlockTransfer); chMask = GetSettingFromMemory(Register::DPP::ChannelEnableMask); boardCfg = GetSettingFromMemory(Register::DPP::BoardConfiguration); + aggOrgan = GetSettingFromMemory(Register::DPP::AggregateOrganization); for( int pCh = 0; pCh < NChannel/2; pCh++){ eventAgg[pCh] = GetSettingFromMemory(Register::DPP::NumberEventsPerAggregate_G, pCh * 2 ); recordLength[pCh] = GetSettingFromMemory(Register::DPP::RecordLength_G, pCh * 2); } } + printf(" agg. orgainzation (bit) : 0x%X \n", aggOrgan); printf(" Channel Mask : %04X \n", chMask); printf("Max number of Agg per Readout : %u \n", numAggBLT); printf(" is Extra2 enabed : %u \n", ((boardCfg >> 17) & 0x1) ); + printf(" is Record wave : %u \n", ((boardCfg >> 16) & 0x1) ); for( int pCh = 0; pCh < NChannel/2; pCh++){ - printf("Paired Ch : %d, RecordLength (bit value): %u, Event per Agg. : %u \n", pCh, recordLength[pCh], eventAgg[pCh]); + printf("Paired Ch : %d, RecordLength (bit value): %u, Event per Agg. : %u \n", pCh, recordLength[pCh], eventAgg[pCh]); } unsigned int bufferSize = 0; for( int pCh = 0; pCh < NChannel/2 ; pCh++){ if( (chMask & ( 3 << (2 * pCh) )) == 0 ) continue; - bufferSize += 2 + ( 2 + ((boardCfg >> 17) & 0x1) + recordLength[pCh]*4 ) * eventAgg[pCh] ; + bufferSize += 2 + ( 2 + ((boardCfg >> 17) & 0x1) + ((boardCfg >> 16) & 0x1)*recordLength[pCh]*4 ) * eventAgg[pCh] ; } bufferSize += 4; /// Bd. Agg Header bufferSize = bufferSize * numAggBLT * 4; /// 1 words = 4 byte - printf("================ Buffer Size : %d Byte \n", bufferSize ); + printf("=============== Buffer Size : %8d Byte \n", bufferSize ); return bufferSize ; } void Digitizer::ReadData(){ if( !isConnected ) return; + if( !AcqRun) return; if( data->buffer == NULL ) { printf("need allocate memory for readout buffer\n"); return; diff --git a/FSUDAQ.cpp b/FSUDAQ.cpp index 60e2eac..21d1d3e 100644 --- a/FSUDAQ.cpp +++ b/FSUDAQ.cpp @@ -149,6 +149,7 @@ MainWindow::MainWindow(const TGWindow *p,UInt_t w,UInt_t h) { cbMode->AddEntry("Data Run", Mode_DataRun); cbMode->Select(1, false); cbMode->Resize(80, 20); + cbMode->Connect("Changed()", "MainWindow", this, "ChangePlot()"); TGHorizontalFrame *hfg1 = new TGHorizontalFrame(vframe); vframe->AddFrame(hfg1 ,new TGLayoutHints(kLHintsLeft, 0, 0, 0, 0)); @@ -224,17 +225,17 @@ MainWindow::MainWindow(const TGWindow *p,UInt_t w,UInt_t h) { LogMsg((char*)"The LogMsg is not complete for all actions. [update later]"); LogMsg((char*)"Please \"Open Digitizers\" to start."); - //HandleMenu(M_DIGITIZER_OPEN); - //HandleMenu(M_BOARD_SETTINGS); - //HandleMenu(M_CH_SETTING_PHA); + HandleMenu(M_DIGITIZER_OPEN); + HandleMenu(M_BOARD_SETTINGS); + HandleMenu(M_CH_SETTING_PHA); //HandleMenu(M_CH_SETTING_PSD); //HandleMenu(M_REGISTER_SETTING); //HandleMenu(M_TRIGGER_SUMMARY); - gAnaTrace1 = new TGraph(); - gAnaTrace2 = new TGraph(); - gDigiTrace1 = new TGraph(); - gDigiTrace2 = new TGraph(); + gAnaTrace1 = new TGraph(); gAnaTrace1->GetYaxis()->SetRangeUser(0, 0x3FFF); + gAnaTrace2 = new TGraph(); gAnaTrace2->SetLineColor(2); + gDigiTrace1 = new TGraph(); gDigiTrace1->SetLineColor(4); + gDigiTrace2 = new TGraph(); gDigiTrace2->SetLineColor(6); gStyle->SetOptStat("neiou"); @@ -438,7 +439,7 @@ void MainWindow::OpenDigitizers(){ for( int i = 0; i < nDigi; i++){ hChannel[i] = new TH1F(Form("hBd%02d", i),Form("hBd%02d; ch; count", i), digi[i]->GetNChannel(), 0, digi[i]->GetNChannel()); - for( int j = 0; j < MaxNChannels; j++) hEnergy[i][j] = new TH1F(Form("hE%02dch%02d", i, j),Form("hE bd-%02d ch-%02d; Energy[ch]; count", i, j), 400, 0, 20000); + for( int j = 0; j < MaxNChannels; j++) hEnergy[i][j] = new TH1F(Form("hE%02dch%02d", i, j),Form("hE bd-%02d ch-%02d; Energy[ch]; count", i, j), 400, 0, 30000); } } @@ -597,7 +598,7 @@ void MainWindow::LogMsg(char * msg){ teLog->AddLine(outMsg); printf("%s\n", outMsg.Data()); - teLog->LineDown(); + //teLog->LineDown(); teLog->ShowBottom(); } @@ -606,42 +607,48 @@ void MainWindow::PlotSingleTrace(){ printf("=== %s\n", __func__); if( digi == NULL ) return; - + int boardID = boardIDEntry->GetNumber(); int chID = chIDEntry->GetNumber(); + + uint32_t bdConfig = digi[boardID]->GetSettingFromMemory(Register::DPP::BoardConfiguration); + bool isDualTrace = ( bdConfig >> 11 ) & 0x1; + bool isRecordWave = ( bdConfig >> 16 ) & 0x1; + if( !isRecordWave ) { + LogMsg((char *) "Please enable trace recording."); + return; + } + Data * data = digi[boardID]->GetData(); int ch2ns = (int) digi[boardID]->GetCh2ns(); digi[boardID]->StartACQ(); int count = 0; - while(count < 10){ usleep(100*1000); /// wait half sec digi[boardID]->ReadData(); if( data->nByte > 0 ){ - data->DecodeBuffer(0); + data->DecodeBuffer(false, 2); data->PrintStat(); - - gDigiTrace1->SetLineColor(4); - + int traceLength = (data->Waveform1[chID][0]).size(); - printf("0----------%d \n", traceLength); - if( traceLength == 0 ) { LogMsg((char *)"no trace"); bFitTrace->SetEnabled(false); }else{ for( int i = 0; i < traceLength ; i++) { - gAnaTrace1->SetPoint(i, i*ch2ns, (data->Waveform1[chID][0])[i]); + gAnaTrace1->SetPoint(i, i*ch2ns*(1+isDualTrace), (data->Waveform1[chID][0])[i]); + if( isDualTrace) gAnaTrace2->SetPoint(i, i*ch2ns*(1+isDualTrace), (data->Waveform2[chID][0])[i]); } if( traceLength <= gAnaTrace1->GetN() ){ for( int i = gAnaTrace1->GetN() -1 ; i >= traceLength ; i--){ gAnaTrace1->RemovePoint(i); + if( isDualTrace) gAnaTrace2->RemovePoint(i); gDigiTrace1->RemovePoint(i); } } @@ -649,13 +656,16 @@ void MainWindow::PlotSingleTrace(){ double xmin, xmax, ymin, ymax; gAnaTrace1->ComputeRange(xmin, ymin, xmax, ymax); for( int i = 0; i < traceLength ; i++) { - gDigiTrace1->SetPoint(i, i*ch2ns, (ymax-ymin)*(data->DigiWaveform1[chID][0])[i] + ymin); + gDigiTrace1->SetPoint(i, i*ch2ns*(1+isDualTrace), (ymax-ymin)*(data->DigiWaveform1[chID][0])[i] + ymin); } } data->ClearData(); fEcanvas->GetCanvas()->cd(); + + gAnaTrace1->GetYaxis()->SetRangeUser(0, 0x3FFF); gAnaTrace1->Draw("APL"); + gAnaTrace2->Draw("L"); gDigiTrace1->Draw("L"); fEcanvas->GetCanvas()->Update(); break; @@ -716,6 +726,28 @@ void MainWindow::FitTrace(){ } +void MainWindow::ChangePlot(){ + int boardID = boardIDEntry->GetNumber(); + int ch = chIDEntry->GetNumber(); + + fEcanvas->GetCanvas()->cd(); + if( cbMode->GetSelected() == Mode_CountHist ) hChannel[boardID]->Draw("hist"); + + if( cbMode->GetSelected() == Mode_EnergyHist ) hEnergy[boardID][ch]->Draw("hist"); + + if( cbMode->GetSelected() == Mode_Oscilloscope ){ + uint32_t bdConfig = digi[boardID]->GetSettingFromMemory(Register::DPP::BoardConfiguration); + bool isDualTrace = ( bdConfig >> 11 ) & 0x1; + gAnaTrace1->GetYaxis()->SetRangeUser(0, 0x3FFF); + gAnaTrace1->Draw("APL"); + if( isDualTrace ) gAnaTrace2->Draw("L"); + gDigiTrace1->Draw("L"); + } + + fEcanvas->GetCanvas()->Update(); + +} + //TODO use the ptr to tell which board, and each digitizer has an indivual thread for savign data and filling hists. void * MainWindow::RunThread(void * ptr){ printf("=== %s\n", __func__); @@ -732,11 +764,13 @@ void * MainWindow::RunThread(void * ptr){ uint32_t ElapsedTime = 0; TString dataFileName = ProgramSetting::DataSavingPath + dataPrefix->GetText(); - //dataFileName += Form("_run%03d_%03d_%3s", (int) runIDEntry->GetNumber(), (int) digi[boardID]->GetSerialNumber(), digi[boardID]->GetDPPStringShort().c_str()); dataFileName += Form("_run%03d", (int) runIDEntry->GetNumber()); printf("|%s|\n", dataFileName.Data()); + uint32_t bdConfig = digi[boardID]->GetSettingFromMemory(Register::DPP::BoardConfiguration); + bool isDualTrace = ( bdConfig >> 11 ) & 0x1; + Data * data = digi[boardID]->GetData(); while(digi[boardID]->IsRunning()){ @@ -748,13 +782,13 @@ void * MainWindow::RunThread(void * ptr){ ch2ns = (int) digi[boardID]->GetCh2ns(); ch = chIDEntry->GetNumber(); - if( data->nByte > 0 ){ //data->PrintStat(); if( cbMode->GetSelected() == Mode_DataRun ){ // Rate graph? data->SaveBuffer(dataFileName.Data()); + data->DecodeBuffer(true, 0); std::string msg = Form("File Size : %.2f MB", data->GetPresentFileSize() / 1024./1024. ); teLog->AddLine(msg.c_str()); teLog->LineDown(); @@ -762,7 +796,7 @@ void * MainWindow::RunThread(void * ptr){ }else{ - data->DecodeBuffer(0); + data->DecodeBuffer(false, 0); fEcanvas->GetCanvas()->cd(); @@ -773,15 +807,19 @@ void * MainWindow::RunThread(void * ptr){ traceLength = (data->Waveform1[ch][nData-1]).size(); if( traceLength > 0 ){ for( int i = 0; i < traceLength; i++) { - gAnaTrace1->SetPoint(i, i*ch2ns, (data->Waveform1[ch][nData-1])[i]); + gAnaTrace1->SetPoint(i, i*ch2ns*(1+isDualTrace), (data->Waveform1[ch][nData-1])[i]); + if( isDualTrace) gAnaTrace2->SetPoint(i, i*ch2ns*(1+isDualTrace), (data->Waveform2[ch][nData-1])[i]); } if( traceLength <= gAnaTrace1->GetN() ){ for( int i = gAnaTrace1->GetN() -1 ; i >= traceLength ; i--){ gAnaTrace1->RemovePoint(i); + if( isDualTrace) gAnaTrace2->RemovePoint(i); } - } + } + gAnaTrace1->GetYaxis()->SetRangeUser(0, 0x3FFF); gAnaTrace1->Draw("APL"); + gAnaTrace2->Draw("L"); } } @@ -799,11 +837,9 @@ void * MainWindow::RunThread(void * ptr){ } ///Fill Energy histogram - //for( int ch = 0; ch < digi[boardID]->GetNChannel(); ch++){ - for( int i = 0; i < data->NumEvents[ch]; i++){ - hEnergy[boardID][ch]->Fill( data->Energy[ch][i]); - } - //} + for( int i = 0; i < data->NumEvents[ch]; i++){ + hEnergy[boardID][ch]->Fill( data->Energy[ch][i]); + } if( cbMode->GetSelected() == Mode_EnergyHist ) hEnergy[boardID][ch]->Draw("hist"); if( cbMode->GetSelected() == Mode_CountHist ) hChannel[boardID]->Draw("hist"); diff --git a/FSUDAQ.h b/FSUDAQ.h index ad7c140..3b85792 100644 --- a/FSUDAQ.h +++ b/FSUDAQ.h @@ -93,7 +93,7 @@ public: void PlotSingleTrace(); void FitTrace(); - void Oscilloscope(); + void ChangePlot(); void OpenChannelSetting(Int_t); void UpdateChannelSetting(); diff --git a/Makefile b/Makefile index 6dcd965..b0868ed 100755 --- a/Makefile +++ b/Makefile @@ -35,7 +35,7 @@ test_indep : test_indep.cpp RegisterAddress.h macro.h @echo "--------- making test_indep" $(CC) $(COPTS) -o test_indep test_indep.cpp $(CAENLIBS) -FSUDAQ : FSUDAQDict.cxx $(OBJS) +FSUDAQ : FSUDAQDict.cxx $(OBJS) ClassData.h @echo "----------- creating FSUDAQ" $(CC) $(COPTS) FSUDAQDict.cxx $(OBJS) -o FSUDAQ $(CAENLIBS) $(ROOTLIBS) diff --git a/boardSetting.cpp b/boardSetting.cpp index fc65da5..a062a53 100644 --- a/boardSetting.cpp +++ b/boardSetting.cpp @@ -1429,7 +1429,7 @@ void BoardSetting::ReadData(){ } Data * data = digi[boardID]->GetData(); - data->AllocateMemory(); + data->Allocate80MBMemory(); data->DPPType = digi[boardID]->GetDPPType(); digi[boardID]->ReadData(); diff --git a/channelSettingPHA.cpp b/channelSettingPHA.cpp index 538b091..6d51547 100644 --- a/channelSettingPHA.cpp +++ b/channelSettingPHA.cpp @@ -86,8 +86,8 @@ ChannelSettingPHA::ChannelSettingPHA(const TGWindow *p, UInt_t w, UInt_t h, Digi ///----------- Polarity TGLabel * lbPol = new TGLabel(vfInput1, "Polarity");vfInput1->AddFrame(lbPol, layoutHintsR); cbPolarity = new TGComboBox(vfInput2); vfInput2->AddFrame(cbPolarity, layoutHints); - cbPolarity->AddEntry("Positive +", 1); - cbPolarity->AddEntry("Negative -", 0); + cbPolarity->AddEntry("Positive +", 0); + cbPolarity->AddEntry("Negative -", 1); cbPolarity->Resize(width, 20); cbPolarity->Connect("Selected(Int_t, Int_t)", "ChannelSettingPHA", this, "SetDPPAlgorithm1()"); diff --git a/test.cpp b/test.cpp index 83db752..2f698a9 100644 --- a/test.cpp +++ b/test.cpp @@ -92,31 +92,47 @@ int main(int argc, char* argv[]){ //dig->PrintSettingFromMemory(); - //dig->WriteRegister(Register::DPP::SoftwareClear_W, 1); + dig->WriteRegister(Register::DPP::SoftwareClear_W, 1); ///dig->SaveSettingAsText("haha.txt"); - /**** + std::remove("Test_323_139_000.fsu"); + {///============ Checking the buffer size calculation - unsigned short B = 1; /// BLT - unsigned short Eg = 10; /// Event / dual channel - unsigned short E2 = 1; /// extra 2; - unsigned short RL = 250; /// record Length + unsigned short B = 10; /// BLT + unsigned short Eg = 511; /// Event / dual channel + bool DT = 1; /// dual trace + bool E2 = 1; /// extra 2; + bool Wr = 1; /// wave record; + unsigned short AP2 = 0; /// 00 = input, 01 = Threshold, 10 = Trapezoid - Baseline, 11 = baseline + unsigned short AP1 = 1; /// 00 = input, 01 = RC-CR, 10 = RC-CR2, 11 = Trapezoid + unsigned short DP1 = 0x0000; /// peaking, + unsigned short RL = 100; /// record Length + unsigned short AO = 0x0; - //for( int i = 0; i < dig->GetNChannel(); i++){ - // dig->WriteRegister(Register::DPP::NumberEventsPerAggregate_G, Eg, i); - // dig->WriteRegister(Register::DPP::RecordLength_G, RL, i); - //} - //dig->WriteRegister(Register::DPP::MaxAggregatePerBlockTransfer, B, 0); - //dig->WriteRegister(Register::DPP::BoardConfiguration, 0x0F8115); /// has Extra2 - //dig->WriteRegister(Register::DPP::BoardConfiguration, 0x0D8115); /// no Extra2 + for( int i = 0; i < dig->GetNChannel(); i++){ + dig->WriteRegister(Register::DPP::NumberEventsPerAggregate_G, Eg, i); + dig->WriteRegister(Register::DPP::RecordLength_G, RL, i); + } + dig->WriteRegister(Register::DPP::MaxAggregatePerBlockTransfer, B); + dig->WriteRegister(Register::DPP::AggregateOrganization, AO); + + uint32_t bit = 0x0C0115; + bit += (DT << 11); + bit += (AP1 << 12); + bit += (AP2 << 14); + bit += (Wr << 16); + bit += (E2 << 17); + bit += (DP1 << 20); + + printf("---- Bd Config : 0x%08X \n", bit); + + dig->WriteRegister(Register::DPP::BoardConfiguration, bit); unsigned int bSize = dig->CalByteForBuffer(); - int bbbb = (((2 + E2 + RL*4) * Eg + 2)*8 + 4)*B *4; - int bbb2 = (((2 + E2 + RL*4) * Eg + 2)*3 + 4)*B *4; - printf("============== exp Buffer size : %8u byte \n", bbbb); - printf("============== exp 3 ch size : %8u byte = %u words\n", bbb2, bbb2/4); + int bbbb = (((2 + E2 + Wr*RL*4) * Eg + 2)*8 + 2)*B *4 *2 + 4 * 4; + printf("=========== exp Buffer size : %8u byte \n", bbbb); usleep(1e6); @@ -126,22 +142,25 @@ int main(int argc, char* argv[]){ CAEN_DGTZ_MallocReadoutBuffer(dig->GetHandle(), (char **)& buffer, &size); printf("CAEN calculated Buffer Size : %8u byte = %.2f MB \n", size, size/1024./1024.); - printf(" diff : %8u byte \n", size > bSize ? size - bSize : bSize - size); + printf(" diff : %8u byte \n", size > 2*bSize ? size - 2*bSize : 2*bSize - size); delete buffer; - }*/ + }/**/ + + dig->GetData()->SetSaveWaveToMemory(true); dig->StartACQ(); - for( int i = 0; i < 5; i++){ + for( int i = 0; i < 2; i++){ usleep(1000000); dig->ReadData(); printf("------------------- %d\n", i); unsigned long time1 = get_time(); - dig->GetData()->DecodeBuffer(true,0); + dig->GetData()->DecodeBuffer(false,4); unsigned long time2 = get_time(); printf("********************* decode time : %lu usec\n", time2-time1); dig->GetData()->PrintStat(); + //dig->GetData()->SaveBuffer("Test"); } dig->StopACQ();