ROOT logo
// $Id: AOpticsManager.cxx 92 2012-11-30 02:59:57Z oxon $
// Author: Akira Okumura 2007/09/24

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

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

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

#include "ABorderSurfaceCondition.h"
#include "AOpticsManager.h"

static const Double_t kEpsilon = 1e-6; // Fixed in TGeoNavigator.cxx (equiv to 1e-6 cm)

ClassImp(AOpticsManager)

//_____________________________________________________________________________
AOpticsManager::AOpticsManager() : TGeoManager(), fDisableFresnelReflection(kFALSE)
{
  fLimit = 100;
}

//_____________________________________________________________________________
AOpticsManager::AOpticsManager(const char* name, const char* title)
 : TGeoManager(name, title), fDisableFresnelReflection(kFALSE)
{
  fLimit = 100;
}

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

//_____________________________________________________________________________
void AOpticsManager::DoFresnel(Double_t n1, Double_t n2, ARay& ray)
{
  TGeoNavigator* nav = GetCurrentNavigator();
  Double_t step = nav->GetStep();
  TGeoNode* startNode = nav->GetCurrentNode();
  TGeoNode* endNode = nav->GetNextNode();

  // Use the same notation used in Wikipedia
  // http://en.wikipedia.org/wiki/Fresnel_equations
  // theta_i = incident angle
  // theta_t = transmission angle
  // Double_t* n = FindNormal(); // normal vect perpendicular to the surface
  TVector3 n = GetFacetNormal(); // normal vect perpendicular to the surface
  Double_t d1[3];
  ray.GetDirection(d1);
  Double_t cosi = d1[0]*n[0] + d1[1]*n[1] + d1[2]*n[2]; // cos(theta_i)
  Double_t sini = TMath::Sqrt(1 - cosi*cosi);
  Double_t sint = n1*sini/n2; // Snell's law

  if(sint > 1.){ // total internal reflection
    step -= kEpsilon*2.; // stop the step before reaching the boundary
    nav->SetStep(step);
    DoReflection(n1, ray);
    return;
  } // if

  Double_t cost = TMath::Sqrt(1 - sint*sint);

  if(fDisableFresnelReflection == kFALSE){
    Double_t Rs = TMath::Power((n1*cosi - n2*cost)/(n1*cosi + n2*cost), 2); // reflectivity for s-polarized photon
    Double_t Rp = TMath::Power((n1*cost - n2*cosi)/(n1*cost + n2*cosi), 2); // reflectivity for p-polarized photon
    Double_t R = (Rs + Rp)/2.; // We assume that polarization is random

    if(gRandom->Uniform(1) < R){ // reflection at the boundary
      step -= kEpsilon*2.; // stop the step before reaching the boundary
      nav->SetStep(step);
      DoReflection(n1, ray);
      return;
    } // if
  } // if

  Double_t x1[4], x2[4], d2[3];
  ray.GetLastPoint(x1);

  for(Int_t i = 0; i < 3; i++){
    x2[i] = x1[i] + step*d1[i];
    d2[i] = (d1[i] - cosi*n[i])*sint/sini + n[i]*cost;
  } // i
  ray.SetDirection(d2);

  // step (m), c (m/s)
  Double_t speed = TMath::C()*m()/n1;
  x2[3] = x1[3] + step/speed;
  ray.AddPoint(x2[0], x2[1], x2[2], x2[3]);
  ray.AddNode(endNode);
}

//_____________________________________________________________________________
void AOpticsManager::DoReflection(Double_t n1, ARay& ray)
{
  TGeoNavigator* nav = GetCurrentNavigator();
  Double_t step = nav->GetStep();
  TGeoNode* startNode = nav->GetCurrentNode();
  TGeoNode* endNode = nav->GetNextNode();

  //Double_t* n = FindNormal(); // normal vect perpendicular to the surface
  TVector3 n = GetFacetNormal(); // normal vect perpendicular to the surface
  Double_t d1[3];
  ray.GetDirection(d1);
  Double_t cosi = d1[0]*n[0] + d1[1]*n[1] + d1[2]*n[2];

  Bool_t absorbed = kFALSE;

  if(IsMirror(endNode) == kMirror){
    Double_t angle = TMath::ACos(cosi)*TMath::RadToDeg();
    Double_t lambda = ray.GetLambda();
    Double_t ref = ((AMirror*)endNode->GetVolume())->GetReflectivity(lambda, angle);
    if(ref < gRandom->Uniform(1)){
      absorbed = kTRUE;
      ray.Absorb();
    } // if
  } // if

  Double_t x1[4], x2[4], d2[3];
  ray.GetLastPoint(x1);

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

  Double_t speed = TMath::C()*m()/n1;
  x2[3] = x1[3] + step/speed;
  ray.AddPoint(x2[0], x2[1], x2[2], x2[3]);
  ray.AddNode(endNode);
}

//_____________________________________________________________________________
TVector3 AOpticsManager::GetFacetNormal()
{
  TGeoNavigator* nav = GetCurrentNavigator();
  TGeoNode* startNode = nav->GetCurrentNode();
  TGeoNode* endNode = nav->GetNextNode();

  TGeoVolume* volume1 = startNode->GetVolume();
  TGeoVolume* volume2 = endNode ? endNode->GetVolume() : 0;

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

  ABorderSurfaceCondition* condition = ABorderSurfaceCondition::GetSurfaceCondition(volume1, volume2);

  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;
  } // if

  return normal;
}

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

  TObjArray* running = array->GetRunning();
  
  for(Int_t i = 0; i <= running->GetLast(); i++){
    ARay* ray = (ARay*)(running->RemoveAt(i));
    if(!ray) continue;
    manager->TraceNonSequential(*ray);
    TThread::Lock();
    array->Add(ray);
    TThread::UnLock();
  } // i

  return 0;
}

//_____________________________________________________________________________
void AOpticsManager::TraceNonSequential(ARay& ray)
{
  if(not ray.IsRunning()){
    return;
  } // if

  Double_t lambda = ray.GetLambda();

  TGeoNavigator* nav = GetCurrentNavigator();
  if(!nav){
    nav = AddNavigator();
  } // if

  while(ray.IsRunning()){
    Double_t x1[4], d1[3];
    ray.GetLastPoint(x1);
    ray.GetDirection(d1);

    TGeoNode* startNode = nav->InitTrack(x1, d1); // start node
    if(nav->IsOutside()){ // if the current position is outside of top volume
      startNode = 0;
    } // if

    TGeoNode* endNode = nav->FindNextBoundaryAndStep();

    // Check type of start node
    Int_t typeStart = kOther;
    Int_t typeEnd   = kOther;
    if     (                  !startNode)  typeStart = kNull;
    else if(            IsLens(startNode)) typeStart = kLens;
    else if(     IsObscuration(startNode)) typeStart = kObs;
    else if(          IsMirror(startNode)) typeStart = kMirror;
    else if(IsOpticalComponent(startNode)) typeStart = kOpt;
    else if(    IsFocalSurface(startNode)) typeStart = kFocus;

    // Check type of end node
    if     (                  !endNode)  typeEnd = kNull;
    else if(            IsLens(endNode)) typeEnd = kLens;
    else if(     IsObscuration(endNode)) typeEnd = kObs;
    else if(          IsMirror(endNode)) typeEnd = kMirror;
    else if(IsOpticalComponent(endNode)) typeEnd = kOpt;
    else if(    IsFocalSurface(endNode)) typeEnd = kFocus;

    Double_t step = nav->GetStep(); // distance to the next boundary
    if(typeEnd == kMirror){
      step -= kEpsilon; // make sure that the photon do NOT cross the boundary
    } else {
      step += kEpsilon; // make sure that the photon crosses the boundary
    } // if
    nav->SetStep(step);

    if(typeStart == kLens){
      Double_t abs = ((ALens*)startNode->GetVolume())->GetAbsorptionLength(lambda);
      if(abs > 0){
        Double_t abs_step = gRandom->Exp(abs);
        if(abs_step < step){
          Double_t n1 = ((ALens*)startNode->GetVolume())->GetRefractiveIndex(ray.GetLambda());
          Double_t speed = TMath::C()*m()/n1;
          ray.AddPoint(x1[0] + x1[0]*abs_step, x1[1] + x1[1]*abs_step, x1[2] + d1[2]*abs_step, x1[3] + abs_step/speed);
          ray.AddNode(startNode);
          ray.Absorb();
          nav->SetStep(step);
          continue;
        } // if
      } // if
    } // if

    if((typeStart == kNull or typeStart == kOpt or typeStart == kLens or typeStart == kOther)
       and typeEnd == kMirror){
      Double_t n1 = typeStart == kLens ? ((ALens*)startNode->GetVolume())->GetRefractiveIndex(ray.GetLambda()) : 1.;
      DoReflection(n1, ray);
    } else if((typeStart == kNull or typeStart == kOpt or typeStart == kOther)
               and typeEnd == kLens){
      Double_t n1 = 1; // Assume refractive index equals 1 (= vacuum)
      Double_t n2 = ((ALens*)endNode->GetVolume())->GetRefractiveIndex(ray.GetLambda());
      DoFresnel(n1, n2, ray);
    } else if((typeStart == kNull or typeStart == kLens or typeStart == kOpt or typeStart == kOther)
               and (typeEnd == kObs or typeEnd == kFocus)){

      Double_t x2[4];
      for(Int_t i = 0; i < 3; i++){
        x2[i] = x1[i] + step*d1[i];
      } // i
      if (typeStart == kLens){
        Double_t n1 = ((ALens*)startNode->GetVolume())->GetRefractiveIndex(ray.GetLambda());
        Double_t speed = TMath::C()*m()/n1;
        x2[3] = x1[3] + step/speed;
      } else {
        Double_t speed = TMath::C()*m();
        x2[3] = x1[3] + step/speed;
      } // if
      ray.AddPoint(x2[0], x2[1], x2[2], x2[3]);
      ray.AddNode(endNode);
    } else if((typeStart == kNull or typeStart == kOpt or typeStart == kOther)
               and (typeEnd == kOther or typeEnd == kOpt)){

      Double_t x2[4];
      for(Int_t i = 0; i < 3; i++){
        x2[i] = x1[i] + step*d1[i];
      } // i
      Double_t speed = TMath::C()*m();
      x2[3] = x1[3] + step/speed;
      ray.AddPoint(x2[0], x2[1], x2[2], x2[3]);
      ray.AddNode(endNode);
    } else if(typeStart == kLens and typeEnd == kLens){
      Double_t n1 = ((ALens*)startNode->GetVolume())->GetRefractiveIndex(lambda);
      Double_t n2 = ((ALens*)endNode->GetVolume())->GetRefractiveIndex(lambda);
      DoFresnel(n1, n2, ray);
    } else if(typeStart == kLens and
              (typeEnd == kNull or typeEnd == kOpt or typeEnd == kOther)){
      Double_t n1 = ((ALens*)startNode->GetVolume())->GetRefractiveIndex(lambda);
      Double_t n2 = 1; // Assume refractive index equals 1 (= vacuum)
      DoFresnel(n1, n2, ray);
    } // if

    if(typeEnd == kNull){
      Double_t x2[4];
      for(Int_t i = 0; i < 3; i++){
        x2[i] = x1[i] + step*d1[i];
      } // i
      Double_t speed = TMath::C()*m();
      x2[3] = x1[3] + step/speed;
      ray.AddPoint(x2[0], x2[1], x2[2], x2[3]);
      ray.AddNode(endNode);
      ray.Exit();
    } else if(typeStart == kFocus or typeStart == kObs or typeStart == kMirror or typeEnd == kObs){
      ray.Stop();
    } else if(typeEnd == kFocus){
      ray.Focus();
    } // if

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

  } // while
}

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

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

  if(IsMultiThread() and nthreads >= 1){
    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; j < ((n + 1)/nthreads)*(i + 1) and j <= n; j++){
        ARay* ray = (ARay*)running->RemoveAt(j);
        if(!ray) continue;
        dividedArray[i]->Add(ray);
      } // j

      TObject* args[2] = {this, dividedArray[i]};
      threads[i] = new TThread(Form("thread%d", i), AOpticsManager::Thread, (void*)args);
      threads[i]->Run();
    } // i

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

    ClearThreadsMap();

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

    delete [] threads;
    delete [] dividedArray;
  } else { // single thread
    for(Int_t i = 0; i <= n; i++){
      ARay* ray = (ARay*)(*running)[i];
      if(!ray) continue;

      ray = (ARay*)running->RemoveAt(i);
      TraceNonSequential(*ray);
      array.Add(ray);
    } // i
  } // if
}

//_____________________________________________________________________________
void AOpticsManager::SetLimit(Int_t n)
{
  if(n > 0){
    fLimit = n;
  } // if
}
 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