added DataBlock and evtReader Classes

This commit is contained in:
Ryan Tang 2022-01-13 18:23:41 -05:00
parent d79ea1a783
commit 888994ae1c
10 changed files with 496 additions and 214 deletions

1
.gitignore vendored
View File

@ -25,3 +25,4 @@ Data
obsolete obsolete
test.cpp test.cpp
test

View File

@ -36,6 +36,10 @@ TH2F * hcrystalBGO;
TH1F * hTDiff; TH1F * hTDiff;
TH2F * hPID;
TH2F * hPID209;
TH2F * hPID219;
///----- after calibration and BGO veto ///----- after calibration and BGO veto
TH2F * heCalVID; TH2F * heCalVID;
TH1F * heCal[NCRYSTAL]; TH1F * heCal[NCRYSTAL];
@ -70,6 +74,11 @@ void Analyzer::Begin(TTree * tree){
heCal[i] = new TH1F(Form("heCal%02d", i), Form("eCal -%02d (BGO veto > %.1f); Energy [keV]; count / %d keV", i, BGO_threshold, energyRange[0]), (energyRange[2] - energyRange[1])/energyRange[0], energyRange[1], energyRange[2]); heCal[i] = new TH1F(Form("heCal%02d", i), Form("eCal -%02d (BGO veto > %.1f); Energy [keV]; count / %d keV", i, BGO_threshold, energyRange[0]), (energyRange[2] - energyRange[1])/energyRange[0], energyRange[1], energyRange[2]);
} }
hPID = new TH2F("hPID", "PID; tail; peak ", 400, -20, 300, 400, -50, 800);
hPID209 = new TH2F("hPID209", "PID detID = 209; tail; peak ", 400, -20, 300, 400, -50, 800);
hPID219 = new TH2F("hPID219", "PID detID = 219; tail; peak ", 400, -20, 300, 400, -50, 800);
for( int i = 0; i < NCRYSTAL; i++){ for( int i = 0; i < NCRYSTAL; i++){
for( int j = i+1; j < NCRYSTAL; j++){ for( int j = i+1; j < NCRYSTAL; j++){
//hgg[i][j] = new TH2F(Form("hgg%02d%02d", i, j), Form("e%02d vs e%02d; e%02d; e%02d", i, j, i, j), //hgg[i][j] = new TH2F(Form("hgg%02d%02d", i, j), Form("e%02d vs e%02d; e%02d; e%02d", i, j, i, j),
@ -112,12 +121,17 @@ Bool_t Analyzer::Process(Long64_t entry){
b_multi->GetEntry(entry); b_multi->GetEntry(entry);
b_multiCry->GetEntry(entry); b_multiCry->GetEntry(entry);
b_detID->GetEntry(entry); b_detID->GetEntry(entry);
b_qdc->GetEntry(entry);
if( multi == 0 ) return kTRUE; if( multi == 0 ) return kTRUE;
for( int i = 0; i < NCRYSTAL; i++) eCal[i] = TMath::QuietNaN(); for( int i = 0; i < NCRYSTAL; i++) eCal[i] = TMath::QuietNaN();
///printf("---------------------------- %d \n", multi); ///printf("---------------------------- %d \n", multi);
double bgC[2]={0}, peakC[2]={0}, tailC[2] = {0};
int count = 0 ;
///=========== Looping data for the event ///=========== Looping data for the event
for( int i = 0; i < multi ; i ++){ for( int i = 0; i < multi ; i ++){
@ -142,6 +156,30 @@ Bool_t Analyzer::Process(Long64_t entry){
} }
if( 200 < id && id < 300){ /// GAGG
}
if( id == 209 ) {
double bg = (qdc[i][0] + qdc[i][1])/60.;
double peak = qdc[i][3]/20. - bg;
double tail = qdc[i][5]/55. - bg;
hPID209->Fill( tail, peak);
}
if( id == 219 ) {
double bg = (qdc[i][0] + qdc[i][1])/60.;
double peak = qdc[i][3]/20. - bg;
double tail = qdc[i][5]/55. - bg;
hPID219->Fill( tail, peak);
}
if( count < 2 && (id == 209 || id == 219 )){
bgC[count] = (qdc[i][0] + qdc[i][1])/60.;
peakC[count] = qdc[i][3]/20. - bgC[count];
tailC[count] = qdc[i][5]/55. - bgC[count];
count++;
}
if ( i > 0 ) hTDiff->Fill( e_t[i] - e_t[0]); if ( i > 0 ) hTDiff->Fill( e_t[i] - e_t[0]);
@ -182,6 +220,9 @@ Bool_t Analyzer::Process(Long64_t entry){
} }
hPID->Fill( (tailC[0]+tailC[1])/2., ( peakC[0] + peakC[1])/2.);
if ( saveEV2) Save2ev2(); if ( saveEV2) Save2ev2();
@ -205,19 +246,20 @@ void Analyzer::Terminate(){
cCanvas->cd(1); cCanvas->cd(1);
cCanvas->cd(1)->SetLogz(1); cCanvas->cd(1)->SetLogz(1);
heVID->Draw("colz"); hPID209->Draw("colz");
cCanvas->cd(2); cCanvas->cd(2);
cCanvas->cd(2)->SetLogz(1); cCanvas->cd(2)->SetLogz(1);
heCalVID->Draw("colz"); hPID219->Draw("colz");
cCanvas->cd(3); cCanvas->cd(3);
cCanvas->cd(3)->SetLogz(1); cCanvas->cd(3)->SetLogz(1);
hcrystalBGO->Draw("colz"); hPID->Draw("colz");
cCanvas->cd(4); cCanvas->cd(4);
cCanvas->cd(4)->SetLogz(1); cCanvas->cd(4)->SetLogz(1);
hcrystalBGO_G->Draw("colz"); //gROOT->ProcessLine(".x script.C");
//hcrystalBGO_G->Draw("colz");
//he[0]->SetLineColor(2); //he[0]->SetLineColor(2);
//he[0]->Draw(); //he[0]->Draw();
//heCal[0]->Draw("same"); //heCal[0]->Draw("same");

View File

@ -18,7 +18,9 @@
#include "mapping.h" #include "mapping.h"
#include "armory/AnalysisLibrary.h" #include "armory/AnalysisLibrary.h"
// Header file for the classes stored in the TTree if any. // Header file for the classes stored in the TTree if any.'
#define MAX_MULTI 200
class Analyzer : public TSelector { class Analyzer : public TSelector {
public : public :
@ -28,9 +30,10 @@ public :
// Declaration of leaf types // Declaration of leaf types
ULong64_t evID; ULong64_t evID;
Int_t detID[200]; Int_t detID[MAX_MULTI];
Double_t e[200]; Double_t e[MAX_MULTI];
ULong64_t e_t[200]; ULong64_t e_t[MAX_MULTI];
Int_t qdc[MAX_MULTI][8];
Int_t multi; Int_t multi;
Int_t multiCry; Int_t multiCry;
@ -39,6 +42,7 @@ public :
TBranch *b_detID; //! TBranch *b_detID; //!
TBranch *b_energy; //! TBranch *b_energy; //!
TBranch *b_time; //! TBranch *b_time; //!
TBranch *b_qdc; //!
TBranch *b_multi; //! TBranch *b_multi; //!
TBranch *b_multiCry; //! TBranch *b_multiCry; //!
@ -99,9 +103,10 @@ void Analyzer::Init(TTree *tree)
fChain->SetMakeClass(1); fChain->SetMakeClass(1);
fChain->SetBranchAddress("evID", &evID, &b_event_ID); fChain->SetBranchAddress("evID", &evID, &b_event_ID);
fChain->SetBranchAddress("id", detID, &b_detID); fChain->SetBranchAddress("detID", detID, &b_detID);
fChain->SetBranchAddress("e", e, &b_energy); fChain->SetBranchAddress("e", e, &b_energy);
fChain->SetBranchAddress("e_t", e_t, &b_time); fChain->SetBranchAddress("e_t", e_t, &b_time);
fChain->SetBranchAddress("qdc", qdc, &b_qdc);
fChain->SetBranchAddress("multi", &multi, &b_multi); fChain->SetBranchAddress("multi", &multi, &b_multi);
fChain->SetBranchAddress("multiCry", &multiCry, &b_multiCry); fChain->SetBranchAddress("multiCry", &multiCry, &b_multiCry);

96
armory/DataBlock.h Normal file
View File

@ -0,0 +1,96 @@
#ifndef DATABLOCK_H
#define DATABLOCK_H
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <string.h>
#include "TSystem.h"
#include "TObject.h"
#include "TFile.h"
#include "TTree.h"
#include "TString.h"
class DataBlock{
public:
UShort_t ch;
UShort_t slot;
UShort_t crate;
UShort_t headerLength; /// headerLength > 4, more data except tarce.
UShort_t eventLength; /// eventLength = headerLength + trace
Bool_t pileup;
ULong64_t time;
UShort_t cfd;
UShort_t energy;
UShort_t trace_length;
Bool_t trace_out_of_range;
Int_t trailing;
Int_t leading;
Int_t gap;
Int_t baseline;
Int_t QDCsum[8];
UShort_t id;
Int_t detID;
ULong64_t eventID;
UShort_t trace[1024];
DataBlock(){
Clear();
};
~DataBlock(){};
void Clear(){
ch = 0;
slot = 0;
crate = 0;
headerLength = 0;
eventLength = 0;
pileup = false;
time = 0;
cfd = 0;
energy = 0;
trace_length = 0;
trace_out_of_range = 0;
id = 0;
detID = -1;
eventID = 0;
trailing = 0;
leading = 0;
gap = 0;
baseline = 0;
for( int i = 0; i < 8; i++) QDCsum[i] = -1;
for( int i = 0; i < 1024; i++) trace[i] = 0;
}
void Print(){
printf("============== eventID : %llu\n", eventID);
printf("Crate: %d, Slot: %d, Ch: %d | id: %d = detID : %d \n", crate, slot, ch, id, detID);
printf("HeaderLength: %d, Event Length: %d, energy: %d, timeStamp: %llu\n", headerLength, eventLength, energy, time);
printf("trace_length: %d, pile-up:%d\n", trace_length, pileup);
if( headerLength > 4 ){
if( headerLength > 12 ){
printf(" trailing : %d\n", trailing);
printf(" leading : %d\n", leading);
printf(" gap : %d\n", gap);
printf(" baseLine : %d\n", baseline);
}
printf(" QDCsum : \n");
for( int i = 0; i < 8; i++) printf(" %-10d\n", QDCsum[i]);
}
if( eventLength > headerLength ){
printf(" trace:\n");
for( int i = 0 ; i < trace_length ; i++)printf("%3d| %-10d\n",i, trace[i]);
}
}
};
#endif

View File

@ -16,49 +16,8 @@
#define BOARD_START 2 #define BOARD_START 2
#include "../mapping.h" #include "../mapping.h"
#include "../armory/DataBlock.h"
class measurment{
public:
UShort_t ch;
UShort_t slot;
UShort_t crate;
UShort_t headerLength; /// headerLength > 4, more data except tarce.
UShort_t eventLength; /// eventLength = headerLength + trace
Bool_t pileup;
ULong64_t time;
UShort_t cfd;
UShort_t energy;
UShort_t trace_length;
Bool_t trace_out_of_range;
Long64_t timeDiff;
UShort_t id;
measurment(){};
void Clear(){
ch = 0;
slot = 0;
crate = 0;
eventLength = 0;
pileup = false;
time = 0;
cfd = 0;
energy = 0;
trace_length = 0;
trace_out_of_range = 0;
timeDiff = 0;
id = 0;
}
void Print(){
printf("Crate: %d, Slot: %d, Ch: %d | id: %d \n", crate, slot, ch, id);
printf("HeaderLength: %d, Event Length: %d, energy: %d, timeStamp: %llu\n", headerLength, eventLength, energy, time);
printf("trace_length: %d, pile-up:%d\n", trace_length, pileup);
}
};
//############################################# //#############################################
// main // main
//############################################# //#############################################
@ -88,7 +47,7 @@ int main(int argn, char **argv) {
printf(" out file: %s\n", outFileName.Data()); printf(" out file: %s\n", outFileName.Data());
Long64_t measureID = -1; Long64_t measureID = -1;
measurment data; DataBlock data;
printf("====================================\n"); printf("====================================\n");

View File

@ -4,6 +4,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <vector> #include <vector>
#include <thread>
#include "TSystem.h" #include "TSystem.h"
#include "TObject.h" #include "TObject.h"
@ -22,6 +23,8 @@
#include "../mapping.h" #include "../mapping.h"
#include "../armory/AnalysisLibrary.h" #include "../armory/AnalysisLibrary.h"
#include "../armory/DataBlock.h"
#define MAX_CRATES 2 #define MAX_CRATES 2
#define MAX_BOARDS_PER_CRATE 13 #define MAX_BOARDS_PER_CRATE 13
#define MAX_CHANNELS_PER_BOARD 16 #define MAX_CHANNELS_PER_BOARD 16
@ -32,98 +35,31 @@
// 2) Change to GUI // 2) Change to GUI
// 4) eventBuilding // 4) eventBuilding
class measurment{ DataBlock dataList[1000];
int dataCollected = 0;
public: void BuildEvent(){
UShort_t ch;
UShort_t slot;
UShort_t crate;
UShort_t headerLength; /// headerLength > 4, more data except tarce.
UShort_t eventLength; /// eventLength = headerLength + trace
Bool_t pileup;
ULong64_t time;
UShort_t cfd;
UShort_t energy;
UShort_t trace_length;
Bool_t trace_out_of_range;
Int_t trailing; ///==== sort timestamp
Int_t leading;
Int_t gap;
Int_t baseline;
Int_t QDCsum[8];
UShort_t id; ///==== build events
Int_t detID;
ULong64_t eventID;
UShort_t trace[1024]; ///==== output to g-g hist
}
measurment(){
Clear();
};
~measurment(){};
void Clear(){
ch = 0;
slot = 0;
crate = 0;
headerLength = 0;
eventLength = 0;
pileup = false;
time = 0;
cfd = 0;
energy = 0;
trace_length = 0;
trace_out_of_range = 0;
id = 0;
detID = -1;
eventID = 0;
trailing = 0;
leading = 0;
gap = 0;
baseline = 0;
for( int i = 0; i < 8; i++) QDCsum[i] = -1;
for( int i = 0; i < 1024; i++) trace[i] = 0;
}
void Print(){
printf("============== eventID : %llu\n", eventID);
printf("Crate: %d, Slot: %d, Ch: %d | id: %d = detID : %d \n", crate, slot, ch, id, detID);
printf("HeaderLength: %d, Event Length: %d, energy: %d, timeStamp: %llu\n", headerLength, eventLength, energy, time);
printf("trace_length: %d, pile-up:%d\n", trace_length, pileup);
if( headerLength > 4 ){
if( headerLength > 12 ){
printf(" trailing : %d\n", trailing);
printf(" leading : %d\n", leading);
printf(" gap : %d\n", gap);
printf(" baseLine : %d\n", baseline);
}
printf(" QDCsum : \n");
for( int i = 0; i < 8; i++) printf(" %-10d\n", QDCsum[i]);
}
if( eventLength > headerLength ){
printf(" trace:\n");
for( int i = 0 ; i < trace_length ; i++)printf("%3d| %-10d\n",i, trace[i]);
}
}
};
//############################################# //#############################################
// main // main
//############################################### //###############################################
int main(int argn, char **argv) { int main(int argn, char **argv) {
if (argn < 2 || argn > 6 ) { if (argn < 2 || argn > 7 ) {
printf("Usage :\n"); printf("Usage :\n");
printf("%s [evt File] [E corr] [raw E threshold] [Save Hist] [Save Root]\n", argv[0]); printf("%s [evt File] [E corr] [raw E threshold] [Hist File] [Root File] [display data]\n", argv[0]);
printf(" [E corr] : correction file for gamma energy \n"); printf(" [E corr] : correction file for gamma energy \n");
printf(" [raw E threshold] : min raw E \n"); printf(" [raw E threshold] : min raw E, default 10 ch \n");
printf(" [save Hist] : 1/0 \n"); printf(" [Hist File] : if provided, saved histograms in root. if value = 1, auto fileName. \n");
printf(" [save Root] : 1/0 \n"); printf(" [Root File] : if provided, saved energy, timestamp, QDC, and trace in to root. if value = 1, auto fileName. \n");
printf(" [display data] : number of event from the first one to display. default 0. \n");
return 1; return 1;
} }
@ -137,15 +73,31 @@ int main(int argn, char **argv) {
eCorr = LoadCorrectionParameters(corrFile); eCorr = LoadCorrectionParameters(corrFile);
} }
int rawEnergyThreshold = 100; int rawEnergyThreshold = 10;
if( argn >= 4 ) rawEnergyThreshold = atoi(argv[3]); if( argn >= 4 ) rawEnergyThreshold = atoi(argv[3]);
bool isSaveHist = false; ///save gamma hist for calibration TString histFileName = ""; ///save gamma hist for calibration
if( argn >= 5 ) isSaveHist = atoi(argv[5]); if( argn >= 5 ) histFileName = argv[4];
if( histFileName == "1" ){
histFileName = inFileName;
histFileName.Remove(0, inFileName.Last('/')+1);
histFileName.Remove(histFileName.First('.'));
histFileName.Append("_hist.root");
}
if( histFileName == "0" ) histFileName = "";
bool isSaveRoot = false; ///save data into root TString rootFileName = ""; ///save data into root
if( argn >= 6 ) isSaveRoot = atoi(argv[6]); if( argn >= 6 ) rootFileName = argv[5];
if( rootFileName == "1" ){
rootFileName = inFileName;
rootFileName.Remove(0, inFileName.Last('/')+1);
rootFileName.Remove(rootFileName.First('.'));
rootFileName.Append("_raw.root");
}
if( rootFileName == "0" ) rootFileName = "";
int maxDataDisplay = 0;
if( argn >= 7 ) maxDataDisplay = atoi(argv[6]);
long int inFilePos; long int inFilePos;
TBenchmark gClock; TBenchmark gClock;
@ -154,7 +106,7 @@ int main(int argn, char **argv) {
ULong64_t measureID = -1; ULong64_t measureID = -1;
measurment data; DataBlock data;
printf("====================================\n"); printf("====================================\n");
@ -166,17 +118,24 @@ int main(int argn, char **argv) {
printf(" in file: \033[1;31m%s\033[m\n", inFileName.Data()); printf(" in file: \033[1;31m%s\033[m\n", inFileName.Data());
printf(" Gamma energy correction file : %s\n", corrFile == "" ? "Not provided." : corrFile.Data()); printf(" Gamma energy correction file : %s\n", corrFile == "" ? "Not provided." : corrFile.Data());
printf(" raw E threshold : %d ch\n", rawEnergyThreshold);
if( histFileName != "" ) printf(" Save histograms to %s\n", histFileName.Data());
if( rootFileName != "" ) printf(" Save root to %s\n", rootFileName.Data());
printf("--------------------------------\n"); printf("--------------------------------\n");
TFile * fFile = NULL; TFile * fFile = NULL;
TTree * tree = NULL; TTree * tree = NULL;
if( isSaveRoot ){ if( rootFileName != "" ){
fFile = new TFile("temp.root", "RECREATE"); fFile = new TFile(rootFileName, "RECREATE");
tree = new TTree("tree", "tree"); tree = new TTree("tree", "tree");
tree->Branch("headerLenght", &data.headerLength, "HeaderLength/s");
tree->Branch("detID", &data.detID, "detID/s"); tree->Branch("detID", &data.detID, "detID/s");
tree->Branch("id", &data.id, "id/s");
tree->Branch("e", &data.energy, "energy/s"); tree->Branch("e", &data.energy, "energy/s");
tree->Branch("e_t", &data.time, "timestamp/l"); tree->Branch("e_t", &data.time, "timestamp/l");
tree->Branch("p", &data.pileup, "pileup/O");
tree->Branch("qdc", data.QDCsum, "QDC_sum[8]/I"); tree->Branch("qdc", data.QDCsum, "QDC_sum[8]/I");
tree->Branch("trace_length", &data.trace_length, "trace_length/s"); tree->Branch("trace_length", &data.trace_length, "trace_length/s");
tree->Branch("trace", data.trace, "trace[trace_length]/s"); tree->Branch("trace", data.trace, "trace[trace_length]/s");
@ -227,7 +186,7 @@ int main(int argn, char **argv) {
while ( ! feof(inFile) ){ while ( ! feof(inFile) ){
fread(header, sizeof(header), 1, inFile); if ( fread(header, sizeof(header), 1, inFile) !=1 ) break;
measureID ++; measureID ++;
/// see the Pixie-16 user manual, Table4-2 /// see the Pixie-16 user manual, Table4-2
@ -251,19 +210,20 @@ int main(int argn, char **argv) {
if( data.headerLength >= 4 ){ if( data.headerLength >= 4 ){
unsigned int extraHeader[data.headerLength-4]; unsigned int extraHeader[data.headerLength-4];
fread(extraHeader, sizeof(extraHeader), 1, inFile); fread(extraHeader, sizeof(extraHeader), 1, inFile);
if( data.headerLength > 12){ if( data.headerLength == 8 || data.headerLength == 16){
data.trailing = extraHeader[0]; data.trailing = extraHeader[0];
data.leading = extraHeader[1]; data.leading = extraHeader[1];
data.gap = extraHeader[2]; data.gap = extraHeader[2];
data.baseline = extraHeader[3]; data.baseline = extraHeader[3];
} }
if( data.headerLength == 12 || data.headerLength == 16){
for( int i = 0; i < 8; i++){ for( int i = 0; i < 8; i++){
int startID = 0; int startID = 0;
if( data.headerLength > 12) startID = 4; ///the 1st 4 words if( data.headerLength > 12) startID = 4; ///the 1st 4 words
data.QDCsum[i] = extraHeader[i+startID]; data.QDCsum[i] = extraHeader[i+startID];
} }
} }
}
///====== read trace ///====== read trace
if( data.eventLength > data.headerLength ){ if( data.eventLength > data.headerLength ){
unsigned int traceBlock[data.trace_length / 2]; unsigned int traceBlock[data.trace_length / 2];
@ -275,11 +235,11 @@ int main(int argn, char **argv) {
} }
} }
///if( measureID < 10 ) { if( measureID < maxDataDisplay ) {
/// printf("----------------------event Length: %u, fpos: %llu byte (%lld words)\n", data.eventLength, fpos, fpos/4); printf("----------------------event Length: %u, fpos: %llu byte (%lld words)\n", data.eventLength, fpos, fpos/4);
/// for(int i = 0; i < 4; i++) printf(" %x\n", header[i]); for(int i = 0; i < 4; i++) printf(" %x\n", header[i]);
/// data.Print(); data.Print();
///} }
//=== jump to next measurement. obsolete, we read the whole block //=== jump to next measurement. obsolete, we read the whole block
///if( data.eventLength > 4 ) { ///if( data.eventLength > 4 ) {
@ -309,12 +269,29 @@ int main(int argn, char **argv) {
gTrace->Clear(); gTrace->Clear();
gTrace->Set(data.trace_length); gTrace->Set(data.trace_length);
gTrace->SetTitle(Form("eventID : %llu, detID: %d", data.eventID, data.detID)); gTrace->SetTitle(Form("eventID : %llu, detID: %d", data.eventID, data.detID));
if( data.headerLength == 4 ) {
for( int i = 0; i < 8; i++ ) data.QDCsum[i] = 0;
}
for( int i = 0; i < data.trace_length; i++){ for( int i = 0; i < data.trace_length; i++){
gTrace->SetPoint(i, i, data.trace[i]); gTrace->SetPoint(i, i, data.trace[i]);
///if the header don't have ADC, make one
if( data.headerLength < 12 ) {
if( 0 <= i && i < 31 ) data.QDCsum[0] += data.trace[i];
if( 31 <= i && i < 60 ) data.QDCsum[1] += data.trace[i];
if( 60 <= i && i < 75 ) data.QDCsum[2] += data.trace[i];
if( 75 <= i && i < 95 ) data.QDCsum[3] += data.trace[i];
if( 95 <= i && i < 105 ) data.QDCsum[4] += data.trace[i];
if( 105 <= i && i < 160 ) data.QDCsum[5] += data.trace[i];
if( 160 <= i && i < 175 ) data.QDCsum[6] += data.trace[i];
if( 175 <= i && i < 200 ) data.QDCsum[7] += data.trace[i];
}
} }
} }
if( isSaveRoot ){ if( rootFileName != "" ){
fFile->cd(); fFile->cd();
tree->Fill(); tree->Fill();
} }
@ -415,15 +392,15 @@ int main(int argn, char **argv) {
printf("\n\n\n============= reached end of file\n"); printf("\n\n\n============= reached end of file\n");
if( isSaveHist ) { if( histFileName != "" ) {
printf(" save gamma histograms : \033[1;3mhist.root\033[m\n"); printf(" save gamma histograms : \033[1;3m%s\033[m\n", histFileName.Data());
TFile * fHist = new TFile("hist.root", "RECREATE"); TFile * fHist = new TFile(histFileName, "RECREATE");
for( int i = 0; i < NCRYSTAL; i++) he[i]->Write("", TObject::kOverwrite); for( int i = 0; i < NCRYSTAL; i++) he[i]->Write("", TObject::kOverwrite);
fHist->Close(); fHist->Close();
} }
if( isSaveRoot){ if( rootFileName != "" ){
printf(" save into Root : \033[1;3mtemp.root\033[m\n"); printf(" save into Root : \033[1;3m%s\033[m\n", rootFileName.Data());
fFile->cd(); fFile->cd();
tree->Write(); tree->Write();
fFile->Close(); fFile->Close();

195
armory/evtReader.h Normal file
View File

@ -0,0 +1,195 @@
#ifndef EVTREADER_H
#define EVTREADER_H
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <string.h>
#include "TSystem.h"
#include "TObject.h"
#include "TFile.h"
#include "TTree.h"
#include "TString.h"
#include "TBenchmark.h"
#include "../mapping.h"
#include "../armory/DataBlock.h"
#define MAX_CRATES 2
#define MAX_BOARDS_PER_CRATE 13
#define MAX_CHANNELS_PER_BOARD 16
#define BOARD_START 2
class evtReader{
public:
DataBlock * data;
Long64_t blockID;
bool isOpen;
private:
FILE * inFile;
long int inFileSize;
long int inFilePos;
bool endOfFile;
TBenchmark gClock;
///============================================ Methods
public:
evtReader(TString inFileName){
inFile = fopen(inFileName, "r");
if( inFile == NULL ){
printf("Cannot read file : %s \n", inFileName.Data());
inFileSize = 0;
inFilePos = 0;
blockID = -1;
endOfFile = false;
isOpen = false;
}else{
fseek(inFile, 0L, SEEK_END);
inFileSize = ftell(inFile);
inFilePos = 0;
rewind(inFile); ///back to the File begining
data = new DataBlock();
data->Clear();
blockID = -1;
endOfFile = false;
isOpen = true;
gClock.Reset();
gClock.Start("timer");
}
}
~evtReader(){
fclose(inFile);
delete inFile;
delete data;
}
void UpdateFileSize(){
if( inFile == NULL ) return;
fseek(inFile, 0L, SEEK_END);
inFileSize = ftell(inFile);
fseek(inFile, inFilePos, SEEK_SET);
}
bool isEndOfFile() {
int haha = feof(inFile);
return haha > 0 ? true: false;
}
long int GetFilePos(){return inFilePos;}
long int GetFileSize(){return inFileSize;}
int ReadBlock(){
if( feof(inFile) ) return -1;
if( endOfFile ) return -1;
unsigned int header[4]; //read 4 header, unsigned int = 4 byte = 32 bits.
if ( fread(header, sizeof(header), 1, inFile) != 1 ) {
endOfFile = true;
return -1;
}
blockID ++;
/// see the Pixie-16 user manual, Table4-2
data->eventID = blockID;
data->ch = header[0] & 0xF ;
data->slot = (header[0] >> 4) & 0xF;
data->crate = (header[0] >> 8) & 0xF;
data->headerLength = (header[0] >> 12) & 0x1F;
data->eventLength = (header[0] >> 17) & 0x3FFF;
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->trace_length = (header[3] >> 16) & 0x7FFF;
data->trace_out_of_range = header[3] >> 31;
data->id = data->crate*MAX_BOARDS_PER_CRATE*MAX_CHANNELS_PER_BOARD + (data->slot-BOARD_START)*MAX_CHANNELS_PER_BOARD + data->ch;
data->detID = mapping[data->id];
///======== read QDCsum
if( data->headerLength >= 4 ){
unsigned int extraHeader[data->headerLength-4];
fread(extraHeader, sizeof(extraHeader), 1, inFile);
if( data->headerLength == 8 || data->headerLength == 16){
data->trailing = extraHeader[0];
data->leading = extraHeader[1];
data->gap = extraHeader[2];
data->baseline = extraHeader[3];
}
if( data->headerLength == 12 || data->headerLength == 16){
for( int i = 0; i < 8; i++){
int startID = 0;
if( data->headerLength > 12) startID = 4; ///the 1st 4 words
data->QDCsum[i] = extraHeader[i+startID];
}
}
}
///====== read trace
if( data->eventLength > data->headerLength ){
unsigned int traceBlock[data->trace_length / 2];
fread(traceBlock, sizeof(traceBlock), 1, inFile);
for( int i = 0; i < data->trace_length/2 ; i++){
data->trace[2*i+0] = traceBlock[i] & 0xFFFF ;
data->trace[2*i+1] = (traceBlock[i] >> 16 ) & 0xFFFF ;
}
///make QDC by trace
if( data->headerLength == 8 ) {
for( int i = 0; i < data->trace_length; i++){
if( 0 <= i && i < 31 ) data->QDCsum[0] += data->trace[i];
if( 31 <= i && i < 60 ) data->QDCsum[1] += data->trace[i];
if( 60 <= i && i < 75 ) data->QDCsum[2] += data->trace[i];
if( 75 <= i && i < 95 ) data->QDCsum[3] += data->trace[i];
if( 95 <= i && i < 105 ) data->QDCsum[4] += data->trace[i];
if( 105 <= i && i < 160 ) data->QDCsum[5] += data->trace[i];
if( 160 <= i && i < 175 ) data->QDCsum[6] += data->trace[i];
if( 175 <= i && i < 200 ) data->QDCsum[7] += data->trace[i];
}
}
}
inFilePos = ftell(inFile);
return 1;
}
void PrintStatus(int id){
///==== event stats, print status every 10000 events
if ( blockID % id == 0 ) {
UpdateFileSize();
//inFilePos = ftell(inFile);
gClock.Stop("timer");
double time = gClock.GetRealTime("timer");
gClock.Start("timer");
printf("Total measurements: \x1B[32m%llu \x1B[0m\nReading Pos: \x1B[32m %.3f/%.3f GB\x1B[0m\nTime used:%3.0f min %5.2f sec\033[A\033[A\r",
blockID, inFilePos/(1024.*1024.*1024.), inFileSize/1024./1024./1024, TMath::Floor(time/60.), time - TMath::Floor(time/60.)*60.);
}
}
};
#endif

View File

@ -1,11 +1,6 @@
CC=g++ CC=g++
#all: xia2root xia2ev2_nopart pixie2root scan pxi-time-order all: to2root evt2hist MergeEVT ev22txt EventBuilder pxi-time-order test
#all: xia2root xia2ev2_nopart pixie2root scan evt2root evt2hist
#all: xia2root to2root MergeEVT evt2hist pxi-time-order ev22txt EventBuilder
#all: xia2root to2root MergeEVT pxi-time-order ev22txt EventBuilder
#all: to2root MergeEVT ev22txt EventBuilder pxi-time-order
all: to2root evt2hist MergeEVT ev22txt EventBuilder pxi-time-order
#this is FSU evt to root #this is FSU evt to root
xia2root: ../armory/xia2root.cpp xia2root: ../armory/xia2root.cpp
@ -19,11 +14,11 @@ to2root: ../armory/to2root.cpp
$(CC) ../armory/to2root.cpp -o to2root `root-config --cflags --glibs` $(CC) ../armory/to2root.cpp -o to2root `root-config --cflags --glibs`
#this is for online root #this is for online root
MergeEVT: ../armory/MergeEVT.cpp MergeEVT: ../armory/MergeEVT.cpp ../armory/DataBlock.h ../mapping.h
$(CC) ../armory/MergeEVT.cpp -o MergeEVT `root-config --cflags --glibs` $(CC) ../armory/MergeEVT.cpp -o MergeEVT `root-config --cflags --glibs`
#this is for online spectrums #this is for online spectrums
evt2hist: ../armory/evt2hist.cpp evt2hist: ../armory/evt2hist.cpp ../armory/DataBlock.h ../mapping.h
$(CC) ../armory/evt2hist.cpp -o evt2hist `root-config --cflags --glibs` $(CC) ../armory/evt2hist.cpp -o evt2hist `root-config --cflags --glibs`
pxi-time-order: ../armory/pxi-time-order.c pxi-time-order: ../armory/pxi-time-order.c
@ -35,5 +30,8 @@ ev22txt: ../armory/ev22txt.cpp
EventBuilder: ../armory/EventBuilder.cpp EventBuilder: ../armory/EventBuilder.cpp
$(CC) ../armory/EventBuilder.cpp -o EventBuilder `root-config --cflags --glibs` $(CC) ../armory/EventBuilder.cpp -o EventBuilder `root-config --cflags --glibs`
test: ../armory/test.cpp ../armory/DataBlock.h ../armory/evtReader.h ../mapping.h
$(CC) ../armory/test.cpp -o test `root-config --cflags --glibs`
clean: clean:
-rm xia2root to2root MergeEVT evt2hist pxi-time-order ev22txt EventBuilder -rm xia2root to2root MergeEVT evt2hist pxi-time-order ev22txt EventBuilder test

View File

@ -121,6 +121,7 @@ int main(int argc, char **argv) {
int id[MAX_ID] = {0}; int id[MAX_ID] = {0};
double e[MAX_ID] = {TMath::QuietNaN()}; double e[MAX_ID] = {TMath::QuietNaN()};
unsigned long long e_t[MAX_ID] = {0}; unsigned long long e_t[MAX_ID] = {0};
int qdc[MAX_ID][8] = {0};
Int_t multiCry = 0 ; /// this is total multiplicity for all crystal Int_t multiCry = 0 ; /// this is total multiplicity for all crystal
//unsigned short pileup[MAXMULTI]; //unsigned short pileup[MAXMULTI];
@ -128,9 +129,10 @@ int main(int argc, char **argv) {
tree->Branch("evID", &evID, "event_ID/l"); tree->Branch("evID", &evID, "event_ID/l");
tree->Branch("multi", &multi, "multi/I"); tree->Branch("multi", &multi, "multi/I");
tree->Branch("id", id, "id[multi]/I"); tree->Branch("detID", id, "detID[multi]/I");
tree->Branch("e", e, "e[multi]/D"); tree->Branch("e", e, "e[multi]/D");
tree->Branch("e_t", e_t, "e_timestamp[multi]/l"); 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("multiCry", &multiCry, "multiplicity_crystal/I");
//open list-mode data file from PXI digitizer //open list-mode data file from PXI digitizer
@ -191,6 +193,49 @@ int main(int argc, char **argv) {
tempf = (float)data.e/RAWE_REBIN_FACTOR;// + RAND; tempf = (float)data.e/RAWE_REBIN_FACTOR;// + RAND;
data.e = (int)tempf; data.e = (int)tempf;
if( data.hlen > 4 ){
unsigned int extraHeader[data.hlen - 4 ];
fread(extraHeader, sizeof(extraHeader), 1, fpr);
if( data.hlen == 8 || data.hlen == 16){
for( int i = 0 ; i < 4; i ++) data.esum[i] = extraHeader[i];
}
if( data.hlen == 12 || data.hlen == 16){
for( int i = 0; i < 8; i++){
int startID = 0;
if( data.hlen > 12) startID = 4; ///the 1st 4 words
data.qsum[i] = extraHeader[i+startID];
}
}
}
if( data.hlen < data.elen ){
unsigned int traceBlock[data.trlen / 2];
fread(traceBlock, sizeof(traceBlock), 1, fpr);
for( int i = 0; i < data.trlen/2 ; i++){
data.tr[2*i+0] = traceBlock[i] & 0xFFFF ;
data.tr[2*i+1] = (traceBlock[i] >> 16 ) & 0xFFFF ;
}
if( data.hlen < 12 ){
for( int i = 0 ; i < 8; i++) data.qsum[i] = 0;
for( int i = 0; i < data.trlen ; i++){
if( 0 <= i && i < 31 ) data.qsum[0] += data.tr[i];
if( 31 <= i && i < 60 ) data.qsum[1] += data.tr[i];
if( 60 <= i && i < 75 ) data.qsum[2] += data.tr[i];
if( 75 <= i && i < 95 ) data.qsum[3] += data.tr[i];
if( 95 <= i && i < 105 ) data.qsum[4] += data.tr[i];
if( 105 <= i && i < 160 ) data.qsum[5] += data.tr[i];
if( 160 <= i && i < 175 ) data.qsum[6] += data.tr[i];
if( 175 <= i && i < 200 ) data.qsum[7] += data.tr[i];
}
}
}
//Set reference time for event building //Set reference time for event building
if (etime == -1) { if (etime == -1) {
etime = data.time; etime = data.time;
@ -202,7 +247,7 @@ int main(int argc, char **argv) {
//Check for end of event, rewind, and break out of while loop //Check for end of event, rewind, and break out of while loop
if (tdif > timeWindow) { if (tdif > timeWindow) {
fseek(fpr, -sizeof(int)*HEADER_LENGTH, SEEK_CUR); //fwrite/fread is buffered by system ; storing this in local buffer is no faster! fseek(fpr, -sizeof(int)*data.elen, SEEK_CUR); //fwrite/fread is buffered by system ; storing this in local buffer is no faster!
break; break;
}else{ }else{
//if within time window, fill array; //if within time window, fill array;
@ -210,6 +255,7 @@ int main(int argc, char **argv) {
id[multi] = detID; id[multi] = detID;
e[multi] = data.e; e[multi] = data.e;
e_t[multi] = data.time; e_t[multi] = data.time;
for( int i = 0; i < 8; i++) qdc[multi][i] = data.qsum[i];
multi++ ; multi++ ;
if( detID < 100 ) multiCry ++; if( detID < 100 ) multiCry ++;
} }
@ -220,49 +266,9 @@ int main(int argc, char **argv) {
} }
//more data than just the header; read entire sub event, first rewind, then read data.elen //more data than just the header; read entire sub event, first rewind, then read data.elen
fseek(fpr, -sizeof(int)*HEADER_LENGTH, SEEK_CUR); //fseek(fpr, -sizeof(int)*HEADER_LENGTH, SEEK_CUR);
//if (fread(sub, sizeof(int)*dataBlock[sevtmult].elen, 1, fpr) != 1) break; //if (fread(sub, sizeof(int)*dataBlock[sevtmult].elen, 1, fpr) != 1) break;
if (fread(sub, sizeof(int)*data.elen, 1, fpr) != 1) break; //if (fread(sub, sizeof(int)*data.elen, 1, fpr) != 1) break;
/**
//trace
k=0;
for (i = dataBlock[sevtmult].hlen; i < dataBlock[sevtmult].elen; i++) {
dataBlock[sevtmult].tr[i - dataBlock[sevtmult].hlen + k] = sub[i] & 0x3FFF;
dataBlock[sevtmult].tr[i - dataBlock[sevtmult].hlen + k + 1] = (sub[i]>>16) & 0x3FFF;
k=k+1;
}
// if (dataBlock[sevtmult].id == 4 && dataBlock[sevtmult].fcode == 1) DB(dataBlock[sevtmult].tr);
//continue if no esum or qsum
if (dataBlock[sevtmult].hlen==HEADER_LENGTH) {
sevtmult++;
continue;
}
//esum
if (dataBlock[sevtmult].hlen==8 || dataBlock[sevtmult].hlen==16) {
for (i=4; i < 8; i++) {
dataBlock[sevtmult].esum[i-4] = sub[i];
}
}
//qsum
if (dataBlock[sevtmult].hlen==12) {
for (i=4; i < 12; i++) {
dataBlock[sevtmult].qsum[i-4] = sub[i];
}
}
//qsum
if (dataBlock[sevtmult].hlen==16) {
for (i=8; i < 16; i++) {
dataBlock[sevtmult].qsum[i-8] = sub[i];
}
}
*/
} //end while loop for unpacking sub events and event building for one "event" } //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 if (multi==0) break; //end main WHILE LOOP when out of events

View File

@ -4,6 +4,8 @@ BGO : 100 - 199
Other : 200 - 299 Other : 200 - 299
* *********************************/ * *********************************/
#ifndef MAPPING
#define MAPPING
//==================== mapping //==================== mapping
@ -27,3 +29,4 @@ int mapping[130] ={ 0, 1, 2, 3, 100, 4, 5, 6, 7, 101, // 0
250, 251, -1, -1, -1, -1, -1, -1, -1, -1, // 110 250, 251, -1, -1, -1, -1, -1, -1, -1, -1, // 110
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}; // 120 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}; // 120
#endif