/* * AculCalParsScint.cpp * * Created on: Oct 21, 2016 * Author: vratik */ #include "AculCalParsScint.h" #include "TFile.h" AculCalParsScint::AculCalParsScint() { // TODO Auto-generated constructor stub Reset(); } AculCalParsScint::AculCalParsScint(const char* parFile) { // TODO Auto-generated constructor stub SetParFile(parFile); Init(); } AculCalParsScint::~AculCalParsScint() { // TODO Auto-generated destructor stub } void AculCalParsScint::Init() { SetPars(); LoadCuts(); } void AculCalParsScint::SetPars() { std::ifstream infile(fParFileName.Data()); if ( !infile.is_open() ) { printf("AculCalParsScint::ReadParFile: File %s was not open and parameters were not set.\n", fParFileName.Data()); Reset(); return; } fEnergyPoints = 0; TString line; TString word; Int_t i, min, max; Int_t lineLength = 400; Char_t det[lineLength]; Char_t part[lineLength]; Char_t fname[lineLength]; Char_t cname[lineLength]; double en; //energy while (!infile.eof()) { line.ReadLine(infile); if ( line.BeginsWith("#") || line.BeginsWith("//") ) continue; if ( line.BeginsWith("energies") ) { sscanf(line.Data(), "%*s %d", &i); continue; } if ( line.BeginsWith("crystals") ) { sscanf(line.Data(), "%*s %d", &i); fNoCrystals = i; continue; } if ( line.BeginsWith("files") ) { sscanf(line.Data(), "%*s %d", &i); fNoFiles = i; for (Int_t j = 0; j < fNoFiles; j++) { line.ReadLine(infile); sscanf(line, "%s", fname); word = fname; fFileName.push_back(fname); } continue; } if ( line.BeginsWith("cutFile") ) { sscanf(line.Data(), "%*s %s %d", fname, &fNoCuts); fCutsFileName = fname; for (Int_t j = 0; j < fNoCuts; j++) { line.ReadLine(infile); sscanf(line, "%s", cname); fCutName.push_back(cname); } continue; } if ( line.BeginsWith("detector") ) { sscanf(line.Data(), "%*s %s %s", det, part); fDetName = det; fPartName = part; continue; } if ( line.BeginsWith("energy") ) { sscanf(line.Data(), "%*s %lf", &en); fE.push_back(en); fEnergyPoints++; vector newM; fPeakMin.push_back(newM); fPeakMax.push_back(newM); continue; } sscanf(line.Data(), "%d %d %d", &i, &min, &max); fPeakMin.at(fEnergyPoints-1).push_back(min); fPeakMax.at(fEnergyPoints-1).push_back(max); }//while infile.close(); return; } void AculCalParsScint::PrintParameters(const char* option) { TString opt = option; cout << "Parameters read from file \"" << fParFileName.Data() << "\"." << endl; cout << "\tCalibration of detector \"" << fDetName << "\" with " << fNoCrystals << " crystals." << endl; // cout << "\tNumber of crystals: " << fNoCrystals << endl; cout << "\tParticle: " << fPartName << endl; cout << "\tInput files with raw data (" << fNoFiles << "):" << endl; for (Int_t i = 0; i < (Int_t)fFileName.size(); i++) { // cout << i << endl; cout << "\t " << fFileName[i] << endl; } cout << "\tInput energies (" << fNoFiles << "):" << endl; for (Int_t i = 0; i < (Int_t)fE.size(); i++) { // cout << i << endl; cout << "\t " << fE[i] << " MeV" << endl; } cout << "\tInput file with " << fNoCuts << " cuts: \"" << fCutsFileName << "\"" << endl; if (opt.Contains("all")) { for (Int_t i = 0; i < (Int_t)fCutName.size(); i++) { // cout << i << endl; cout << "\t cut: \"" << fCutName[i] << "\"" << endl; } } if (!opt.Contains("all")) return; cout << "\tPeak limits for particular channels and energies:" << endl; for (Int_t k = 0; k < (Int_t)fPeakMin.size(); k++) { cout << "\t Set number: " << k << "; energy: " << fE[k] << " MeV" << endl; for (Int_t i = 0; i < (Int_t)fPeakMin[k].size(); i++) { // cout << i << endl; cout << "\t\t " << fPeakMin[k][i] << "\t" << fPeakMax[k][i] << endl; } } return; } void AculCalParsScint::Reset() { fParFileName = ""; fDetName = ""; fPartName = ""; fNoFiles = 0; fEnergyPoints = 0; fE.clear(); fCutsFileName = ""; fNoCuts = 0; //number of cuts fFileName.clear(); fCutName.clear(); fPeakMin.clear(); fPeakMax.clear(); return; } const char* AculCalParsScint::GetFileName(Int_t i) { if ( i > (Int_t)fFileName.size()-1 ) { cerr << "\"AculCalParsScint::GetFileName\" index i cannot be higher than " << fFileName.size() - 1 << endl; return 0; } return fFileName[i].Data(); } const char* AculCalParsScint::GetCutName(Int_t i) { if ( i > (Int_t)fCutName.size()-1 ) { cerr << "\"AculCalParsScint::GetCutName\" index i cannot be higher than " << fCutName.size() - 1 << endl; return 0; } return fCutName[i].Data(); } TCutG* AculCalParsScint::GetCut(Int_t i) { if ( i >= (Int_t)fCuts.size() ) { cerr << "\"AculCalParsScint::GetCut\" index i cannot be higher than " << fCuts.size() - 1 << endl; return 0; } return &fCuts[i]; } TCutG* AculCalParsScint::GetCut(const char* cutName) { // TClonesArray cutsCol; // // for (Int_t i = 0; i < nCuts; i++) { // cutsCol[i] = (TCutG*)fCuts->Get(cutNames[i]); // } const TString cName = cutName; for (Int_t i = 0; i <= (Int_t)fCuts.size(); i++) { if (cName.EqualTo(fCutName[i])) { return &fCuts[i]; } } cerr << "\"AculCalParsScint::GetCut\" cut \"" << cutName << "\" was not found." << endl; return 0; } Double_t AculCalParsScint::GetCalEnergy(Int_t i) { if ( i > (Int_t)fE.size()-1 ) { cerr << "\"AculCalParsScint::GetCalEnergy\" index i cannot be higher than " << fE.size() - 1 << endl; return 0; } return fE[i]; } Int_t AculCalParsScint::GetMinChannel(Int_t energy, Int_t crystal) { if ( energy > (Int_t)fPeakMin.size()-1 ) { cerr << "\"AculCalParsScint::GetMinChannel\" index \"energy\" cannot be higher than " << fPeakMin.size() - 1 << endl; return 0; } vector v = fPeakMin[energy]; if ( crystal > (Int_t)v.size()-1 ) { cerr << "\"AculCalParsScint::GetMinChannel\" index \"crystal\" cannot be higher than " << v.size() - 1 << endl; return 0; } return fPeakMin[energy][crystal]; } Int_t AculCalParsScint::GetMaxChannel(Int_t energy, Int_t crystal) { if ( energy > (Int_t)fPeakMax.size()-1 ) { cerr << "\"AculCalParsScint::GetMinChannel\" index \"energy\" cannot be higher than " << fPeakMax.size() - 1 << endl; return 0; } vector v = fPeakMax[energy]; if ( crystal > (Int_t)v.size()-1 ) { cerr << "\"AculCalParsScint::GetMinChannel\" index \"crystal\" cannot be higher than " << v.size() - 1 << endl; return 0; } return fPeakMax[energy][crystal]; } void AculCalParsScint::LoadCuts() { if (fCutsFileName.Length() == 0) { printf("AculCalParsScint::LoadCuts: Name of file (*.root) with cuts was not provided.\n"); printf("AculCalParsScint::LoadCuts: No cuts has been loaded.\n"); return; } TFile cutFile(fCutsFileName.Data(), "READ"); if(!cutFile.IsOpen()) { cerr << "\"AculCalParsScint::LoadCuts\" File " << fCutsFileName.Data() << " was not open and no cuts were loaded." << endl; return; } for (Int_t i = 0; i < (Int_t)fCutName.size(); i++) { TCutG *currentCut = (TCutG*)cutFile.Get(fCutName[i]); if (!currentCut) { cout << "\"AculCalParsScint::LoadCuts\" Cut \"" << fCutName[i] << "\" was not found in file " << fCutsFileName << "." << endl; continue; } fCuts.push_back(*currentCut); } }