]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TFluka/TFlukaCerenkov.cxx
Using cluster position and angular correction for cluster charge (Marian)
[u/mrichter/AliRoot.git] / TFluka / TFlukaCerenkov.cxx
index a1d86388979df131ce0a487a302ebfc7b2f7f31a..53d26b54e073c7725a02c7cdcc11425b375f75fe 100644 (file)
@@ -31,7 +31,7 @@
 
 Double_t TFlukaCerenkov::fgGlobalMaximumEfficiency = 0.;
    
-ClassImp(TFlukaCerenkov);
+ClassImp(TFlukaCerenkov)
 
 
 TFlukaCerenkov::TFlukaCerenkov()
@@ -43,6 +43,7 @@ TFlukaCerenkov::TFlukaCerenkov()
       fAbsorptionCoefficient(0),
       fQuantumEfficiency(0),
       fRefractionIndex(0),
+      fReflectivity(0),
       fMaximumEfficiency(0.)
 {
 // Default constructor
@@ -50,39 +51,102 @@ TFlukaCerenkov::TFlukaCerenkov()
 
 
 TFlukaCerenkov::TFlukaCerenkov(Int_t npckov, Float_t *ppckov, Float_t *absco, Float_t *effic, Float_t *rindex)
+    : fSamples(npckov),
+      fIsMetal(kFALSE),
+      fIsSensitive(kFALSE),
+      fEnergy(new Float_t[fSamples]),
+      fWaveLength(new Float_t[fSamples]),
+      fAbsorptionCoefficient(new Float_t[fSamples]),
+      fQuantumEfficiency(new Float_t[fSamples]),
+      fRefractionIndex(new Float_t[fSamples]),
+      fReflectivity(new Float_t[fSamples]),
+      fMaximumEfficiency(0.)
 {
-// Constructor    
-    fSamples = npckov;
-    fEnergy                = new Float_t[fSamples];
-    fWaveLength            = new Float_t[fSamples];
-    fAbsorptionCoefficient = new Float_t[fSamples];
-    fRefractionIndex       = new Float_t[fSamples];
-    fQuantumEfficiency     = new Float_t[fSamples];
-    
+// Constructor
+
+//    fSamples = npckov;
+//    fEnergy                = new Float_t[fSamples];
+//    fWaveLength            = new Float_t[fSamples];
+//    fAbsorptionCoefficient = new Float_t[fSamples];
+//    fRefractionIndex       = new Float_t[fSamples];
+//    fQuantumEfficiency     = new Float_t[fSamples];
+//    fReflectivity          = new Float_t[fSamples];    
+
     for (Int_t i = 0; i < fSamples; i++) {
-       fEnergy[i]             = ppckov[i];
-       fWaveLength[i]         = khc / ppckov[i];
-       if (absco[i] > 0.) {
-           fAbsorptionCoefficient[i]   = 1./ absco[i];
-       } else {
-           fAbsorptionCoefficient[i]   = 1.e15;
-       }
-       fRefractionIndex[i]    = rindex[i];
-       fQuantumEfficiency[i]  = effic[i];
-       //
-       // Find local maximum quantum efficiency
-       if (effic[i] > fMaximumEfficiency) fMaximumEfficiency = effic[i];
-       //
-       // Flag is sensitive if quantum efficiency 0 < eff < 1 for at least one value.
-       if (effic[i] < 1. && effic[i] > 0.) fIsSensitive = 1;
+        fEnergy[i]             = ppckov[i];
+        fWaveLength[i]         = khc / ppckov[i];
+        if (absco[i] > 0.) {
+            fAbsorptionCoefficient[i]   = 1./ absco[i];
+        } else {
+            fAbsorptionCoefficient[i]   = 1.e15;
+        }
+        fRefractionIndex[i]    = rindex[i];
+        fQuantumEfficiency[i]  = effic[i];
+        //
+        // Find local maximum quantum efficiency
+        if (effic[i] > fMaximumEfficiency) fMaximumEfficiency = effic[i];
+        //
+        // Flag is sensitive if quantum efficiency 0 < eff < 1 for at least one value.
+        if (effic[i] < 1. && effic[i] > 0.) fIsSensitive = 1;
+        // G3 way to define metal
+        if (rindex[0] == 0.) {
+            fIsMetal = kTRUE;
+            fReflectivity[i] = absco[i];
+        }
     }
     // Find global  maximum quantum efficiency
     if (fMaximumEfficiency > GetGlobalMaximumEfficiency()) {
-       SetGlobalMaximumEfficiency(fMaximumEfficiency);
+        SetGlobalMaximumEfficiency(fMaximumEfficiency);
     }
-    printf("Maximum eff. %f\n",  GetGlobalMaximumEfficiency());
-       
+}
+
+TFlukaCerenkov::TFlukaCerenkov(Int_t npckov, Float_t *ppckov, Float_t *absco, Float_t *effic, Float_t *rindex, Float_t *refl)
+    : fSamples(npckov),
+      fIsMetal(kFALSE),
+      fIsSensitive(kFALSE),
+      fEnergy(new Float_t[fSamples]),
+      fWaveLength(new Float_t[fSamples]),
+      fAbsorptionCoefficient(new Float_t[fSamples]),
+      fQuantumEfficiency(new Float_t[fSamples]),
+      fRefractionIndex(new Float_t[fSamples]),
+      fReflectivity(new Float_t[fSamples]),
+      fMaximumEfficiency(0.)
+{
+    // Constructor including reflectivity
+//    fSamples = npckov;
+//    fEnergy                = new Float_t[fSamples];
+//    fWaveLength            = new Float_t[fSamples];
+//    fAbsorptionCoefficient = new Float_t[fSamples];
+//    fRefractionIndex       = new Float_t[fSamples];
+//    fQuantumEfficiency     = new Float_t[fSamples];
+    
     
+    for (Int_t i = 0; i < fSamples; i++) {
+        fEnergy[i]             = ppckov[i];
+        fWaveLength[i]         = khc / ppckov[i];
+        if (absco[i] > 0.) {
+            fAbsorptionCoefficient[i]   = 1./ absco[i];
+        } else {
+            fAbsorptionCoefficient[i]   = 1.e15;
+        }
+        fRefractionIndex[i]    = rindex[i];
+        fQuantumEfficiency[i]  = effic[i];
+        //
+        // Find local maximum quantum efficiency
+        if (effic[i] > fMaximumEfficiency) fMaximumEfficiency = effic[i];
+        //
+        // Flag is sensitive if quantum efficiency 0 < eff < 1 for at least one value.
+        if (effic[i] < 1. && effic[i] > 0.) fIsSensitive = 1;
+        //
+
+    }
+    // Find global  maximum quantum efficiency
+    if (fMaximumEfficiency > GetGlobalMaximumEfficiency()) {
+        SetGlobalMaximumEfficiency(fMaximumEfficiency);
+    }
+//    fReflectivity     = new Float_t[fSamples];
+    for (Int_t i = 0; i < fSamples; i++) fReflectivity[i] = refl[i];
+    fIsMetal = kTRUE;
 }
 
 Float_t TFlukaCerenkov::GetAbsorptionCoefficient(Float_t energy)
@@ -103,6 +167,15 @@ Float_t TFlukaCerenkov::GetRefractionIndex(Float_t energy)
     
 }
 
+Float_t TFlukaCerenkov::GetReflectivity(Float_t energy)
+{
+//
+// Get RefractionIndex for given energy 
+//
+    return Interpolate(energy, fEnergy, fReflectivity);
+    
+}
+
 Float_t TFlukaCerenkov::GetQuantumEfficiency(Float_t energy)
 {
 //
@@ -132,6 +205,15 @@ Float_t TFlukaCerenkov::GetRefractionIndexByWaveLength(Float_t wavelength)
     return Interpolate(energy, fEnergy, fRefractionIndex);
 }
 
+Float_t TFlukaCerenkov::GetReflectivityByWaveLength(Float_t wavelength)
+{
+//
+// Get RefractionIndex for given wavelenth 
+//
+    Float_t energy = khc / wavelength;    
+    return Interpolate(energy, fEnergy, fReflectivity);
+}
+
 Float_t TFlukaCerenkov::GetQuantumEfficiencyByWaveLength(Float_t wavelength)
 {
 //
@@ -147,15 +229,15 @@ Float_t TFlukaCerenkov::Interpolate(Float_t value, Float_t* array1, Float_t* arr
 // Interpolate array values 
 //
     if (value < array1[0] && value >= array1[fSamples - 1]) {
-       Warning("Interpolate()", "Photon energy out of range. Returning 0.");
-       return (0.);
+        Warning("Interpolate()", "Photon energy out of range. Returning 0.");
+        return (0.);
     }
     
     Int_t i = TMath::BinarySearch(fSamples, array1, value);
     if (i == (fSamples-1)) {
-       return (array2[i]);
+        return (array2[i]);
     } else {
-       return (array2[i] + (array2[i+1] - array2[i]) / (array1[i+1] - array1[i]) * (value - array1[i]));
+        return (array2[i] + (array2[i+1] - array2[i]) / (array1[i+1] - array1[i]) * (value - array1[i]));
     }
 }