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

#include "TRandom.h"

#include "ARayShooter.h"

ClassImp(ARayShooter);

//_____________________________________________________________________________
/*
Begin_Html
<p>ARayShooter creates an array of photons to be traced.</p>

<p>Three static member functions create aligned initial photons as below.
By default, the start coordinates is at (x, y, z) = (0, 0, 0) and emitted
direction is in parallel to z axis. Users can change these values using
TGeoRotation and TGeoTranslation.
</p>
End_Html
Begin_Macro(source)
{
  Double_t nm = AOpticsManager::nm();
  Double_t  m = AOpticsManager::m();

  ARayArray* rays = ARayShooter::Circle(400*nm, 100*m, 20, 6, 0, 0);
  TGraph* circle = new TGraph;
  circle->SetTitle("Circle(400*nm, 100*m, 20, 6, 0, 0);X (m);Y (m)");
  TObjArray* running = rays->GetRunning();

  for(Int_t i = 0; i <= running->GetLast(); i++){
    ARay* ray = (ARay*)(*running)[i];
    if(!ray) continue;
    Double_t p[4];
    ray->GetLastPoint(p);
    circle->SetPoint(i, p[0], p[1]);
  }

  rays = ARayShooter::Rectangle(400*nm, 100*m, 80*m, 20, 10, 0, 0);
  TGraph* rectangle = new TGraph;
  rectangle->SetTitle("Rectangle(400*nm, 100*m, 80*m, 20, 10, 0, 0);X(m);Y(m)");
  running = rays->GetRunning();

  for(Int_t i = 0; i <= running->GetLast(); i++){
    ARay* ray = (ARay*)(*running)[i];
    if(!ray) continue;
    Double_t p[4];
    ray->GetLastPoint(p);
    rectangle->SetPoint(i, p[0], p[1]);
  }

  rays = ARayShooter::Square(400*nm, 90*m, 30, 0, 0);
  TGraph* square = new TGraph;
  square->SetTitle("Square(400*nm, 90*m, 30, 0, 0);X (m);Y (m)");
  running = rays->GetRunning();

  for(Int_t i = 0; i <= running->GetLast(); i++){
    ARay* ray = (ARay*)(*running)[i];
    if(!ray) continue;
    Double_t p[4];
    ray->GetLastPoint(p);
    square->SetPoint(i, p[0], p[1]);
  }

  AOpticsManager* manager = new AOpticsManager("manager", "manager");
  // Make the world
  TGeoBBox* worldbox = new TGeoBBox("worldbox", 100*m, 100*m, 100*m);
  AOpticalComponent* world = new AOpticalComponent("world", worldbox);
  manager->SetTopVolume(world);

  // Top volume
  TGeoBBox* topbox = new TGeoBBox("topbox", 100*m, 100*m, 100*m);
  AOpticalComponent* top = new AOpticalComponent("top", topbox);

  TGeoBBox* focal_box = new TGeoBBox("focal_box",45*m, 45*m, 1*m);
  AFocalSurface* focal = new AFocalSurface("focal", focal_box);
  top->AddNode(focal, 1, new TGeoTranslation(0, 0, 11*m));
  world->AddNode(top, 1);
  manager->CloseGeometry();

  rays = ARayShooter::RandomCone(400*nm, 45*m, 10*m, 1000, 0);
  TGraph* cone = new TGraph;
  cone->SetTitle("RandomCone(400*nm, 45*m, 10*m, 1000, 0, 0);X (m);Y (m)");
  manager->TraceNonSequential(*rays);
  running = rays->GetFocused();

  for(Int_t i = 0; i <= running->GetLast(); i++){
    ARay* ray = (ARay*)(*running)[i];
    if(!ray) continue;
    Double_t p[4];
    ray->GetLastPoint(p);
    cone->SetPoint(i, p[0], p[1]);
  }

  TCanvas* can = new TCanvas("can", "can", 400, 1600);
  can->Divide(1, 4, 1e-10, 1e-10);
  can->cd(1);
  circle->Draw("ap");
  can->cd(2);
  rectangle->Draw("ap");
  can->cd(3);
  square->Draw("ap");
  can->cd(4);
  cone->Draw("ap");

  return can;
}
End_Macro
*/

//_____________________________________________________________________________
ARayShooter::ARayShooter() {
  // Default constructor
}

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

//_____________________________________________________________________________
ARayArray* ARayShooter::Circle(Double_t lambda, Double_t rmax, Int_t nr,
                               Int_t nphi, TGeoRotation* rot,
                               TGeoTranslation* tr, TVector3* v) {
  // Create initial photons aligned in concentric circles
  ARayArray* array = new ARayArray;

  if (0 > rmax or nr < 1 or nphi < 1) {
    return array;
  }

  Double_t position[3] = {0, 0, 0};
  Double_t new_pos[3];
  Double_t dir[3] = {0, 0, 1};
  if (v) {
    dir[0] = v->X();
    dir[1] = v->Y();
    dir[2] = v->Z();
  }
  Double_t new_dir[3];

  if (rot) {
    rot->LocalToMaster(dir, new_dir);
  } else {
    memcpy(new_dir, dir, 3 * sizeof(Double_t));
  }

  if (tr) {
    tr->LocalToMaster(position, new_pos);
  } else {
    memcpy(new_pos, position, 3 * sizeof(Double_t));
  }

  // a photon at the center
  array->Add(new ARay(0, lambda, new_pos[0], new_pos[1], new_pos[2], 0,
                      new_dir[0], new_dir[1], new_dir[2]));

  for (Int_t i = 0; i < nr; i++) {
    Double_t r = rmax * (i + 1) / nr;
    for (Int_t j = 0; j < nphi * (i + 1); j++) {
      Double_t phi = 2 * TMath::Pi() / nphi / (i + 1) * j;
      Double_t x[3] = {r * TMath::Cos(phi), r * TMath::Sin(phi), 0};

      if (rot) {
        rot->LocalToMaster(x, new_pos);
      } else {
        memcpy(new_pos, x, 3 * sizeof(Double_t));
      }

      if (tr) {
        tr->LocalToMaster(new_pos, x);
      } else {
        memcpy(x, new_pos, 3 * sizeof(Double_t));
      }

      ARay* ray = new ARay(0, lambda, x[0], x[1], x[2], 0, new_dir[0],
                           new_dir[1], new_dir[2]);
      array->Add(ray);
    }
  }

  return array;
}

//_____________________________________________________________________________
ARayArray* ARayShooter::RandomCircle(Double_t lambda, Double_t rmax, Int_t n,
                                     TGeoRotation* rot, TGeoTranslation* tr,
                                     TVector3* v) {
  ARayArray* array = new ARayArray;

  if (0 > rmax) {
    return array;
  }

  Double_t new_pos[3];
  Double_t dir[3] = {0, 0, 1};
  if (v) {
    dir[0] = v->X();
    dir[1] = v->Y();
    dir[2] = v->Z();
  }
  Double_t new_dir[3];

  if (rot) {
    rot->LocalToMaster(dir, new_dir);
  } else {
    memcpy(new_dir, dir, 3 * sizeof(Double_t));
  }

  for (Int_t i = 0; i < n; i++) {
    Double_t randx, randy;
    do {
      randx = gRandom->Uniform(-rmax, rmax);
      randy = gRandom->Uniform(-rmax, rmax);
    } while (TMath::Sqrt(randx * randx + randy * randy) > rmax);

    Double_t x[3] = {randx, randy, 0};

    if (rot) {
      rot->LocalToMaster(x, new_pos);
    } else {
      memcpy(new_pos, x, 3 * sizeof(Double_t));
    }

    if (tr) {
      tr->LocalToMaster(new_pos, x);
    } else {
      memcpy(x, new_pos, 3 * sizeof(Double_t));
    }

    ARay* ray = new ARay(0, lambda, x[0], x[1], x[2], 0, new_dir[0], new_dir[1],
                         new_dir[2]);
    array->Add(ray);
  }

  return array;
}

//_____________________________________________________________________________
ARayArray* ARayShooter::RandomCone(Double_t lambda, Double_t r, Double_t d,
                                   Int_t n, TGeoRotation* rot,
                                   TGeoTranslation* tr) {
  // Create initial photons aligned in a cone. Direction is random
  // Start position is at the origin.
  // Arrival position is inside the circle of radius r at z = d
  ARayArray* array = new ARayArray;

  for (Int_t i = 0; i < n; i++) {
    // random (x, y) inside a circle
    Double_t x = gRandom->Uniform(-r, r);
    Double_t y = gRandom->Uniform(-r, r);
    if (x * x + y * y > r * r) {
      i--;
      continue;
    }

    Double_t goal_pos[3] = {x, y, d};
    Double_t tmp_pos[3];
    if (rot) {
      rot->LocalToMaster(goal_pos, tmp_pos);
    } else {
      memcpy(tmp_pos, goal_pos, 3 * sizeof(Double_t));
    }

    Double_t start_pos[3] = {0, 0, 0};

    if (tr) {
      tr->LocalToMaster(tmp_pos, goal_pos);
      tr->LocalToMaster(start_pos, tmp_pos);
    } else {
      memcpy(goal_pos, tmp_pos, 3 * sizeof(Double_t));
      memcpy(tmp_pos, start_pos, 3 * sizeof(Double_t));
    }

    TVector3 start(tmp_pos);
    TVector3 goal(goal_pos);
    TVector3 dir = goal - start;

    ARay* ray = new ARay(0, lambda, start.X(), start.Y(), start.Z(), 0, dir.X(),
                         dir.Y(), dir.Z());
    array->Add(ray);
  }

  return array;
}

//_____________________________________________________________________________
ARayArray* ARayShooter::RandomRectangle(Double_t lambda, Double_t dx,
                                        Double_t dy, Int_t n, TGeoRotation* rot,
                                        TGeoTranslation* tr, TVector3* v) {
  // Create initial photons randomly distributed in a rectangle
  ARayArray* array = new ARayArray;

  if (dx < 0 or dy < 0 or n < 1) {
    return array;
  }

  Double_t dir[3] = {0, 0, 1};
  if (v) {
    dir[0] = v->X();
    dir[1] = v->Y();
    dir[2] = v->Z();
  }
  Double_t new_dir[3];

  if (rot) {
    rot->LocalToMaster(dir, new_dir);
  } else {
    memcpy(new_dir, dir, 3 * sizeof(Double_t));
  }

  for (Int_t i = 0; i < n; i++) {
    Double_t new_pos[3];
    Double_t x[3] = {gRandom->Uniform(-dx / 2., dx / 2.),
                     gRandom->Uniform(-dy / 2., dy / 2.), 0};

    if (rot) {
      rot->LocalToMaster(x, new_pos);
    } else {
      memcpy(new_pos, x, 3 * sizeof(Double_t));
    }

    if (tr) {
      tr->LocalToMaster(new_pos, x);
    } else {
      memcpy(x, new_pos, 3 * sizeof(Double_t));
    }

    ARay* ray = new ARay(0, lambda, x[0], x[1], x[2], 0, new_dir[0], new_dir[1],
                         new_dir[2]);
    array->Add(ray);
  }

  return array;
}

//_____________________________________________________________________________
ARayArray* ARayShooter::RandomSphere(Double_t lambda, Int_t n,
                                     TGeoTranslation* tr) {
  ARayArray* array = new ARayArray;
  for (Int_t i = 0; i < n; i++) {
    Double_t dir[3];
    gRandom->Sphere(dir[0], dir[1], dir[2], 1);

    Double_t p[3] = {0, 0, 0};
    Double_t new_pos[3] = {0, 0, 0};
    if (tr) {
      tr->LocalToMaster(p, new_pos);
    }
    ARay* ray = new ARay(0, lambda, new_pos[0], new_pos[1], new_pos[2], 0,
                         dir[0], dir[1], dir[2]);
    array->Add(ray);
  }

  return array;
}

//_____________________________________________________________________________
ARayArray* ARayShooter::RandomSphericalCone(Double_t lambda, Int_t n,
                                            Double_t theta, TGeoRotation* rot,
                                            TGeoTranslation* tr) {
  ARayArray* array = new ARayArray;
  for (Int_t i = 0; i < n; i++) {
    Double_t dir[3];
    Double_t ran = gRandom->Uniform(TMath::Cos(theta * TMath::DegToRad()), 1);
    Double_t theta_ = TMath::ACos(ran);
    Double_t phi = gRandom->Uniform(0, TMath::TwoPi());
    dir[0] = TMath::Sin(theta_) * TMath::Cos(phi);
    dir[1] = TMath::Sin(theta_) * TMath::Sin(phi);
    dir[2] = TMath::Cos(theta_);

    Double_t new_dir[3];
    if (rot) {
      rot->LocalToMaster(dir, new_dir);
    } else {
      memcpy(new_dir, dir, 3 * sizeof(Double_t));
    }

    Double_t p[3] = {0, 0, 0};
    Double_t new_pos[3] = {0, 0, 0};
    if (tr) {
      tr->LocalToMaster(p, new_pos);
    }

    ARay* ray = new ARay(0, lambda, new_pos[0], new_pos[1], new_pos[2], 0,
                         new_dir[0], new_dir[1], new_dir[2]);
    array->Add(ray);
  }

  return array;
}

//_____________________________________________________________________________
ARayArray* ARayShooter::RandomSquare(Double_t lambda, Double_t d, Int_t n,
                                     TGeoRotation* rot, TGeoTranslation* tr,
                                     TVector3* v) {
  return RandomRectangle(lambda, d, d, n, rot, tr, v);
}

//_____________________________________________________________________________
ARayArray* ARayShooter::Rectangle(Double_t lambda, Double_t dx, Double_t dy,
                                  Int_t nx, Int_t ny, TGeoRotation* rot,
                                  TGeoTranslation* tr, TVector3* v) {
  // Create initial photons aligned in rectangles
  ARayArray* array = new ARayArray;

  if (dx < 0 or dy < 0 or nx < 1 or ny < 1) {
    return array;
  }

  Double_t dir[3] = {0, 0, 1};
  if (v) {
    dir[0] = v->X();
    dir[1] = v->Y();
    dir[2] = v->Z();
  }
  Double_t new_dir[3];

  if (rot) {
    rot->LocalToMaster(dir, new_dir);
  } else {
    memcpy(new_dir, dir, 3 * sizeof(Double_t));
  }

  Double_t deltax = nx == 1 ? dx / 2 : dx / (nx - 1);
  Double_t deltay = ny == 1 ? dy / 2 : dy / (ny - 1);

  for (Int_t i = 0; i < nx; i++) {
    for (Int_t j = 0; j < ny; j++) {
      Double_t new_pos[3];
      Double_t x[3] = {i * deltax - dx / 2, j * deltay - dy / 2, 0};

      if (rot) {
        rot->LocalToMaster(x, new_pos);
      } else {
        memcpy(new_pos, x, 3 * sizeof(Double_t));
      }

      if (tr) {
        tr->LocalToMaster(new_pos, x);
      } else {
        memcpy(x, new_pos, 3 * sizeof(Double_t));
      }

      ARay* ray = new ARay(0, lambda, x[0], x[1], x[2], 0, new_dir[0],
                           new_dir[1], new_dir[2]);
      array->Add(ray);
    }
  }

  return array;
}

//_____________________________________________________________________________
ARayArray* ARayShooter::Square(Double_t lambda, Double_t d, Int_t n,
                               TGeoRotation* rot, TGeoTranslation* tr,
                               TVector3* v) {
  // Create initial photons aligned in squares
  return Rectangle(lambda, d, d, n, n, rot, tr, v);
}
 ARayShooter.cxx:1
 ARayShooter.cxx:2
 ARayShooter.cxx:3
 ARayShooter.cxx:4
 ARayShooter.cxx:5
 ARayShooter.cxx:6
 ARayShooter.cxx:7
 ARayShooter.cxx:8
 ARayShooter.cxx:9
 ARayShooter.cxx:10
 ARayShooter.cxx:11
 ARayShooter.cxx:12
 ARayShooter.cxx:13
 ARayShooter.cxx:14
 ARayShooter.cxx:15
 ARayShooter.cxx:16
 ARayShooter.cxx:17
 ARayShooter.cxx:18
 ARayShooter.cxx:19
 ARayShooter.cxx:20
 ARayShooter.cxx:21
 ARayShooter.cxx:22
 ARayShooter.cxx:23
 ARayShooter.cxx:24
 ARayShooter.cxx:25
 ARayShooter.cxx:26
 ARayShooter.cxx:27
 ARayShooter.cxx:28
 ARayShooter.cxx:29
 ARayShooter.cxx:30
 ARayShooter.cxx:31
 ARayShooter.cxx:32
 ARayShooter.cxx:33
 ARayShooter.cxx:34
 ARayShooter.cxx:35
 ARayShooter.cxx:36
 ARayShooter.cxx:37
 ARayShooter.cxx:38
 ARayShooter.cxx:39
 ARayShooter.cxx:40
 ARayShooter.cxx:41
 ARayShooter.cxx:42
 ARayShooter.cxx:43
 ARayShooter.cxx:44
 ARayShooter.cxx:45
 ARayShooter.cxx:46
 ARayShooter.cxx:47
 ARayShooter.cxx:48
 ARayShooter.cxx:49
 ARayShooter.cxx:50
 ARayShooter.cxx:51
 ARayShooter.cxx:52
 ARayShooter.cxx:53
 ARayShooter.cxx:54
 ARayShooter.cxx:55
 ARayShooter.cxx:56
 ARayShooter.cxx:57
 ARayShooter.cxx:58
 ARayShooter.cxx:59
 ARayShooter.cxx:60
 ARayShooter.cxx:61
 ARayShooter.cxx:62
 ARayShooter.cxx:63
 ARayShooter.cxx:64
 ARayShooter.cxx:65
 ARayShooter.cxx:66
 ARayShooter.cxx:67
 ARayShooter.cxx:68
 ARayShooter.cxx:69
 ARayShooter.cxx:70
 ARayShooter.cxx:71
 ARayShooter.cxx:72
 ARayShooter.cxx:73
 ARayShooter.cxx:74
 ARayShooter.cxx:75
 ARayShooter.cxx:76
 ARayShooter.cxx:77
 ARayShooter.cxx:78
 ARayShooter.cxx:79
 ARayShooter.cxx:80
 ARayShooter.cxx:81
 ARayShooter.cxx:82
 ARayShooter.cxx:83
 ARayShooter.cxx:84
 ARayShooter.cxx:85
 ARayShooter.cxx:86
 ARayShooter.cxx:87
 ARayShooter.cxx:88
 ARayShooter.cxx:89
 ARayShooter.cxx:90
 ARayShooter.cxx:91
 ARayShooter.cxx:92
 ARayShooter.cxx:93
 ARayShooter.cxx:94
 ARayShooter.cxx:95
 ARayShooter.cxx:96
 ARayShooter.cxx:97
 ARayShooter.cxx:98
 ARayShooter.cxx:99
 ARayShooter.cxx:100
 ARayShooter.cxx:101
 ARayShooter.cxx:102
 ARayShooter.cxx:103
 ARayShooter.cxx:104
 ARayShooter.cxx:105
 ARayShooter.cxx:106
 ARayShooter.cxx:107
 ARayShooter.cxx:108
 ARayShooter.cxx:109
 ARayShooter.cxx:110
 ARayShooter.cxx:111
 ARayShooter.cxx:112
 ARayShooter.cxx:113
 ARayShooter.cxx:114
 ARayShooter.cxx:115
 ARayShooter.cxx:116
 ARayShooter.cxx:117
 ARayShooter.cxx:118
 ARayShooter.cxx:119
 ARayShooter.cxx:120
 ARayShooter.cxx:121
 ARayShooter.cxx:122
 ARayShooter.cxx:123
 ARayShooter.cxx:124
 ARayShooter.cxx:125
 ARayShooter.cxx:126
 ARayShooter.cxx:127
 ARayShooter.cxx:128
 ARayShooter.cxx:129
 ARayShooter.cxx:130
 ARayShooter.cxx:131
 ARayShooter.cxx:132
 ARayShooter.cxx:133
 ARayShooter.cxx:134
 ARayShooter.cxx:135
 ARayShooter.cxx:136
 ARayShooter.cxx:137
 ARayShooter.cxx:138
 ARayShooter.cxx:139
 ARayShooter.cxx:140
 ARayShooter.cxx:141
 ARayShooter.cxx:142
 ARayShooter.cxx:143
 ARayShooter.cxx:144
 ARayShooter.cxx:145
 ARayShooter.cxx:146
 ARayShooter.cxx:147
 ARayShooter.cxx:148
 ARayShooter.cxx:149
 ARayShooter.cxx:150
 ARayShooter.cxx:151
 ARayShooter.cxx:152
 ARayShooter.cxx:153
 ARayShooter.cxx:154
 ARayShooter.cxx:155
 ARayShooter.cxx:156
 ARayShooter.cxx:157
 ARayShooter.cxx:158
 ARayShooter.cxx:159
 ARayShooter.cxx:160
 ARayShooter.cxx:161
 ARayShooter.cxx:162
 ARayShooter.cxx:163
 ARayShooter.cxx:164
 ARayShooter.cxx:165
 ARayShooter.cxx:166
 ARayShooter.cxx:167
 ARayShooter.cxx:168
 ARayShooter.cxx:169
 ARayShooter.cxx:170
 ARayShooter.cxx:171
 ARayShooter.cxx:172
 ARayShooter.cxx:173
 ARayShooter.cxx:174
 ARayShooter.cxx:175
 ARayShooter.cxx:176
 ARayShooter.cxx:177
 ARayShooter.cxx:178
 ARayShooter.cxx:179
 ARayShooter.cxx:180
 ARayShooter.cxx:181
 ARayShooter.cxx:182
 ARayShooter.cxx:183
 ARayShooter.cxx:184
 ARayShooter.cxx:185
 ARayShooter.cxx:186
 ARayShooter.cxx:187
 ARayShooter.cxx:188
 ARayShooter.cxx:189
 ARayShooter.cxx:190
 ARayShooter.cxx:191
 ARayShooter.cxx:192
 ARayShooter.cxx:193
 ARayShooter.cxx:194
 ARayShooter.cxx:195
 ARayShooter.cxx:196
 ARayShooter.cxx:197
 ARayShooter.cxx:198
 ARayShooter.cxx:199
 ARayShooter.cxx:200
 ARayShooter.cxx:201
 ARayShooter.cxx:202
 ARayShooter.cxx:203
 ARayShooter.cxx:204
 ARayShooter.cxx:205
 ARayShooter.cxx:206
 ARayShooter.cxx:207
 ARayShooter.cxx:208
 ARayShooter.cxx:209
 ARayShooter.cxx:210
 ARayShooter.cxx:211
 ARayShooter.cxx:212
 ARayShooter.cxx:213
 ARayShooter.cxx:214
 ARayShooter.cxx:215
 ARayShooter.cxx:216
 ARayShooter.cxx:217
 ARayShooter.cxx:218
 ARayShooter.cxx:219
 ARayShooter.cxx:220
 ARayShooter.cxx:221
 ARayShooter.cxx:222
 ARayShooter.cxx:223
 ARayShooter.cxx:224
 ARayShooter.cxx:225
 ARayShooter.cxx:226
 ARayShooter.cxx:227
 ARayShooter.cxx:228
 ARayShooter.cxx:229
 ARayShooter.cxx:230
 ARayShooter.cxx:231
 ARayShooter.cxx:232
 ARayShooter.cxx:233
 ARayShooter.cxx:234
 ARayShooter.cxx:235
 ARayShooter.cxx:236
 ARayShooter.cxx:237
 ARayShooter.cxx:238
 ARayShooter.cxx:239
 ARayShooter.cxx:240
 ARayShooter.cxx:241
 ARayShooter.cxx:242
 ARayShooter.cxx:243
 ARayShooter.cxx:244
 ARayShooter.cxx:245
 ARayShooter.cxx:246
 ARayShooter.cxx:247
 ARayShooter.cxx:248
 ARayShooter.cxx:249
 ARayShooter.cxx:250
 ARayShooter.cxx:251
 ARayShooter.cxx:252
 ARayShooter.cxx:253
 ARayShooter.cxx:254
 ARayShooter.cxx:255
 ARayShooter.cxx:256
 ARayShooter.cxx:257
 ARayShooter.cxx:258
 ARayShooter.cxx:259
 ARayShooter.cxx:260
 ARayShooter.cxx:261
 ARayShooter.cxx:262
 ARayShooter.cxx:263
 ARayShooter.cxx:264
 ARayShooter.cxx:265
 ARayShooter.cxx:266
 ARayShooter.cxx:267
 ARayShooter.cxx:268
 ARayShooter.cxx:269
 ARayShooter.cxx:270
 ARayShooter.cxx:271
 ARayShooter.cxx:272
 ARayShooter.cxx:273
 ARayShooter.cxx:274
 ARayShooter.cxx:275
 ARayShooter.cxx:276
 ARayShooter.cxx:277
 ARayShooter.cxx:278
 ARayShooter.cxx:279
 ARayShooter.cxx:280
 ARayShooter.cxx:281
 ARayShooter.cxx:282
 ARayShooter.cxx:283
 ARayShooter.cxx:284
 ARayShooter.cxx:285
 ARayShooter.cxx:286
 ARayShooter.cxx:287
 ARayShooter.cxx:288
 ARayShooter.cxx:289
 ARayShooter.cxx:290
 ARayShooter.cxx:291
 ARayShooter.cxx:292
 ARayShooter.cxx:293
 ARayShooter.cxx:294
 ARayShooter.cxx:295
 ARayShooter.cxx:296
 ARayShooter.cxx:297
 ARayShooter.cxx:298
 ARayShooter.cxx:299
 ARayShooter.cxx:300
 ARayShooter.cxx:301
 ARayShooter.cxx:302
 ARayShooter.cxx:303
 ARayShooter.cxx:304
 ARayShooter.cxx:305
 ARayShooter.cxx:306
 ARayShooter.cxx:307
 ARayShooter.cxx:308
 ARayShooter.cxx:309
 ARayShooter.cxx:310
 ARayShooter.cxx:311
 ARayShooter.cxx:312
 ARayShooter.cxx:313
 ARayShooter.cxx:314
 ARayShooter.cxx:315
 ARayShooter.cxx:316
 ARayShooter.cxx:317
 ARayShooter.cxx:318
 ARayShooter.cxx:319
 ARayShooter.cxx:320
 ARayShooter.cxx:321
 ARayShooter.cxx:322
 ARayShooter.cxx:323
 ARayShooter.cxx:324
 ARayShooter.cxx:325
 ARayShooter.cxx:326
 ARayShooter.cxx:327
 ARayShooter.cxx:328
 ARayShooter.cxx:329
 ARayShooter.cxx:330
 ARayShooter.cxx:331
 ARayShooter.cxx:332
 ARayShooter.cxx:333
 ARayShooter.cxx:334
 ARayShooter.cxx:335
 ARayShooter.cxx:336
 ARayShooter.cxx:337
 ARayShooter.cxx:338
 ARayShooter.cxx:339
 ARayShooter.cxx:340
 ARayShooter.cxx:341
 ARayShooter.cxx:342
 ARayShooter.cxx:343
 ARayShooter.cxx:344
 ARayShooter.cxx:345
 ARayShooter.cxx:346
 ARayShooter.cxx:347
 ARayShooter.cxx:348
 ARayShooter.cxx:349
 ARayShooter.cxx:350
 ARayShooter.cxx:351
 ARayShooter.cxx:352
 ARayShooter.cxx:353
 ARayShooter.cxx:354
 ARayShooter.cxx:355
 ARayShooter.cxx:356
 ARayShooter.cxx:357
 ARayShooter.cxx:358
 ARayShooter.cxx:359
 ARayShooter.cxx:360
 ARayShooter.cxx:361
 ARayShooter.cxx:362
 ARayShooter.cxx:363
 ARayShooter.cxx:364
 ARayShooter.cxx:365
 ARayShooter.cxx:366
 ARayShooter.cxx:367
 ARayShooter.cxx:368
 ARayShooter.cxx:369
 ARayShooter.cxx:370
 ARayShooter.cxx:371
 ARayShooter.cxx:372
 ARayShooter.cxx:373
 ARayShooter.cxx:374
 ARayShooter.cxx:375
 ARayShooter.cxx:376
 ARayShooter.cxx:377
 ARayShooter.cxx:378
 ARayShooter.cxx:379
 ARayShooter.cxx:380
 ARayShooter.cxx:381
 ARayShooter.cxx:382
 ARayShooter.cxx:383
 ARayShooter.cxx:384
 ARayShooter.cxx:385
 ARayShooter.cxx:386
 ARayShooter.cxx:387
 ARayShooter.cxx:388
 ARayShooter.cxx:389
 ARayShooter.cxx:390
 ARayShooter.cxx:391
 ARayShooter.cxx:392
 ARayShooter.cxx:393
 ARayShooter.cxx:394
 ARayShooter.cxx:395
 ARayShooter.cxx:396
 ARayShooter.cxx:397
 ARayShooter.cxx:398
 ARayShooter.cxx:399
 ARayShooter.cxx:400
 ARayShooter.cxx:401
 ARayShooter.cxx:402
 ARayShooter.cxx:403
 ARayShooter.cxx:404
 ARayShooter.cxx:405
 ARayShooter.cxx:406
 ARayShooter.cxx:407
 ARayShooter.cxx:408
 ARayShooter.cxx:409
 ARayShooter.cxx:410
 ARayShooter.cxx:411
 ARayShooter.cxx:412
 ARayShooter.cxx:413
 ARayShooter.cxx:414
 ARayShooter.cxx:415
 ARayShooter.cxx:416
 ARayShooter.cxx:417
 ARayShooter.cxx:418
 ARayShooter.cxx:419
 ARayShooter.cxx:420
 ARayShooter.cxx:421
 ARayShooter.cxx:422
 ARayShooter.cxx:423
 ARayShooter.cxx:424
 ARayShooter.cxx:425
 ARayShooter.cxx:426
 ARayShooter.cxx:427
 ARayShooter.cxx:428
 ARayShooter.cxx:429
 ARayShooter.cxx:430
 ARayShooter.cxx:431
 ARayShooter.cxx:432
 ARayShooter.cxx:433
 ARayShooter.cxx:434
 ARayShooter.cxx:435
 ARayShooter.cxx:436
 ARayShooter.cxx:437
 ARayShooter.cxx:438
 ARayShooter.cxx:439
 ARayShooter.cxx:440
 ARayShooter.cxx:441
 ARayShooter.cxx:442
 ARayShooter.cxx:443
 ARayShooter.cxx:444
 ARayShooter.cxx:445
 ARayShooter.cxx:446
 ARayShooter.cxx:447
 ARayShooter.cxx:448
 ARayShooter.cxx:449
 ARayShooter.cxx:450
 ARayShooter.cxx:451
 ARayShooter.cxx:452
 ARayShooter.cxx:453
 ARayShooter.cxx:454
 ARayShooter.cxx:455
 ARayShooter.cxx:456
 ARayShooter.cxx:457
 ARayShooter.cxx:458
 ARayShooter.cxx:459
 ARayShooter.cxx:460