From 12f4803e45f23821211ae08b0b533abb4095fe4b Mon Sep 17 00:00:00 2001 From: "Ryan@WorkStation" Date: Fri, 21 Jan 2022 15:57:40 -0500 Subject: [PATCH] added to2root_multi --- .gitignore | 2 +- armory/MergeEVT.cpp | 2 +- armory/evtReader.h | 2 +- armory/makefile | 6 +- armory/to2root.cpp | 26 +++-- armory/to2root_multi.cpp | 207 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 233 insertions(+), 12 deletions(-) create mode 100644 armory/to2root_multi.cpp diff --git a/.gitignore b/.gitignore index 12e1db9..41880bb 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,7 @@ xia2root xia2ev2* -to2root +to2root* scan pxi-time-order MergeEVT diff --git a/armory/MergeEVT.cpp b/armory/MergeEVT.cpp index de6d2d4..8c086be 100644 --- a/armory/MergeEVT.cpp +++ b/armory/MergeEVT.cpp @@ -42,7 +42,7 @@ int main(int argn, char **argv) { TString inFileName[nFiles]; for( int i = 0; i < nFiles ; i++){ inFileName[i] = argv[i+2]; - printf(" in file - %2d: %s\n", i, inFileName[i].Data()); + printf(" in file - %2d: %s\n", i, inFileName[i].Data()); } printf(" out file: %s\n", outFileName.Data()); diff --git a/armory/evtReader.h b/armory/evtReader.h index c7d3c05..ccdb382 100644 --- a/armory/evtReader.h +++ b/armory/evtReader.h @@ -126,7 +126,7 @@ public: data->pileup = header[0] >> 31 ; data->time = ((ULong64_t)(header[2] & 0xFFFF) << 32) + header[1]; data->cfd = header[2] >> 16 ; - data->energy = (header[3] & 0xFFFF ) /2; // I don;t know why it has to "rebin" + data->energy = (header[3] & 0xFFFF ); data->trace_length = (header[3] >> 16) & 0x7FFF; data->trace_out_of_range = header[3] >> 31; diff --git a/armory/makefile b/armory/makefile index de9f8d0..158b7a1 100644 --- a/armory/makefile +++ b/armory/makefile @@ -1,6 +1,6 @@ CC=g++ -all: to2root evt2hist MergeEVT ev22txt EventBuilder pxi-time-order +all: to2root evt2hist MergeEVT ev22txt EventBuilder pxi-time-order to2root_multi #this is FSU evt to root xia2root: ../armory/xia2root.cpp @@ -13,6 +13,10 @@ xia2root: ../armory/xia2root.cpp to2root: ../armory/to2root.cpp ../armory/DataBlock.h ../armory/evtReader.h ../mapping.h $(CC) ../armory/to2root.cpp -o to2root `root-config --cflags --glibs` +to2root_multi: ../armory/to2root_multi.cpp ../armory/DataBlock.h ../armory/evtReader.h ../mapping.h + $(CC) ../armory/to2root_multi.cpp -o to2root_multi `root-config --cflags --glibs` + + #this is for online root MergeEVT: ../armory/MergeEVT.cpp ../armory/DataBlock.h ../armory/evtReader.h ../mapping.h $(CC) ../armory/MergeEVT.cpp -o MergeEVT `root-config --cflags --glibs` diff --git a/armory/to2root.cpp b/armory/to2root.cpp index af5cee1..894350e 100644 --- a/armory/to2root.cpp +++ b/armory/to2root.cpp @@ -102,13 +102,16 @@ int main(int argc, char **argv) { //unsigned short pileup[MAXMULTI]; - tree->Branch("evID", &evID, "event_ID/l"); - tree->Branch("multi", &multi, "multi/I"); - tree->Branch("detID", id, "detID[multi]/I"); - tree->Branch("e", e, "e[multi]/D"); - tree->Branch("e_t", e_t, "e_timestamp[multi]/l"); - tree->Branch("qdc", qdc, "qdc[multi][8]/I"); + tree->Branch("evID", &evID, "event_ID/l"); + tree->Branch("multi", &multi, "multi/I"); + tree->Branch("detID", id, "detID[multi]/I"); + tree->Branch("e", e, "e[multi]/D"); + tree->Branch("e_t", e_t, "e_timestamp[multi]/l"); + tree->Branch("qdc", qdc, "qdc[multi][8]/I"); tree->Branch("multiCry", &multiCry, "multiplicity_crystal/I"); + + + int countGP = 0; //gamma-particle coincident ///////////////////// // MAIN WHILE LOOP // @@ -166,11 +169,16 @@ int main(int argc, char **argv) { } //end while loop for unpacking sub events and event building for one "event" if (multi==0) break; //end main WHILE LOOP when out of events - dataCount += multi; + dataCount = evt->GetBlockID(); evID ++; evt->PrintStatus(10000); - + + // when no gagg, don't save + if( multiCry == 0 || multi == multiCry ) continue; + + countGP ++; + outRootFile->cd(); tree->Fill(); @@ -185,6 +193,8 @@ int main(int argc, char **argv) { outRootFile->Close(); printf("\n\n\n==================== finished.\r\n"); + + printf(" number of Gamma - GAGG coincdient : %d\n", countGP); return 0; } diff --git a/armory/to2root_multi.cpp b/armory/to2root_multi.cpp new file mode 100644 index 0000000..475f0e2 --- /dev/null +++ b/armory/to2root_multi.cpp @@ -0,0 +1,207 @@ +/**********************************************************/ +/* */ +/* Modified by Ryan From */ +/* */ +/* PXI SCAN CODE -- J.M. Allmond (ORNL) -- July 2016 */ +/* */ +/**********************************************************/ + +#include +#include +#include +#include +#include + +#include "TFile.h" +#include "TTree.h" +#include "TMath.h" +#include "TBenchmark.h" + +#define RAND ((float) rand() / ((unsigned int) RAND_MAX + 1)) // random number in interval (0,1) + +#define MAX_CRATES 2 +#define MAX_BOARDS_PER_CRATE 13 +#define MAX_CHANNELS_PER_BOARD 16 +#define BOARD_START 2 + +#define MAX_ID MAX_CRATES*MAX_BOARDS_PER_CRATE*MAX_CHANNELS_PER_BOARD + +#define HEADER_LENGTH 4 //unit = words with 4 bytes per word +#define MAX_SUB_LENGTH 2016 //unit = words with 4 bytes per word ; 2004 --> 40 micro-second trace + 4 word header + +#define RAWE_REBIN_FACTOR 2.0 // Rebin 32k pixie16 spectra to something smaller to fit better into 8k. + +#include "../mapping.h" + +#include "../armory/evtReader.h" + +unsigned long long int dataCount=0; +unsigned long long int pileUpCount=0; +unsigned long long int evtCount=0; + +/////////////////////////////////// +// START OF MAIN FUNCTION // +/////////////////////////////////// +int main(int argc, char **argv) { + + printf("=====================================\n"); + printf("=== evt.to --> root ===\n"); + printf("=====================================\n"); + + // Check that the corrent number of arguments were provided. + if (argc <= 4) { + printf("Incorrect number of arguments:\n"); + printf("%s [outFile] [timeWindow] [to File1] [to File2] .... \n", argv[0]); + printf(" outFile : output root file name\n"); + printf(" timeWindow : number of tick, 1 tick = 10 ns. default = 100 \n"); + return 1; + } + + TString outFileName = argv[1]; + int timeWindow = atoi(argv[2]); + int nFile = argc - 3; + TString inFileName[nFile]; + for( int i = 0 ; i < nFile ; i++){ + inFileName[i] = argv[i+3]; + } + + printf("====================================\n"); + + evtReader * evt = new evtReader(); + DataBlock * data = evt->data; + + printf(" Number of input file : %d \n", nFile); + printf(" out file : \033[1;31m%s\033[m\n", outFileName.Data()); + printf(" Event building time window : %d tics = %d nsec \n", timeWindow, timeWindow*10); + + + TFile * outRootFile = new TFile(outFileName, "recreate"); + outRootFile->cd(); + TTree * tree = new TTree("tree", "tree"); + + unsigned long long evID = 0; + int multi = 0; + int id[MAX_ID] = {0}; + double e[MAX_ID] = {TMath::QuietNaN()}; + unsigned long long e_t[MAX_ID] = {0}; + int qdc[MAX_ID][8] = {0}; + int multiCry = 0 ; /// this is total multiplicity for all crystal + int runID = 0; // date-run-fileID, Dec15-02-001 = 1502001 + + //unsigned short pileup[MAXMULTI]; + + tree->Branch("evID", &evID, "event_ID/l"); + tree->Branch("multi", &multi, "multi/I"); + tree->Branch("detID", id, "detID[multi]/I"); + tree->Branch("e", e, "e[multi]/D"); + tree->Branch("e_t", e_t, "e_timestamp[multi]/l"); + tree->Branch("qdc", qdc, "qdc[multi][8]/I"); + tree->Branch("multiCry", &multiCry, "multiplicity_crystal/I"); + tree->Branch("runID", &runID, "runID/I"); + + int countGP = 0; //gamma-particle coincident + + for( int i = 0; i < nFile; i++){ + evt->OpenFile(inFileName[i]); + if( evt->IsOpen() == false ) continue; + + printf("====================================================\n"); + printf("\033[1;31m%s \033[m\n", inFileName[i].Data()); + + int pos = inFileName[i].Last('/'); + TString temp = inFileName[i]; + temp.Remove(0, pos+1); + temp.Remove(0, 3); + temp.Remove(2, 1); + temp.Remove(4, 1); + temp.Remove(7); + runID = atoi(temp.Data()); + + + while ( evt->IsEndOfFile() == false ) { //main while loop + + long long int etime = -1; + long long int tdif = -1; + + while (1) { //get subevents and event build for one "event" + + if ( evt->ReadBlock() == -1) break; + + //Set reference time for event building + if (etime == -1) { + etime = data->time; + tdif = 0; + multi = 0; + }else { + tdif = data->time - etime; + } + + //Check for end of event, rewind, and break out of while loop + if (tdif > timeWindow) { + + etime = data->time; + tdif = 0; + multi = 0; + multiCry = 0; + + id[multi] = data->detID; + e[multi] = data->energy; + e_t[multi] = data->time; + for( int i = 0; i < 8; i++) qdc[multi][i] = data->QDCsum[i]; + multi++ ; + if( data->detID < 100 ) multiCry ++; + + break; + }else{ + //if within time window, fill array; + id[multi] = data->detID; + e[multi] = data->energy; + e_t[multi] = data->time; + for( int i = 0; i < 8; i++) qdc[multi][i] = data->QDCsum[i]; + multi++ ; + if( data->detID < 100 ) multiCry ++; + } + + // total pileups + if (data->pileup == 1) { + pileUpCount++; + } + + + } //end while loop for unpacking sub events and event building for one "event" + if (multi==0) break; //end main WHILE LOOP when out of events + dataCount = evt->GetBlockID(); + evID ++; + + evt->PrintStatus(10000); + + // when no gagg, don't save + if( multiCry == 0 || multi == multiCry ) continue; + + countGP ++; + + outRootFile->cd(); + tree->Fill(); + + } // end main while loop + + evt->PrintStatus(1); + printf("\n\n\n"); + printf(" total number of event built : %llu\n", evID); + printf(" total number of Gamma - GAGG coincdient : %d\n", countGP); + + } + + + outRootFile->cd(); + tree->Write(); + outRootFile->Close(); + + printf("\n\n\n==================== finished.\r\n"); + + printf(" number of Gamma - GAGG coincdient : %d\n", countGP); + + return 0; +} + +