ROBAST logo
// Author: Akira Okumura <mailto:oxon@mac.com>
/******************************************************************************
 * Copyright (C) 2006-, Akira Okumura                                         *
 * All rights reserved.                                                       *
 *****************************************************************************/

#ifndef A_OPTICS_MANAGER_H
#define A_OPTICS_MANAGER_H

#include "TGeoManager.h"
#include "TMath.h"

#include "AFocalSurface.h"
#include "ALens.h"
#include "AMirror.h"
#include "AObscuration.h"
#include "AOpticalComponent.h"
#include "ARayArray.h"

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

class AOpticsManager : public TGeoManager {
 private:
  Int_t fLimit;                      // Maximum number of crossing calculations
  Bool_t fDisableFresnelReflection;  // disable Fresnel reflection
  TClass* fClassList[5];

  static void* Thread(void* args);

  void DoFresnel(Double_t n1, Double_t n2, Double_t k2, ARay& ray,
                 TGeoNavigator* nav, TGeoNode* currentNode, TGeoNode* nextNode);
  void DoReflection(Double_t n1, ARay& ray, TGeoNavigator* nav,
                    TGeoNode* currentNode, TGeoNode* nextNode,
                    TVector3* normal = 0);
  TVector3 GetFacetNormal(TGeoNavigator* nav, TGeoNode* currentNode,
                          TGeoNode* nextNode);

 public:
  enum {
    kLens = 0,
    kObs = 1,
    kMirror = 2,
    kFocus = 3,
    kOpt = 4,
    kOther = 5,
    kNull = 6
  };

  AOpticsManager();
  AOpticsManager(const char* name, const char* title);
  virtual ~AOpticsManager();

  static Double_t km() { return 1e3 * m(); };
  static Double_t m() { return 1e2 * cm(); };
  static Double_t cm() { return 1; };
  static Double_t mm() { return 1e-3 * m(); };
  static Double_t um() { return 1e-6 * m(); };
  static Double_t nm() { return 1e-9 * m(); };
  static Double_t inch() { return 2.54 * cm(); };
  static Double_t s() { return 1.; };
  static Double_t ms() { return 1e-3 * s(); };
  static Double_t us() { return 1e-6 * s(); };
  static Double_t ns() { return 1e-9 * s(); };
  static Double_t deg() { return TMath::DegToRad(); };
  static Double_t rad() { return 1.; }

  void DisableFresnelReflection(Bool_t disable) {
    fDisableFresnelReflection = disable;
  }
  Bool_t IsFocalSurface(TGeoNode* node) const {
    return node ? node->GetVolume()->IsA() == fClassList[kFocus] : kFALSE;
  };
  Bool_t IsLens(TGeoNode* node) const {
    return node ? node->GetVolume()->IsA() == fClassList[kLens] : kFALSE;
  };
  Bool_t IsMirror(TGeoNode* node) const {
    return node ? node->GetVolume()->IsA() == fClassList[kMirror] : kFALSE;
  };
  Bool_t IsObscuration(TGeoNode* node) const {
    return node ? node->GetVolume()->IsA() == fClassList[kObs] : kFALSE;
  };
  Bool_t IsOpticalComponent(TGeoNode* node) const {
    return node ? node->GetVolume()->IsA() == fClassList[kOpt] : kFALSE;
  };
  void SetLimit(Int_t n);
  void TraceNonSequential(ARay& ray);
  void TraceNonSequential(ARay* ray) {
    if (ray) TraceNonSequential(*ray);
  }
  void TraceNonSequential(ARayArray& array);
  void TraceNonSequential(ARayArray* array) {
    if (array) TraceNonSequential(*array);
  }
  void TraceNonSequential(TObjArray* array);

  ClassDef(AOpticsManager, 1)
};

#endif  // A_OPTICS_MANAGER_H
 AOpticsManager.h:1
 AOpticsManager.h:2
 AOpticsManager.h:3
 AOpticsManager.h:4
 AOpticsManager.h:5
 AOpticsManager.h:6
 AOpticsManager.h:7
 AOpticsManager.h:8
 AOpticsManager.h:9
 AOpticsManager.h:10
 AOpticsManager.h:11
 AOpticsManager.h:12
 AOpticsManager.h:13
 AOpticsManager.h:14
 AOpticsManager.h:15
 AOpticsManager.h:16
 AOpticsManager.h:17
 AOpticsManager.h:18
 AOpticsManager.h:19
 AOpticsManager.h:20
 AOpticsManager.h:21
 AOpticsManager.h:22
 AOpticsManager.h:23
 AOpticsManager.h:24
 AOpticsManager.h:25
 AOpticsManager.h:26
 AOpticsManager.h:27
 AOpticsManager.h:28
 AOpticsManager.h:29
 AOpticsManager.h:30
 AOpticsManager.h:31
 AOpticsManager.h:32
 AOpticsManager.h:33
 AOpticsManager.h:34
 AOpticsManager.h:35
 AOpticsManager.h:36
 AOpticsManager.h:37
 AOpticsManager.h:38
 AOpticsManager.h:39
 AOpticsManager.h:40
 AOpticsManager.h:41
 AOpticsManager.h:42
 AOpticsManager.h:43
 AOpticsManager.h:44
 AOpticsManager.h:45
 AOpticsManager.h:46
 AOpticsManager.h:47
 AOpticsManager.h:48
 AOpticsManager.h:49
 AOpticsManager.h:50
 AOpticsManager.h:51
 AOpticsManager.h:52
 AOpticsManager.h:53
 AOpticsManager.h:54
 AOpticsManager.h:55
 AOpticsManager.h:56
 AOpticsManager.h:57
 AOpticsManager.h:58
 AOpticsManager.h:59
 AOpticsManager.h:60
 AOpticsManager.h:61
 AOpticsManager.h:62
 AOpticsManager.h:63
 AOpticsManager.h:64
 AOpticsManager.h:65
 AOpticsManager.h:66
 AOpticsManager.h:67
 AOpticsManager.h:68
 AOpticsManager.h:69
 AOpticsManager.h:70
 AOpticsManager.h:71
 AOpticsManager.h:72
 AOpticsManager.h:73
 AOpticsManager.h:74
 AOpticsManager.h:75
 AOpticsManager.h:76
 AOpticsManager.h:77
 AOpticsManager.h:78
 AOpticsManager.h:79
 AOpticsManager.h:80
 AOpticsManager.h:81
 AOpticsManager.h:82
 AOpticsManager.h:83
 AOpticsManager.h:84
 AOpticsManager.h:85
 AOpticsManager.h:86
 AOpticsManager.h:87
 AOpticsManager.h:88
 AOpticsManager.h:89
 AOpticsManager.h:90
 AOpticsManager.h:91
 AOpticsManager.h:92
 AOpticsManager.h:93
 AOpticsManager.h:94
 AOpticsManager.h:95
 AOpticsManager.h:96
 AOpticsManager.h:97
 AOpticsManager.h:98
 AOpticsManager.h:99
 AOpticsManager.h:100
 AOpticsManager.h:101
 AOpticsManager.h:102
 AOpticsManager.h:103
 AOpticsManager.h:104
 AOpticsManager.h:105