/* * 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; fFilePars.resize(fNoFiles); for (Int_t j = 0; j < fNoFiles; j++) { line.ReadLine(infile); if ( line.BeginsWith("#") || line.BeginsWith("//") ) { j--; continue; } sscanf(line, "%s", fname); word = fname; fFilePars[j].SetRawFileName(fname); fFilePars[j].SetNoCrystals(fNoCrystals); fFilePars[j].Init(); } 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); if ( line.BeginsWith("#") || line.BeginsWith("//") ) { j--; continue; } 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); fFilePars[fEnergyPoints].SetEnergy(en); fEnergyPoints++; continue; } sscanf(line.Data(), "%d %d %d", &i, &min, &max); fFilePars.at(fEnergyPoints-1).SetPeakMin(i, min); fFilePars.at(fEnergyPoints-1).SetPeakMax(i, 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 << "\tParticle: " << fPartName << endl; cout << "\tInput files with raw data (" << fNoFiles << "):" << endl; for (Int_t i = 0; i < (Int_t)fFilePars.size(); i++) { cout << "\t " << GetFileName(i) << endl; } cout << "\tInput energies (" << fNoFiles << "):" << endl; for (Int_t i = 0; i <= (Int_t)fFilePars.size(); i++) { cout << "\t " << fFilePars[i].GetEnergy() << " 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 << "\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)fFilePars.size(); k++) { cout << "\t Set number: " << k << "; energy: " << fFilePars[k].GetEnergy() << " MeV" << endl; for (Int_t i = 0; i < (Int_t)fFilePars[k].GetNoCrystals(); i++) { cout << "\t\t " << fFilePars[k].GetPeakMin(i) << "\t" << fFilePars[k].GetPeakMax(i) << endl; } } return; } void AculCalParsScint::Reset() { fParFileName = ""; fDetName = ""; fPartName = ""; fNoFiles = 0; fFilePars.clear(); fEnergyPoints = 0; fCutsFileName = ""; fNoCuts = 0; //number of cuts fCutName.clear(); return; } const char* AculCalParsScint::GetFileName(Int_t i) { if ( i >= (Int_t)fFilePars.size() ) { cerr << "\"AculCalParsScint::GetFileName\" index i cannot be higher than " << fFilePars.size() - 1 << endl; return 0; } return fFilePars[i].GetRawFileName(); } 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) { 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)fFilePars.size() ) { cerr << "\"AculCalParsScint::GetCalEnergy\" index i cannot be higher than " << fFilePars.size() - 1 << endl; return 0; } return fFilePars[i].GetEnergy(); } Int_t AculCalParsScint::GetMinChannel(Int_t energy, Int_t crystal) { if ( energy >= (Int_t)fFilePars.size() ) { cerr << "\"AculCalParsScint::GetMinChannel\" index \"energy\" cannot be higher than " << fFilePars.size() - 1 << endl; return 0; } if ( crystal >= fFilePars[energy].GetNoCrystals() ) { cerr << "\"AculCalParsScint::GetMinChannel\" index \"crystal\" cannot be higher than " << fFilePars[energy].GetNoCrystals() - 1 << endl; return 0; } return fFilePars[energy].GetPeakMin(crystal); } Int_t AculCalParsScint::GetMaxChannel(Int_t energy, Int_t crystal) { if ( energy >= (Int_t)fFilePars.size() ) { cerr << "\"AculCalParsScint::GetMinChannel\" index \"energy\" cannot be higher than " << fFilePars.size() - 1 << endl; return 0; } if ( crystal >= fFilePars[energy].GetNoCrystals() ) { cerr << "\"AculCalParsScint::GetMinChannel\" index \"crystal\" cannot be higher than " << fFilePars[energy].GetNoCrystals() - 1 << endl; return 0; } return fFilePars[energy].GetPeakMax(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); } }