AculCalParsScint.cpp 6.99 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
/*
 * 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;
75
			fFilePars.resize(fNoFiles);
76 77 78 79
			for (Int_t j = 0; j < fNoFiles; j++) {
				line.ReadLine(infile);
				sscanf(line, "%s", fname);
				word = fname;
80 81 82
				fFilePars[j].SetRawFileName(fname);
				fFilePars[j].SetNoCrystals(fNoCrystals);
				fFilePars[j].Init();
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
			}
			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);
107
			fFilePars[fEnergyPoints].SetEnergy(en);
108 109 110 111
			fEnergyPoints++;
			continue;
		}

112

113
		sscanf(line.Data(), "%d %d %d", &i, &min, &max);
114 115 116
		fFilePars.at(fEnergyPoints-1).SetPeakMin(i, min);
		fFilePars.at(fEnergyPoints-1).SetPeakMax(i, max);

117 118 119 120 121 122 123 124 125 126 127 128 129 130
	}//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;
131 132
	for (Int_t i = 0; i < (Int_t)fFilePars.size(); i++) {
		cout << "\t " << GetFileName(i) << endl;
133 134 135
	}

	cout << "\tInput energies (" << fNoFiles << "):" << endl;
136 137
	for (Int_t i = 0; i <= (Int_t)fFilePars.size(); i++) {
		cout << "\t " << fFilePars[i].GetEnergy() << " MeV" << endl;
138 139 140 141 142 143 144 145 146 147 148 149
	}

	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;
150 151 152 153
	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;
154 155 156 157 158 159 160 161 162 163 164 165 166 167
		}
	}

	return;
}

void AculCalParsScint::Reset() {

	fParFileName = "";

	fDetName = "";
	fPartName = "";

	fNoFiles = 0;
168
	fFilePars.clear();
169 170 171 172 173 174 175 176 177 178 179 180
	fEnergyPoints = 0;

	fCutsFileName = "";
	fNoCuts = 0;				//number of cuts

	fCutName.clear();

	return;
}

const char* AculCalParsScint::GetFileName(Int_t i) {

181 182
	if ( i >= (Int_t)fFilePars.size() ) {
		cerr << "\"AculCalParsScint::GetFileName\"  index i cannot be higher than " << fFilePars.size() - 1 << endl;
183 184
		return 0;
	}
185
	return fFilePars[i].GetRawFileName();
186 187 188 189 190 191 192 193 194 195 196
}

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();
}

197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217
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;
}

218 219
Double_t AculCalParsScint::GetCalEnergy(Int_t i) {

220 221
	if ( i >= (Int_t)fFilePars.size() ) {
		cerr << "\"AculCalParsScint::GetCalEnergy\"  index i cannot be higher than " << fFilePars.size() - 1 << endl;
222 223
		return 0;
	}
224
	return fFilePars[i].GetEnergy();
225 226 227 228
}

Int_t AculCalParsScint::GetMinChannel(Int_t energy, Int_t crystal) {

229 230 231
	if ( energy >= (Int_t)fFilePars.size() ) {
		cerr << "\"AculCalParsScint::GetMinChannel\"  index \"energy\" cannot be higher than "
				<< fFilePars.size() - 1 << endl;
232 233 234
		return 0;
	}

235 236 237
	if ( crystal >= fFilePars[energy].GetNoCrystals() ) {
		cerr << "\"AculCalParsScint::GetMinChannel\"  index \"crystal\" cannot be higher than "
				<< fFilePars[energy].GetNoCrystals() - 1 << endl;
238 239 240
		return 0;
	}

241
	return fFilePars[energy].GetPeakMin(crystal);
242 243 244 245
}

Int_t AculCalParsScint::GetMaxChannel(Int_t energy, Int_t crystal) {

246 247 248
	if ( energy >= (Int_t)fFilePars.size() ) {
		cerr << "\"AculCalParsScint::GetMinChannel\"  index \"energy\" cannot be higher than "
				<< fFilePars.size() - 1 << endl;
249 250 251
		return 0;
	}

252 253 254
	if ( crystal >= fFilePars[energy].GetNoCrystals() ) {
		cerr << "\"AculCalParsScint::GetMinChannel\"  index \"crystal\" cannot be higher than "
				<< fFilePars[energy].GetNoCrystals() - 1 << endl;
255 256 257
		return 0;
	}

258
	return fFilePars[energy].GetPeakMax(crystal);
259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277
}

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]);
278 279 280 281
		if (!currentCut) {
			cout << "\"AculCalParsScint::LoadCuts\" Cut \"" << fCutName[i]
				<< "\" was not found in file " << fCutsFileName << "." << endl;
			continue;
282
		}
283
		fCuts.push_back(*currentCut);
284 285 286
	}

}