ROOT logo
// $Id: AOpticsManager.h 3 2010-11-26 17:17:31Z oxon $
// Author: Akira Okumura 2007/09/24

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

#ifndef A_OPTICS_MANAGER_H
#define A_OPTICS_MANAGER_H

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

#ifndef ROOT_TGeoManager
#include "TGeoManager.h"
#endif
#ifndef ROOT_TMath
#include "TMath.h"
#endif

#ifndef A_RAY_ARRAY_H
#include "ARayArray.h"
#endif
#ifndef A_FOCAL_SURFACE_H
#include "AFocalSurface.h"
#endif
#ifndef A_LENS_H
#include "ALens.h"
#endif
#ifndef A_MIRROR_H
#include "AMirror.h"
#endif
#ifndef A_OPTICAL_COMPONENT_H
#include "AOpticalComponent.h"
#endif
#ifndef A_OBSCURATION_H
#include "AObscuration.h"
#endif

class AOpticsManager : public TGeoManager {
 private:
  Int_t fLimit; // Maximum number of crossing calculations
  Bool_t fDisableFresnelReflection; // disable Fresnel reflection

  static void* Thread(void* args);

  void     DoFresnel(Double_t n1, Double_t n2, ARay& ray);
  void     DoReflection(Double_t n1, ARay& ray);
  TVector3 GetFacetNormal();

 public:
  enum {kLens, kObs, kMirror, kFocus, kOpt, kOther, kNull};

  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();};

  void   DisableFresnelReflection(Bool_t disable) {fDisableFresnelReflection = disable;}
  Bool_t IsFocalSurface(TGeoNode* node) const { return node->GetVolume()->IsA() == AFocalSurface::Class();};
  Bool_t IsLens(TGeoNode* node) const { return node->GetVolume()->IsA() == ALens::Class();};
  Bool_t IsMirror(TGeoNode* node) const { return node->GetVolume()->IsA() == AMirror::Class();};
  Bool_t IsObscuration(TGeoNode* node) const { return node->GetVolume()->IsA() == AObscuration::Class();};
  Bool_t IsOpticalComponent(TGeoNode* node) const { return node->GetVolume()->IsA() == AOpticalComponent::Class();};
  void   SetLimit(Int_t n);
  void   TraceNonSequential(ARay& ray);
  void   TraceNonSequential(ARayArray& 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