Compare commits

...

2 Commits

Author SHA1 Message Date
carina@hades 03b6a03557 ran various test, bugs fixed. approching to finsihed single PHA digitizer 2022-10-25 14:52:57 -04:00
carina@hades 12f965f788 added fast decode, that skipp waveform 2022-10-24 17:01:05 -04:00
8 changed files with 314 additions and 230 deletions

View File

@ -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,11 +60,13 @@ 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;}
void PrintBuffer() const; //Incorrect
void DecodeBuffer(bool fastDecode, int verbose = 0);
void DecodeBuffer(bool fastDecode, int verbose = 0); /// fastDecode will not save waveform
void DecodeBuffer(char * buffer, unsigned int size, bool fastDecode, int verbose = 0); // for outside data
void PrintStat() const;
@ -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,15 +189,15 @@ 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);
}
inline void Data::PrintStat() const{
printf("========= %d \n", IsNotRollOverFakeAgg);
if( IsNotRollOverFakeAgg ) {
printf(" this is roll-over fake event.\n");
printf(" this is roll-over fake event or no events.\n");
return;
}
printf("%2s | %6s | %9s | %6s\n", "ch", "# Evt.", "Rate [Hz]", "Tot. Evt.");
@ -260,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,67 +333,67 @@ inline int Data::DecodePHADualChannelBlock(unsigned int ChannelMask, bool fastDe
nSample = ( word & 0xFFFF ) * 8;
extra2Option = ( (word >> 24 ) & 0x7 );
unsigned int digitalProbe = ( (word >> 16 ) & 0xF );
unsigned int analogProbe2 = ( (word >> 20 ) & 0x3 );
unsigned int analogProbe1 = ( (word >> 22 ) & 0x3 );
bool hasWaveForm = ( (word >> 27 ) & 0x1 );
hasExtra2 = ( (word >> 28 ) & 0x1 );
bool hasTimeStamp = ( (word >> 29 ) & 0x1 );
bool hasEnergy = ( (word >> 30 ) & 0x1 );
hasDualTrace = ( (word >> 31 ) & 0x1 );
if( verbose >= 2 ) {
printf("DualTrace : %d, Energy : %d, Time: %d, Wave : %d, Extra2: %d \n",
hasDualTrace, hasEnergy, hasTimeStamp, hasWaveForm, hasExtra2);
}
if( verbose >= 3){
if( hasExtra2 ){
printf("...... extra 2 : ");
switch (extra2Option){
case 0: printf("[0:15] trapwzoid baseline * 4 [16:31] Extended timestamp (16-bit)\n"); break;
case 1: printf("Reserved\n"); break;
case 2: printf("[0:9] Fine time stamp [10:15] Reserved [16:31] Extended timestamp (16-bit)\n"); break;
case 3: printf("Reserved\n"); break;
case 4: printf("[0:15] Total trigger counter [16:31] Lost trigger counter\n"); break;
case 5: printf("[0:15] Event after Zero crossing [16:31] Event before Zero crossing\n"); break;
case 6: printf("Reserved\n"); break;
case 7: printf("Reserved\n"); break;
if( !fastDecode || verbose >= 2){
unsigned int digitalProbe = ( (word >> 16 ) & 0xF );
unsigned int analogProbe2 = ( (word >> 20 ) & 0x3 );
unsigned int analogProbe1 = ( (word >> 22 ) & 0x3 );
bool hasWaveForm = ( (word >> 27 ) & 0x1 );
bool hasTimeStamp = ( (word >> 29 ) & 0x1 );
bool hasEnergy = ( (word >> 30 ) & 0x1 );
hasDualTrace = ( (word >> 31 ) & 0x1 );
if( verbose >= 2 ) {
printf("DualTrace : %d, Energy : %d, Time: %d, Wave : %d, Extra2: %d \n",
hasDualTrace, hasEnergy, hasTimeStamp, hasWaveForm, hasExtra2);
}
if( verbose >= 3){
if( hasExtra2 ){
printf("...... extra 2 : ");
switch (extra2Option){
case 0: printf("[0:15] trapwzoid baseline * 4 [16:31] Extended timestamp (16-bit)\n"); break;
case 1: printf("Reserved\n"); break;
case 2: printf("[0:9] Fine time stamp [10:15] Reserved [16:31] Extended timestamp (16-bit)\n"); break;
case 3: printf("Reserved\n"); break;
case 4: printf("[0:15] Total trigger counter [16:31] Lost trigger counter\n"); break;
case 5: printf("[0:15] Event after Zero crossing [16:31] Event before Zero crossing\n"); break;
case 6: printf("Reserved\n"); break;
case 7: printf("Reserved\n"); break;
}
}
printf("...... Analog Probe 1 : ");
switch (analogProbe1 ){
case 0 : printf("Input \n"); break;
case 1 : printf("RC-CR (1st derivative) \n"); break;
case 2 : printf("RC-CR2 (2st derivative) \n"); break;
case 3 : printf("trapazoid \n"); break;
}
printf("...... Analog Probe 2 : ");
switch (analogProbe2 ){
case 0 : printf("Input \n"); break;
case 1 : printf("Theshold \n"); break;
case 2 : printf("trapezoid - baseline \n"); break;
case 3 : printf("baseline \n"); break;
}
printf("...... Digital Probe : ");
switch (digitalProbe ){
case 0 : printf("Peaking \n"); break;
case 1 : printf("Armed (trigger) \n"); break;
case 2 : printf("Peak Run \n"); break;
case 3 : printf("Pile up \n"); break;
case 4 : printf("Peaking \n"); break;
case 5 : printf("Trigger Validation Window \n"); break;
case 6 : printf("Baseline for energy calculation \n"); break;
case 7 : printf("Trigger holdoff \n"); break;
case 8 : printf("Trigger Validation \n"); break;
case 9 : printf("ACQ Busy \n"); break;
case 10 : printf("Trigger window \n"); break;
case 11 : printf("Ext. Trigger \n"); break;
case 12 : printf("Busy = memory is full \n"); break;
}
}
printf("...... Analog Probe 1 : ");
switch (analogProbe1 ){
case 0 : printf("Input \n"); break;
case 1 : printf("RC-CR (1st derivative) \n"); break;
case 2 : printf("RC-CR2 (2st derivative) \n"); break;
case 3 : printf("trapazoid \n"); break;
}
printf("...... Analog Probe 2 : ");
switch (analogProbe2 ){
case 0 : printf("Input \n"); break;
case 1 : printf("Theshold \n"); break;
case 2 : printf("trapezoid - baseline \n"); break;
case 3 : printf("baseline \n"); break;
}
printf("...... Digital Probe : ");
switch (digitalProbe ){
case 0 : printf("Peaking \n"); break;
case 1 : printf("Armed (trigger) \n"); break;
case 2 : printf("Peak Run \n"); break;
case 3 : printf("Pile up \n"); break;
case 4 : printf("Peaking \n"); break;
case 5 : printf("Trigger Validation Window \n"); break;
case 6 : printf("Baseline for energy calculation \n"); break;
case 7 : printf("Trigger holdoff \n"); break;
case 8 : printf("Trigger Validation \n"); break;
case 9 : printf("ACQ Busy \n"); break;
case 10 : printf("Trigger window \n"); break;
case 11 : printf("Ext. Trigger \n"); break;
case 12 : printf("Busy = memory is full \n"); break;
}
}
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");
@ -408,54 +411,64 @@ inline int Data::DecodePHADualChannelBlock(unsigned int ChannelMask, bool fastDe
//TODO Skip
///===== read waveform
if( SaveWaveToMemory ) {
if( !fastDecode && SaveWaveToMemory ) {
tempWaveform1.clear();
tempWaveform2.clear();
tempDigiWaveform1.clear();
}
unsigned int triggerAtSample = 0 ;
for( int wi = 0; wi < nSample/2; wi++){
nw = nw +1 ; word = ReadBuffer(nw, verbose - 2);
bool isTrigger1 = (( word >> 31 ) & 0x1 );
bool dp1 = (( word >> 30 ) & 0x1 );
unsigned short wave1 = (( word >> 16) & 0x3FFF);
bool isTrigger0 = (( word >> 15 ) & 0x1 );
bool dp0 = (( word >> 14 ) & 0x1 );
unsigned short wave0 = ( word & 0x3FFF);
if( fastDecode ){
nw += nSample/2;
}else{
for( int wi = 0; wi < nSample/2; wi++){
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);
}else{
tempWaveform1.push_back(wave0);
tempWaveform1.push_back(wave1);
if( SaveWaveToMemory){
if( hasDualTrace ){
tempWaveform1.push_back(wave1);
tempWaveform2.push_back(wave0);
tempDigiWaveform1.push_back(dp0);
}else{
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( isTrigger0 == 1 ) triggerAtSample = 2*wi ;
if( isTrigger1 == 1 ) triggerAtSample = 2*wi + 1;
if( verbose >= 4 && ev == 0 ){
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);
}
}
}
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( SaveWaveToMemory ) {
if( hasDualTrace ){
Waveform1[channel][NumEvents[channel]] = tempWaveform1;
Waveform2[channel][NumEvents[channel]] = tempWaveform2;
}else{
Waveform1[channel][NumEvents[channel]] = tempWaveform1;
}
DigiWaveform1[channel][NumEvents[channel]] = tempDigiWaveform1;
}
}
if( SaveWaveToMemory ) {
if( hasDualTrace ){
Waveform1[channel][NumEvents[channel]] = tempWaveform1;
Waveform2[channel][NumEvents[channel]] = tempWaveform2;
}else{
Waveform1[channel][NumEvents[channel]] = tempWaveform1;
}
DigiWaveform1[channel][NumEvents[channel]] = tempDigiWaveform1;
}
unsigned long long extTimeStamp = 0;
unsigned int extra2 = 0;
if( hasExtra2 ){
@ -467,17 +480,16 @@ 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);
bool pileUpOrRollOver = ((word >> 15) & 0x1);
bool pileUp = (extra & 0x200);
bool rollOver = (extra & 0x002);
bool pileUp = (extra & 0x200);
bool pileUpOrRollOver = ((word >> 15) & 0x1);
if( verbose >= 3 ) {
printf("PileUp : %d , extra : 0x%03x, energy : %d \n", pileUp, extra, energy);
printf("PileUp : %d , extra : 0x%03x, energy : %d \n", pileUp, extra, energy);
printf(" lost event : %d \n", ((extra >> 0) & 0x1) );
printf(" roll-over : %d (fake event)\n", ((extra >> 1) & 0x1) );
printf(" fake-event : %d \n", ((extra >> 3) & 0x1) );
@ -588,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
@ -601,54 +613,56 @@ inline int Data::DecodePSDDualChannelBlock(unsigned int ChannelMask, bool fastDe
if( verbose >= 2 ) printf("ch : %d, timeStamp %u \n", channel, timeStamp0);
///===== read waveform
if( SaveWaveToMemory ) {
if( !fastDecode && SaveWaveToMemory ) {
tempWaveform1.clear();
tempWaveform2.clear();
tempDigiWaveform1.clear();
tempDigiWaveform2.clear();
}
for( int wi = 0; wi < nSample/2; wi++){
nw = nw +1 ; word = ReadBuffer(nw, verbose - 2);
bool dp2b = (( word >> 31 ) & 0x1 );
bool dp1b = (( word >> 30 ) & 0x1 );
unsigned short waveb = (( word >> 16) & 0x3FFF);
bool dp2a = (( word >> 15 ) & 0x1 );
bool dp1a = (( word >> 14 ) & 0x1 );
unsigned short wavea = ( word & 0x3FFF);
if( SaveWaveToMemory){
if( hasDualTrace ){
tempWaveform1.push_back(wavea);
tempWaveform2.push_back(waveb);
}else{
tempWaveform1.push_back(wavea);
tempWaveform1.push_back(waveb);
if( fastDecode ){
nw += nSample/2;
}else{
for( int wi = 0; wi < nSample/2; wi++){
nw = nw +1 ; word = ReadBuffer(nw, verbose - 2);
bool dp2b = (( word >> 31 ) & 0x1 );
bool dp1b = (( word >> 30 ) & 0x1 );
unsigned short waveb = (( word >> 16) & 0x3FFF);
bool dp2a = (( word >> 15 ) & 0x1 );
bool dp1a = (( word >> 14 ) & 0x1 );
unsigned short wavea = ( word & 0x3FFF);
if( SaveWaveToMemory){
if( hasDualTrace ){
tempWaveform1.push_back(wavea);
tempWaveform2.push_back(waveb);
}else{
tempWaveform1.push_back(wavea);
tempWaveform1.push_back(waveb);
}
tempDigiWaveform1.push_back(dp1a);
tempDigiWaveform1.push_back(dp1b);
tempDigiWaveform2.push_back(dp2a);
tempDigiWaveform2.push_back(dp2b);
}
if( verbose >= 3 && ev == 0 ){
printf("%4d| %5d, %d, %d \n", 2*wi, wavea, dp1a, dp2a);
printf("%4d| %5d, %d, %d \n", 2*wi+1, waveb, dp1b, dp2b);
}
tempDigiWaveform1.push_back(dp1a);
tempDigiWaveform1.push_back(dp1b);
tempDigiWaveform2.push_back(dp2a);
tempDigiWaveform2.push_back(dp2b);
}
if( verbose >= 3 && ev == 0 ){
printf("%4d| %5d, %d, %d \n", 2*wi, wavea, dp1a, dp2a);
printf("%4d| %5d, %d, %d \n", 2*wi+1, waveb, dp1b, dp2b);
if( SaveWaveToMemory ) {
if( hasDualTrace ){
Waveform1[channel][NumEvents[channel]] = tempWaveform1;
Waveform2[channel][NumEvents[channel]] = tempWaveform2;
}else{
Waveform1[channel][NumEvents[channel]] = tempWaveform1;
}
DigiWaveform1[channel][NumEvents[channel]] = tempDigiWaveform1;
DigiWaveform2[channel][NumEvents[channel]] = tempDigiWaveform2;
}
}
if( SaveWaveToMemory ) {
if( hasDualTrace ){
Waveform1[channel][NumEvents[channel]] = tempWaveform1;
Waveform2[channel][NumEvents[channel]] = tempWaveform2;
}else{
Waveform1[channel][NumEvents[channel]] = tempWaveform1;
}
DigiWaveform1[channel][NumEvents[channel]] = tempDigiWaveform1;
DigiWaveform2[channel][NumEvents[channel]] = tempDigiWaveform2;
}
nw = nw +1 ; word = ReadBuffer(nw, verbose);
unsigned int extra = word;
unsigned long long extTimeStamp = 0;

View File

@ -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;
@ -431,7 +443,7 @@ void Digitizer::PrintACQStatue(){
//===========================================================
void Digitizer::WriteRegister (Reg registerAddress, uint32_t value, int ch, bool isSave2MemAndFile){
printf("%s[0x%04X](ch-%02d) [0x%04X]: %u \n", registerAddress.GetNameChar(), registerAddress.GetAddress(),ch, registerAddress.ActualAddress(ch), value);
printf("%s[0x%04X](ch-%02d) [0x%04X]: 0x%08X \n", registerAddress.GetNameChar(), registerAddress.GetAddress(),ch, registerAddress.ActualAddress(ch), value);
if( !isConnected ) {
SetSettingToMemory(registerAddress, value, ch);

View File

@ -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");

View File

@ -93,7 +93,7 @@ public:
void PlotSingleTrace();
void FitTrace();
void Oscilloscope();
void ChangePlot();
void OpenChannelSetting(Int_t);
void UpdateChannelSetting();

View File

@ -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)

View File

@ -1429,7 +1429,7 @@ void BoardSetting::ReadData(){
}
Data * data = digi[boardID]->GetData();
data->AllocateMemory();
data->Allocate80MBMemory();
data->DPPType = digi[boardID]->GetDPPType();
digi[boardID]->ReadData();

View File

@ -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()");
@ -115,7 +115,7 @@ ChannelSettingPHA::ChannelSettingPHA(const TGWindow *p, UInt_t w, UInt_t h, Digi
TGLabel * lbEventAgg = new TGLabel(vfInput1, "Events / Aggregate"); vfInput1->AddFrame(lbEventAgg, layoutHintsR);
numEventAgg = new TGNumberEntry(vfInput2, 512, 0, 0, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative); vfInput2->AddFrame(numEventAgg, layoutHints);
numEventAgg->Resize(width, 20);
numEventAgg->SetLimits(TGNumberFormat::kNELLimitMinMax, 0, 511);
numEventAgg->SetLimits(TGNumberFormat::kNELLimitMinMax, 1, 511);
numEventAgg->Connect("Modified()", "ChannelSettingPHA", this, "SetEventAggregate()");
TGLabel * lbBuffer = new TGLabel(vfInput1, "Buffer Size [MByte]"); vfInput1->AddFrame(lbBuffer, layoutHintsR);

View File

@ -96,49 +96,71 @@ int main(int argc, char* argv[]){
///dig->SaveSettingAsText("haha.txt");
unsigned short B = 1; /// BLT
unsigned short Eg = 10; /// Event / dual channel
unsigned short E2 = 1; /// extra 2;
unsigned short RL = 250; /// record Length
std::remove("Test_323_139_000.fsu");
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
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)*2 + 4)*B *4;
//
//printf("============== exp Buffer size : %8u byte \n", bbbb);
//printf("============== exp 2 ch size : %8u byte = %u words\n", bbb2, bbb2/4);
usleep(1e6);
///using CAEN method
char * buffer = NULL;
uint32_t size;
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);
{///============ Checking the buffer size calculation
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;
delete buffer;
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 + Wr*RL*4) * Eg + 2)*8 + 2)*B *4 *2 + 4 * 4;
printf("=========== exp Buffer size : %8u byte \n", bbbb);
usleep(1e6);
///using CAEN method
char * buffer = NULL;
uint32_t size;
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 > 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);
dig->GetData()->DecodeBuffer(false,2);
unsigned long time1 = get_time();
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();