From 27576d301d61cf9fc83a6a7db316f9c0d9c311d4 Mon Sep 17 00:00:00 2001 From: "Ryan@WorkStation" Date: Mon, 9 Jan 2023 15:11:16 -0500 Subject: [PATCH] test_indep.cpp is done compare speed for 2 readout method --- test_indep.cpp | 232 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 165 insertions(+), 67 deletions(-) diff --git a/test_indep.cpp b/test_indep.cpp index 2c443f1..2a1f34d 100644 --- a/test_indep.cpp +++ b/test_indep.cpp @@ -4,10 +4,129 @@ #include #include #include +#include // time in nano-sec + +void RawDecorder(uint8_t * data, size_t size, int verbose = 0){ + uint64_t haha ; + unsigned short dataType; + + int word = 0; + int traceWord = -2; + for( int i =0 ; i < ((int)size / 8) ; i++){ + + ///the data is array of 1 byte. + /// by get the point of the data[8*i] + /// cast it into uint64_t pointer, that will get 8 bytes all togteher + /// get this point value, and bit swap it. + haha = __builtin_bswap64(*(uint64_t *)&(data[8*i])); + if (verbose > 0 ) printf("%7d | %3d | %3d | 0x%016lX \n", i, word, traceWord, haha); + + if ( word == 0 ){ /// aggregation header, or start header, or end header + dataType = ( haha >> 56 ) & 0xFF ; + if ( verbose> 0 & dataType == 0x30 ) printf("====== start Run data\n"); + if ( verbose> 0 & dataType == 0x32 ) printf("====== Stop Run data\n"); + if ( verbose> 0 & (dataType >> 4) == 0x2 ) printf("====== data aggregation start\n"); + }else{ + + + if( dataType == 0x30 ){ + if( word == 1){ + if( (haha & 0xFFFFFFFF) != 0x2000000) printf("*** something wrong.\n"); + } + uint64_t channelMask; + if( word == 2){ + channelMask = ( haha & 0xFFFFFFFF ); + } + if( word == 3){ + channelMask += (( haha & 0xFFFFFFFF ) << 32); + if (verbose > 0 ) printf("Channel mask : 0x%016lX\n", channelMask); + } + + } + + if( (dataType >> 4 ) == 0x2 ) { + unsigned short chID ; + uint64_t timestamp ; + bool hasTrace; + unsigned short fl ; // flag low + unsigned short fh ; // flog hight + unsigned short energy ; + unsigned short fTime ; + + unsigned short traceLength; + + unsigned short anaProb0[512]; + unsigned short anaProb1[512]; + bool digProb0[512]; + bool digProb1[512]; + bool digProb2[512]; + bool digProb3[512]; + + if( word == 1){ + chID = ((haha >> 56) & 0x7F); + timestamp = (haha & 0xFFFFFFFFFFFF); + }else if( word == 2){ + hasTrace = ((haha >> 62) & 0x1); + fl = (( haha >> 50) & 0x1FFF); + fh = (( haha >> 41) & 0xFF); + energy = (haha & 0xFFFF); + fTime = ((haha >> 15) & 0x7FF); + }else{ + if( ((haha >> 63) & 0x1 ) == 1 && traceWord == -2) { + //printf("=====last word of header\n"); + traceWord = 0; + + if (verbose > 0 ) printf("ch %2d, energy %5u, time %10lu, fTime %5u %10.2f ms 0x%X, 0x%X, %u\n", + chID, energy, timestamp, fTime, (timestamp*8 + fTime*0.0078125) / 1e+6 , fl, fh, hasTrace); + + word ++; + continue; + } + + if( hasTrace) { + if( traceWord == 0) { + traceLength = (haha & 0xFFF ); + word ++; + traceWord ++; + continue; + } + + if( traceWord > 0 ){ + anaProb0[traceWord-1] = (haha & 0x3FFF); + anaProb1[traceWord-1] = ((haha >> 16) & 0x3FFF); + digProb0[traceWord-1] = ((haha >> 14) & 0x1); + digProb1[traceWord-1] = ((haha >> 15) & 0x1); + digProb2[traceWord-1] = ((haha >> 30) & 0x1); + digProb3[traceWord-1] = ((haha >> 31) & 0x1); + + traceWord ++; + + if( traceWord - 1 == traceLength ){ + //printf("============= end of one data, traceLength = %d\n", traceLength); + word = 0; + traceWord = -2; + } + } + } + } + + } + + + + + } + + word++; + + } + +} int main(){ int ret; + timespec t0, t1, t2; //#################################### Open digitizer uint64_t dev_handle; @@ -31,20 +150,20 @@ int main(){ /// Global trigger configuration ret = CAEN_FELib_SetValue(dev_handle, "/par/GlobalTriggerSource", "SwTrg | TestPulse"); // use test Pulse - ret = CAEN_FELib_SetValue(dev_handle, "/par/TestPulsePeriod", "100000000"); /// ns + ret = CAEN_FELib_SetValue(dev_handle, "/par/TestPulsePeriod", "1000000"); /// ns, 1 msec ret = CAEN_FELib_SetValue(dev_handle, "/par/TestPulseWidth", "16"); ///ns /// Wave configuration - ret = CAEN_FELib_SetValue(dev_handle, "/ch/0..63/par/ChRecordLengthS", "512"); + ret = CAEN_FELib_SetValue(dev_handle, "/ch/0..63/par/ChRecordLengthS", "512"); // when setting sample, the ChRecordLengthT will not set. vice versa ret = CAEN_FELib_SetValue(dev_handle, "/ch/0..63/par/WaveTriggerSource", "GlobalTriggerSource"); - ret = CAEN_FELib_SetValue(dev_handle, "/ch/0..63/par/WaveResolution", "RES8"); + ret = CAEN_FELib_SetValue(dev_handle, "/ch/0..63/par/WaveResolution", "RES8"); // 8 ns ret = CAEN_FELib_SetValue(dev_handle, "/ch/0..63/par/WaveAnalogProbe0", "ADCInput"); ret = CAEN_FELib_SetValue(dev_handle, "/ch/0..63/par/WaveAnalogProbe1", "TimeFilter"); ret = CAEN_FELib_SetValue(dev_handle, "/ch/0..63/par/WaveDigitalProbe0", "Trigger"); ret = CAEN_FELib_SetValue(dev_handle, "/ch/0..63/par/WaveDigitalProbe1", "TimeFilterArmed"); ret = CAEN_FELib_SetValue(dev_handle, "/ch/0..63/par/WaveDigitalProbe2", "EnergyFilterBaselineFreeze"); ret = CAEN_FELib_SetValue(dev_handle, "/ch/0..63/par/WaveDigitalProbe3", "EnergyFilterPeakReady"); - ret = CAEN_FELib_SetValue(dev_handle, "/ch/0..63/par/ChPreTriggerS", "200"); + ret = CAEN_FELib_SetValue(dev_handle, "/ch/0..63/par/ChPreTriggerS", "100"); /// Event configuration ret = CAEN_FELib_SetValue(dev_handle, "/ch/0..63/par/EventTriggerSource", "GlobalTriggerSource"); @@ -65,8 +184,17 @@ int main(){ ret = CAEN_FELib_SetValue(dev_handle, "/ch/0..63/par/EnergyFilterFineGain", "1.0"); - //#################################### Set the end point for data + if( ret != CAEN_FELib_Success) printf("errro in set value\n"); + + //#################################### setting readout + ret = CAEN_FELib_GetValue(dev_handle, "/ch/10/par/ChRecordLengthS", value); + if( ret != CAEN_FELib_Success) printf("errro in get value\n"); + + printf("trace length : %s sample\n", value); + + //#################################### Set the end point for data + /* {//----------------------- RAW uint64_t ep_handle; ret = CAEN_FELib_GetHandle(dev_handle, "/endpoint/raw", &ep_handle); @@ -85,7 +213,7 @@ int main(){ ); uint8_t* data = new uint8_t[200000]; - size_t size; /// number of byte of the data + size_t size; /// number of byte of the data, size/8 = word [64 bits] uint32_t n_events; printf("Starting ACQ\n"); @@ -93,70 +221,25 @@ int main(){ ret = CAEN_FELib_SendCommand(dev_handle, "/cmd/swstartacquisition"); int count = 0; - for( int i = 0; i < 2; i++){ + + for( int i = 0; i < 10; i++){ - usleep(10000); - + //usleep(1000000); + clock_gettime(CLOCK_REALTIME, &t0); + ret = CAEN_FELib_ReadData(ep_handle, 100, data, &size, &n_events ); count ++; + clock_gettime(CLOCK_REALTIME, &t1); if( ret == CAEN_FELib_Success ) { - printf("================= %u, %ld, %d \n", n_events, size, count); - - uint64_t haha ; - unsigned short dataType; - - int word = 0; - for( int i =0 ; i < std::min((int)size / 8, 100) ; i++){ - - ///the data is array of 1 byte. - /// by get the point of the data[8*i] - /// cast it into uint64_t pointer, that will get 8 bytes all togteher - /// get this point value, and bit swap it. - haha = __builtin_bswap64(*(uint64_t *)&(data[8*i])); - printf("%7d | 0x%016lX \n", i, haha); - - - if ( word == 0 ){ /// aggregation header, or start header, or end header - dataType = ( haha >> 55 ) & 0xFF ; - if ( dataType == 0x30 ){ /// start Run data - - - } - - if ( dataType == 0x32 ){ /// stop Run data - - - } - - if ( (dataType >> 4) == 0x2 ){ /// data aggregation - - - } - - } - - if ( word == 1 ){ - unsigned short channel = ((haha >> 56) & 0x7F); - unsigned short SE = ((haha >> 55) & 0x1); - uint64_t timestamp = (haha & 0xFFFFFFFFFFFF); - printf("ch %u, SE %u, %llu \n", channel, SE, timestamp); - } - if ( word == 2 ){ - unsigned short W = ((haha >> 62) & 0x1); - unsigned short fl = (( haha >> 50) & 0x1FFF); - unsigned short fh = (( haha >> 41) & 0xFF); - unsigned short energy = (haha & 0xFFFF); - unsigned short fTime = ((haha >> 15) & 7FF); - - printf("energy %u, fTiem %u, fl %u, fh %u, W %u\n", energy, fTime, fl, fh, W); - - }*/ - - word++; - } + printf("================= %u, %ld byte, %d \n", n_events, size, count); + + RawDecorder(data, size); + clock_gettime(CLOCK_REALTIME, &t2); + printf("t2-t1 : %ld\n", t2.tv_nsec-t1.tv_nsec); } + printf("t1-t0 : %ld\n", t1.tv_nsec-t0.tv_nsec); } @@ -164,8 +247,8 @@ int main(){ ret = CAEN_FELib_SendCommand(dev_handle, "/cmd/disarmacquisition"); } + /**/ - /** {//------------------------ DPPPHA uint64_t ep_handle; ret = CAEN_FELib_GetHandle(dev_handle, "/endpoint/dpppha", &ep_handle); @@ -231,11 +314,14 @@ int main(){ ret = CAEN_FELib_SendCommand(dev_handle, "/cmd/armacquisition"); ret = CAEN_FELib_SendCommand(dev_handle, "/cmd/swstartacquisition"); + timespec tsum; + int count = 0; - for( int i = 0; i < 10; i++){ + for( int i = 0; i < 64*5; i++){ - usleep(10000); + //usleep(10000); + clock_gettime(CLOCK_REALTIME, &t0); ret = CAEN_FELib_ReadData(ep_handle, 100, &channel, ×tamp, @@ -259,6 +345,18 @@ int main(){ &event_size ); count ++; + + clock_gettime(CLOCK_REALTIME, &t1); + printf("%3d | t1-t0 : %ld\n", i, t1.tv_nsec-t0.tv_nsec); + + tsum.tv_nsec += t1.tv_nsec-t0.tv_nsec; + + if( channel == 63) { + printf("================###################=== tsum : %ld\n", tsum.tv_nsec); + tsum.tv_nsec = 0; + } + + /* if( ret == CAEN_FELib_Success ) { printf("================= %ld, %d \n", event_size, count); printf("ch : %u, energy : %u, time : %lu, fTime : %u \n", channel, energy, timestamp, fine_timestamp); @@ -280,7 +378,7 @@ int main(){ digital_probes[3][i]); } - } + }*/ }