#include "TListSpectrum.h" #include "TSystemDirectory.h" #include "TSystemFile.h" #include "TFile.h" #include "TCanvas.h" #include "TMath.h" #include "TF1.h" #include "TVirtualFitter.h" #include "TFitEditor.h" #include "TFitResult.h" #include "TMinuit.h" // #include "Minuit/Minuit2Minimizer.h" #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; // using namespace ROOT::Minuit2; ClassImp(TListSpectrum); TListSpectrum::TListSpectrum() : TNamed("ListSpectrum", "Unnamed Rawdata File") { kChannels = 0; kSampleNorm = 1.0; kStartofCounting = *(new TTimeStamp()); kGeometry = "{EMPTY}"; kSampleUnit = "sample"; kListData.SetNameTitle("kListData","kListData"); kEnergyCalibration = {0.0, 0.0, 0.0}; // this should be in TListSpectrumCal } TListSpectrum::TListSpectrum(TString fileTitle) : TListSpectrum() { this->SetTitle(fileTitle); } TListSpectrum::~TListSpectrum() { } Int_t factorial(int i) { return (i == 1 || i == 0) ? 1: i*factorial(i - 1);} void TListSpectrum::SetChannels() { kDescription.resize(kChannels); kDAQserialnmbr.resize(kChannels);; kChannelRange.resize(kChannels); kDAQchannelnmbr.resize(kChannels); kRealTime_ns.resize(kChannels); kDeadTime_ns.resize(kChannels); kLiveTime_ns.resize(kChannels); kFullSpectrum.resize(kChannels); kTemporalSpectrum.resize(kChannels); kDeadTime.resize(kChannels); kWindow_ns.resize(kChannels-1); kTimePhase_ns.resize(kChannels-1); kCombinations = factorial(kChannels)/(factorial(2)*factorial(kChannels-1)); kCoincEvents.resize(kCombinations); kCoincidenceSpectrum.resize(kCombinations); } void TListSpectrum::ProgressBar(clock_t start, ULong64_t filePosition, ULong64_t fileLength, ULong64_t realtime, ULong64_t deadtime) { clock_t currentTime = clock(); printf("\e[A"); printf("\e[A"); printf("\e[A"); printf("\r processed acq. time (sec) : %10.3f estimated acq. time (sec) : %10.3f est. dead-time (%%) : %10.5f\% \n", realtime*1.e-9, realtime*1.e-9/double(filePosition)*fileLength, double(deadtime)/realtime*100.0); printf("\r %% complete: %6.3f%% time (sec): %8.2f Predicted completion time: %10.2f seconds \n", double(filePosition)/fileLength*100., double(currentTime-start)/CLOCKS_PER_SEC, double(currentTime-start)/CLOCKS_PER_SEC*fileLength/filePosition); printf("|"); for (int i = 0; i < int(double(filePosition)/fileLength*100./2); i++) { printf("="); } printf(">"); for (int i = 0; i < 50-int(double(filePosition)/fileLength*100./2)-1; i++) { printf(" "); } printf("|\n"); } TList * TListSpectrum::ListDirectoryFiles(TString extension, TString directory = ".") { TSystemDirectory dir(directory, directory); TList *allFiles = dir.GetListOfFiles(); TList *myFiles = new TList(); if (allFiles) { TSystemFile *file; TString fname; TIter next(allFiles); while ((file=(TSystemFile*)next())) { fname = file->GetName(); if (!file->IsDirectory() && fname.EndsWith(extension)) { TObjString *item = new TObjString(fname.Data()); myFiles->Add(item); } } } return myFiles; } vector TListSpectrum::FindinFile(ifstream *input, string search) { vector returnval; string tmp; // bool notfound(true); unsigned long flag(-2); input->clear(); input->seekg(0, ios::beg); if (input->good() && !input->eof()) { while(!input->eof()) { getline(*input, tmp); if (tmp.find(search) < flag) { returnval.push_back(tmp); } } } else { printf("Error: ifstream not good or already at eof \n"); } return returnval; } void TListSpectrum::ParseCaenCompassROOT(TString rootFolder, Int_t boardnmbr, Int_t channelnmbr, TString description, TString geometry, TString type) { kChannels = 1; SetChannels(); TString rundataFile("//run.info"); TString settingsFile("//settings.xml"); ifstream input(rootFolder+rundataFile); TString dateString; dateString = FindinFile(&input, "time.start=")[0]; dateString.Remove(0, dateString.First("=")+1); dateString.ReplaceAll("/"," "); dateString.ReplaceAll(":"," "); dateString.ReplaceAll("."," "); dateString.ReplaceAll("-"," "); stringstream dateStream(dateString.Data()); UInt_t year, month, day, hour, min, sec, msec, timezone; dateStream >> year >> month >> day >> hour >> min >> sec >> msec >> timezone; kStartofCounting.Set(year, month, day, hour, min, sec, msec*1.e6, kFALSE, timezone); input.close(); input.open(rootFolder+settingsFile); kDescription[0] = description + " " + FindinFile(&input, "run")[0]; kDAQserialnmbr[0] = FindinFile(&input, "serial")[boardnmbr]; kGeometry = geometry; kDAQchannelnmbr[0] = channelnmbr; input.close(); TList *caenROOTdatafiles = ListDirectoryFiles(".root", rootFolder+type+"/"); TFile *caenROOTdata = new TFile(); for (int i = 0; i < caenROOTdatafiles->GetEntries(); i++) { if (((TObjString*)caenROOTdatafiles->At(i))->GetString().First("compass") == 0) { caenROOTdata = new TFile(rootFolder+"/"+type+"/"+((TObjString*)caenROOTdatafiles->At(i))->GetString()); } } clock_t start(clock()); UInt_t caenflag(0); UShort_t caenboard(0), caenchannel(0), caenenergy(0), caenextraflag(0); ULong64_t caenrealtime(0), inputCounts(0), outputCounts(0); vector energy, flag, extraflag; vector realtime, deadtime; TTree *caenROOTtree = (TTree*)caenROOTdata->Get("Data"); caenROOTtree->SetBranchAddress("Board",&caenboard); caenROOTtree->SetBranchAddress("Channel",&caenchannel); caenROOTtree->SetBranchAddress("Timestamp",&caenrealtime); caenROOTtree->SetBranchAddress("Energy",&caenenergy); caenROOTtree->SetBranchAddress("Flags",&caenflag); caenROOTtree->SetBranchAddress("EnergyShort",&caenextraflag); kListData.Branch("RealTime_ns","std::vector",&realtime); kListData.Branch("DeadTime_ns","std::vector",&deadtime); kListData.Branch("Energy_channel","std::vector",&energy); kListData.Branch("Flag_DAQ","std::vector",&flag); kListData.Branch("ExtraFlag_DAQ","std::vector",&extraflag); ULong64_t totalEntries(caenROOTtree->GetEntries()); ULong64_t pct(totalEntries/1000), iter(0); printf("CAEN CoMPASS ROOT FILE PARSE\n\n\n\n\n"); for (ULong64_t i = 0; i < totalEntries; i++) { caenROOTtree->GetEntry(i); if (caenboard == boardnmbr && caenchannel == channelnmbr) { inputCounts++; if (caenenergy > 0 && caenenergy < 32768 && caenflag == 0 || caenflag == 49152) { outputCounts++;} energy.push_back(caenenergy); extraflag.push_back(caenextraflag); realtime.push_back(caenrealtime/1000); flag.push_back(caenflag); deadtime.push_back((1.0-double(outputCounts)/double(inputCounts))*realtime[0]); kListData.Fill(); energy.clear(); extraflag.clear(); realtime.clear(); flag.clear(); deadtime.clear(); } if (iter > pct) { ProgressBar(start, i, totalEntries, realtime[0], deadtime[0]); iter = 0; } iter++; } kChannelRange[0] = kListData.GetMaximum("Energy_channel"); }