30e1da9928675d3dad39b8dd75166b71c69657a0
[u/mrichter/AliRoot.git] / TFluka / TFlukaCerenkov.cxx
1 #include "TFlukaCerenkov.h"
2
3 ClassImp(TFlukaCerenkov);
4
5
6 TFlukaCerenkov::TFlukaCerenkov()
7     : fSamples(0), 
8       fIsMetal(0),
9       fEnergy(0),
10       fWaveLength(0),
11       fAbsorptionCoefficient(0),
12       fQuantumEfficiency(0),
13       fRefractionIndex(0)
14 {
15 // Default constructor
16 }
17
18
19 TFlukaCerenkov::TFlukaCerenkov(Int_t npckov, Float_t *ppckov, Float_t *absco, Float_t *effic, Float_t *rindex)
20 {
21 // Constructor    
22     fSamples = npckov;
23     fEnergy             = new Float_t[fSamples];
24     fWaveLength         = new Float_t[fSamples];
25     fAbsorptionCoefficient   = new Float_t[fSamples];
26     fRefractionIndex    = new Float_t[fSamples];
27     fQuantumEfficiency  = new Float_t[fSamples];
28     for (Int_t i = 0; i < fSamples; i++) {
29         fEnergy[i]             = ppckov[i];
30         fWaveLength[i]         = khc / ppckov[i];
31         if (absco[i] > 0.) {
32             fAbsorptionCoefficient[i]   = 1./ absco[i];
33         } else {
34             fAbsorptionCoefficient[i]   = 1.e15;
35         }
36         fRefractionIndex[i]    = rindex[i];
37         fQuantumEfficiency[i]  = effic[i];
38         if (effic[i] < 1. && effic[i] > 0.) fIsMetal = 1;
39     }
40 }
41
42 Float_t TFlukaCerenkov::GetAbsorptionCoefficient(Float_t energy)
43 {
44 //
45 // Get AbsorptionCoefficient for given energy 
46 //
47     return Interpolate(energy, fEnergy, fAbsorptionCoefficient);
48     
49 }
50
51 Float_t TFlukaCerenkov::GetRefractionIndex(Float_t energy)
52 {
53 //
54 // Get RefractionIndex for given energy 
55 //
56     return Interpolate(energy, fEnergy, fRefractionIndex);
57     
58 }
59
60 Float_t TFlukaCerenkov::GetQuantumEfficiency(Float_t energy)
61 {
62 //
63 // Get QuantumEfficiency for given energy 
64 //
65     return Interpolate(energy, fEnergy, fQuantumEfficiency);
66     
67 }
68
69
70 Float_t TFlukaCerenkov::GetAbsorptionCoefficientByWaveLength(Float_t wavelength)
71 {
72 //
73 // Get AbsorptionCoefficient for given wavelength 
74 //
75     Float_t energy = khc / wavelength;    
76     return Interpolate(energy, fEnergy, fAbsorptionCoefficient);
77     
78 }
79
80 Float_t TFlukaCerenkov::GetRefractionIndexByWaveLength(Float_t wavelength)
81 {
82 //
83 // Get RefractionIndex for given wavelenth 
84 //
85     Float_t energy = khc / wavelength;    
86     return Interpolate(energy, fEnergy, fRefractionIndex);
87 }
88
89 Float_t TFlukaCerenkov::GetQuantumEfficiencyByWaveLength(Float_t wavelength)
90 {
91 //
92 // Get QuantumEfficiency for given wavelength 
93 //
94     Float_t energy = khc / wavelength;    
95     return Interpolate(energy, fEnergy, fQuantumEfficiency);
96 }
97
98 Float_t TFlukaCerenkov::Interpolate(Float_t value, Float_t* array1, Float_t* array2)
99 {
100 //
101 // Interpolate array values 
102 //
103     if (value < array1[0] && value >= array1[fSamples - 1]) {
104         Warning("Interpolate()", "Photon energy out of range. Returning 0.");
105         return (0.);
106     }
107     
108     Int_t i = TMath::BinarySearch(fSamples, array1, value);
109     if (i == (fSamples-1)) {
110         return (array2[i]);
111     } else {
112         return (array2[i] + (array2[i+1] - array2[i]) / (array1[i+1] - array1[i]) * (value - array1[i]));
113     }
114 }
115