Change the output filename format, including tick2ns, fix evenbuilder bug

This commit is contained in:
splitPoleDAQ 2024-01-11 11:52:40 -05:00
parent 0d9690b5ed
commit bdc02a5639
5 changed files with 95 additions and 65 deletions

View File

@ -13,8 +13,8 @@
#define BUFFERFILL 0.1 // only 0.5 * MAXNData will be filled in memeory each time
template<typename T> void swap(T * a, T *b );
int partition(int arr[], int kaka[], TString file[], unsigned int fileSize[], unsigned int numBlock[], int start, int end);
void quickSort(int arr[], int kaka[], TString file[], unsigned int fileSize[], unsigned int numBlock[], int start, int end);
int partition(int arr[], int kaka[], TString file[], unsigned int fileSize[], unsigned int numBlock[], int t2ns[], int start, int end);
void quickSort(int arr[], int kaka[], TString file[], unsigned int fileSize[], unsigned int numBlock[], int t2ns[], int start, int end);
//^#############################################################
//^#############################################################
@ -71,62 +71,47 @@ int main(int argc, char **argv) {
int type[nFile];
unsigned int fileSize[nFile];
unsigned int numBlock[nFile];
int tick2ns[nFile];
// file name format is expName_runID_SN_DPP_tick2ns_order.fsu
for( int i = 0; i < nFile; i++){
int snPos = inFileName[i].Index("_"); // first "_"
//snPos = inFileName[i].Index("_", snPos + 1);
int sn = atoi(&inFileName[i][snPos+5]);
int typePos = inFileName[i].Index("_", snPos+5);
TString typeStr = &inFileName[i][typePos+1];
typeStr.Resize(3);
//printf("sn %d %s \n", sn, typeStr.Data());
if( typeStr == "PHA" ) type[i] = DPPType::DPP_PHA_CODE;
if( typeStr == "PSD" ) type[i] = DPPType::DPP_PSD_CODE;
if( typeStr == "QDC" ) type[i] = DPPType::DPP_QDC_CODE;
int orderPos = inFileName[i].Index("_", typePos + 1);
int order = atoi(&inFileName[i][orderPos+1]);
ID[i] = sn + order * 100000;
FILE * temp = fopen(inFileName[i].Data(), "rb");
if( temp == NULL ) {
fileSize[i] = 0;
}else{
fseek(temp, 0, SEEK_END);
fileSize[i] = ftell(temp);
}
fclose(temp);
FSUReader * reader = new FSUReader(inFileName[i].Data(), typeStr == "QDC" ? 64 : 16, false);
FSUReader * reader = new FSUReader(inFileName[i].Data(), false);
reader->ScanNumBlock(false);
numBlock[i] = reader->GetTotNumBlock();
fileSize[i] = reader->GetFileByteSize();
delete reader;
//printf("sn:%d, type:%d (%s), order:%d \n", sn, type[i], typeStr.Data(), order);
tick2ns[i] = reader->GetTick2ns();
type[i] = reader->GetDPPType();
int sn = reader->GetSN();
int order = reader->GetFileOrder();
ID[i] = sn + order * 100000;
delete reader;
}
quickSort(&(ID[0]), &(type[0]), &(inFileName[0]), &(fileSize[0]), &(numBlock[0]), 0, nFile-1);
quickSort(&(ID[0]), &(type[0]), &(inFileName[0]), &(fileSize[0]), &(numBlock[0]), &(tick2ns[0]), 0, nFile-1);
unsigned int totBlock = 0;
for( int i = 0 ; i < nFile; i++){
printf("%d | %6d | %3d | %30s | %6u | %u Bytes = %.2f MB\n", i, ID[i], type[i], inFileName[i].Data(), numBlock[i], fileSize[i], fileSize[i]/1024./1024.);
printf("%d | %6d | %3d | %30s | %2d | %6u | %u Bytes = %.2f MB\n", i,
ID[i], type[i], inFileName[i].Data(), tick2ns[i], numBlock[i], fileSize[i], fileSize[i]/1024./1024.);
totBlock += numBlock[i];
}
printf("----- total number of block : %u.\n", totBlock);
//*======================================= Sort files in to group
//*======================================= Sort files into groups
std::vector<int> snList; // store the serial number of the group
std::vector<int> typeList; // store the DPP type of the group
std::vector<std::vector<TString>> fileList; // store the file list of the group
std::vector<int> t2nsList;
for( int i = 0; i < nFile; i++){
if( ID[i] / 100000 == 0 ) {
std::vector<TString> temp = {inFileName[i]};
fileList.push_back(temp);
typeList.push_back(type[i]);
snList.push_back(ID[i]%100000);
t2nsList.push_back(tick2ns[i]);
}else{
for( int p = 0; p < (int) snList.size(); p++){
if( (ID[i] % 1000) == snList[p] ) {
@ -160,6 +145,7 @@ int main(int argc, char **argv) {
if( typeList[i] == DPPType::DPP_QDC_CODE ) data[i] = new Data(64);
data[i]->DPPType = typeList[i];
data[i]->boardSN = snList[i];
data[i]->tick2ns = t2nsList[i];
}else{
inFileIndex[i] = -1;
data[i] = nullptr;
@ -239,16 +225,24 @@ int main(int argc, char **argv) {
// go to next file in same digitizer
if( feof(inFile[i])){
fclose(inFile[i]);
inFile[i] = fopen(fileList[i][inFileIndex[i]+1], "r");
if( inFile[i] ){
if( inFileIndex[i] + 1 < (int) fileList[i].size() ){
inFile[i] = fopen(fileList[i][inFileIndex[i]+1], "r");
inFileIndex[i]++;
printf("---- go to next file for digi-%d\n", snList[i]);
}else{
inFile[i] = nullptr;
inFileIndex[i] = -1;
printf("---- no more file for digi-%d.\n", snList[i]);
fillFlag = false;
continue;
}
// if( inFile[i] ){
// inFileIndex[i]++;
// printf("---- go to next file for digi-%d\n", snList[i]);
// }else{
// inFileIndex[i] = -1;
// printf("---- no more file for digi-%d.\n", snList[i]);
// continue;
// }
}
}else{
@ -290,6 +284,7 @@ int main(int argc, char **argv) {
if( iData < 0 ) continue;
if( (iLoop*MaxNData + iData) - (lastLoopIndex[i][ch]*MaxNData + lastDataIndex[i][ch]) > MaxNData * BUFFERFILL ) {
if( debug ) printf("############# BREAK!!!! Group: %d, ch : %d | last : %d(%d), Present : %d(%d) | BufferSize : %.0f \n", i, ch, lastDataIndex[i][ch], lastLoopIndex[i][ch], iData, iLoop, MaxNData * BUFFERFILL);
fillFlag = false;
}
@ -300,7 +295,7 @@ int main(int argc, char **argv) {
}
if( debug ){
printf(" %3d | agg : %d | %u | %s\n", snList[i], aggCount[i], data[i]->aggTime, fillFlag ? "cont. fill" : "break." );
printf("-------------------------> %3d | agg : %d | %u \n", snList[i], aggCount[i], data[i]->aggTime);
//data[i]->PrintStat();
}
}
@ -312,6 +307,7 @@ int main(int argc, char **argv) {
lastDataIndex[i][ch] = data[i]->DataIndex[ch];
lastLoopIndex[i][ch] = data[i]->LoopIndex[ch];
}
//data[i]->PrintAllData();
}
mb->BuildEvents(0, !traceOn, debug);
@ -420,7 +416,7 @@ template<typename T> void swap(T * a, T *b ){
*a = temp;
}
int partition(int arr[], int kaka[], TString file[], unsigned int fileSize[], unsigned int numBlock[], int start, int end){
int partition(int arr[], int kaka[], TString file[], unsigned int fileSize[], unsigned int numBlock[], int tick2ns[], int start, int end){
int pivot = arr[start];
int count = 0;
for (int i = start + 1; i <= end; i++) {
@ -433,6 +429,7 @@ int partition(int arr[], int kaka[], TString file[], unsigned int fileSize[], un
swap(&kaka[pivotIndex], &kaka[start]);
swap(&fileSize[pivotIndex], &fileSize[start]);
swap(&numBlock[pivotIndex], &numBlock[start]);
swap(&tick2ns[pivotIndex], &tick2ns[start]);
/// Sorting left and right parts of the pivot element
int i = start, j = end;
@ -447,18 +444,19 @@ int partition(int arr[], int kaka[], TString file[], unsigned int fileSize[], un
swap(&kaka[ip], &kaka[jm]);
swap(&fileSize[ip], &fileSize[jm]);
swap(&numBlock[ip], &numBlock[jm]);
swap(&tick2ns[ip], &tick2ns[jm]);
}
}
return pivotIndex;
}
void quickSort(int arr[], int kaka[], TString file[], unsigned int fileSize[], unsigned int numBlock[], int start, int end){
void quickSort(int arr[], int kaka[], TString file[], unsigned int fileSize[], unsigned int numBlock[], int tick2ns[], int start, int end){
/// base case
if (start >= end) return;
/// partitioning the array
int p = partition(arr, kaka, file, fileSize, numBlock, start, end);
int p = partition(arr, kaka, file, fileSize, numBlock, tick2ns, start, end);
/// Sorting the left part
quickSort(arr, kaka, file, fileSize, numBlock, start, p - 1);
quickSort(arr, kaka, file, fileSize, numBlock, tick2ns, start, p - 1);
/// Sorting the right part
quickSort(arr, kaka, file, fileSize, numBlock, p + 1, end);
quickSort(arr, kaka, file, fileSize, numBlock, tick2ns, p + 1, end);
}

View File

@ -3,7 +3,7 @@
class FSUReader{
public:
FSUReader(std::string fileName, unsigned short numCh, bool verbose = true);
FSUReader(std::string fileName, bool verbose = true);
~FSUReader();
void ScanNumBlock(bool verbose = true);
@ -14,8 +14,11 @@ class FSUReader{
Data * GetData() const{return data;}
int GetDPPType() const{return DPPType;}
int GetDPPType() const{return DPPType;}
int GetSN() const{return sn;}
int GetTick2ns() const{return tick2ns;}
int GetNumCh() const{return numCh;}
int GetFileOrder() const{return order;}
unsigned long GetFileByteSize() const {return inFileSize;}
private:
@ -29,8 +32,12 @@ class FSUReader{
unsigned int blockID;
// for dual block
int sn;
int DPPType;
int tick2ns;
int order;
int chMask;
int numCh;
std::vector<unsigned int> blockPos;
@ -40,7 +47,7 @@ class FSUReader{
};
inline FSUReader::FSUReader(std::string fileName, unsigned short numCh, bool verbose){
inline FSUReader::FSUReader(std::string fileName, bool verbose){
inFile = fopen(fileName.c_str(), "r");
@ -55,17 +62,10 @@ inline FSUReader::FSUReader(std::string fileName, unsigned short numCh, bool ver
fseek(inFile, 0L, SEEK_SET);
filePos = 0;
data = new Data(numCh);
totNumBlock = 0;
blockID = 0;
blockPos.clear();
//Get DPPType from file name;
DPPType = -1;
if( fileName.find("PHA") != std::string::npos ) DPPType = DPPType::DPP_PHA_CODE;
if( fileName.find("PSD") != std::string::npos ) DPPType = DPPType::DPP_PSD_CODE;
if( fileName.find("QDC") != std::string::npos ) DPPType = DPPType::DPP_QDC_CODE;
//check is the file is *.fsu or *.fsu.X
size_t found = fileName.find_last_of('.');
@ -78,6 +78,29 @@ inline FSUReader::FSUReader(std::string fileName, unsigned short numCh, bool ver
if(verbose) printf("It is a splitted dual block data *.fsu.X format, dual channel mask : %d \n", chMask);
}
std::string fileNameNoExt = fileName.substr(0, found);
// Split the string by underscores
std::istringstream iss(fileNameNoExt);
std::vector<std::string> tokens;
std::string token;
while (std::getline(iss, token, '_')) { tokens.push_back(token); }
sn = atoi(tokens[2].c_str());
tick2ns = atoi(tokens[4].c_str());
order = atoi(tokens[5].c_str());
DPPType = -1;
if( fileName.find("PHA") != std::string::npos ) DPPType = DPPType::DPP_PHA_CODE;
if( fileName.find("PSD") != std::string::npos ) DPPType = DPPType::DPP_PSD_CODE;
if( fileName.find("QDC") != std::string::npos ) DPPType = DPPType::DPP_QDC_CODE;
numCh = DPPType == DPPType::DPP_QDC_CODE ? 64 : 16;
data = new Data(numCh);
data->tick2ns = tick2ns;
data->boardSN = sn;
data->DPPType = DPPType;
//ScanNumBlock();
}

View File

@ -29,9 +29,9 @@ class Data{
public:
char *buffer; /// readout buffer
int DPPType;
std::string DPPTypeStr;
std::string DPPTypeStr; /// only for saving fiel name
unsigned short boardSN;
float tick2ns; /// only use in TriggerRate calculation
float tick2ns; /// use in convert the timestamp to ns, and use in TriggerRate calculation
unsigned int nByte; /// number of byte from read buffer
uint32_t AllocatedSize;
@ -230,6 +230,7 @@ inline bool Data::OpenSaveFile(std::string fileNamePrefix){
oss << outFilePrefix << "_"
<< std::setfill('0') << std::setw(3) << boardSN << "_"
<< DPPTypeStr << "_"
<< std::fixed << std::setprecision(0) << tick2ns << "_"
<< std::setfill('0') << std::setw(3) << outFileIndex << ".fsu";
std::string saveFileName = oss.str();
@ -271,6 +272,7 @@ inline void Data::SaveData(){
oss << outFilePrefix << "_"
<< std::setfill('0') << std::setw(3) << boardSN << "_"
<< DPPTypeStr << "_"
<< std::fixed << std::setprecision(0) << tick2ns << "_"
<< std::setfill('0') << std::setw(3) << outFileIndex << ".fsu";
std::string saveFileName = oss.str();
@ -350,7 +352,7 @@ inline void Data::PrintAllData(bool tableMode, unsigned int maxRowDisplay) const
if( DataIndex[ch] < 0 ) continue;
printf("------------ ch : %d, DataIndex : %d, loop : %d\n", ch, DataIndex[ch], LoopIndex[ch]);
for( int ev = 0; ev <= (LoopIndex[ch] > 0 ? MaxNData : DataIndex[ch]) ; ev++){
if( DPPType == DPPType::DPP_PHA_CODE ) printf("%4d, %5u, %15llu, %5u \n", ev, Energy[ch][ev], Timestamp[ch][ev], fineTime[ch][ev]);
if( DPPType == DPPType::DPP_PHA_CODE || DPPType == DPPType::DPP_QDC_CODE ) printf("%4d, %5u, %15llu, %5u \n", ev, Energy[ch][ev], Timestamp[ch][ev], fineTime[ch][ev]);
if( DPPType == DPPType::DPP_PSD_CODE ) printf("%4d, %5u, %5u, %15llu, %5u \n", ev, Energy[ch][ev], Energy2[ch][ev], Timestamp[ch][ev], fineTime[ch][ev]);
if( maxRowDisplay > 0 && (unsigned int) ev > maxRowDisplay ) break;
}
@ -761,7 +763,7 @@ inline int Data::DecodePHADualChannelBlock(unsigned int ChannelMask, bool fastDe
}
Energy[channel][DataIndex[channel]] = energy;
Timestamp[channel][DataIndex[channel]] = timeStamp;
Timestamp[channel][DataIndex[channel]] = timeStamp * tick2ns;
if(extra2Option == 2 ) fineTime[channel][DataIndex[channel]] = (extra2 & 0x03FF );
PileUp[channel][DataIndex[channel]] = pileUp;
NumEventsDecoded[channel] ++;
@ -964,7 +966,7 @@ inline int Data::DecodePSDDualChannelBlock(unsigned int ChannelMask, bool fastDe
Energy2[channel][DataIndex[channel]] = Qshort;
Energy[channel][DataIndex[channel]] = Qlong;
Timestamp[channel][DataIndex[channel]] = timeStamp;
Timestamp[channel][DataIndex[channel]] = timeStamp * tick2ns;
if( extraOption == 2 ) fineTime[channel][DataIndex[channel]] = extra & 0x3FF;
NumEventsDecoded[channel] ++;
@ -1119,7 +1121,7 @@ inline int Data::DecodeQDCGroupedChannelBlock(unsigned int ChannelMask, bool fas
}
Energy[channel][DataIndex[channel]] = energy;
Timestamp[channel][DataIndex[channel]] = timeStamp;
Timestamp[channel][DataIndex[channel]] = timeStamp * tick2ns;
NumEventsDecoded[channel] ++;
if( !pileup && !OverRange){

View File

@ -11,6 +11,11 @@ MultiBuilder::MultiBuilder(Data ** multiData, std::vector<int> type, std::vector
leftOverTime = 100;
breakTime = -1;
ClearEvents();
// for( int i = 0; i < nData; i++){
// printf("sn: %d, numCh : %d \n", snList[i], data[i]->GetNChannel());
// }
}
MultiBuilder::MultiBuilder(Data * singleData, int type, int sn): nData(1){
@ -220,10 +225,11 @@ void MultiBuilder::BuildEvents(bool isFinal, bool skipTrace, bool verbose){
// printf("##### %d/%d | ", k, nData);
// data[k]->PrintAllData(true, 10);
const int numCh = data[k]->GetNChannel();
const int numCh = data[bd]->GetNChannel();
for( int i = 0; i < numCh; i++){
int ch = (i + earlistCh ) % numCh;
// printf("ch : %d | exhaused ? %s \n", ch, chExhaused[bd][ch] ? "Yes" : "No");
if( chExhaused[bd][ch] ) continue;
if( loopIndex[bd][ch] * MaxNData + nextIndex[bd][ch] > data[bd]->LoopIndex[ch] * MaxNData + data[bd]->DataIndex[ch]) {
nExhaushedCh ++;
@ -234,7 +240,7 @@ void MultiBuilder::BuildEvents(bool isFinal, bool skipTrace, bool verbose){
do {
unsigned long long time = data[bd]->Timestamp[ch][nextIndex[bd][ch]];
// printf("Check timestamp : %llu | earlistTime : %llu | timeWindow : %u \n", time, earlistTime, timeWindow);
if( time >= earlistTime && (time - earlistTime <= timeWindow) ){
em.sn = snList[bd];
em.bd = bd;
@ -269,7 +275,7 @@ void MultiBuilder::BuildEvents(bool isFinal, bool skipTrace, bool verbose){
}
///Find the next earlist
FindEarlistTimeAndCh(verbose);
FindEarlistTimeAndCh(false);
if( verbose ){
printf(">>>>>>>>>>>>>>>>> Event ID : %ld, total built: %ld, multiplicity : %ld\n", eventIndex, totalEventBuilt, events[eventIndex].size());

View File

@ -73,6 +73,7 @@ private:
std::vector<int> typeList;
std::vector<int> snList;
std::vector<int> idList;
std::vector<int> tick2ns;
const unsigned short nData;
Data ** data; // assume all data has MaxNChannel (16)