source: trunk/MagicSoft/Mars/mcalib/MCalibrationQEPix.cc@ 4200

Last change on this file since 4200 was 4199, checked in by gaug, 21 years ago
*** empty log message ***
File size: 42.4 KB
Line 
1/* ======================================================================== *\
2!
3! *
4! * This file is part of MARS, the MAGIC Analysis and Reconstruction
5! * Software. It is distributed to you in the hope that it can be a useful
6! * and timesaving tool in analysing Data of imaging Cerenkov telescopes.
7! * It is distributed WITHOUT ANY WARRANTY.
8! *
9! * Permission to use, copy, modify and distribute this software and its
10! * documentation for any purpose is hereby granted without fee,
11! * provided that the above copyright notice appear in all copies and
12! * that both that copyright notice and this permission notice appear
13! * in supporting documentation. It is provided "as is" without express
14! * or implied warranty.
15! *
16!
17!
18! Author(s): Markus Gaug 02/2004 <mailto:markus@ifae.es>
19!
20! Copyright: MAGIC Software Development, 2000-2004
21!
22!
23\* ======================================================================== */
24
25/////////////////////////////////////////////////////////////////////////////
26//
27// MCalibrationQEPix
28//
29// Storage container of the calibrated Quantrum Efficiency of one pixel.
30// This container (like MCalibrationQECam) is designed to persist during
31// several eventloops over different calibration files, especially those
32// with different colour LEDs. This class contains all measured Quantum
33// Efficiencies with the calibration system for each individual pixel.
34//
35// At the moment, this calibration works in the following steps:
36//
37// 1) MHCalibrationChargeCam extracts mean and sigma (and its errors) of
38// the summed FADC slices distribution and stores them in MCalibrationCam
39//
40// 2) MHCalibrationChargeBlindPix extracts the mean of a Poisson fit to the
41// single photo-electron spectrum and stores it in MCalibrationChargeBlindPix
42//
43// 3) MHCalibrationChargePINDiode extracts the mean of a charge distribution
44// of the signals collected by the PIN Diode and stores it in
45// MCalibrationChargePINDiode
46//
47// 4) MCalibrationChargeCalc calculates for every pixel the number of
48// photo-electrons with the F-Factor method and stores them in MCalibrationChargePix
49//
50// 5) MCalibrationChargeCalc calculates the (weighted) average number of photo-
51// electrons from the pixels with the area index 0 (Inner pixels for the MAGIC
52// camera) and divides this number by gkDefaultQEGreen, gkDefaultQEBlue,
53// gkDefaultQEUV or gkDefaultQECT1, depending on the used pulser LED colour,
54// and further by MCalibrationQECam::gkPlexiglassQE. The obtained number is then
55// divided further by MGeomCam::GetPixRatio(pixel idx) (1. for inner pixels) and
56// gives the NUMBER OF PHOTONS incident on every pixel light guide OUTSIDE THE PLEXIGLASS
57// of the camera, obtained with the F-Factor method. (In the case of the MAGIC camera,
58// this number is thus BY CONSTRUCTION four times bigger for the outer pixels than for
59// the inner ones.)
60//
61// 6) MCalibrationChargeCalc calculates the mean photon flux per mm^2 in the camera
62// from the MCalibrationChargeBlindPix and multiplies it with the light guides area
63// of each pixel (MGeomPix::GetA()) and divides it by the quantum efficiency of the
64// plexi-glass (MCalibrationQECam::gkPlexiglassQE). The obtained number gives the
65// NUMBER OF PHOTONS incident on every pixel light guide OUTSIDE THE PLEXIGLASS of the camera,
66// obtained with the Blind Pixel method.
67//
68// 7) MCalibrationChargeCalc calculates the mean photon flux per mm^2 in the camera
69// from the MCalibrationChargePINDiode and multiplies it with the light guides area
70// of each pixel (MGeomPix::GetA()). The obtained number gives the NUMBER OF PHOTONS
71// incident on every pixels light guid OUTSIDE THE PLEXIGLASS of the camera,
72// obtained with the PIN Diode method.
73//
74// 8) Each of the three photons numbers is divided by the mean sum of FADC counts
75// and defined as MEASURED QUANTUM EFFICIENCY AT A GIVEN COLOUR. They are stored
76// in the variables SetQEBlindPixel(qe, color), SetQEFFactor(qe,color) and
77// SetQEPINDiode(qe,color)
78//
79// 9) Errors are propagated and corresponding variances get stored in
80// SetQEBlindPixelVar(var,color), SetQEFFactorVar(var,color) and
81// SetQEPINDiodeVar(var,color).
82//
83// 10) After every eventloop, MCalibrationChargeCalc calls the functions UpdateBlindPixelMethod(),
84// UpdateFFactorMethod() and UpdatePINDiodeMethod() which calculate the ratio
85// measured QE / gkDefaultQEGreen (or gkDefaultQEBlue or gkDefaultQEUV or gkDefaultQECT1)
86// and calculates an weighted average of these quantum-efficiency normalizations obtained
87// by one of the three methods.
88//
89// 11) A call to GetQECascadesBlindPixel(zenith), GetQECascadesFFactor(zenith) or
90// GetQECascadesPINDiode(zenith) returns then the normalization multiplied with an average QE
91// folded into a cascades spectrum. This number should be dependent on zenith angle, but
92// this feature is not yet implemented, instead a fixed number gkDefaultAverageQE is used.
93//
94// The number gkDefaultAverageQE = 0.18 +- 0.02 can be obtained in the following way:
95//
96// * Transmission probability Plexiglass: 0.96
97//
98// * Averaged QE coated PMTs: zenith value
99// 0. 0.237
100// 20. 0.237
101// 40. 0.236
102// 60. 0.234
103// (from D.Paneque et al., NIM A 504, 2003, 109-115
104//
105// * PMT photoelectron collection efficiency: 0.9
106// (from D.Paneque, email 14.2.2004)
107//
108// * Light guides efficiency: 0.94
109// (from D.Paneque, email 14.2.2004)
110//
111// "Concerning the light guides effiency estimation... Daniel Ferenc
112// is preparing some work (simulations) to estimate it. Yet so far, he has
113// been busy with other stuff, and this work is still UNfinished.
114//
115// The estimation I did comes from:
116// 1) Reflectivity of light guide walls is 85 % (aluminum)
117// 2) At ZERO degree light incidence, 37% of the light hits such walls
118// (0.15X37%= 5.6% of light lost)
119// 3) When increasing the light incidence angle, more and more light hits
120// the walls.
121//
122// However, the loses due to larger amount of photons hitting the walls is more
123// or less counteracted by the fact that more and more photon trajectories cross
124// the PMT photocathode twice, increasing the effective sensitivity of the PMT.
125//
126//Begin_Html
127/*
128<img src="images/Normalized_Cherenkov_phe_spectrums_20deg_60deg_coatedPMT.png">
129*/
130//End_Html
131//
132// The plot shows the normalized spectrum of photo-electrons preceding from
133// a typical spectrum of Cherenkov photons produced by an atmospheric shower. The
134// green line is for observation zenith angles of 20 deg. and the red line for
135// 60 deg. The overall effective QE drops from about 20.8 to about 19.8.
136//
137// Jurgen Gebauer did some quick measurements about this issue. I attach a
138// plot. You can see that the angular dependence is (more or less) in agreement with a
139// CosTheta function (below 20-25 degrees), which is the variation of the entrance
140// window cross section. So, in first approximation, no losses when increasing light
141// incidence angle; and therefore, the factor 0.94.
142//
143//Begin_Html
144/*
145<img src="images/JuergensMeasurementWithCosThetaCurve.png">
146*/
147//End_Html
148//
149//
150// See also: MJCalibration, MCalibrationChargeCalc,
151// MCalibrationChargeCam, MCalibrationChargePix,
152// MHCalibrationChargeCam, MHCalibrationChargePix,
153// MHCalibrationChargePINDiode, MHCalibrationChargeBlindPix
154//
155/////////////////////////////////////////////////////////////////////////////
156#include "MCalibrationQEPix.h"
157#include "MCalibrationCam.h"
158
159#include "MLog.h"
160#include "MLogManip.h"
161
162#include "TArrayF.h"
163#include "TArrayC.h"
164
165ClassImp(MCalibrationQEPix);
166
167using namespace std;
168
169const Float_t MCalibrationQEPix::gkDefaultQEGreen = 0.192;
170const Float_t MCalibrationQEPix::gkDefaultQEBlue = 0.27;
171const Float_t MCalibrationQEPix::gkDefaultQEUV = 0.285;
172const Float_t MCalibrationQEPix::gkDefaultQECT1 = 0.285;
173const Float_t MCalibrationQEPix::gkDefaultQEGreenErr = 0.05 ;
174const Float_t MCalibrationQEPix::gkDefaultQEBlueErr = 0.07 ;
175const Float_t MCalibrationQEPix::gkDefaultQEUVErr = 0.07 ;
176const Float_t MCalibrationQEPix::gkDefaultQECT1Err = 0.07 ;
177const Float_t MCalibrationQEPix::gkDefaultAverageQE = 0.18;
178const Float_t MCalibrationQEPix::gkDefaultAverageQEErr = 0.02;
179// --------------------------------------------------------------------------
180//
181// Default Constructor:
182//
183// Initializes all TArrays to MCalibrationCam::gkNumPulserColors
184//
185// Calls:
186// - Clear()
187//
188MCalibrationQEPix::MCalibrationQEPix(const char *name, const char *title)
189 : fAverageQE ( gkDefaultAverageQE )
190{
191
192 fName = name ? name : "MCalibrationQEPix";
193 fTitle = title ? title : "Container of the calibrated quantum efficiency ";
194
195 fQEBlindPixel .Set( MCalibrationCam::gkNumPulserColors );
196 fQEBlindPixelVar .Set( MCalibrationCam::gkNumPulserColors );
197 fQECombined .Set( MCalibrationCam::gkNumPulserColors );
198 fQECombinedVar .Set( MCalibrationCam::gkNumPulserColors );
199 fQEFFactor .Set( MCalibrationCam::gkNumPulserColors );
200 fQEFFactorVar .Set( MCalibrationCam::gkNumPulserColors );
201 fQEPINDiode .Set( MCalibrationCam::gkNumPulserColors );
202 fQEPINDiodeVar .Set( MCalibrationCam::gkNumPulserColors );
203 fValidFlags .Set( MCalibrationCam::gkNumPulserColors );
204
205 Clear();
206
207}
208
209// ----------------------------------------------------------------------------------------------
210//
211// Search all available QE's of a certain colour after the blind pixel method,
212// compare them to the default QE of that colour and
213// add up a weighted average (wav) and a sum of weights (sumw)
214//
215// FIXME: This has to be replaced by a decent fit the QE-spectrum!
216//
217void MCalibrationQEPix::AddAverageBlindPixelQEs(const MCalibrationCam::PulserColor_t col, Float_t &wav, Float_t &sumw )
218{
219
220 if (IsBlindPixelMethodValid (col))
221 {
222 const Float_t newavqe = GetQEBlindPixel(col) / GetDefaultQE (col) ;
223 const Float_t newavqevar = ( GetQEBlindPixelRelVar(col) + GetDefaultQERelVar(col) ) * newavqe * newavqe;
224 const Float_t weight = 1./newavqevar;
225 wav += newavqe * weight;
226 sumw += weight;
227 }
228}
229
230// ----------------------------------------------------------------------------------------------
231//
232// Search all available QE's of a certain colour after the combination of the three methods
233// compare them to the default QE of that colour and
234// add up a weighted average (wav) and a sum of weights (sumw)
235//
236// FIXME: This has to be replaced by a decent fit the QE-spectrum!
237//
238void MCalibrationQEPix::AddAverageCombinedQEs(const MCalibrationCam::PulserColor_t col, Float_t &wav, Float_t &sumw )
239{
240
241 if (IsCombinedMethodValid (col))
242 {
243 const Float_t newavqe = GetQECombined(col) / GetDefaultQE (col) ;
244 const Float_t newavqevar = ( GetQECombinedRelVar(col) + GetDefaultQERelVar(col) ) * newavqe * newavqe;
245 const Float_t weight = 1./newavqevar;
246 wav += newavqe * weight;
247 sumw += weight;
248
249 }
250}
251
252// ----------------------------------------------------------------------------------------------
253//
254// Search all available QE's of a certain colour after the F-Factor method,
255// compare them to the default QE of that colour and
256// add up a weighted average (wav) and a sum of weights (sumw)
257//
258// FIXME: This has to be replaced by a decent fit the QE-spectrum!
259//
260void MCalibrationQEPix::AddAverageFFactorQEs(const MCalibrationCam::PulserColor_t col, Float_t &wav, Float_t &sumw )
261{
262
263 if (IsFFactorMethodValid (col))
264 {
265 const Float_t newavqe = GetQEFFactor(col) / GetDefaultQE (col) ;
266 const Float_t newavqevar = ( GetQEFFactorRelVar(col) + GetDefaultQERelVar(col) ) * newavqe * newavqe;
267 const Float_t weight = 1./newavqevar;
268 wav += newavqe *weight;
269 sumw += weight;
270
271 }
272
273
274}
275
276// ----------------------------------------------------------------------------------------------
277//
278// Search all available QE's of a certain colour after the PIN Diode method,
279// compare them to the default QE of that colour and
280// add up a weighted average (wav) and a sum of weights (sumw)
281//
282// FIXME: This has to be replaced by a decent fit the QE-spectrum!
283//
284void MCalibrationQEPix::AddAveragePINDiodeQEs(const MCalibrationCam::PulserColor_t col, Float_t &wav, Float_t &sumw )
285{
286
287 if (IsPINDiodeMethodValid (col))
288 {
289 const Float_t newavqe = GetQEPINDiode(col) / GetDefaultQE (col) ;
290 const Float_t newavqevar = ( GetQEPINDiodeRelVar(col) + GetDefaultQERelVar(col) ) * newavqe * newavqe;
291 const Float_t weight = 1./newavqevar;
292 wav += newavqe *weight;
293 sumw += weight;
294 }
295}
296
297
298
299// ------------------------------------------------------------------------
300//
301// Sets all quantum efficiencies to the gkDefaultQE*
302// Sets all Variances to the square root of gkDefaultQE*Err
303// Sets all flags to kFALSE
304// Sets all fAvNorm-Variables to 1.;
305// Sets all fAvNorm-Variances to 0.;
306//
307// Calls:
308// - MCalibrationPix::Clear()
309//
310void MCalibrationQEPix::Clear(Option_t *o)
311{
312
313 SetAverageQEBlindPixelAvailable ( kFALSE );
314 SetAverageQEFFactorAvailable ( kFALSE );
315 SetAverageQECombinedAvailable ( kFALSE );
316 SetAverageQEPINDiodeAvailable ( kFALSE );
317
318 fQEBlindPixel [ MCalibrationCam::kGREEN ] = gkDefaultQEGreen;
319 fQEBlindPixelVar [ MCalibrationCam::kGREEN ] = gkDefaultQEGreenErr*gkDefaultQEGreenErr;
320 fQEFFactor [ MCalibrationCam::kGREEN ] = gkDefaultQEGreen;
321 fQEFFactorVar [ MCalibrationCam::kGREEN ] = gkDefaultQEGreenErr*gkDefaultQEGreenErr;
322 fQECombined [ MCalibrationCam::kGREEN ] = gkDefaultQEGreen;
323 fQECombinedVar [ MCalibrationCam::kGREEN ] = gkDefaultQEGreenErr*gkDefaultQEGreenErr;
324 fQEPINDiode [ MCalibrationCam::kGREEN ] = gkDefaultQEGreen;
325 fQEPINDiodeVar [ MCalibrationCam::kGREEN ] = gkDefaultQEGreenErr*gkDefaultQEGreenErr;
326
327 SetBlindPixelMethodValid ( kFALSE, MCalibrationCam::kGREEN);
328 SetFFactorMethodValid ( kFALSE, MCalibrationCam::kGREEN);
329 SetCombinedMethodValid ( kFALSE, MCalibrationCam::kGREEN);
330 SetPINDiodeMethodValid ( kFALSE, MCalibrationCam::kGREEN);
331
332 fQEBlindPixel [ MCalibrationCam::kBLUE ] = gkDefaultQEBlue;
333 fQEBlindPixelVar [ MCalibrationCam::kBLUE ] = gkDefaultQEBlueErr*gkDefaultQEBlueErr;
334 fQEFFactor [ MCalibrationCam::kBLUE ] = gkDefaultQEBlue;
335 fQEFFactorVar [ MCalibrationCam::kBLUE ] = gkDefaultQEBlueErr*gkDefaultQEBlueErr;
336 fQECombined [ MCalibrationCam::kBLUE ] = gkDefaultQEBlue;
337 fQECombinedVar [ MCalibrationCam::kBLUE ] = gkDefaultQEBlueErr*gkDefaultQEBlueErr;
338 fQEPINDiode [ MCalibrationCam::kBLUE ] = gkDefaultQEBlue;
339 fQEPINDiodeVar [ MCalibrationCam::kBLUE ] = gkDefaultQEBlueErr*gkDefaultQEBlueErr;
340
341 SetBlindPixelMethodValid ( kFALSE, MCalibrationCam::kBLUE);
342 SetFFactorMethodValid ( kFALSE, MCalibrationCam::kBLUE);
343 SetCombinedMethodValid ( kFALSE, MCalibrationCam::kBLUE);
344 SetPINDiodeMethodValid ( kFALSE, MCalibrationCam::kBLUE);
345
346 fQEBlindPixel [ MCalibrationCam::kUV ] = gkDefaultQEUV;
347 fQEBlindPixelVar [ MCalibrationCam::kUV ] = gkDefaultQEUVErr*gkDefaultQEUVErr;
348 fQEFFactor [ MCalibrationCam::kUV ] = gkDefaultQEUV;
349 fQEFFactorVar [ MCalibrationCam::kUV ] = gkDefaultQEUVErr*gkDefaultQEUVErr;
350 fQECombined [ MCalibrationCam::kUV ] = gkDefaultQEUV;
351 fQECombinedVar [ MCalibrationCam::kUV ] = gkDefaultQEUVErr*gkDefaultQEUVErr;
352 fQEPINDiode [ MCalibrationCam::kUV ] = gkDefaultQEUV;
353 fQEPINDiodeVar [ MCalibrationCam::kUV ] = gkDefaultQEUVErr*gkDefaultQEUVErr;
354
355 SetBlindPixelMethodValid ( kFALSE, MCalibrationCam::kUV);
356 SetFFactorMethodValid ( kFALSE, MCalibrationCam::kUV);
357 SetCombinedMethodValid ( kFALSE, MCalibrationCam::kUV);
358 SetPINDiodeMethodValid ( kFALSE, MCalibrationCam::kUV);
359
360 fQEBlindPixel [ MCalibrationCam::kCT1 ] = gkDefaultQECT1;
361 fQEBlindPixelVar [ MCalibrationCam::kCT1 ] = gkDefaultQECT1Err*gkDefaultQECT1Err;
362 fQEFFactor [ MCalibrationCam::kCT1 ] = gkDefaultQECT1;
363 fQEFFactorVar [ MCalibrationCam::kCT1 ] = gkDefaultQECT1Err*gkDefaultQECT1Err;
364 fQECombined [ MCalibrationCam::kCT1 ] = gkDefaultQECT1;
365 fQECombinedVar [ MCalibrationCam::kCT1 ] = gkDefaultQECT1Err*gkDefaultQECT1Err;
366 fQEPINDiode [ MCalibrationCam::kCT1 ] = gkDefaultQECT1;
367 fQEPINDiodeVar [ MCalibrationCam::kCT1 ] = gkDefaultQECT1Err*gkDefaultQECT1Err;
368
369 SetBlindPixelMethodValid ( kFALSE, MCalibrationCam::kCT1);
370 SetFFactorMethodValid ( kFALSE, MCalibrationCam::kCT1);
371 SetCombinedMethodValid ( kFALSE, MCalibrationCam::kCT1);
372 SetPINDiodeMethodValid ( kFALSE, MCalibrationCam::kCT1);
373
374 fAvNormBlindPixel = 1.;
375 fAvNormBlindPixelVar = 0.;
376 fAvNormCombined = 1.;
377 fAvNormCombinedVar = 0.;
378 fAvNormFFactor = 1.;
379 fAvNormFFactorVar = 0.;
380 fAvNormPINDiode = 1.;
381 fAvNormPINDiodeVar = 0.;
382
383 MCalibrationPix::Clear();
384}
385
386
387// -----------------------------------------------------------------
388//
389// Return the average Default QE (depending on zenith angle)
390//
391const Float_t MCalibrationQEPix::GetAverageQE( const Float_t zenith ) const
392{
393 // return gkDefaultAverageQE ;
394 return fAverageQE;
395}
396
397// -----------------------------------------------------------------
398//
399// Return the relative variance of the average Default QE (depending on zenith angle)
400//
401const Float_t MCalibrationQEPix::GetAverageQERelVar( const Float_t zenith ) const
402{
403 return gkDefaultAverageQEErr * gkDefaultAverageQEErr / (gkDefaultAverageQE * gkDefaultAverageQE );
404}
405
406// -----------------------------------------------------------------
407//
408// Return the relative variance of the average normalization (Blind Pixel Method)
409//
410const Float_t MCalibrationQEPix::GetAvNormBlindPixelRelVar( ) const
411{
412 return fAvNormBlindPixelVar / (fAvNormBlindPixel * fAvNormBlindPixel );
413}
414
415// -----------------------------------------------------------------
416//
417// Return the relative variance of the average normalization (Combined Method)
418//
419const Float_t MCalibrationQEPix::GetAvNormCombinedRelVar( ) const
420{
421 return fAvNormCombinedVar / (fAvNormCombined * fAvNormCombined );
422}
423
424// -----------------------------------------------------------------
425//
426// Return the relative variance of the average normalization (F-Factor Method)
427//
428const Float_t MCalibrationQEPix::GetAvNormFFactorRelVar( ) const
429{
430 return fAvNormFFactorVar / (fAvNormFFactor * fAvNormFFactor );
431}
432
433// -----------------------------------------------------------------
434//
435// Return the relative variance of the average normalization (PIN Diode Method)
436//
437const Float_t MCalibrationQEPix::GetAvNormPINDiodeRelVar( ) const
438{
439 return fAvNormPINDiodeVar / (fAvNormPINDiode * fAvNormPINDiode );
440}
441
442// ------------------------------------------------------------------------------
443//
444// Get the default Quantum efficiency for pulser colour "col"
445//
446Float_t MCalibrationQEPix::GetDefaultQE( const MCalibrationCam::PulserColor_t col ) const
447{
448 switch (col)
449 {
450 case MCalibrationCam::kGREEN:
451 return gkDefaultQEGreen;
452 break;
453 case MCalibrationCam::kBLUE:
454 return gkDefaultQEBlue;
455 break;
456 case MCalibrationCam::kUV:
457 return gkDefaultQEUV;
458 break;
459 case MCalibrationCam::kCT1:
460 return gkDefaultQECT1;
461 break;
462 default:
463 return gkDefaultQECT1;
464 break;
465 }
466 return -1.;
467}
468
469// ------------------------------------------------------------------------------
470//
471// Get the relative variance of the default Quantum efficiency for pulser colour "col"
472//
473Float_t MCalibrationQEPix::GetDefaultQERelVar( const MCalibrationCam::PulserColor_t col ) const
474{
475 switch (col)
476 {
477 case MCalibrationCam::kGREEN:
478 return gkDefaultQEGreenErr * gkDefaultQEGreenErr / (gkDefaultQEGreen * gkDefaultQEGreen );
479 break;
480 case MCalibrationCam::kBLUE:
481 return gkDefaultQEBlueErr * gkDefaultQEBlueErr / (gkDefaultQEBlue * gkDefaultQEBlue );
482 break;
483 case MCalibrationCam::kUV:
484 return gkDefaultQEUVErr * gkDefaultQEUVErr / (gkDefaultQEUV * gkDefaultQEUV );
485 break;
486 case MCalibrationCam::kCT1:
487 return gkDefaultQECT1Err * gkDefaultQECT1Err / (gkDefaultQECT1 * gkDefaultQECT1 );
488 break;
489 default:
490 return gkDefaultQECT1Err * gkDefaultQECT1Err / (gkDefaultQECT1 * gkDefaultQECT1 );
491 break;
492 }
493 return -1.;
494}
495
496// ------------------------------------------------------------------------------
497//
498// Get the calculated Quantum efficiency with the blind pixel method,
499// obtained with pulser colour "col"
500//
501Float_t MCalibrationQEPix::GetQEBlindPixel( const MCalibrationCam::PulserColor_t col ) const
502{
503 return fQEBlindPixel[col];
504}
505
506// ------------------------------------------------------------------------------
507//
508// Get the error on the calculated Quantum efficiency with the blind pixel method,
509// obtained with pulser colour "col"
510// Tests for variances smaller than 0. (e.g. if it has not yet been set)
511// and returns -1. in that case
512//
513Float_t MCalibrationQEPix::GetQEBlindPixelErr( const MCalibrationCam::PulserColor_t col ) const
514{
515
516 if (fQEBlindPixelVar[col] < 0.)
517 return -1.;
518
519 return TMath::Sqrt(fQEBlindPixelVar[col]);
520
521}
522
523// ------------------------------------------------------------------------------
524//
525// Get the relative variance of the calculated Quantum efficiency with the blind pixel method,
526// obtained with pulser colour "col"
527// Tests for variances smaller than 0. (e.g. if it has not yet been set)
528// and returns -1. in that case
529// Tests for quantum efficiency equal to 0. and returns -1. in that case
530//
531Float_t MCalibrationQEPix::GetQEBlindPixelRelVar( const MCalibrationCam::PulserColor_t col ) const
532{
533
534 if (fQEBlindPixelVar[col] < 0.)
535 return -1.;
536 if (fQEBlindPixel[col] < 0.)
537 return -1.;
538 return fQEBlindPixelVar[col] / ( fQEBlindPixel[col] * fQEBlindPixel[col] );
539
540}
541
542// ------------------------------------------------------------------------------
543//
544// Get the calculated Quantum efficiency with the combination of the three methods
545// obtained with pulser colour "col"
546//
547Float_t MCalibrationQEPix::GetQECombined( const MCalibrationCam::PulserColor_t col ) const
548{
549 return fQECombined[col];
550}
551
552
553// ------------------------------------------------------------------------------
554//
555// Get the error on the calculated Quantum efficiency with the combination of the three methods
556// obtained with pulser colour "col"
557// Tests for variances smaller than 0. (e.g. if it has not yet been set)
558// and returns -1. in that case
559//
560Float_t MCalibrationQEPix::GetQECombinedErr( const MCalibrationCam::PulserColor_t col ) const
561{
562
563 if (fQECombinedVar[col] < 0.)
564 return -1.;
565
566 return TMath::Sqrt(fQECombinedVar[col]);
567
568}
569
570
571// ----------------------------------------------------------------------------------------
572//
573// Get the relative variance of the calculated Quantum efficiency with the combination of
574// the three methods,
575// obtained with pulser colour "col"
576// Tests for variances smaller than 0. (e.g. if it has not yet been set)
577// and returns -1. in that case
578// Tests for quantum efficiency equal to 0. and returns -1. in that case
579//
580Float_t MCalibrationQEPix::GetQECombinedRelVar( const MCalibrationCam::PulserColor_t col ) const
581{
582
583 if (fQECombinedVar[col] < 0.)
584 return -1.;
585 if (fQECombined[col] < 0.)
586 return -1.;
587 return fQECombinedVar[col] / ( fQECombined[col] * fQECombined[col] );
588
589}
590
591// ------------------------------------------------------------------------------
592//
593// Get the calculated Quantum efficiency with the F-Factor method
594// obtained with pulser colour "col"
595//
596Float_t MCalibrationQEPix::GetQEFFactor( const MCalibrationCam::PulserColor_t col ) const
597{
598 return fQEFFactor[col];
599}
600
601
602// ------------------------------------------------------------------------------
603//
604// Get the error on the calculated Quantum efficiency with the F-Factor method,
605// obtained with pulser colour "col"
606// Tests for variances smaller than 0. (e.g. if it has not yet been set)
607// and returns -1. in that case
608//
609Float_t MCalibrationQEPix::GetQEFFactorErr( const MCalibrationCam::PulserColor_t col ) const
610{
611
612 if (fQEFFactorVar[col] < 0.)
613 return -1.;
614
615 return TMath::Sqrt(fQEFFactorVar[col]);
616
617}
618
619
620// ----------------------------------------------------------------------------------------
621//
622// Get the relative variance of the calculated Quantum efficiency with the F-Factor method,
623// obtained with pulser colour "col"
624// Tests for variances smaller than 0. (e.g. if it has not yet been set)
625// and returns -1. in that case
626// Tests for quantum efficiency equal to 0. and returns -1. in that case
627//
628Float_t MCalibrationQEPix::GetQEFFactorRelVar( const MCalibrationCam::PulserColor_t col ) const
629{
630
631 if (fQEFFactorVar[col] < 0.)
632 return -1.;
633 if (fQEFFactor[col] < 0.)
634 return -1.;
635 return fQEFFactorVar[col] / ( fQEFFactor[col] * fQEFFactor[col] );
636
637}
638
639// ------------------------------------------------------------------------------
640//
641// Get the calculated Quantum efficiency with the PIN-Diode method
642// obtained with pulser colour "col"
643//
644Float_t MCalibrationQEPix::GetQEPINDiode( const MCalibrationCam::PulserColor_t col ) const
645{
646 return fQEPINDiode[col];
647}
648
649
650// ------------------------------------------------------------------------------
651//
652// Get the error on the calculated Quantum efficiency with the PIN Diode method,
653// obtained with pulser colour "col"
654// Tests for variances smaller than 0. (e.g. if it has not yet been set)
655// and returns -1. in that case
656//
657Float_t MCalibrationQEPix::GetQEPINDiodeErr( const MCalibrationCam::PulserColor_t col ) const
658{
659
660 if (fQEPINDiodeVar[col] < 0.)
661 return -1.;
662
663 return TMath::Sqrt(fQEPINDiodeVar[col]);
664
665}
666
667// ----------------------------------------------------------------------------------------
668//
669// Get the relative variance of the calculated Quantum efficiency with the PIN Diode method,
670// obtained with pulser colour "col"
671// Tests for variances smaller than 0. (e.g. if it has not yet been set)
672// and returns -1. in that case
673// Tests for quantum efficiency equal to 0. and returns -1. in that case
674//
675Float_t MCalibrationQEPix::GetQEPINDiodeRelVar( const MCalibrationCam::PulserColor_t col ) const
676{
677
678 if (fQEPINDiodeVar[col] < 0.)
679 return -1.;
680 if (fQEPINDiode[col] < 0.)
681 return -1.;
682 return fQEPINDiodeVar[col] / ( fQEPINDiode[col] * fQEPINDiode[col] );
683
684}
685
686// ------------------------------------------------------------------------------
687//
688// Get the averaged Quantum efficiency folded over the cascade spectrum, obtained
689// with the blind pixel method and averaged over the results from the different colours.
690//
691Float_t MCalibrationQEPix::GetQECascadesBlindPixel( const Float_t zenith ) const
692{
693 return fAvNormBlindPixel * GetAverageQE ( zenith );
694}
695
696// ------------------------------------------------------------------------------
697//
698// Get the variance of the averaged Quantum efficiency folded over the cascade spectrum,
699// obtained with the blind pixel method and averaged over the results from the
700// different colours.
701//
702Float_t MCalibrationQEPix::GetQECascadesBlindPixelVar( const Float_t zenith ) const
703{
704 return ( GetAvNormBlindPixelRelVar() + GetAverageQERelVar(zenith))
705 * GetQECascadesBlindPixel(zenith) * GetQECascadesBlindPixel(zenith);
706}
707
708// ------------------------------------------------------------------------------
709//
710// Get the error on the averaged Quantum efficiency folded over the cascade spectrum,
711// obtained with the blind pixel method and averaged over the results from the
712// different colours.
713//
714Float_t MCalibrationQEPix::GetQECascadesBlindPixelErr( const Float_t zenith ) const
715{
716 const Float_t var = GetQECascadesBlindPixelVar(zenith);
717
718 if (var < 0.)
719 return -1.;
720
721 return TMath::Sqrt(var);
722}
723
724// ------------------------------------------------------------------------------
725//
726// Get the averaged Quantum efficiency folded over the cascade spectrum, obtained
727// with the combination of the three methods and averaged over the results
728// from the different colours.
729//
730Float_t MCalibrationQEPix::GetQECascadesCombined( const Float_t zenith ) const
731{
732 return fAvNormCombined * GetAverageQE ( zenith );
733}
734
735// ------------------------------------------------------------------------------
736//
737// Get the error on the averaged Quantum efficiency folded over the cascade spectrum,
738// obtained with the combined method and averaged over the results from the
739// different colours.
740//
741Float_t MCalibrationQEPix::GetQECascadesCombinedErr( const Float_t zenith ) const
742{
743 const Float_t var = GetQECascadesCombinedVar(zenith);
744
745 if (var < 0.)
746 return -1.;
747
748 return TMath::Sqrt(var);
749}
750
751// ------------------------------------------------------------------------------
752//
753// Get the variance of the averaged Quantum efficiency folded over the cascade spectrum,
754// obtained with the combination of the three methods and averaged over the results from the
755// different colours.
756//
757Float_t MCalibrationQEPix::GetQECascadesCombinedVar( const Float_t zenith ) const
758{
759 return ( GetAvNormCombinedRelVar() + GetAverageQERelVar(zenith))
760 * GetQECascadesCombined(zenith) * GetQECascadesCombined(zenith);
761}
762
763// ------------------------------------------------------------------------------
764//
765// Get the averaged Quantum efficiency folded over the cascade spectrum, obtained
766// with the F-Factor method and averaged over the results from the different colours.
767//
768Float_t MCalibrationQEPix::GetQECascadesFFactor( const Float_t zenith ) const
769{
770 return fAvNormFFactor * GetAverageQE ( zenith );
771}
772
773// ------------------------------------------------------------------------------
774//
775// Get the error on the averaged Quantum efficiency folded over the cascade spectrum,
776// obtained with the F-Factor method and averaged over the results from the
777// different colours.
778//
779Float_t MCalibrationQEPix::GetQECascadesFFactorErr( const Float_t zenith ) const
780{
781 const Float_t var = GetQECascadesFFactorVar(zenith);
782
783 if (var < 0.)
784 return -1.;
785
786 return TMath::Sqrt(var);
787}
788
789// ------------------------------------------------------------------------------
790//
791// Get the variance of the averaged Quantum efficiency folded over the cascade spectrum,
792// obtained with the F-Factor method and averaged over the results from the
793// different colours.
794//
795Float_t MCalibrationQEPix::GetQECascadesFFactorVar( const Float_t zenith ) const
796{
797 return ( GetAvNormFFactorRelVar() + GetAverageQERelVar(zenith))
798 * GetQECascadesFFactor(zenith) * GetQECascadesFFactor(zenith);
799}
800
801// ------------------------------------------------------------------------------
802//
803// Get the averaged Quantum efficiency folded over the cascade spectrum, obtained
804// with the PIN Diode method and averaged over the results from the different colours.
805//
806Float_t MCalibrationQEPix::GetQECascadesPINDiode( const Float_t zenith ) const
807{
808 return fAvNormPINDiode * GetAverageQE ( zenith );
809}
810
811// ------------------------------------------------------------------------------
812//
813// Get the error on the averaged Quantum efficiency folded over the cascade spectrum,
814// obtained with the PIN Diode method and averaged over the results from the
815// different colours.
816//
817Float_t MCalibrationQEPix::GetQECascadesPINDiodeErr( const Float_t zenith ) const
818{
819 const Float_t var = GetQECascadesPINDiodeVar(zenith);
820
821 if (var < 0.)
822 return -1.;
823
824 return TMath::Sqrt(var);
825}
826
827// ------------------------------------------------------------------------------
828//
829// Get the variance of the averaged Quantum efficiency folded over the cascade spectrum,
830// obtained with the PIN Diode method and averaged over the results from the
831// different colours.
832//
833Float_t MCalibrationQEPix::GetQECascadesPINDiodeVar( const Float_t zenith ) const
834{
835 return ( GetAvNormPINDiodeRelVar() + GetAverageQERelVar(zenith))
836 * GetQECascadesPINDiode(zenith) * GetQECascadesPINDiode(zenith);
837}
838
839// ------------------------------------------------------------------------------
840//
841// Test if the average QE can be obtained from the blind pixel method
842//
843Bool_t MCalibrationQEPix::IsAverageQEBlindPixelAvailable() const
844{
845 return TESTBIT(fAvailableFlags,kAverageQEBlindPixelAvailable);
846}
847
848// ------------------------------------------------------------------------------
849//
850// Test if the average QE can be obtained from the combination of the three methods
851//
852Bool_t MCalibrationQEPix::IsAverageQECombinedAvailable() const
853{
854 return TESTBIT(fAvailableFlags,kAverageQECombinedAvailable);
855}
856
857// ------------------------------------------------------------------------------
858//
859// Test if the average QE can be obtained from the F-Factor method
860//
861Bool_t MCalibrationQEPix::IsAverageQEFFactorAvailable() const
862{
863 return TESTBIT(fAvailableFlags,kAverageQEFFactorAvailable);
864}
865
866// ------------------------------------------------------------------------------
867//
868// Test if the average QE can be obtained from the PIN Diode method
869//
870Bool_t MCalibrationQEPix::IsAverageQEPINDiodeAvailable() const
871{
872 return TESTBIT(fAvailableFlags,kAverageQEPINDiodeAvailable);
873}
874
875// ------------------------------------------------------------------------------
876//
877// Test if any of the three colours has already been calibrated with the blind pixel method
878//
879Bool_t MCalibrationQEPix::IsBlindPixelMethodValid () const
880{
881
882 if (IsBlindPixelMethodValid (MCalibrationCam::kGREEN))
883 return kTRUE;
884 if (IsBlindPixelMethodValid (MCalibrationCam::kBLUE ))
885 return kTRUE;
886 if (IsBlindPixelMethodValid (MCalibrationCam::kUV ))
887 return kTRUE;
888 if (IsBlindPixelMethodValid (MCalibrationCam::kCT1 ))
889 return kTRUE;
890
891 return kFALSE;
892}
893
894// ------------------------------------------------------------------------------
895//
896// Test if any of the three colours has already been calibrated with the combination
897// of the three methods
898//
899Bool_t MCalibrationQEPix::IsCombinedMethodValid () const
900{
901 if (IsCombinedMethodValid (MCalibrationCam::kGREEN))
902 return kTRUE;
903 if (IsCombinedMethodValid (MCalibrationCam::kBLUE ))
904 return kTRUE;
905 if (IsCombinedMethodValid (MCalibrationCam::kUV ))
906 return kTRUE;
907 if (IsCombinedMethodValid (MCalibrationCam::kCT1 ))
908 return kTRUE;
909
910 return kFALSE;
911}
912
913// ------------------------------------------------------------------------------
914//
915// Test if any of the three colours has already been calibrated with the F-Factor method
916//
917Bool_t MCalibrationQEPix::IsFFactorMethodValid () const
918{
919 if (IsFFactorMethodValid (MCalibrationCam::kGREEN))
920 return kTRUE;
921 if (IsFFactorMethodValid (MCalibrationCam::kBLUE ))
922 return kTRUE;
923 if (IsFFactorMethodValid (MCalibrationCam::kUV ))
924 return kTRUE;
925 if (IsFFactorMethodValid (MCalibrationCam::kCT1 ))
926 return kTRUE;
927
928 return kFALSE;
929}
930
931
932// ------------------------------------------------------------------------------
933//
934// Test if any of the three colours has already been calibrated with the PIN Diode method
935//
936Bool_t MCalibrationQEPix::IsPINDiodeMethodValid () const
937{
938 if (IsPINDiodeMethodValid (MCalibrationCam::kGREEN))
939 return kTRUE;
940 if (IsPINDiodeMethodValid (MCalibrationCam::kBLUE ))
941 return kTRUE;
942 if (IsPINDiodeMethodValid (MCalibrationCam::kUV ))
943 return kTRUE;
944 if (IsPINDiodeMethodValid (MCalibrationCam::kCT1 ))
945 return kTRUE;
946
947 return kFALSE;
948}
949
950// ------------------------------------------------------------------------------
951//
952// Test if the colour "col" has already been calibrated with the Blind Pixel method
953//
954Bool_t MCalibrationQEPix::IsBlindPixelMethodValid (MCalibrationCam::PulserColor_t col) const
955{
956 return TESTBIT(fValidFlags[ col ],kBlindPixelMethodValid);
957}
958
959// ------------------------------------------------------------------------------
960//
961// Test if the colour "col" has already been calibrated with the combination of
962// the three methods
963//
964Bool_t MCalibrationQEPix::IsCombinedMethodValid (MCalibrationCam::PulserColor_t col) const
965{
966 return TESTBIT(fValidFlags[ col ],kCombinedMethodValid);
967}
968
969// ------------------------------------------------------------------------------
970//
971// Test if the colour "col" has already been calibrated with the F-Factor method
972//
973Bool_t MCalibrationQEPix::IsFFactorMethodValid (MCalibrationCam::PulserColor_t col) const
974{
975 return TESTBIT(fValidFlags[ col ],kFFactorMethodValid);
976}
977
978// ------------------------------------------------------------------------------
979//
980// Test if the colour "col" has already been calibrated with the PIN Diode method
981//
982Bool_t MCalibrationQEPix::IsPINDiodeMethodValid (MCalibrationCam::PulserColor_t col) const
983{
984 return TESTBIT(fValidFlags[ col ],kPINDiodeMethodValid);
985}
986
987// ------------------------------------------------------------------------------
988//
989// Set the bit Average QE Blind Pixel method available from outside (only for MC!)
990//
991void MCalibrationQEPix::SetAverageQEBlindPixelAvailable ( Bool_t b )
992{
993 if (b)
994 SETBIT(fAvailableFlags,kAverageQEBlindPixelAvailable);
995 else
996 CLRBIT(fAvailableFlags,kAverageQEBlindPixelAvailable);
997}
998
999// ------------------------------------------------------------------------------
1000//
1001// Set the bit Average QE combination of three methods available from outside (only for MC!)
1002//
1003void MCalibrationQEPix::SetAverageQECombinedAvailable ( Bool_t b )
1004{
1005 if (b)
1006 SETBIT(fAvailableFlags,kAverageQECombinedAvailable);
1007 else
1008 CLRBIT(fAvailableFlags,kAverageQECombinedAvailable);
1009}
1010
1011// ------------------------------------------------------------------------------
1012//
1013// Set the bit Average QE F-Factor method available from outside (only for MC!)
1014//
1015void MCalibrationQEPix::SetAverageQEFFactorAvailable ( Bool_t b )
1016{
1017 if (b)
1018 SETBIT(fAvailableFlags,kAverageQEFFactorAvailable);
1019 else
1020 CLRBIT(fAvailableFlags,kAverageQEFFactorAvailable);
1021}
1022
1023// ------------------------------------------------------------------------------
1024//
1025// Set the bit Average QE PIN Diode method available from outside (only for MC!)
1026//
1027void MCalibrationQEPix::SetAverageQEPINDiodeAvailable ( Bool_t b )
1028{
1029 if (b)
1030 SETBIT(fAvailableFlags,kAverageQEPINDiodeAvailable);
1031 else
1032 CLRBIT(fAvailableFlags,kAverageQEPINDiodeAvailable);
1033}
1034
1035// ------------------------------------------------------------------------------
1036//
1037// Set the bit QE Blind Pixel method available from colour "col"
1038//
1039void MCalibrationQEPix::SetBlindPixelMethodValid ( Bool_t b, MCalibrationCam::PulserColor_t col )
1040{
1041 if (b)
1042 SETBIT(fValidFlags[ col ],kBlindPixelMethodValid);
1043 else
1044 CLRBIT(fValidFlags[ col ],kBlindPixelMethodValid);
1045}
1046
1047// ------------------------------------------------------------------------------
1048//
1049// Set the bit QE Combination of three methods available from colour "col"
1050//
1051void MCalibrationQEPix::SetCombinedMethodValid ( Bool_t b, MCalibrationCam::PulserColor_t col )
1052{
1053 if (b)
1054 SETBIT(fValidFlags[ col ],kCombinedMethodValid);
1055 else
1056 CLRBIT(fValidFlags[ col ],kCombinedMethodValid);
1057}
1058
1059// ------------------------------------------------------------------------------
1060//
1061// Set the bit QE F-Factor method available from colour "col"
1062//
1063void MCalibrationQEPix::SetFFactorMethodValid ( Bool_t b, MCalibrationCam::PulserColor_t col )
1064{
1065 if (b)
1066 SETBIT(fValidFlags[ col ],kFFactorMethodValid);
1067 else
1068 CLRBIT(fValidFlags[ col ],kFFactorMethodValid);
1069}
1070
1071// ------------------------------------------------------------------------------
1072//
1073// Set the bit QE PIN Diode method available from colour "col"
1074//
1075void MCalibrationQEPix::SetPINDiodeMethodValid ( Bool_t b, MCalibrationCam::PulserColor_t col )
1076{
1077 if (b)
1078 SETBIT(fValidFlags[ col ],kPINDiodeMethodValid);
1079 else
1080 CLRBIT(fValidFlags[ col ],kPINDiodeMethodValid);
1081}
1082
1083// ------------------------------------------------------------------------------
1084//
1085// Update the Blind Pixel Method: Calculate new average QE's
1086//
1087Bool_t MCalibrationQEPix::UpdateBlindPixelMethod()
1088{
1089
1090 Float_t weightedav = 0.;
1091 Float_t sumweights = 0.;
1092
1093 AddAverageBlindPixelQEs(MCalibrationCam::kGREEN, weightedav, sumweights);
1094 AddAverageBlindPixelQEs(MCalibrationCam::kBLUE , weightedav, sumweights);
1095 AddAverageBlindPixelQEs(MCalibrationCam::kUV , weightedav, sumweights);
1096 AddAverageBlindPixelQEs(MCalibrationCam::kCT1 , weightedav, sumweights);
1097
1098 if (weightedav == 0. || sumweights == 0.)
1099 return kFALSE;
1100
1101 fAvNormBlindPixel = weightedav / sumweights;
1102 fAvNormBlindPixelVar = 1./ sumweights ;
1103
1104 SetAverageQEBlindPixelAvailable();
1105
1106 return kTRUE;
1107}
1108
1109// ------------------------------------------------------------------------------
1110//
1111// Update the Combination of the three Methods: Calculate new average QE's
1112//
1113Bool_t MCalibrationQEPix::UpdateCombinedMethod()
1114{
1115
1116 Float_t weightedav = 0.;
1117 Float_t sumweights = 0.;
1118
1119 AddAverageCombinedQEs(MCalibrationCam::kGREEN, weightedav, sumweights);
1120 AddAverageCombinedQEs(MCalibrationCam::kBLUE , weightedav, sumweights);
1121 AddAverageCombinedQEs(MCalibrationCam::kUV , weightedav, sumweights);
1122 AddAverageCombinedQEs(MCalibrationCam::kCT1 , weightedav, sumweights);
1123
1124 if (weightedav == 0. || sumweights == 0.)
1125 return kFALSE;
1126
1127 fAvNormCombined = weightedav / sumweights;
1128 fAvNormCombinedVar = 1./ sumweights ;
1129
1130 SetAverageQECombinedAvailable();
1131
1132 return kTRUE;
1133
1134}
1135
1136// ------------------------------------------------------------------------------
1137//
1138// Update the F-Factor Method: Calculate new average QE's
1139//
1140Bool_t MCalibrationQEPix::UpdateFFactorMethod()
1141{
1142
1143 Float_t weightedav = 0.;
1144 Float_t sumweights = 0.;
1145
1146 AddAverageFFactorQEs(MCalibrationCam::kGREEN, weightedav, sumweights);
1147 AddAverageFFactorQEs(MCalibrationCam::kBLUE , weightedav, sumweights);
1148 AddAverageFFactorQEs(MCalibrationCam::kUV , weightedav, sumweights);
1149 AddAverageFFactorQEs(MCalibrationCam::kCT1 , weightedav, sumweights);
1150
1151 if (weightedav == 0. || sumweights == 0.)
1152 return kFALSE;
1153
1154 fAvNormFFactor = weightedav / sumweights;
1155 fAvNormFFactorVar = 1./ sumweights ;
1156
1157 SetAverageQEFFactorAvailable();
1158
1159 return kTRUE;
1160
1161
1162}
1163
1164// ------------------------------------------------------------------------------
1165//
1166// Update the PIN Diode Method: Calculate new average QE's
1167//
1168Bool_t MCalibrationQEPix::UpdatePINDiodeMethod()
1169{
1170
1171 Float_t weightedav = 0.;
1172 Float_t sumweights = 0.;
1173
1174 AddAveragePINDiodeQEs(MCalibrationCam::kGREEN, weightedav, sumweights);
1175 AddAveragePINDiodeQEs(MCalibrationCam::kBLUE , weightedav, sumweights);
1176 AddAveragePINDiodeQEs(MCalibrationCam::kUV , weightedav, sumweights);
1177 AddAveragePINDiodeQEs(MCalibrationCam::kCT1 , weightedav, sumweights);
1178
1179 if (weightedav == 0. || sumweights == 0.)
1180 return kFALSE;
1181
1182 fAvNormPINDiode = weightedav / sumweights;
1183 fAvNormPINDiodeVar = 1./ sumweights ;
1184
1185 SetAverageQEPINDiodeAvailable();
1186
1187 return kTRUE;
1188
1189
1190}
1191
Note: See TracBrowser for help on using the repository browser.