1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
19 // Stores user defined cerenkov properties of media like
20 // absorption coefficient, refraction index and quantum efficiency.
21 // The properties are stored in arrays. The array index corresponds to discrete
22 // optical photon energies defined in fEnergy.
23 // Access to the properties is provided by interpolation.
27 // andreas.morsch@cern.ch
30 #include "TFlukaCerenkov.h"
32 Double_t TFlukaCerenkov::fgGlobalMaximumEfficiency = 0.;
34 ClassImp(TFlukaCerenkov);
37 TFlukaCerenkov::TFlukaCerenkov()
43 fAbsorptionCoefficient(0),
44 fQuantumEfficiency(0),
47 fMaximumEfficiency(0.)
49 // Default constructor
53 TFlukaCerenkov::TFlukaCerenkov(Int_t npckov, Float_t *ppckov, Float_t *absco, Float_t *effic, Float_t *rindex)
57 fEnergy = new Float_t[fSamples];
58 fWaveLength = new Float_t[fSamples];
59 fAbsorptionCoefficient = new Float_t[fSamples];
60 fRefractionIndex = new Float_t[fSamples];
61 fQuantumEfficiency = new Float_t[fSamples];
64 for (Int_t i = 0; i < fSamples; i++) {
65 fEnergy[i] = ppckov[i];
66 fWaveLength[i] = khc / ppckov[i];
68 fAbsorptionCoefficient[i] = 1./ absco[i];
70 fAbsorptionCoefficient[i] = 1.e15;
72 fRefractionIndex[i] = rindex[i];
73 fQuantumEfficiency[i] = effic[i];
75 // Find local maximum quantum efficiency
76 if (effic[i] > fMaximumEfficiency) fMaximumEfficiency = effic[i];
78 // Flag is sensitive if quantum efficiency 0 < eff < 1 for at least one value.
79 if (effic[i] < 1. && effic[i] > 0.) fIsSensitive = 1;
81 // Find global maximum quantum efficiency
82 if (fMaximumEfficiency > GetGlobalMaximumEfficiency()) {
83 SetGlobalMaximumEfficiency(fMaximumEfficiency);
87 TFlukaCerenkov::TFlukaCerenkov(Int_t npckov, Float_t *ppckov, Float_t *absco, Float_t *effic, Float_t *rindex, Float_t *refl)
89 // Constructor including reflectivity
91 fEnergy = new Float_t[fSamples];
92 fWaveLength = new Float_t[fSamples];
93 fAbsorptionCoefficient = new Float_t[fSamples];
94 fRefractionIndex = new Float_t[fSamples];
95 fQuantumEfficiency = new Float_t[fSamples];
98 for (Int_t i = 0; i < fSamples; i++) {
99 fEnergy[i] = ppckov[i];
100 fWaveLength[i] = khc / ppckov[i];
102 fAbsorptionCoefficient[i] = 1./ absco[i];
104 fAbsorptionCoefficient[i] = 1.e15;
106 fRefractionIndex[i] = rindex[i];
107 fQuantumEfficiency[i] = effic[i];
109 // Find local maximum quantum efficiency
110 if (effic[i] > fMaximumEfficiency) fMaximumEfficiency = effic[i];
112 // Flag is sensitive if quantum efficiency 0 < eff < 1 for at least one value.
113 if (effic[i] < 1. && effic[i] > 0.) fIsSensitive = 1;
115 // Find global maximum quantum efficiency
116 if (fMaximumEfficiency > GetGlobalMaximumEfficiency()) {
117 SetGlobalMaximumEfficiency(fMaximumEfficiency);
119 fReflectivity = new Float_t[fSamples];
120 for (Int_t i = 0; i < fSamples; i++) fReflectivity[i] = refl[i];
124 Float_t TFlukaCerenkov::GetAbsorptionCoefficient(Float_t energy)
127 // Get AbsorptionCoefficient for given energy
129 return Interpolate(energy, fEnergy, fAbsorptionCoefficient);
133 Float_t TFlukaCerenkov::GetRefractionIndex(Float_t energy)
136 // Get RefractionIndex for given energy
138 return Interpolate(energy, fEnergy, fRefractionIndex);
142 Float_t TFlukaCerenkov::GetReflectivity(Float_t energy)
145 // Get RefractionIndex for given energy
147 return Interpolate(energy, fEnergy, fReflectivity);
151 Float_t TFlukaCerenkov::GetQuantumEfficiency(Float_t energy)
154 // Get QuantumEfficiency for given energy
156 return Interpolate(energy, fEnergy, fQuantumEfficiency);
161 Float_t TFlukaCerenkov::GetAbsorptionCoefficientByWaveLength(Float_t wavelength)
164 // Get AbsorptionCoefficient for given wavelength
166 Float_t energy = khc / wavelength;
167 return Interpolate(energy, fEnergy, fAbsorptionCoefficient);
171 Float_t TFlukaCerenkov::GetRefractionIndexByWaveLength(Float_t wavelength)
174 // Get RefractionIndex for given wavelenth
176 Float_t energy = khc / wavelength;
177 return Interpolate(energy, fEnergy, fRefractionIndex);
180 Float_t TFlukaCerenkov::GetReflectivityByWaveLength(Float_t wavelength)
183 // Get RefractionIndex for given wavelenth
185 Float_t energy = khc / wavelength;
186 return Interpolate(energy, fEnergy, fReflectivity);
189 Float_t TFlukaCerenkov::GetQuantumEfficiencyByWaveLength(Float_t wavelength)
192 // Get QuantumEfficiency for given wavelength
194 Float_t energy = khc / wavelength;
195 return Interpolate(energy, fEnergy, fQuantumEfficiency);
198 Float_t TFlukaCerenkov::Interpolate(Float_t value, Float_t* array1, Float_t* array2)
201 // Interpolate array values
203 if (value < array1[0] && value >= array1[fSamples - 1]) {
204 Warning("Interpolate()", "Photon energy out of range. Returning 0.");
208 Int_t i = TMath::BinarySearch(fSamples, array1, value);
209 if (i == (fSamples-1)) {
212 return (array2[i] + (array2[i+1] - array2[i]) / (array1[i+1] - array1[i]) * (value - array1[i]));