source: trunk/MagicSoft/Simulation/Detector/StarResponse/MStarLight.cxx@ 5407

Last change on this file since 5407 was 5326, checked in by moralejo, 21 years ago
*** empty log message ***
File size: 10.2 KB
Line 
1#include "MStarLight.hxx"
2
3using namespace std;
4
5MStarLight::MStarLight(Float_t fadc_slices_per_ns, Int_t response_slices_fadc) {
6 //
7 // default constructor
8 //
9
10 fBrightness = 0.;
11 fTimeRange = TIMERANGE;
12
13 fFadcSlicesPerNanosec = fadc_slices_per_ns; // "real" number of FADC slices per ns
14
15 fResponseSlicesFadc = response_slices_fadc;
16 // total number of bins in the histogram containing the response of the FADC to a
17 // single photoelectron. The bins are narrower than the true FADC slices by a factor
18 // equal to SUBBINS (see MFadcDefine.h)
19
20
21 fBinsTrig = (Int_t)(TRIG_SLICES_PER_NSEC*fTimeRange); // Default value 4*10000=40000
22 fTrigShape = 0;
23 fAmplTrig = 0.;
24 fFwhmTrig = 0.;
25
26 fBinsFadc = (Int_t)(fFadcSlicesPerNanosec*fTimeRange); // Default value 0.3*10000=3000
27 fFadcShape = 0;
28 fIntegFadc = 0.;
29 fFwhmFadc = 0.;
30
31
32 fTrig = new Float_t[fBinsTrig];
33 fTrigResp = new Float_t[RESPONSE_SLICES_TRIG];
34 fFadc = new Float_t[fBinsFadc];
35 fFadcResp = new Float_t[fResponseSlicesFadc];
36
37 for (Int_t i= 0; i< fBinsTrig ; i++)
38 fTrig[i] = 0. ;
39
40 for (Int_t i= 0; i < fBinsFadc; i++)
41 fFadc[i] = 0.;
42
43 for (Int_t i = 0; i < RESPONSE_SLICES_TRIG; i++)
44 fTrigResp[i] = 0.;
45
46 for (Int_t i = 0; i < fResponseSlicesFadc; i++)
47 fFadcResp[i] = 0.;
48}
49
50void MStarLight::Reset() {
51
52 fBrightness = 0. ;
53
54 fTrigShape = 0;
55 fAmplTrig = 0.;
56 fFwhmTrig = 0.;
57
58 fFadcShape = 0;
59 fIntegFadc = 0.;
60 fFwhmFadc = 0.;
61
62
63 for (Int_t i= 0; i < fBinsTrig ; i++)
64 fTrig[i] = 0.;
65
66 for (Int_t i= 0; i < fBinsFadc; i++)
67 fFadc[i] = 0.;
68
69 for (Int_t i = 0; i < RESPONSE_SLICES_TRIG; i++)
70 fTrigResp[i] = 0.;
71
72 for (Int_t i = 0; i < fResponseSlicesFadc; i++)
73 fFadcResp[i] = 0.;
74}
75
76Float_t MStarLight::GetBrightness ()
77{
78 return fBrightness;
79}
80
81void MStarLight::SetBrightness (Float_t in )
82{
83 fBrightness = in;
84}
85
86Float_t MStarLight::GetAmplTrig ()
87{
88 return fAmplTrig ;
89}
90
91void MStarLight::SetAmplTrig (Float_t in )
92{
93 fAmplTrig = in;
94}
95
96Float_t MStarLight::GetFwhmTrig ()
97{
98 return fFwhmTrig;
99}
100
101void MStarLight::SetFwhmTrig (Float_t in )
102{
103 fFwhmTrig = in;
104}
105
106void MStarLight::SetFadcSlicesPerNanosec (Float_t in)
107{
108 fFadcSlicesPerNanosec = in;
109 fBinsFadc = (Int_t)(fFadcSlicesPerNanosec*fTimeRange);
110
111 if (fFadc)
112 delete [] fFadc;
113
114 fFadc = new Float_t[fBinsFadc];
115
116 for (Int_t i= 0; i < fBinsFadc; i++)
117 fFadc[i] = 0.;
118}
119
120Float_t MStarLight::GetIntegFadc ()
121{
122 return fIntegFadc;
123}
124
125void MStarLight::SetIntegFadc (Float_t in )
126{
127 fIntegFadc = in;
128}
129
130Float_t MStarLight::GetFwhmFadc ()
131{
132 return fFwhmFadc;
133}
134
135void MStarLight::SetFwhmFadc (Float_t in )
136{
137 fFwhmFadc = in;
138}
139
140
141void MStarLight::SetTrigResponse( Float_t *in )
142{
143 for (Int_t i = 0; i < RESPONSE_SLICES_TRIG; i++)
144 fTrigResp[i] = in[i];
145}
146
147void MStarLight::SetFadcResponse( Float_t *in )
148{
149 for (Int_t i = 0; i < fResponseSlicesFadc; i++)
150 fFadcResp[i] = in[i];
151}
152
153void MStarLight::FillResponse( Float_t ampl, Float_t time )
154{
155 // fill the trigger response
156
157 Int_t startbin = (Int_t) (time * ((Float_t)fBinsTrig/fTimeRange));
158
159 Int_t icount = 0;
160 Int_t idata;
161
162 for ( Int_t i = startbin ; i < startbin+RESPONSE_SLICES_TRIG ; i++)
163 {
164 if ( i < fBinsTrig )
165 idata = i;
166 else if ( i >= fBinsTrig )
167 idata = i - fBinsTrig;
168
169 fTrig[idata] = fTrig[idata] + ampl * fTrigResp[icount];
170 icount++ ;
171 }
172
173 //
174 // fill the FADC content
175 //
176
177 startbin = (Int_t) ( time * ((Float_t)(fBinsFadc*SUBBINS)/fTimeRange));
178
179 Int_t ichanfadc = 0 ;
180
181 //
182 // putting the response slices in the right sig slices.
183 // Be careful, because both slices have different widths.
184 //
185
186 //
187 // Changed, Jan 2004, A. Moralejo: now the FADC does not integrate all
188 // the signal within each FADC slice, but measures just the signal height
189 // at one point, like the real FADC does. By default, each FADC slice
190 // contains SUBBINS bins of the response histogram
191 // (fFadcResp). Warning: do not change this unless you do the corresponding
192 // modifications also in MFadc.cxx, or the signal and the noise photoelectrons
193 // will be treated differently!!
194 //
195
196 for ( Int_t i = 0 ; i < fResponseSlicesFadc; i += SUBBINS )
197 {
198 ichanfadc = (Int_t) ((startbin+i)/(Float_t)SUBBINS);
199
200 if ( ichanfadc < fBinsFadc )
201 idata = ichanfadc;
202 else if ( ichanfadc >= fBinsFadc )
203 idata = ichanfadc-fBinsFadc;
204
205 fFadc[idata] += (ampl * fFadcResp[i]);
206 }
207}
208
209void MStarLight::ElecNoise ( Float_t noiseTrig, Float_t noiseFadc ) {
210 //
211 // putting some noise to the baseline
212 //
213
214 TRandom2 wuerfel( (UInt_t) (noiseTrig*100) ) ;
215
216 for (Int_t i=0; i< fBinsTrig ; i++ )
217 fTrig[i] += wuerfel.Gaus(0., noiseTrig );
218
219 for (Int_t i=0; i< fBinsFadc ; i++ )
220 fFadc[i] += wuerfel.Gaus(0., noiseFadc );
221
222}
223
224Float_t MStarLight::GetTrig( Int_t i)
225{
226 //------------------------------------------------------------------
227 //
228 // It gets the value of the simulated trigger in the i bin
229 //
230 return fTrig[i];
231}
232
233Float_t MStarLight::GetFadc( Int_t i)
234{
235 //------------------------------------------------------------------
236 //
237 // It gets the value of the simulated FADC signal in the i bin
238 //
239 return fFadc[i];
240}
241
242void MStarLight::StoreHisto( char *filename)
243{
244
245 Float_t baseline = 0.;
246
247 // first the histograms for trigger
248 //
249 // the calculated trigger signal before baseline
250 //
251
252 TH1F trigresp ("trigresp", "Trigger Response", fBinsTrig, 0., fTimeRange);
253
254 for (Int_t i=0; i< fBinsTrig ; i++ )
255 {
256 trigresp.SetBinContent(i+1, fTrig[i]);
257 baseline += fTrig[i];
258 }
259
260 baseline /= fBinsTrig;
261
262 TH1F trigbase ("trigbase", "Response after Baseline shift",
263 fBinsTrig, 0., fTimeRange) ;
264
265 for (Int_t i = 0; i < fBinsTrig ; i++)
266 trigbase.SetBinContent(i+1, fTrig[i]-baseline );
267
268 TH1F trigdist ("trigdist", "Noise on the baseline",
269 1000, -25., 25. );
270
271 for (Int_t i = 0; i < fBinsTrig ; i++)
272 trigdist.Fill( (Float_t) trigbase.GetBinContent(i+1) );
273
274
275 //
276 // Now the histograms for the fadc
277 //
278
279 TH1F fadcresp ("fadcresp", "Fadc Response", fBinsFadc, 0., fTimeRange);
280
281 baseline = 0.;
282 for (Int_t i=0; i < fBinsFadc; i++)
283 {
284 fadcresp.SetBinContent(i+1, fFadc[i]);
285 baseline += fFadc[i];
286 }
287
288 baseline /= fBinsFadc;
289
290 TH1F fadcbase ("fadcbase", "Fadc after Baseline shift",
291 fBinsFadc, 0., fTimeRange) ;
292
293 for (Int_t i=0; i< fBinsFadc ; i++ )
294 fadcbase.SetBinContent(i+1, fFadc[i]-baseline );
295
296 TH1F fadcdist ("fadcdist", "Noise on fadc",
297 1000, -100., 100. ) ;
298
299 for (Int_t i=0; i< fBinsFadc ; i++ )
300 fadcdist.Fill( (Float_t) fadcbase.GetBinContent(i+1) );
301
302 TFile outfile( filename, "RECREATE");
303
304 trigresp.Write();
305 trigbase.Write();
306 trigdist.Write();
307
308 fadcresp.Write();
309 fadcbase.Write();
310 fadcdist.Write();
311
312
313 outfile.Close();
314}
315
316void MStarLight::WriteBinary( char *filename)
317{
318 //
319 // write the information to the binary file
320
321 FILE *datei ;
322
323 datei = fopen ( filename, "w" ) ;
324
325 if ( ! datei )
326 {
327 cout << " ERROR: Can't open the file " << filename << endl;
328 exit (230);
329 }
330
331 Float_t version = VERSIONSR;
332
333 // write them out
334
335 fwrite ( &version, sizeof(Float_t), 1, datei );
336 fwrite ( &fBrightness, sizeof(Float_t), 1, datei );
337 fwrite ( &fTimeRange, sizeof(Float_t), 1, datei );
338 fwrite ( &fFadcSlicesPerNanosec, sizeof(Float_t), 1, datei );
339
340 fwrite ( &fBinsTrig , sizeof(Int_t), 1, datei );
341 fwrite ( &fTrigShape , sizeof(Int_t), 1, datei );
342 fwrite ( &fAmplTrig , sizeof(Float_t), 1, datei );
343 fwrite ( &fFwhmTrig , sizeof(Float_t), 1, datei );
344
345 fwrite ( &fBinsFadc , sizeof(Int_t), 1, datei );
346 fwrite ( &fFadcShape , sizeof(Int_t), 1, datei );
347 fwrite ( &fIntegFadc , sizeof(Float_t), 1, datei );
348 fwrite ( &fFwhmFadc , sizeof(Float_t), 1, datei );
349
350 fwrite (fTrig, sizeof(Float_t), fBinsTrig, datei);
351
352 // We want to store the FADC signal taking into account the AC
353 // coupling
354 //
355 // We calculate and substract the baseline
356 //
357
358 Float_t baseline = 0.;
359
360 for (Int_t i=0; i< fBinsFadc ; i++ )
361 baseline += fFadc[i];
362
363 baseline /= fBinsFadc;
364
365 Float_t *temp = new Float_t[fBinsFadc];
366
367 for (Int_t i=0; i < fBinsFadc; i++ )
368 temp[i] = fFadc[i]-baseline;
369
370 fwrite (temp, sizeof(Float_t), fBinsFadc, datei);
371
372 delete [] temp;
373
374 fclose ( datei );
375
376}
377
378void MStarLight::ReadBinary( char *filename) {
379
380 //
381 // read the things from the binary file
382
383 FILE *datei ;
384
385 datei = fopen ( filename, "r" ) ;
386
387 if ( ! datei ) {
388 cout << " ERROR: Can't open the file " << filename
389 << endl ;
390 cout<< " The database for the NSB may be too small. "
391 << endl;
392 cout<< " See the How to Use of the Camera simulation for more information"
393 << endl;
394 exit (230) ;
395 }
396
397 Float_t read_version;
398 Float_t current_version = VERSIONSR;
399
400 // Check that we read the right version of the Database
401 fread ( &read_version, sizeof(Float_t), 1, datei ) ;
402
403 if(Int_t(read_version)!=Int_t(current_version)){
404 cout<<" ERROR: You are trying to read database VERSION "<<
405 read_version << endl;
406 cout<<" You must generate a database for the current VERSION "<<
407 current_version << endl;
408 cout<<" See the NSB database section in the Camera How to Use note."
409 <<endl;
410 exit (230);
411 }
412
413 fread ( &fBrightness, sizeof(Float_t), 1, datei );
414 fread ( &fTimeRange , sizeof(Float_t), 1, datei );
415 fread ( &fFadcSlicesPerNanosec, sizeof(Float_t), 1, datei );
416
417 fread ( &fBinsTrig , sizeof(Int_t), 1, datei );
418 fread ( &fTrigShape , sizeof(Int_t), 1, datei );
419 fread ( &fAmplTrig , sizeof(Float_t), 1, datei );
420 fread ( &fFwhmTrig , sizeof(Float_t), 1, datei );
421
422 fread ( &fBinsFadc , sizeof(Int_t), 1, datei );
423 fread ( &fFadcShape , sizeof(Int_t), 1, datei );
424 fread ( &fIntegFadc , sizeof(Float_t), 1, datei );
425 fread ( &fFwhmFadc , sizeof(Float_t), 1, datei );
426
427 if (fTrig)
428 delete [] fTrig;
429
430 if (fFadc)
431 delete [] fFadc;
432
433 fTrig = new Float_t[fBinsTrig];
434 fFadc = new Float_t[fBinsFadc];
435
436 fread (fTrig, sizeof(Float_t), fBinsTrig, datei);
437 fread (fFadc, sizeof(Float_t), fBinsFadc, datei);
438
439 fclose ( datei ) ;
440}
Note: See TracBrowser for help on using the repository browser.