added FIFOEnergies, FIFOEnergies, FIFOChannles, FIFOTimestamps, ScanNumDataBlockInExtFIFO() will fill them

This commit is contained in:
Ryan Tang 2022-04-12 16:27:24 -04:00
parent b4c48497a2
commit 66e2b9d8f6
4 changed files with 78 additions and 24 deletions

View File

@ -54,6 +54,11 @@ Pixie16::Pixie16(){
ExtFIFO_Data = NULL;
Statistics = NULL;
FIFOEnergies = new unsigned short[MAXFIFODATABLOCK];
FIFOChannels = new unsigned short[MAXFIFODATABLOCK];
FIFOTimestamps = new unsigned long long[MAXFIFODATABLOCK];
FIFONumDataBlock = 0;
data = new DataBlock();
nextWord = 0;
@ -65,6 +70,10 @@ Pixie16::~Pixie16(){
CloseDigitizers();
delete FIFOEnergies;
delete FIFOChannels;
delete FIFOTimestamps;
delete PXISlotMap;
delete ch2ns;
delete ComFPGAConfigFile;
@ -426,15 +435,26 @@ void Pixie16::ReadData(unsigned short modID){
unsigned int Pixie16::ScanNumDataBlockInExtFIFO(){
unsigned int numDataBlock = 0;
unsigned int FIFONumDataBlock = 0;
unsigned int nextWordtemp = nextWord;
///if( nextWordtemp < nFIFOWords ) printf("============= FIFOWord : %u \n", nFIFOWords);
while( nextWordtemp < nFIFOWords ){
nextWordtemp += (ExtFIFO_Data[nextWordtemp] >> 17) & 0x3FFF;
numDataBlock ++;
unsigned short eventLen = (ExtFIFO_Data[nextWordtemp] >> 17) & 0x3FFF;
FIFOEnergies[FIFONumDataBlock] = (ExtFIFO_Data[nextWordtemp + 3] & 0xFFFF );
FIFOChannels[FIFONumDataBlock] = (ExtFIFO_Data[nextWordtemp] & 0xF );
FIFOTimestamps[FIFONumDataBlock] = ((unsigned long long)(ExtFIFO_Data[nextWordtemp+2] & 0xFFFF) << 32) + ExtFIFO_Data[nextWordtemp+1];
nextWordtemp += eventLen;
///printf("%u | nextWordtemp %u, nextWord %u, ch %u, energy %u \n", FIFONumDataBlock, nextWordtemp, nextWord, FIFOChannels[FIFONumDataBlock], FIFOEnergies[FIFONumDataBlock]);
FIFONumDataBlock ++;
}
nextWord = nextWordtemp - nFIFOWords ;
return numDataBlock;
return FIFONumDataBlock;
}
int Pixie16::ProcessSingleData(){

View File

@ -6,6 +6,8 @@
#include "pixie16/pixie16.h"
#include "DataBlock.h"
#define MAXFIFODATABLOCK 1000 ///max FIFO Datablack for one read
enum CSRA_BIT{
FAST_TRIGGER = 0x00000001,
M_VALIDATION = 0x00000002,
@ -77,7 +79,10 @@ private:
unsigned int * Statistics;
unsigned int totNumFIFOWords;
unsigned short * FIFOChannels;
unsigned short * FIFOEnergies;
unsigned long long * FIFOTimestamps;
unsigned int FIFONumDataBlock;
double Baselines[3640], TimeStamps[3640]; ///for baseline
unsigned short ADCTrace[8192];
@ -196,15 +201,20 @@ public:
void CheckExternalFIFOWords(unsigned short modID);
void ReadData(unsigned short modID);
unsigned int ScanNumDataBlockInExtFIFO();
unsigned int GetTotalNumWords() {return totNumFIFOWords;}
unsigned int GetnFIFOWords() {return nFIFOWords;}
unsigned int GetNextWord() {return nextWord;}
DataBlock * GetData() {return data;}
int ProcessSingleData();
unsigned int ScanNumDataBlockInExtFIFO(); /// also fill the FIFOEnergies, FIFOChannels, FIFOTimestamps, output FIFONumDataBlock
unsigned int GetFIFONumDataBlock() {return FIFONumDataBlock;}
unsigned short * GetFIFOEnergies() {return FIFOEnergies;}
unsigned short * GetFIFOChannels() {return FIFOChannels;}
unsigned long long * GetFIFOTimestamps() {return FIFOTimestamps;}
void PrintExtFIFOWords() {
unsigned int nWords = (ExtFIFO_Data[nextWord] >> 17) & 0x3FFF;
printf("------------------- print dataBlock, nWords = %d\n", nWords);

View File

@ -442,21 +442,13 @@ void MainWindow::FitTrace(){
if( y < yMin) yMin = y;
if( y > yMax) yMax = y;
}
///printf("%f %f %f %f\n", xMin, xMax, yMin, yMax);
double baseline = yMin;
double amp = yMax-yMin;
double riseTime = 200;
double decayTime = 40000;
///printf(" t0 : %f ns\n", t0);
///printf(" r : %f ns\n", riseTime);
///printf(" d : %f ns\n", decayTime);
///printf(" amp : %f ns\n", amp);
///printf(" bl : %f ns\n", baseline);
TF1 * traceFunc = new TF1("fit", standardPulse, xMin + t0*0.1, xMax - t0*0.1, 5);
traceFunc->SetNpx(1000);

View File

@ -185,7 +185,7 @@ int main(int argc, char *argv[]){
pixie->PrintDigitizerSettings(0);
int ch = 6;
double time = 4.0; ///sec
double time = 1.0; ///sec
pixie->PrintChannelAllSettings(0, ch);
@ -200,23 +200,41 @@ int main(int argc, char *argv[]){
pixie->StartRun(1);
std::thread kakakaka(ProcessData);
///std::thread kakakaka(ProcessData);
while( CurrentTime - StartTime < time * 1000 ){
pixie->ReadData(0);
if( pixie->GetnFIFOWords() > 0 ) pixie->SaveData();
if( pixie->GetnFIFOWords() > 0 ) {/// msec
printf("number of dataBlack read : %u\n", pixie->ScanNumDataBlockInExtFIFO());
//if( pixie->GetnFIFOWords() > 0 ) {/// msec
// printf("number of dataBlack read : %u\n", pixie->ScanNumDataBlockInExtFIFO());
//}
//TODO a quick way to read and fill histogram; the most time consumping part is filling trace
unsigned int nData = pixie->ScanNumDataBlockInExtFIFO();
unsigned short * energies = pixie->GetFIFOEnergies();
unsigned short * channels = pixie->GetFIFOChannels();
//unsigned long long * timestamps = pixie->GetFIFOTimestamps();
for( unsigned int h = 0; h < nData; h++) {
//printf(" %3u| %8u, %8u , %20llu\n", h, channels[h], energies[h], timestamps[h]);
hch->Fill(channels[h] );
hE->Fill( energies[h] );
}
//TODO a quick way to read and fill histogram; the most time consumping part is filling trace
if( ElapsedTime > 1000 ) {
if( ElapsedTime > 500 ) {
pixie->PrintStatistics(0);
PresenTime = CurrentTime;
ElapsedTime = 0;
canvas->cd(1); hch->Draw();
canvas->cd(2); hE->Draw();
canvas->Modified();
canvas->Update();
gSystem->ProcessEvents();
}
CurrentTime = get_time();
@ -228,6 +246,20 @@ int main(int argc, char *argv[]){
pixie->StopRun();
pixie->CloseFile();
unsigned int nData = pixie->ScanNumDataBlockInExtFIFO();
unsigned short * energies = pixie->GetFIFOEnergies();
unsigned short * channels = pixie->GetFIFOChannels();
for( unsigned int h = 0; h < nData; h++) {
//printf(" %3u| %8u, %8u , %20llu\n", h, channels[h], energies[h], timestamps[h]);
hch->Fill(channels[h] );
hE->Fill( energies[h] );
}
canvas->cd(1); hch->Draw();
canvas->cd(2); hE->Draw();
canvas->Modified();
canvas->Update();
gSystem->ProcessEvents();
printf("===================================\n");
pixie->PrintStatistics(0);