ROBAST logo
/******************************************************************************
 * Copyright (C) 2006-, Akira Okumura                                         *
 * All rights reserved.                                                       *
 *****************************************************************************/

///////////////////////////////////////////////////////////////////////////////
//
// AOpticsManager
//
// Manager of optics
//
///////////////////////////////////////////////////////////////////////////////

#include "TRandom.h"
#include "TThread.h"

#include <iostream>
#include "ABorderSurfaceCondition.h"
#include "AOpticsManager.h"
static const Double_t kEpsilon =
    1e-6;  // Fixed in TGeoNavigator.cxx (equiv to 1e-6 cm)
static const Double_t kInf = std::numeric_limits<Double_t>::infinity();

ClassImp(AOpticsManager);

//_____________________________________________________________________________
AOpticsManager::AOpticsManager()
    : TGeoManager(), fDisableFresnelReflection(kFALSE) {
  fLimit = 100;
  fClassList[kLens] = ALens::Class();
  fClassList[kFocus] = AFocalSurface::Class();
  fClassList[kMirror] = AMirror::Class();
  fClassList[kObs] = AObscuration::Class();
  fClassList[kOpt] = AOpticalComponent::Class();
}

//_____________________________________________________________________________
AOpticsManager::AOpticsManager(const char* name, const char* title)
    : TGeoManager(name, title), fDisableFresnelReflection(kFALSE) {
  fLimit = 100;
  fClassList[kLens] = ALens::Class();
  fClassList[kFocus] = AFocalSurface::Class();
  fClassList[kMirror] = AMirror::Class();
  fClassList[kObs] = AObscuration::Class();
  fClassList[kOpt] = AOpticalComponent::Class();
}

//_____________________________________________________________________________
AOpticsManager::~AOpticsManager() {}

//_____________________________________________________________________________
void AOpticsManager::DoFresnel(Double_t n1, Double_t n2, Double_t k2, ARay& ray,
                               TGeoNavigator* nav, TGeoNode* currentNode,
                               TGeoNode* nextNode) {
  Double_t step = nav->GetStep();

  // Calculation taken from
  // M. Kobiyama "Kogakuhakumaku no Kisoriron" (OPTRONICS, Tokyo, 2011)
  // See Eq. (2-75) - (2-84)
  // theta1 = incident angle
  // theta2 = transmission angle
  TVector3 n = GetFacetNormal(
      nav, currentNode, nextNode);  // normal vect perpendicular to the surface
  Double_t d1[3];
  ray.GetDirection(d1);
  Double_t cos1 = d1[0] * n[0] + d1[1] * n[1] + d1[2] * n[2];  // cos(theta1)
  Double_t sin1 = TMath::Sqrt(1 - cos1 * cos1);
  Double_t sin2 = n1 * sin1 / n2;  // Snell's law
  Double_t cos2 = TMath::Sqrt(1 - sin2 * sin2);

  AOpticalComponent* component1 = (AOpticalComponent*)currentNode->GetVolume();
  AOpticalComponent* component2 =
      nextNode ? (AOpticalComponent*)nextNode->GetVolume() : 0;
  ABorderSurfaceCondition* condition =
      component1 ? component1->FindBorderSurfaceCondition(component2) : 0;

  Bool_t absorbed = kFALSE;

  if (condition and condition->GetMultilayer()) {
    Double_t reflectance, transmittance;
    Double_t angle = TMath::ACos(cos1);
    Double_t lambda = ray.GetLambda();
    // polarization is ignored in this version
    condition->GetMultilayer()->CoherentTMMMixed(angle, lambda, reflectance,
                                                 transmittance);
    auto rnd = gRandom->Uniform(1);
    if (rnd < reflectance) {  // reflection at the boundary
      DoReflection(n1, ray, nav, currentNode, nextNode, &n);
      return;
    } else if (rnd < reflectance + transmittance) {
      goto transmission_process;
    } else {  // absorption
      absorbed = kTRUE;
      goto transmission_process;
    }
  }

  if (sin2 > 1.) {  // total internal reflection
    DoReflection(n1, ray, nav, currentNode, nextNode, &n);
    return;
  }

  if (fDisableFresnelReflection == kFALSE) {
    Double_t Rs, Rp;  // reflectivity for s- and p-polarized photon
    auto _2 = [](Double_t v) { return v * v; };
    if (k2 <= 0.) {
      Double_t eta1S = n1 * cos1;
      Double_t eta2S = n2 * cos2;
      // We assume cos1 is non-zero here but a non-zero check might be needed
      // As long as navigation is OK, theta1 should not be 90 deg
      Double_t eta1P = n1 / cos1;
      Double_t eta2P = n2 / cos2;

      Rs = _2((eta1S - eta2S) / (eta1S + eta2S));
      Rp = _2((eta1P - eta2P) / (eta1P + eta2P));
    } else {
      Double_t eta1S = n1 * cos1;
      Double_t eta1P = n1 / cos1;
      Double_t x1S = eta1S;
      Double_t x1P = eta1P;
      Double_t u = _2(n2) - _2(k2) - _2(n1 * sin1);
      Double_t v = 2 * n2 * k2;
      Double_t tmp = TMath::Sqrt(_2(u) + _2(v));
      // cos(\xi/2), sin(\xi/2)
      Double_t cosxi2 = TMath::Sqrt(1 + u / tmp) / TMath::Sqrt2();
      Double_t sinxi2 = TMath::Sqrt(1 - u / tmp) / TMath::Sqrt2();
      // Double_t xi = TMath::ATan(v / u); // unused
      Double_t x2S = TMath::Sqrt(tmp) * cosxi2;
      Double_t y2S = TMath::Sqrt(tmp) * sinxi2;
      tmp = _2(x2S) + _2(y2S);
      Double_t x2P = (2 * n2 * k2 * y2S + (_2(n2) - _2(k2)) * x2S) / tmp;
      Double_t y2P = (2 * n2 * k2 * x2S - (_2(n2) - _2(k2)) * y2S) / tmp;
      Rs = (_2(x1S - x2S) + _2(y2S)) / (_2(x1S + x2S) + _2(y2S));
      Rp = (_2(x1P - x2P) + _2(y2P)) / (_2(x1P + x2P) + _2(y2P));
    }
    Double_t R = (Rs + Rp) / 2.;  // We assume that polarization is random

    if (gRandom->Uniform(1) < R) {  // reflection at the boundary
      DoReflection(n1, ray, nav, currentNode, nextNode, &n);
      return;
    }
  }

transmission_process:

  Double_t x1[4], d2[3];
  ray.GetLastPoint(x1);
  const Double_t* x2 = nav->GetCurrentPoint();
  for (Int_t i = 0; i < 3; i++) {
    if (sin1 != 0) {
      d2[i] = (d1[i] - cos1 * n[i]) * sin2 / sin1 + n[i] * cos2;
    } else {
      d2[i] = d1[i];
    }
  }
  // step (m), c (m/s)
  Double_t speed = TMath::C() * m() / n1;
  Double_t t = x1[3] + step / speed;
  ray.AddPoint(x2[0], x2[1], x2[2], t);
  ray.AddNode(nextNode);
  if (absorbed) {
    ray.Absorb();
  } else {
    ray.SetDirection(d2);
    nav->SetCurrentDirection(d2);
  }
}

//_____________________________________________________________________________
void AOpticsManager::DoReflection(Double_t n1, ARay& ray, TGeoNavigator* nav,
                                  TGeoNode* currentNode, TGeoNode* nextNode,
                                  TVector3* normal) {
  Double_t step = nav->GetStep();

  // normal vect perpendicular to the surface
  // if it is not calculated yet, call GetFacetNormal
  TVector3 n = normal ? *normal : GetFacetNormal(nav, currentNode, nextNode);
  Double_t d1[3];
  ray.GetDirection(d1);
  Double_t cos1 = d1[0] * n[0] + d1[1] * n[1] + d1[2] * n[2];

  AOpticalComponent* component1 = (AOpticalComponent*)currentNode->GetVolume();
  AOpticalComponent* component2 =
      nextNode ? (AOpticalComponent*)nextNode->GetVolume() : 0;
  ABorderSurfaceCondition* condition =
      component1 ? component1->FindBorderSurfaceCondition(component2) : 0;

  Bool_t absorbed = kFALSE;

  if (IsMirror(nextNode)) {
    Double_t angle = TMath::ACos(cos1);
    Double_t lambda = ray.GetLambda();
    Double_t ref;
    if (condition and condition->GetMultilayer()) {
      Double_t transmittance;
      // ignore polarization in the current version
      condition->GetMultilayer()->CoherentTMMMixed(angle, lambda, ref,
                                                   transmittance);
    } else {
      ref = ((AMirror*)nextNode->GetVolume())->GetReflectance(lambda, angle);
    }
    if (ref < gRandom->Uniform(1)) {
      absorbed = kTRUE;
      ray.Absorb();
    }
  }

  Double_t d2[3];
  for (Int_t i = 0; i < 3; i++) {  // d2 = d1 - 2n*(d1*n)
    d2[i] = d1[i] - 2 * n[i] * cos1;
  }
  if (not absorbed) {
    ray.SetDirection(d2);
  }

  Double_t x1[4];
  ray.GetLastPoint(x1);
  const Double_t* x2 = nav->GetCurrentPoint();
  Double_t speed = TMath::C() * m() / n1;
  Double_t t = x1[3] + step / speed;
  nav->SetCurrentDirection(-d1[0], -d1[1], -d1[2]);
  nav->SetStep(kEpsilon);
  nav->Step();
  nav->SetCurrentDirection(d2);
  ray.AddPoint(x2[0], x2[1], x2[2], t);
  ray.AddNode(nextNode);
}

//_____________________________________________________________________________
TVector3 AOpticsManager::GetFacetNormal(TGeoNavigator* nav,
                                        TGeoNode* currentNode,
                                        TGeoNode* nextNode) {
  AOpticalComponent* component1 = (AOpticalComponent*)currentNode->GetVolume();
  AOpticalComponent* component2 =
      nextNode ? (AOpticalComponent*)nextNode->GetVolume() : 0;

  TVector3 normal(nav->FindNormal());
  TVector3 momentum(nav->GetCurrentDirection());

  ABorderSurfaceCondition* condition =
      component1 ? component1->FindBorderSurfaceCondition(component2) : 0;

  if (condition and condition->GetGaussianRoughness() != 0) {
    // The following method is based on G4OpBoundaryProcess::GetFacetNormal in
    // Geant4 optics
    TVector3 facetNormal;
    Double_t alpha;
    Double_t sigma_alpha = condition->GetGaussianRoughness();
    Double_t f_max = TMath::Min(1., 4. * sigma_alpha);

    do {
      do {
        alpha = gRandom->Gaus(0, sigma_alpha);
      } while (gRandom->Uniform(f_max) > TMath::Sin(alpha) ||
               alpha >= TMath::PiOver2());

      Double_t phi = gRandom->Uniform(TMath::TwoPi());

      Double_t SinAlpha = TMath::Sin(alpha);
      Double_t CosAlpha = TMath::Cos(alpha);
      Double_t SinPhi = TMath::Sin(phi);
      Double_t CosPhi = TMath::Cos(phi);

      Double_t unit_x = SinAlpha * CosPhi;
      Double_t unit_y = SinAlpha * SinPhi;
      Double_t unit_z = CosAlpha;

      facetNormal.SetXYZ(unit_x, unit_y, unit_z);

      TVector3 tmpNormal = normal;

      facetNormal.RotateUz(tmpNormal);
    } while (momentum * facetNormal <= 0.0);
    normal = facetNormal;
  }

  return normal;
}

//_____________________________________________________________________________
void* AOpticsManager::Thread(void* args) {
  AOpticsManager* manager = (AOpticsManager*)((TObject**)args)[0];
  ARayArray* array = (ARayArray*)((TObject**)args)[1];

  TObjArray* running = array->GetRunning();
  manager->TraceNonSequential(running);

  Int_t n = running->GetLast();

  for (Int_t i = 0; i <= n; i++) {
    ARay* ray = (ARay*)(running->RemoveAt(i));
    if (!ray) continue;
    array->Add(ray);
  }

  running->Expand(0);

  manager->RemoveNavigator(manager->GetCurrentNavigator());

  return 0;
}

//_____________________________________________________________________________
void AOpticsManager::TraceNonSequential(ARay& ray) {
  TObjArray array;
  array.SetOwner(kFALSE);
  array.Add(&ray);
  TraceNonSequential(&array);
}

//_____________________________________________________________________________
void AOpticsManager::TraceNonSequential(TObjArray* array) {
  TGeoNavigator* nav = GetCurrentNavigator();
  if (!nav) {
#if ROOT_VERSION(6, 9, 2) <= ROOT_VERSION_CODE && \
    ROOT_VERSION_CODE <= ROOT_VERSION(6, 10, 2)
    // This line is missing in TGeoManager::AddNavigator
    if (IsMultiThread()) TGeoManager::ThreadId();
#endif
    nav = AddNavigator();
  }

  Int_t n = array->GetLast();
  for (Int_t j = 0; j <= n; j++) {
    ARay* ray = (ARay*)array->At(j);
    if (not ray or not ray->IsRunning()) {
      continue;
    }

    Double_t lambda = ray->GetLambda();
    Double_t x1[4], d1[3];
    ray->GetLastPoint(x1);
    ray->GetDirection(d1);
    nav->InitTrack(x1, d1);

    while (ray->IsRunning()) {
      ray->GetLastPoint(x1);
      ray->GetDirection(d1);

      TGeoNode* currentNode = nav->GetCurrentNode();
      if (nav->IsOutside()) {  // if the current position is outside of top
                               // volume
        currentNode = 0;
      }

      TGeoNode* nextNode = nav->FindNextBoundaryAndStep();
      Double_t step = nav->GetStep();  // distance to the next boundary

      // Check type of start node
      Int_t typeCurrent = kOther;
      Int_t typeNext = kOther;

      if (!currentNode)
        typeCurrent = kNull;
      else if (IsLens(currentNode))
        typeCurrent = kLens;
      else if (IsObscuration(currentNode))
        typeCurrent = kObs;
      else if (IsMirror(currentNode))
        typeCurrent = kMirror;
      else if (IsFocalSurface(currentNode))
        typeCurrent = kFocus;
      else if (IsOpticalComponent(currentNode))
        typeCurrent = kOpt;

      // Check type of next node
      if (!nextNode)
        typeNext = kNull;
      else if (IsLens(nextNode))
        typeNext = kLens;
      else if (IsObscuration(nextNode))
        typeNext = kObs;
      else if (IsMirror(nextNode))
        typeNext = kMirror;
      else if (IsFocalSurface(nextNode))
        typeNext = kFocus;
      else if (IsOpticalComponent(nextNode))
        typeNext = kOpt;

      if (typeCurrent == kLens) {
        Double_t abs =
            ((ALens*)currentNode->GetVolume())->GetAbsorptionLength(lambda);
        if (abs > 0 && abs != kInf) {
          Double_t abs_step = gRandom->Exp(abs);
          if (abs_step < step) {
            Double_t n1 =
                ((ALens*)currentNode->GetVolume())->GetRefractiveIndex(lambda);
            Double_t speed = TMath::C() * m() / n1;
            Double_t x2[3];
            for (Int_t i = 0; i < 3; i++) {
              x2[i] = x1[i] + abs_step * d1[i];
            }
            Double_t t = x1[3] + abs_step / speed;
            ray->AddPoint(x2[0], x2[1], x2[2], t);
            ray->AddNode(nextNode);
            ray->Absorb();
            continue;
          }
        }
      }

      if ((typeCurrent == kNull or typeCurrent == kOpt or
           typeCurrent == kLens or typeCurrent == kOther) and
          typeNext == kMirror) {
        Double_t n1 =
            typeCurrent == kLens
                ? ((ALens*)currentNode->GetVolume())->GetRefractiveIndex(lambda)
                : 1.;
        DoReflection(n1, *ray, nav, currentNode, nextNode);
      } else if ((typeCurrent == kNull or typeCurrent == kOpt or
                  typeCurrent == kOther) and
                 typeNext == kLens) {
        Double_t n1 = 1;  // Assume refractive index equals 1 (= vacuum)
        Double_t n2 =
            ((ALens*)nextNode->GetVolume())->GetRefractiveIndex(lambda);
        Double_t k2 =
            ((ALens*)nextNode->GetVolume())->GetExtinctionCoefficient(lambda);
        DoFresnel(n1, n2, k2, *ray, nav, currentNode, nextNode);
      } else if ((typeCurrent == kNull or typeCurrent == kLens or
                  typeCurrent == kOpt or typeCurrent == kOther) and
                 (typeNext == kObs or typeNext == kFocus)) {
        const Double_t* x2 = nav->GetCurrentPoint();
        Double_t t;
        if (typeCurrent == kLens) {
          Double_t n1 =
              ((ALens*)currentNode->GetVolume())->GetRefractiveIndex(lambda);
          Double_t speed = TMath::C() * m() / n1;
          t = x1[3] + step / speed;
        } else {
          Double_t speed = TMath::C() * m();
          t = x1[3] + step / speed;
        }
        ray->AddPoint(x2[0], x2[1], x2[2], t);
        ray->AddNode(nextNode);
      } else if ((typeCurrent == kNull or typeCurrent == kOpt or
                  typeCurrent == kOther) and
                 (typeNext == kOther or typeNext == kOpt)) {
        const Double_t* x2 = nav->GetCurrentPoint();

        Double_t speed = TMath::C() * m();
        Double_t t = x1[3] + step / speed;
        ray->AddPoint(x2[0], x2[1], x2[2], t);
        ray->AddNode(nextNode);
      } else if (typeCurrent == kLens and typeNext == kLens) {
        Double_t n1 =
            ((ALens*)currentNode->GetVolume())->GetRefractiveIndex(lambda);
        Double_t n2 =
            ((ALens*)nextNode->GetVolume())->GetRefractiveIndex(lambda);
        Double_t k2 =
            ((ALens*)nextNode->GetVolume())->GetExtinctionCoefficient(lambda);
        DoFresnel(n1, n2, k2, *ray, nav, currentNode, nextNode);
      } else if (typeCurrent == kLens and
                 (typeNext == kNull or typeNext == kOpt or
                  typeNext == kOther)) {
        Double_t n1 =
            ((ALens*)currentNode->GetVolume())->GetRefractiveIndex(lambda);
        Double_t n2 = 1;  // Assume refractive index equals 1 (= vacuum)
        Double_t k2 = 0;  // No extinction (= vacuum)
        DoFresnel(n1, n2, k2, *ray, nav, currentNode, nextNode);
      }

      if (typeNext == kNull) {
        const Double_t* x2 = nav->GetCurrentPoint();
        Double_t speed = TMath::C() * m();
        Double_t t = x1[3] + step / speed;
        ray->AddPoint(x2[0], x2[1], x2[2], t);
        ray->AddNode(nextNode);
        ray->Exit();
      } else if (typeCurrent == kFocus or typeCurrent == kObs or
                 typeCurrent == kMirror or typeNext == kObs) {
        ray->Stop();
      } else if (typeNext == kFocus) {
        AFocalSurface* focal = (AFocalSurface*)nextNode->GetVolume();
        Double_t angle = 0.;
        if (focal->HasQEAngle()) {
          TVector3 n = GetFacetNormal(
              nav, currentNode,
              nextNode);  // normal vect perpendicular to the surface
          Double_t d1[3];
          ray->GetDirection(d1);
          Double_t cos1 = d1[0] * n[0] + d1[1] * n[1] + d1[2] * n[2];
          angle = TMath::ACos(cos1);
        }
        Double_t qe = focal->GetQuantumEfficiency(lambda, angle);
        if (qe == 1 or gRandom->Uniform(0, 1) < qe) {
          ray->Focus();
        } else {
          ray->Stop();
        }
      }

      if (ray->IsRunning() and ray->GetNpoints() >= fLimit) {
        ray->Suspend();
      }
    }
  }
}

//_____________________________________________________________________________
void AOpticsManager::TraceNonSequential(ARayArray& array) {
  TObjArray* running = array.GetRunning();

  Int_t n = running->GetLast();
  Int_t nthreads = GetMaxThreads();

  if (IsMultiThread() and nthreads >= 2) {
    TThread** threads = new TThread*[nthreads];
    ARayArray** dividedArray = new ARayArray*[nthreads];

    for (Int_t i = 0; i < nthreads; i++) {
      dividedArray[i] = new ARayArray();
      for (Int_t j = ((n + 1) / nthreads) * i;
           (i == (nthreads - 1)) ? j <= n : j < ((n + 1) / nthreads) * (i + 1);
           j++) {
        ARay* ray = (ARay*)running->RemoveAt(j);
        dividedArray[i]->Add(ray);
      }
    }

    TObject*** args = new TObject**[nthreads];
    for (Int_t i = 0; i < nthreads; i++) {
      args[i] = new TObject*[2];
      args[i][0] = this;
      args[i][1] = dividedArray[i];
      threads[i] = new TThread(Form("thread%d", i), AOpticsManager::Thread,
                               (void*)args[i]);
      threads[i]->Run();
    }

    for (Int_t i = 0; i < nthreads; i++) {
      threads[i]->Join();
    }

    ClearThreadsMap();

    for (Int_t i = 0; i < nthreads; i++) {
      delete[] args[i];
      array.Merge(dividedArray[i]);
      SafeDelete(dividedArray[i]);
      SafeDelete(threads[i]);
    }

    delete[] args;
    delete[] threads;
    delete[] dividedArray;
  } else {  // single thread
    TObjArray* objarray = new TObjArray;
    for (Int_t i = 0; i <= n; i++) {
      ARay* ray = (ARay*)running->RemoveAt(i);
      if (!ray) continue;
      objarray->Add(ray);
    }
    TraceNonSequential(objarray);
    n = objarray->GetLast();
    for (Int_t i = 0; i <= n; i++) {
      ARay* ray = (ARay*)objarray->RemoveAt(i);
      if (!ray) continue;
      array.Add(ray);
    }
    delete objarray;
  }

  running->Expand(0);  // shrink the array
}

//_____________________________________________________________________________
void AOpticsManager::SetLimit(Int_t n) {
  if (n > 0) {
    fLimit = n;
  }
}
 AOpticsManager.cxx:1
 AOpticsManager.cxx:2
 AOpticsManager.cxx:3
 AOpticsManager.cxx:4
 AOpticsManager.cxx:5
 AOpticsManager.cxx:6
 AOpticsManager.cxx:7
 AOpticsManager.cxx:8
 AOpticsManager.cxx:9
 AOpticsManager.cxx:10
 AOpticsManager.cxx:11
 AOpticsManager.cxx:12
 AOpticsManager.cxx:13
 AOpticsManager.cxx:14
 AOpticsManager.cxx:15
 AOpticsManager.cxx:16
 AOpticsManager.cxx:17
 AOpticsManager.cxx:18
 AOpticsManager.cxx:19
 AOpticsManager.cxx:20
 AOpticsManager.cxx:21
 AOpticsManager.cxx:22
 AOpticsManager.cxx:23
 AOpticsManager.cxx:24
 AOpticsManager.cxx:25
 AOpticsManager.cxx:26
 AOpticsManager.cxx:27
 AOpticsManager.cxx:28
 AOpticsManager.cxx:29
 AOpticsManager.cxx:30
 AOpticsManager.cxx:31
 AOpticsManager.cxx:32
 AOpticsManager.cxx:33
 AOpticsManager.cxx:34
 AOpticsManager.cxx:35
 AOpticsManager.cxx:36
 AOpticsManager.cxx:37
 AOpticsManager.cxx:38
 AOpticsManager.cxx:39
 AOpticsManager.cxx:40
 AOpticsManager.cxx:41
 AOpticsManager.cxx:42
 AOpticsManager.cxx:43
 AOpticsManager.cxx:44
 AOpticsManager.cxx:45
 AOpticsManager.cxx:46
 AOpticsManager.cxx:47
 AOpticsManager.cxx:48
 AOpticsManager.cxx:49
 AOpticsManager.cxx:50
 AOpticsManager.cxx:51
 AOpticsManager.cxx:52
 AOpticsManager.cxx:53
 AOpticsManager.cxx:54
 AOpticsManager.cxx:55
 AOpticsManager.cxx:56
 AOpticsManager.cxx:57
 AOpticsManager.cxx:58
 AOpticsManager.cxx:59
 AOpticsManager.cxx:60
 AOpticsManager.cxx:61
 AOpticsManager.cxx:62
 AOpticsManager.cxx:63
 AOpticsManager.cxx:64
 AOpticsManager.cxx:65
 AOpticsManager.cxx:66
 AOpticsManager.cxx:67
 AOpticsManager.cxx:68
 AOpticsManager.cxx:69
 AOpticsManager.cxx:70
 AOpticsManager.cxx:71
 AOpticsManager.cxx:72
 AOpticsManager.cxx:73
 AOpticsManager.cxx:74
 AOpticsManager.cxx:75
 AOpticsManager.cxx:76
 AOpticsManager.cxx:77
 AOpticsManager.cxx:78
 AOpticsManager.cxx:79
 AOpticsManager.cxx:80
 AOpticsManager.cxx:81
 AOpticsManager.cxx:82
 AOpticsManager.cxx:83
 AOpticsManager.cxx:84
 AOpticsManager.cxx:85
 AOpticsManager.cxx:86
 AOpticsManager.cxx:87
 AOpticsManager.cxx:88
 AOpticsManager.cxx:89
 AOpticsManager.cxx:90
 AOpticsManager.cxx:91
 AOpticsManager.cxx:92
 AOpticsManager.cxx:93
 AOpticsManager.cxx:94
 AOpticsManager.cxx:95
 AOpticsManager.cxx:96
 AOpticsManager.cxx:97
 AOpticsManager.cxx:98
 AOpticsManager.cxx:99
 AOpticsManager.cxx:100
 AOpticsManager.cxx:101
 AOpticsManager.cxx:102
 AOpticsManager.cxx:103
 AOpticsManager.cxx:104
 AOpticsManager.cxx:105
 AOpticsManager.cxx:106
 AOpticsManager.cxx:107
 AOpticsManager.cxx:108
 AOpticsManager.cxx:109
 AOpticsManager.cxx:110
 AOpticsManager.cxx:111
 AOpticsManager.cxx:112
 AOpticsManager.cxx:113
 AOpticsManager.cxx:114
 AOpticsManager.cxx:115
 AOpticsManager.cxx:116
 AOpticsManager.cxx:117
 AOpticsManager.cxx:118
 AOpticsManager.cxx:119
 AOpticsManager.cxx:120
 AOpticsManager.cxx:121
 AOpticsManager.cxx:122
 AOpticsManager.cxx:123
 AOpticsManager.cxx:124
 AOpticsManager.cxx:125
 AOpticsManager.cxx:126
 AOpticsManager.cxx:127
 AOpticsManager.cxx:128
 AOpticsManager.cxx:129
 AOpticsManager.cxx:130
 AOpticsManager.cxx:131
 AOpticsManager.cxx:132
 AOpticsManager.cxx:133
 AOpticsManager.cxx:134
 AOpticsManager.cxx:135
 AOpticsManager.cxx:136
 AOpticsManager.cxx:137
 AOpticsManager.cxx:138
 AOpticsManager.cxx:139
 AOpticsManager.cxx:140
 AOpticsManager.cxx:141
 AOpticsManager.cxx:142
 AOpticsManager.cxx:143
 AOpticsManager.cxx:144
 AOpticsManager.cxx:145
 AOpticsManager.cxx:146
 AOpticsManager.cxx:147
 AOpticsManager.cxx:148
 AOpticsManager.cxx:149
 AOpticsManager.cxx:150
 AOpticsManager.cxx:151
 AOpticsManager.cxx:152
 AOpticsManager.cxx:153
 AOpticsManager.cxx:154
 AOpticsManager.cxx:155
 AOpticsManager.cxx:156
 AOpticsManager.cxx:157
 AOpticsManager.cxx:158
 AOpticsManager.cxx:159
 AOpticsManager.cxx:160
 AOpticsManager.cxx:161
 AOpticsManager.cxx:162
 AOpticsManager.cxx:163
 AOpticsManager.cxx:164
 AOpticsManager.cxx:165
 AOpticsManager.cxx:166
 AOpticsManager.cxx:167
 AOpticsManager.cxx:168
 AOpticsManager.cxx:169
 AOpticsManager.cxx:170
 AOpticsManager.cxx:171
 AOpticsManager.cxx:172
 AOpticsManager.cxx:173
 AOpticsManager.cxx:174
 AOpticsManager.cxx:175
 AOpticsManager.cxx:176
 AOpticsManager.cxx:177
 AOpticsManager.cxx:178
 AOpticsManager.cxx:179
 AOpticsManager.cxx:180
 AOpticsManager.cxx:181
 AOpticsManager.cxx:182
 AOpticsManager.cxx:183
 AOpticsManager.cxx:184
 AOpticsManager.cxx:185
 AOpticsManager.cxx:186
 AOpticsManager.cxx:187
 AOpticsManager.cxx:188
 AOpticsManager.cxx:189
 AOpticsManager.cxx:190
 AOpticsManager.cxx:191
 AOpticsManager.cxx:192
 AOpticsManager.cxx:193
 AOpticsManager.cxx:194
 AOpticsManager.cxx:195
 AOpticsManager.cxx:196
 AOpticsManager.cxx:197
 AOpticsManager.cxx:198
 AOpticsManager.cxx:199
 AOpticsManager.cxx:200
 AOpticsManager.cxx:201
 AOpticsManager.cxx:202
 AOpticsManager.cxx:203
 AOpticsManager.cxx:204
 AOpticsManager.cxx:205
 AOpticsManager.cxx:206
 AOpticsManager.cxx:207
 AOpticsManager.cxx:208
 AOpticsManager.cxx:209
 AOpticsManager.cxx:210
 AOpticsManager.cxx:211
 AOpticsManager.cxx:212
 AOpticsManager.cxx:213
 AOpticsManager.cxx:214
 AOpticsManager.cxx:215
 AOpticsManager.cxx:216
 AOpticsManager.cxx:217
 AOpticsManager.cxx:218
 AOpticsManager.cxx:219
 AOpticsManager.cxx:220
 AOpticsManager.cxx:221
 AOpticsManager.cxx:222
 AOpticsManager.cxx:223
 AOpticsManager.cxx:224
 AOpticsManager.cxx:225
 AOpticsManager.cxx:226
 AOpticsManager.cxx:227
 AOpticsManager.cxx:228
 AOpticsManager.cxx:229
 AOpticsManager.cxx:230
 AOpticsManager.cxx:231
 AOpticsManager.cxx:232
 AOpticsManager.cxx:233
 AOpticsManager.cxx:234
 AOpticsManager.cxx:235
 AOpticsManager.cxx:236
 AOpticsManager.cxx:237
 AOpticsManager.cxx:238
 AOpticsManager.cxx:239
 AOpticsManager.cxx:240
 AOpticsManager.cxx:241
 AOpticsManager.cxx:242
 AOpticsManager.cxx:243
 AOpticsManager.cxx:244
 AOpticsManager.cxx:245
 AOpticsManager.cxx:246
 AOpticsManager.cxx:247
 AOpticsManager.cxx:248
 AOpticsManager.cxx:249
 AOpticsManager.cxx:250
 AOpticsManager.cxx:251
 AOpticsManager.cxx:252
 AOpticsManager.cxx:253
 AOpticsManager.cxx:254
 AOpticsManager.cxx:255
 AOpticsManager.cxx:256
 AOpticsManager.cxx:257
 AOpticsManager.cxx:258
 AOpticsManager.cxx:259
 AOpticsManager.cxx:260
 AOpticsManager.cxx:261
 AOpticsManager.cxx:262
 AOpticsManager.cxx:263
 AOpticsManager.cxx:264
 AOpticsManager.cxx:265
 AOpticsManager.cxx:266
 AOpticsManager.cxx:267
 AOpticsManager.cxx:268
 AOpticsManager.cxx:269
 AOpticsManager.cxx:270
 AOpticsManager.cxx:271
 AOpticsManager.cxx:272
 AOpticsManager.cxx:273
 AOpticsManager.cxx:274
 AOpticsManager.cxx:275
 AOpticsManager.cxx:276
 AOpticsManager.cxx:277
 AOpticsManager.cxx:278
 AOpticsManager.cxx:279
 AOpticsManager.cxx:280
 AOpticsManager.cxx:281
 AOpticsManager.cxx:282
 AOpticsManager.cxx:283
 AOpticsManager.cxx:284
 AOpticsManager.cxx:285
 AOpticsManager.cxx:286
 AOpticsManager.cxx:287
 AOpticsManager.cxx:288
 AOpticsManager.cxx:289
 AOpticsManager.cxx:290
 AOpticsManager.cxx:291
 AOpticsManager.cxx:292
 AOpticsManager.cxx:293
 AOpticsManager.cxx:294
 AOpticsManager.cxx:295
 AOpticsManager.cxx:296
 AOpticsManager.cxx:297
 AOpticsManager.cxx:298
 AOpticsManager.cxx:299
 AOpticsManager.cxx:300
 AOpticsManager.cxx:301
 AOpticsManager.cxx:302
 AOpticsManager.cxx:303
 AOpticsManager.cxx:304
 AOpticsManager.cxx:305
 AOpticsManager.cxx:306
 AOpticsManager.cxx:307
 AOpticsManager.cxx:308
 AOpticsManager.cxx:309
 AOpticsManager.cxx:310
 AOpticsManager.cxx:311
 AOpticsManager.cxx:312
 AOpticsManager.cxx:313
 AOpticsManager.cxx:314
 AOpticsManager.cxx:315
 AOpticsManager.cxx:316
 AOpticsManager.cxx:317
 AOpticsManager.cxx:318
 AOpticsManager.cxx:319
 AOpticsManager.cxx:320
 AOpticsManager.cxx:321
 AOpticsManager.cxx:322
 AOpticsManager.cxx:323
 AOpticsManager.cxx:324
 AOpticsManager.cxx:325
 AOpticsManager.cxx:326
 AOpticsManager.cxx:327
 AOpticsManager.cxx:328
 AOpticsManager.cxx:329
 AOpticsManager.cxx:330
 AOpticsManager.cxx:331
 AOpticsManager.cxx:332
 AOpticsManager.cxx:333
 AOpticsManager.cxx:334
 AOpticsManager.cxx:335
 AOpticsManager.cxx:336
 AOpticsManager.cxx:337
 AOpticsManager.cxx:338
 AOpticsManager.cxx:339
 AOpticsManager.cxx:340
 AOpticsManager.cxx:341
 AOpticsManager.cxx:342
 AOpticsManager.cxx:343
 AOpticsManager.cxx:344
 AOpticsManager.cxx:345
 AOpticsManager.cxx:346
 AOpticsManager.cxx:347
 AOpticsManager.cxx:348
 AOpticsManager.cxx:349
 AOpticsManager.cxx:350
 AOpticsManager.cxx:351
 AOpticsManager.cxx:352
 AOpticsManager.cxx:353
 AOpticsManager.cxx:354
 AOpticsManager.cxx:355
 AOpticsManager.cxx:356
 AOpticsManager.cxx:357
 AOpticsManager.cxx:358
 AOpticsManager.cxx:359
 AOpticsManager.cxx:360
 AOpticsManager.cxx:361
 AOpticsManager.cxx:362
 AOpticsManager.cxx:363
 AOpticsManager.cxx:364
 AOpticsManager.cxx:365
 AOpticsManager.cxx:366
 AOpticsManager.cxx:367
 AOpticsManager.cxx:368
 AOpticsManager.cxx:369
 AOpticsManager.cxx:370
 AOpticsManager.cxx:371
 AOpticsManager.cxx:372
 AOpticsManager.cxx:373
 AOpticsManager.cxx:374
 AOpticsManager.cxx:375
 AOpticsManager.cxx:376
 AOpticsManager.cxx:377
 AOpticsManager.cxx:378
 AOpticsManager.cxx:379
 AOpticsManager.cxx:380
 AOpticsManager.cxx:381
 AOpticsManager.cxx:382
 AOpticsManager.cxx:383
 AOpticsManager.cxx:384
 AOpticsManager.cxx:385
 AOpticsManager.cxx:386
 AOpticsManager.cxx:387
 AOpticsManager.cxx:388
 AOpticsManager.cxx:389
 AOpticsManager.cxx:390
 AOpticsManager.cxx:391
 AOpticsManager.cxx:392
 AOpticsManager.cxx:393
 AOpticsManager.cxx:394
 AOpticsManager.cxx:395
 AOpticsManager.cxx:396
 AOpticsManager.cxx:397
 AOpticsManager.cxx:398
 AOpticsManager.cxx:399
 AOpticsManager.cxx:400
 AOpticsManager.cxx:401
 AOpticsManager.cxx:402
 AOpticsManager.cxx:403
 AOpticsManager.cxx:404
 AOpticsManager.cxx:405
 AOpticsManager.cxx:406
 AOpticsManager.cxx:407
 AOpticsManager.cxx:408
 AOpticsManager.cxx:409
 AOpticsManager.cxx:410
 AOpticsManager.cxx:411
 AOpticsManager.cxx:412
 AOpticsManager.cxx:413
 AOpticsManager.cxx:414
 AOpticsManager.cxx:415
 AOpticsManager.cxx:416
 AOpticsManager.cxx:417
 AOpticsManager.cxx:418
 AOpticsManager.cxx:419
 AOpticsManager.cxx:420
 AOpticsManager.cxx:421
 AOpticsManager.cxx:422
 AOpticsManager.cxx:423
 AOpticsManager.cxx:424
 AOpticsManager.cxx:425
 AOpticsManager.cxx:426
 AOpticsManager.cxx:427
 AOpticsManager.cxx:428
 AOpticsManager.cxx:429
 AOpticsManager.cxx:430
 AOpticsManager.cxx:431
 AOpticsManager.cxx:432
 AOpticsManager.cxx:433
 AOpticsManager.cxx:434
 AOpticsManager.cxx:435
 AOpticsManager.cxx:436
 AOpticsManager.cxx:437
 AOpticsManager.cxx:438
 AOpticsManager.cxx:439
 AOpticsManager.cxx:440
 AOpticsManager.cxx:441
 AOpticsManager.cxx:442
 AOpticsManager.cxx:443
 AOpticsManager.cxx:444
 AOpticsManager.cxx:445
 AOpticsManager.cxx:446
 AOpticsManager.cxx:447
 AOpticsManager.cxx:448
 AOpticsManager.cxx:449
 AOpticsManager.cxx:450
 AOpticsManager.cxx:451
 AOpticsManager.cxx:452
 AOpticsManager.cxx:453
 AOpticsManager.cxx:454
 AOpticsManager.cxx:455
 AOpticsManager.cxx:456
 AOpticsManager.cxx:457
 AOpticsManager.cxx:458
 AOpticsManager.cxx:459
 AOpticsManager.cxx:460
 AOpticsManager.cxx:461
 AOpticsManager.cxx:462
 AOpticsManager.cxx:463
 AOpticsManager.cxx:464
 AOpticsManager.cxx:465
 AOpticsManager.cxx:466
 AOpticsManager.cxx:467
 AOpticsManager.cxx:468
 AOpticsManager.cxx:469
 AOpticsManager.cxx:470
 AOpticsManager.cxx:471
 AOpticsManager.cxx:472
 AOpticsManager.cxx:473
 AOpticsManager.cxx:474
 AOpticsManager.cxx:475
 AOpticsManager.cxx:476
 AOpticsManager.cxx:477
 AOpticsManager.cxx:478
 AOpticsManager.cxx:479
 AOpticsManager.cxx:480
 AOpticsManager.cxx:481
 AOpticsManager.cxx:482
 AOpticsManager.cxx:483
 AOpticsManager.cxx:484
 AOpticsManager.cxx:485
 AOpticsManager.cxx:486
 AOpticsManager.cxx:487
 AOpticsManager.cxx:488
 AOpticsManager.cxx:489
 AOpticsManager.cxx:490
 AOpticsManager.cxx:491
 AOpticsManager.cxx:492
 AOpticsManager.cxx:493
 AOpticsManager.cxx:494
 AOpticsManager.cxx:495
 AOpticsManager.cxx:496
 AOpticsManager.cxx:497
 AOpticsManager.cxx:498
 AOpticsManager.cxx:499
 AOpticsManager.cxx:500
 AOpticsManager.cxx:501
 AOpticsManager.cxx:502
 AOpticsManager.cxx:503
 AOpticsManager.cxx:504
 AOpticsManager.cxx:505
 AOpticsManager.cxx:506
 AOpticsManager.cxx:507
 AOpticsManager.cxx:508
 AOpticsManager.cxx:509
 AOpticsManager.cxx:510
 AOpticsManager.cxx:511
 AOpticsManager.cxx:512
 AOpticsManager.cxx:513
 AOpticsManager.cxx:514
 AOpticsManager.cxx:515
 AOpticsManager.cxx:516
 AOpticsManager.cxx:517
 AOpticsManager.cxx:518
 AOpticsManager.cxx:519
 AOpticsManager.cxx:520
 AOpticsManager.cxx:521
 AOpticsManager.cxx:522
 AOpticsManager.cxx:523
 AOpticsManager.cxx:524
 AOpticsManager.cxx:525
 AOpticsManager.cxx:526
 AOpticsManager.cxx:527
 AOpticsManager.cxx:528
 AOpticsManager.cxx:529
 AOpticsManager.cxx:530
 AOpticsManager.cxx:531
 AOpticsManager.cxx:532
 AOpticsManager.cxx:533
 AOpticsManager.cxx:534
 AOpticsManager.cxx:535
 AOpticsManager.cxx:536
 AOpticsManager.cxx:537
 AOpticsManager.cxx:538
 AOpticsManager.cxx:539
 AOpticsManager.cxx:540
 AOpticsManager.cxx:541
 AOpticsManager.cxx:542
 AOpticsManager.cxx:543
 AOpticsManager.cxx:544
 AOpticsManager.cxx:545
 AOpticsManager.cxx:546
 AOpticsManager.cxx:547
 AOpticsManager.cxx:548
 AOpticsManager.cxx:549
 AOpticsManager.cxx:550
 AOpticsManager.cxx:551
 AOpticsManager.cxx:552
 AOpticsManager.cxx:553
 AOpticsManager.cxx:554
 AOpticsManager.cxx:555
 AOpticsManager.cxx:556
 AOpticsManager.cxx:557
 AOpticsManager.cxx:558
 AOpticsManager.cxx:559
 AOpticsManager.cxx:560
 AOpticsManager.cxx:561
 AOpticsManager.cxx:562
 AOpticsManager.cxx:563
 AOpticsManager.cxx:564
 AOpticsManager.cxx:565
 AOpticsManager.cxx:566
 AOpticsManager.cxx:567
 AOpticsManager.cxx:568
 AOpticsManager.cxx:569
 AOpticsManager.cxx:570
 AOpticsManager.cxx:571