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

///////////////////////////////////////////////////////////////////////////////
//
// ARay
//
// Classical ray class
//
///////////////////////////////////////////////////////////////////////////////

#include "ARay.h"
#include "AOpticsManager.h"
#include "TMath.h"

ClassImp(ARay);

ARay::ARay() {
  // Default constructor
  fLambda = 0;
  fDirection = TVector3(1, 0, 0);
  fStatus = kRun;
}

//_____________________________________________________________________________
ARay::ARay(Int_t id, Double_t lambda, Double_t x, Double_t y, Double_t z,
           Double_t t, Double_t nx, Double_t ny, Double_t nz)
    : TGeoTrack(id, 22 /*photon*/, 0, 0) {
  // Constructor
  AddPoint(x, y, z, t);
  fLambda = lambda;
  SetDirection(nx, ny, nz);
  fStatus = kRun;
}

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

//_____________________________________________________________________________
TGeoNode* ARay::FindNodeStartWith(const char* name) const {
  for (Int_t i = 0; i < fNodeHisotry.GetEntries(); i++) {
    TGeoNode* node = (TGeoNode*)fNodeHisotry.At(i);
    if (node and strncmp(node->GetName(), name, strlen(name)) == 0) {
      return node;
    }
  }

  return 0;
}

//_____________________________________________________________________________
Int_t ARay::FindNodeNumberStartWith(const char* name) const {
  for (Int_t i = 0; i < fNodeHisotry.GetEntries(); i++) {
    TGeoNode* node = (TGeoNode*)fNodeHisotry.At(i);
    if (node and strncmp(node->GetName(), name, strlen(name)) == 0) {
      return i;
    }
  }

  return -1;
}

//_____________________________________________________________________________
void ARay::GetDirection(Double_t* v) const { fDirection.GetXYZ(v); }

//_____________________________________________________________________________
void ARay::GetLastPoint(Double_t* x) const {
  GetPoint(GetNpoints() - 1, x[0], x[1], x[2], x[3]);
}

//_____________________________________________________________________________
Bool_t ARay::IsAbsorbed() const {
  if (fStatus == kAbsorb) {
    return kTRUE;
  }

  return kFALSE;
}

//_____________________________________________________________________________
Bool_t ARay::IsExited() const {
  if (fStatus == kExit) {
    return kTRUE;
  }

  return kFALSE;
}

//_____________________________________________________________________________
Bool_t ARay::IsFocused() const {
  if (fStatus == kFocus) {
    return kTRUE;
  }

  return kFALSE;
}

//_____________________________________________________________________________
Bool_t ARay::IsRunning() const {
  if (fStatus == kRun) {
    return kTRUE;
  }

  return kFALSE;
}

//_____________________________________________________________________________
Bool_t ARay::IsStopped() const {
  if (fStatus == kStop) {
    return kTRUE;
  }

  return kFALSE;
}

//_____________________________________________________________________________
Bool_t ARay::IsSuspended() const {
  if (fStatus == kSuspend) {
    return kTRUE;
  }

  return kFALSE;
}

//_____________________________________________________________________________
#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 7, 7)
TColor* ARay::MakeColor() const {
  // The origianl code in FORTRAN was written by Dan Bruton
  // See http://www.physics.sfasu.edu/astro/color/spectra.html
  Double_t wl = fLambda / AOpticsManager::nm();
  Double_t R, G, B;

  if (300. <= wl && wl < 380.) {
    R = (wl - 300.) / (380. - 300.);
    G = 0.;
    B = (wl - 300.) / (380. - 300.);
  } else if (380. <= wl && wl < 440.) {
    R = -(wl - 440.) / (440. - 380.);
    G = 0.;
    B = 1.;
  } else if (440. <= wl && wl < 490.) {
    R = 0.;
    G = (wl - 440.) / (490. - 440.);
    B = 1.;
  } else if (490. <= wl && wl < 510.) {
    R = 0.;
    G = 1.;
    B = -(wl - 510.) / (510. - 490.);
  } else if (510. <= wl && wl < 580.) {
    R = (wl - 510.) / (580. - 510.);
    G = 1.;
    B = 0.;
  } else if (580. <= wl && wl < 645) {
    R = 1.;
    G = -(wl - 645.) / (645. - 580.);
    B = 0.;
  } else if (645 <= wl && wl < 780.) {
    R = 1.;
    G = 0.;
    B = 0.;
  } else if (780. <= wl && wl < 880.) {
    R = -(wl - 880.) / (880. - 781.);
    G = 0.;
    B = 0.;
  } else {
    R = 0.;
    G = 0.;
    B = 0.;
  }

  Double_t sss = 0.;
  if (300. <= wl && wl < 380.) {
    sss = 0.3;
  } else if (380. <= wl && wl < 420.) {
    sss = 0.3 + 0.7 * (wl - 380.) / (420. - 380.);
  } else if (420. <= wl && wl < 700.) {
    sss = 1.;
  } else if (700. <= wl && wl < 781) {
    sss = 0.3 + 0.7 * (780. - wl) / (780. - 700.);
  } else if (781 <= wl && wl < 880.) {
    sss = 0.3;
  }

  const Double_t gamma = 0.8;
  R = R > 0. ? TMath::Power(R * sss, gamma) : 0.;
  G = G > 0. ? TMath::Power(G * sss, gamma) : 0.;
  B = B > 0. ? TMath::Power(B * sss, gamma) : 0.;

  Int_t ci = TColor::GetFreeColorIndex();
  return new TColor(ci, R, G, B);
}
#endif

//_____________________________________________________________________________
TPolyLine3D* ARay::MakePolyLine3D() const {
  TPolyLine3D* pol = new TPolyLine3D;

  for (Int_t i = 0; i < GetNpoints(); i++) {
    Double_t x, y, z, t;
    GetPoint(i, x, y, z, t);
    pol->SetPoint(i, x, y, z);
  }

  return pol;
}

//_____________________________________________________________________________
void ARay::SetDirection(Double_t* d) {
  Double_t mag = TMath::Sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
  if (mag > 0) {
    fDirection.SetXYZ(d[0] / mag, d[1] / mag, d[2] / mag);
  }
}

//_____________________________________________________________________________
void ARay::SetDirection(Double_t dx, Double_t dy, Double_t dz) {
  Double_t mag = TMath::Sqrt(dx * dx + dy * dy + dz * dz);
  if (mag > 0) {
    fDirection.SetXYZ(dx / mag, dy / mag, dz / mag);
  }
}
 ARay.cxx:1
 ARay.cxx:2
 ARay.cxx:3
 ARay.cxx:4
 ARay.cxx:5
 ARay.cxx:6
 ARay.cxx:7
 ARay.cxx:8
 ARay.cxx:9
 ARay.cxx:10
 ARay.cxx:11
 ARay.cxx:12
 ARay.cxx:13
 ARay.cxx:14
 ARay.cxx:15
 ARay.cxx:16
 ARay.cxx:17
 ARay.cxx:18
 ARay.cxx:19
 ARay.cxx:20
 ARay.cxx:21
 ARay.cxx:22
 ARay.cxx:23
 ARay.cxx:24
 ARay.cxx:25
 ARay.cxx:26
 ARay.cxx:27
 ARay.cxx:28
 ARay.cxx:29
 ARay.cxx:30
 ARay.cxx:31
 ARay.cxx:32
 ARay.cxx:33
 ARay.cxx:34
 ARay.cxx:35
 ARay.cxx:36
 ARay.cxx:37
 ARay.cxx:38
 ARay.cxx:39
 ARay.cxx:40
 ARay.cxx:41
 ARay.cxx:42
 ARay.cxx:43
 ARay.cxx:44
 ARay.cxx:45
 ARay.cxx:46
 ARay.cxx:47
 ARay.cxx:48
 ARay.cxx:49
 ARay.cxx:50
 ARay.cxx:51
 ARay.cxx:52
 ARay.cxx:53
 ARay.cxx:54
 ARay.cxx:55
 ARay.cxx:56
 ARay.cxx:57
 ARay.cxx:58
 ARay.cxx:59
 ARay.cxx:60
 ARay.cxx:61
 ARay.cxx:62
 ARay.cxx:63
 ARay.cxx:64
 ARay.cxx:65
 ARay.cxx:66
 ARay.cxx:67
 ARay.cxx:68
 ARay.cxx:69
 ARay.cxx:70
 ARay.cxx:71
 ARay.cxx:72
 ARay.cxx:73
 ARay.cxx:74
 ARay.cxx:75
 ARay.cxx:76
 ARay.cxx:77
 ARay.cxx:78
 ARay.cxx:79
 ARay.cxx:80
 ARay.cxx:81
 ARay.cxx:82
 ARay.cxx:83
 ARay.cxx:84
 ARay.cxx:85
 ARay.cxx:86
 ARay.cxx:87
 ARay.cxx:88
 ARay.cxx:89
 ARay.cxx:90
 ARay.cxx:91
 ARay.cxx:92
 ARay.cxx:93
 ARay.cxx:94
 ARay.cxx:95
 ARay.cxx:96
 ARay.cxx:97
 ARay.cxx:98
 ARay.cxx:99
 ARay.cxx:100
 ARay.cxx:101
 ARay.cxx:102
 ARay.cxx:103
 ARay.cxx:104
 ARay.cxx:105
 ARay.cxx:106
 ARay.cxx:107
 ARay.cxx:108
 ARay.cxx:109
 ARay.cxx:110
 ARay.cxx:111
 ARay.cxx:112
 ARay.cxx:113
 ARay.cxx:114
 ARay.cxx:115
 ARay.cxx:116
 ARay.cxx:117
 ARay.cxx:118
 ARay.cxx:119
 ARay.cxx:120
 ARay.cxx:121
 ARay.cxx:122
 ARay.cxx:123
 ARay.cxx:124
 ARay.cxx:125
 ARay.cxx:126
 ARay.cxx:127
 ARay.cxx:128
 ARay.cxx:129
 ARay.cxx:130
 ARay.cxx:131
 ARay.cxx:132
 ARay.cxx:133
 ARay.cxx:134
 ARay.cxx:135
 ARay.cxx:136
 ARay.cxx:137
 ARay.cxx:138
 ARay.cxx:139
 ARay.cxx:140
 ARay.cxx:141
 ARay.cxx:142
 ARay.cxx:143
 ARay.cxx:144
 ARay.cxx:145
 ARay.cxx:146
 ARay.cxx:147
 ARay.cxx:148
 ARay.cxx:149
 ARay.cxx:150
 ARay.cxx:151
 ARay.cxx:152
 ARay.cxx:153
 ARay.cxx:154
 ARay.cxx:155
 ARay.cxx:156
 ARay.cxx:157
 ARay.cxx:158
 ARay.cxx:159
 ARay.cxx:160
 ARay.cxx:161
 ARay.cxx:162
 ARay.cxx:163
 ARay.cxx:164
 ARay.cxx:165
 ARay.cxx:166
 ARay.cxx:167
 ARay.cxx:168
 ARay.cxx:169
 ARay.cxx:170
 ARay.cxx:171
 ARay.cxx:172
 ARay.cxx:173
 ARay.cxx:174
 ARay.cxx:175
 ARay.cxx:176
 ARay.cxx:177
 ARay.cxx:178
 ARay.cxx:179
 ARay.cxx:180
 ARay.cxx:181
 ARay.cxx:182
 ARay.cxx:183
 ARay.cxx:184
 ARay.cxx:185
 ARay.cxx:186
 ARay.cxx:187
 ARay.cxx:188
 ARay.cxx:189
 ARay.cxx:190
 ARay.cxx:191
 ARay.cxx:192
 ARay.cxx:193
 ARay.cxx:194
 ARay.cxx:195
 ARay.cxx:196
 ARay.cxx:197
 ARay.cxx:198
 ARay.cxx:199
 ARay.cxx:200
 ARay.cxx:201
 ARay.cxx:202
 ARay.cxx:203
 ARay.cxx:204
 ARay.cxx:205
 ARay.cxx:206
 ARay.cxx:207
 ARay.cxx:208
 ARay.cxx:209
 ARay.cxx:210
 ARay.cxx:211
 ARay.cxx:212
 ARay.cxx:213
 ARay.cxx:214
 ARay.cxx:215
 ARay.cxx:216
 ARay.cxx:217
 ARay.cxx:218
 ARay.cxx:219
 ARay.cxx:220
 ARay.cxx:221
 ARay.cxx:222
 ARay.cxx:223