AEvent.cpp 5.43 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

60 61 62 63 64 65
	return;

}

void AEvent::Reset() {

66
	for (Int_t i = 0; i < fNPoints; i++) {
67 68
		fAmpPos[i] = 0;
		fTime[i] = 0;
69
		fAmpCFD[i] = 0;
70 71
	}

72
	fEdgeSlope=0.;
73
	fEdgeXi=0.;
74
	fEdgeSlope=-100.;
75 76
	fTime10=0.;
	fTime90=0.;
77 78
	fAmpMax = 0.;
	fTimeAmpMax = 0.;
79 80
	fTimeCFD = 0.;
	fZeroLevel = 0.;
81
	fChargeCFD = 0.;
82 83 84 85 86 87 88 89 90 91 92 93 94
}

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

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

}

void AEvent::Init() {

95 96 97 98
	fAmpPos.Set(fNPoints);
	fTime.Set(fNPoints);
	fAmpCFD.Set(fNPoints);

99 100
	fGraphSignal = new TGraph();
	fGraphCFD = new TGraph();
101 102
	fInputEvent = 0;

103 104 105
	fCFratio = 0.;
	fCFtimeDelay = 0.;

106 107 108
	fNoiseRangeMin = 0.;
	fNoiseRangeMax = 1.;

109 110 111 112
}

void AEvent::SetGraphs() {

113
	fGraphSignal->Set(fNPoints);
114 115

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

	return;
}
121

122
void AEvent::SetCFD() {
123

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

	//working variables
	Double_t maxCFD = 0., minCFD = 0.;
Muzalevsky I.A's avatar
Muzalevsky I.A committed
130
	Double_t TmaxCFD = 0., TminCFD = 0.;	
131 132
	Double_t ampCFD;
	const Double_t timeStep = 0.1;
133 134 135
	Int_t i = 0; //for graph 
 
	//while goes by the graph with the step of timeStep
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
	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;
	}
156

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

Muzalevsky I.A's avatar
Muzalevsky I.A committed
164
}
Muzalevsky I.A's avatar
Muzalevsky I.A committed
165

166 167
void AEvent::FindFrontProperties() {

168 169 170 171 172
	//in percents
	const Double_t minHeight = 0.1;
	const Double_t maxHeight = 0.9;

	const Double_t timeStep = 0.05;	//in ns
173
	Double_t time = 0;			//in ns
174

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

180
	//TODO search of minimum should be done from the lower edge on the time axis
181

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

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

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

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

	delete fit1;
}
202

203
Double_t AEvent::FindZeroLevel() {
204 205 206

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

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

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

218 219
	delete fit1;
	return correction;
220
}
221

222 223
void AEvent::SetChargeCFD(Int_t tmin, Int_t tmax) {
	
224 225 226 227
	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);
228 229

	for(Int_t i = 0; i < fNPoints; i++) {
230
		if( fTime[i] > (fTimeCFD + tmin) && fTime[i] < (fTimeCFD + tmax) ) {
231 232 233
			integral = integral + fAmpPos[i];
		}
	}
234
	fChargeCFD = integral*time_sig/res;
235 236 237 238 239

	return;

}

Muzalevsky I.A's avatar
Muzalevsky I.A committed
240
Double_t AEvent::GetfCFD() {
241
		return fTimeCFD;
Muzalevsky I.A's avatar
Muzalevsky I.A committed
242 243 244 245 246
}

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

Muzalevsky I.A's avatar
Muzalevsky I.A committed
248 249
Double_t AEvent::GetOnefAmpPos(Int_t i) {
		return fAmpPos[i];
250
}
251 252

Double_t AEvent::GetT_10() {
253
		return fTime10;
254 255 256
}

Double_t AEvent::GetT_90() {
257
		return fTime90;
258 259 260
}

Double_t AEvent::GetEdgeSlope() {
261 262
		return fEdgeSlope;
}
263

264 265 266 267
Double_t AEvent::GetEdgeXi() {
		return fEdgeXi;
}

268 269 270 271 272 273 274 275 276 277 278 279 280
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;
281

282
}
283 284 285 286 287 288 289 290 291 292 293 294

void AEvent::SetLED(Double_t threshold) {
	
	Double_t time = 0;
	const Double_t timeStep = 0.1;
	while( time < 200. && fGraphSignal->Eval(time) <= threshold ) {
		fTimeLED = time;
		time = time + timeStep;
	}
	//fTimeLED = time;

}