AculCalParsScint.cpp 7.16 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
			for (Int_t j = 0; j < fNoFiles; j++) {
				line.ReadLine(infile);
78 79 80 81
				if ( line.BeginsWith("#") || line.BeginsWith("//") ) {
					j--;
					continue;
				}
82 83
				sscanf(line, "%s", fname);
				word = fname;
84 85 86
				fFilePars[j].SetRawFileName(fname);
				fFilePars[j].SetNoCrystals(fNoCrystals);
				fFilePars[j].Init();
87 88 89 90 91 92 93 94 95
			}
			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);
96 97 98 99
				if ( line.BeginsWith("#") || line.BeginsWith("//") ) {
					j--;
					continue;
				}
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
				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);
115
			fFilePars[fEnergyPoints].SetEnergy(en);
116 117 118 119
			fEnergyPoints++;
			continue;
		}

120

121
		sscanf(line.Data(), "%d %d %d", &i, &min, &max);
122 123 124
		fFilePars.at(fEnergyPoints-1).SetPeakMin(i, min);
		fFilePars.at(fEnergyPoints-1).SetPeakMax(i, max);

125 126 127 128 129 130 131 132 133 134 135 136 137 138
	}//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;
139 140
	for (Int_t i = 0; i < (Int_t)fFilePars.size(); i++) {
		cout << "\t " << GetFileName(i) << endl;
141 142 143
	}

	cout << "\tInput energies (" << fNoFiles << "):" << endl;
144 145
	for (Int_t i = 0; i <= (Int_t)fFilePars.size(); i++) {
		cout << "\t " << fFilePars[i].GetEnergy() << " MeV" << endl;
146 147 148 149 150 151 152 153 154 155 156 157
	}

	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;
158 159 160 161
	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;
162 163 164 165 166 167 168 169 170 171 172 173 174 175
		}
	}

	return;
}

void AculCalParsScint::Reset() {

	fParFileName = "";

	fDetName = "";
	fPartName = "";

	fNoFiles = 0;
176
	fFilePars.clear();
177 178 179 180 181 182 183 184 185 186 187 188
	fEnergyPoints = 0;

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

	fCutName.clear();

	return;
}

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

189 190
	if ( i >= (Int_t)fFilePars.size() ) {
		cerr << "\"AculCalParsScint::GetFileName\"  index i cannot be higher than " << fFilePars.size() - 1 << endl;
191 192
		return 0;
	}
193
	return fFilePars[i].GetRawFileName();
194 195 196 197 198 199 200 201 202 203 204
}

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

205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
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;
}

226 227
Double_t AculCalParsScint::GetCalEnergy(Int_t i) {

228 229
	if ( i >= (Int_t)fFilePars.size() ) {
		cerr << "\"AculCalParsScint::GetCalEnergy\"  index i cannot be higher than " << fFilePars.size() - 1 << endl;
230 231
		return 0;
	}
232
	return fFilePars[i].GetEnergy();
233 234 235 236
}

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

237 238 239
	if ( energy >= (Int_t)fFilePars.size() ) {
		cerr << "\"AculCalParsScint::GetMinChannel\"  index \"energy\" cannot be higher than "
				<< fFilePars.size() - 1 << endl;
240 241 242
		return 0;
	}

243 244 245
	if ( crystal >= fFilePars[energy].GetNoCrystals() ) {
		cerr << "\"AculCalParsScint::GetMinChannel\"  index \"crystal\" cannot be higher than "
				<< fFilePars[energy].GetNoCrystals() - 1 << endl;
246 247 248
		return 0;
	}

249
	return fFilePars[energy].GetPeakMin(crystal);
250 251 252 253
}

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

254 255 256
	if ( energy >= (Int_t)fFilePars.size() ) {
		cerr << "\"AculCalParsScint::GetMinChannel\"  index \"energy\" cannot be higher than "
				<< fFilePars.size() - 1 << endl;
257 258 259
		return 0;
	}

260 261 262
	if ( crystal >= fFilePars[energy].GetNoCrystals() ) {
		cerr << "\"AculCalParsScint::GetMinChannel\"  index \"crystal\" cannot be higher than "
				<< fFilePars[energy].GetNoCrystals() - 1 << endl;
263 264 265
		return 0;
	}

266
	return fFilePars[energy].GetPeakMax(crystal);
267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285
}

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]);
286 287 288 289
		if (!currentCut) {
			cout << "\"AculCalParsScint::LoadCuts\" Cut \"" << fCutName[i]
				<< "\" was not found in file " << fCutsFileName << "." << endl;
			continue;
290
		}
291
		fCuts.push_back(*currentCut);
292 293 294
	}

}