AEvent.cpp 6.87 KB
Newer Older
1 2 3 4 5 6 7 8 9
/*
 * AEvent.cpp
 *
 *  Created on: Dec 28, 2016
 *      Author: daria
 */

#include "AEvent.h"

10
AEvent::AEvent() : fNPoints(1024) {	//fNPoints is number of points in one event, 1024 or 1000
11 12 13 14 15 16

	Init();
	Reset();

}

17 18 19 20 21 22
AEvent::AEvent(const Int_t npoints) : fNPoints(npoints) {

	Init();
	Reset();
}

23 24
AEvent::~AEvent() {
	// TODO Auto-generated destructor stub
25 26
	delete fGraphSignal;
	delete fGraphCFD;
27
	delete fInputEvent;
28 29 30 31 32 33 34 35 36 37 38 39 40
}


void AEvent::ProcessEvent() {

	if (fInputEvent == NULL) {
		Warning("AEvent::ProcessEvent", "Input event wasn't set. Function won't be processed.");
		return;
	}

	const Double_t *amp = fInputEvent->GetAmp();
	const Double_t *time = fInputEvent->GetTime();

41
	for(Int_t j = 0; j < fNPoints; j++) {
42 43 44 45
		fAmpPos[j] = amp[j]*(-1.);
		fTime[j] = time[j];
	}

46
	fZeroLevel = FindZeroLevel();
47
	for(Int_t j = 0; j < fNPoints; j++) {
48
		fAmpPos[j] = fAmpPos[j] - fZeroLevel;
49 50
	}

51
	SetMaxAmplitudes();
52

53
	SetGraphs();
54
	FindFrontProperties();
55
	SetLED();
Vratislav Chudoba's avatar
Vratislav Chudoba committed
56
//	SetGraphs();
57
	SetCFD();
58
	SetChargeCFD();
59
	SetChargeLED();
60

61 62 63 64 65 66
	return;

}

void AEvent::Reset() {

67
	for (Int_t i = 0; i < fNPoints; i++) {
68 69
		fAmpPos[i] = 0;
		fTime[i] = 0;
70
		fAmpCFD[i] = 0;
71
	}
72
	fTimeLED = -100.;
73
	fEdgeSlope=0.;
74
	fEdgeXi=0.;
75
	fEdgeSlope=-100.;
76 77
	fTime10=0.;
	fTime90=0.;
78 79
	fAmpMax = 0.;
	fTimeAmpMax = 0.;
80
	fTimeCFD = -100.;
81
	fZeroLevel = 0.;
82 83
	fChargeCFD = -10.;
	fChargeLED = -10.;
84 85 86 87 88 89 90 91 92 93 94 95 96
}

void AEvent::SetInputEvent(RawEvent** event) {

	if (event == 0) {
		Warning("AEvent::SetInputEvent", "Input event was set as 0.");
	}
	fInputEvent = *event;

}

void AEvent::Init() {

97 98 99 100
	fAmpPos.Set(fNPoints);
	fTime.Set(fNPoints);
	fAmpCFD.Set(fNPoints);

101 102
	fGraphSignal = new TGraph();
	fGraphCFD = new TGraph();
103 104
	fInputEvent = 0;

105 106 107
	fCFratio = 0.;
	fCFtimeDelay = 0.;

108 109 110
	fNoiseRangeMin = 0.;
	fNoiseRangeMax = 1.;

111 112 113 114
}

void AEvent::SetGraphs() {

115
	fGraphSignal->Set(fNPoints);
116 117

	for (Int_t i=0; i<fNPoints; i++) {
118
		fGraphSignal->SetPoint(i, fTime[i], fAmpPos[i]);
119 120 121 122
	}

	return;
}
123

124
void AEvent::SetCFD() {
125

Muzalevsky I.A's avatar
Muzalevsky I.A committed
126
	Double_t time = 0;
127
	Double_t mytime = fCFtimeDelay;
128 129 130 131
	fGraphCFD->Set(fNPoints);

	//working variables
	Double_t maxCFD = 0., minCFD = 0.;
Muzalevsky I.A's avatar
Muzalevsky I.A committed
132
	Double_t TmaxCFD = 0., TminCFD = 0.;	
133 134
	Double_t ampCFD;
	const Double_t timeStep = 0.1;
135 136 137
	Int_t i = 0; //for graph 
 
	//while goes by the graph with the step of timeStep
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
	while( mytime < (200. - fCFtimeDelay) ) {

		ampCFD = fGraphSignal->Eval(mytime)*fCFratio*(-1) + fGraphSignal->Eval(mytime - fCFtimeDelay);
		fGraphCFD->SetPoint(i, mytime, ampCFD);

		//point for max CFD amplitude
		if( ampCFD > maxCFD) {
			maxCFD = ampCFD;
			TmaxCFD = mytime;
		}

		//point for min CFD amplitude
		if( ampCFD < minCFD) {
			minCFD = ampCFD;
			TminCFD = mytime;
		}

		i++;
		mytime = mytime + timeStep;
	}
158

159
	//looking for the first point with the closest values to 0 and writing to fTimeCFD
Muzalevsky I.A's avatar
Muzalevsky I.A committed
160
	time = TminCFD;
161
	while( (fGraphCFD->Eval(time) <= 0) && (time <= TmaxCFD) /*&& (time >= TminCFD)*/ ) {
Muzalevsky I.A's avatar
Muzalevsky I.A committed
162 163 164 165
		fTimeCFD = time;
		time = time + timeStep;
	}

Muzalevsky I.A's avatar
Muzalevsky I.A committed
166
}
Muzalevsky I.A's avatar
Muzalevsky I.A committed
167

168 169
void AEvent::FindFrontProperties() {

170 171 172 173 174
	//in percents
	const Double_t minHeight = 0.1;
	const Double_t maxHeight = 0.9;

	const Double_t timeStep = 0.05;	//in ns
175
	Double_t time = 0;			//in ns
176

177
	if (!fGraphSignal) {
178
		Warning("AEvent::FindFrontProperties", "Graph was not set");
179 180 181
		return;
	}

182
	//TODO search of minimum should be done from the lower edge on the time axis
183

184
	while (fGraphSignal->Eval(time) <= maxHeight*fAmpMax && time<200.) {
185
		fTime90 = time;
186 187 188 189 190 191
		time = time + timeStep;
	};

	time = fTime90;
	while( fGraphSignal->Eval(time) >= minHeight*fAmpMax && time>0) {
		fTime10 = time;
192
		time = time - timeStep;
193
	}
194

195
	TF1 *fit1 = new TF1("fit1","[1]*x+[0]");	//function for one parameter fitting in the range of pmin-pmax
196
	fit1->SetRange(fTime10,fTime90);
197

198
	fGraphSignal->Fit(fit1,"RQN","goff");
199
	fEdgeSlope = fit1->GetParameter(1);
200
	fEdgeXi = fit1->GetChisquare();
201 202 203

	delete fit1;
}
204

205
Double_t AEvent::FindZeroLevel() {
206 207 208

	SetGraphs();
	Double_t correction = 0;
209
	TF1 *fit1 = new TF1("fit1","[0]");	//function for one parameter fitting in the range of pmin-pmax
210
	fit1->SetRange(fNoiseRangeMin,fNoiseRangeMax);
211 212 213 214 215

	if (!fGraphSignal) {
		Warning("AEvent::FindZeroLevel", "Graph was not set");
		return 0;
	}
216

217 218
	fGraphSignal->Fit(fit1,"RQN","goff");
	correction = fit1->GetParameter(0);
219

220 221
	delete fit1;
	return correction;
222
}
223

224
void AEvent::SetChargeCFD(Int_t tmin, Int_t tmax) { // tmin = -3, tmax = 17
225
	
226 227 228 229
	Double_t integral = 0.;					//voltage
	Double_t time_sig = 0;					//approximate signal duration in seconds
	const Double_t res = 50.; 				//resistance 50 Om
	time_sig = (double)(-tmin + tmax)*(1e-9);
230

231
	/*for(Int_t i = 0; i < fNPoints; i++) {
232
		if( fTime[i] > (fTimeCFD + tmin) && fTime[i] < (fTimeCFD + tmax) ) {
233 234
			integral = integral + fAmpPos[i];
		}
235 236 237 238 239 240 241 242 243 244
	}*/

	Int_t imin = 0, imax = 0;

	Int_t i = 0;
	while ( fTime[i] < (fTimeCFD + tmin) && (i < (fGraphSignal->GetN()-1)) ) { imin = i; i++; }
	while ( fTime[i] < (fTimeCFD + tmax) && (i < (fGraphSignal->GetN()-1)) ) { imax = i; i++; }

	integral = fGraphSignal->Integral(imin, imax);

245
	fChargeCFD = integral*time_sig/res;
246 247 248 249 250

	return;

}

251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267
void AEvent::SetChargeLED(Int_t tmin, Int_t tmax) { // tmin = -3, tmax = 17
	
	Double_t integral = 0.;					//voltage
	Double_t time_sig = 0;					//approximate signal duration in seconds
	const Double_t res = 50.; 				//resistance 50 Om
	time_sig = (double)(-tmin + tmax)*(1e-9);

/*	for(Int_t i = 0; i < fNPoints; i++) {
		if( fTime[i] > (fTimeLED + tmin) && fTime[i] < (fTimeLED + tmax) ) {
			integral = integral + fAmpPos[i];
		}
	}*/

	Int_t imin = 0, imax = 0;

	Int_t i = 0;
	while ( fTime[i] < (fTimeLED + tmin) && (i < (fGraphSignal->GetN()-1)) ) { imin = i; i++; }
268
//	i = 0;
269 270 271 272 273 274 275 276 277 278
	while ( fTime[i] < (fTimeLED + tmax) && (i < (fGraphSignal->GetN()-1)) ) { imax = i; i++; }

	integral = fGraphSignal->Integral(imin, imax);

	fChargeLED = integral*time_sig/res;

	return;

}

Muzalevsky I.A's avatar
Muzalevsky I.A committed
279
Double_t AEvent::GetfCFD() {
280
		return fTimeCFD;
Muzalevsky I.A's avatar
Muzalevsky I.A committed
281 282 283 284 285
}

Double_t AEvent::GetOnefTime(Int_t i) {
		return fTime[i];
}
286

Muzalevsky I.A's avatar
Muzalevsky I.A committed
287 288
Double_t AEvent::GetOnefAmpPos(Int_t i) {
		return fAmpPos[i];
289
}
290 291

Double_t AEvent::GetT_10() {
292
		return fTime10;
293 294 295
}

Double_t AEvent::GetT_90() {
296
		return fTime90;
297 298 299
}

Double_t AEvent::GetEdgeSlope() {
300 301
		return fEdgeSlope;
}
302

303 304 305 306
Double_t AEvent::GetEdgeXi() {
		return fEdgeXi;
}

307 308 309 310 311 312 313 314 315 316 317 318 319
void AEvent::SetMaxAmplitudes() {
	Double_t maxAmp = 0.;
	Double_t maxAmpT = 0.;

	maxAmp = fAmpPos[0];
	for(Int_t j=0; j < fNPoints; j++) {
		if(fAmpPos[j] > maxAmp) {
			maxAmp = fAmpPos[j];
			maxAmpT = fTime[j];
		}
	}
	fAmpMax = maxAmp;
	fTimeAmpMax = maxAmpT;
320

321
}
322 323 324 325

void AEvent::SetLED(Double_t threshold) {
	
	Double_t time = 0;
326 327
	const Double_t timeStep = 0.05;
	while( time < fTimeAmpMax && fGraphSignal->Eval(time) <= threshold ) {
328 329 330
		fTimeLED = time;
		time = time + timeStep;
	}
331 332
	//fTimeLED = time; найти номера точек которые лежат на 3 нс раньше и на 20 нс позже чем точка с временем timeled (искать точки в пределах условных)
	// сделать через функцию getpoint и цикл по точкам от 
333 334

}