ROBAST logo
#include "TDirectory.h"
#include "TRandom.h"
#include "TSystem.h"

#include "ACorsikaIACTFile.h"
#include "AOpticsManager.h"

ClassImp(ACorsikaIACTFile);

const Int_t ACorsikaIACTFile::kMaxArrays = 100;
const Int_t ACorsikaIACTFile::kMaxTelescopes = 1000;

ACorsikaIACTFile::ACorsikaIACTFile(Int_t bufferLength)
    : fBunches(0), fEventHeader(0), fRunHeader(0) {
  fIOBuffer = allocate_io_buffer(0);
  fIOBuffer->max_length = bufferLength;
  fMaxPhotonBunches = 100000;
  for (Int_t i = 0; i < 4; i++) {
    fTelescopePosition[i] = new Double_t[kMaxTelescopes];
  }
  fCorsikaInputs.text = 0;
  fCorsikaInputs.next = 0;
}

//_____________________________________________________________________________
ACorsikaIACTFile::~ACorsikaIACTFile() {
  Close();
  for (Int_t i = 0; i < 4; i++) {
    delete[] fTelescopePosition[i];
    fTelescopePosition[i] = 0;
  }
  free_io_buffer(fIOBuffer);
}

//_____________________________________________________________________________
void ACorsikaIACTFile::Close() {
  if (not IsOpen()) {
    return;
  }

  // Reset all variables
  fclose(fIOBuffer->input_file);
  fIOBuffer->input_file = 0;

  struct linked_string *xl, *xln;
  for (xl = &fCorsikaInputs; xl != 0; xl = xln) {
    free(xl->text);
    xl->text = 0;
    xln = xl->next;
    xl->next = 0;
    if (xl != &fCorsikaInputs) {
      free(xl);
    }
  }

  fNumberOfTelescopes = 0;
  for (Int_t j = 0; j < 4; j++) {
    for (Int_t i = 0; i < kMaxTelescopes; i++) {
      fTelescopePosition[j][i] = 0;
    }
  }

  SafeDelete(fBunches);
  SafeDelete(fEventHeader);
  SafeDelete(fRunHeader);

  fFileName = "";
}

//_____________________________________________________________________________
ARayArray* ACorsikaIACTFile::GetRayArray(Int_t telNo, Int_t arrayNo, Double_t z,
                                         Double_t refractiveIndex) {
  // z is the starting position of photons relative to the CORSIKA observation
  // level

  if (!fBunches) {
    return 0;
  }

  if (telNo < 0 or telNo >= fNumberOfTelescopes or arrayNo < 0 or
      arrayNo >= kMaxArrays) {
    return 0;
  }

  ARayArray* array = new ARayArray;

  Int_t telNo_, arrayNo_;
  Float_t x, y, zem, time, cx, cy, cz, lambda, photons;
  fBunches->SetBranchAddress("telNo", &telNo_);
  fBunches->SetBranchAddress("arrayNo", &arrayNo_);
  fBunches->SetBranchAddress("x", &x);
  fBunches->SetBranchAddress("y", &y);
  fBunches->SetBranchAddress("zem", &zem);
  fBunches->SetBranchAddress("time", &time);
  fBunches->SetBranchAddress("cx", &cx);
  fBunches->SetBranchAddress("cy", &cy);
  fBunches->SetBranchAddress("cz", &cz);
  fBunches->SetBranchAddress("lambda", &lambda);
  fBunches->SetBranchAddress("photons", &photons);

  Double_t m = AOpticsManager::m();
  Double_t cm = AOpticsManager::cm();
  Double_t nm = AOpticsManager::nm();
  Double_t ns = AOpticsManager::ns();

  for (Int_t i = 0; i < fBunches->GetEntries(); i++) {
    fBunches->GetEntry(i);
    if (telNo != telNo_ or arrayNo != arrayNo_) {
      continue;
    }

    Double_t airmass = -1. / cz;
    Double_t tel_dist = (z - GetTelescopeZ(telNo) * cm) * airmass;
    Double_t speed = TMath::C() * m / refractiveIndex;
    Double_t px = x * cm - tel_dist * cx;
    Double_t py = y * cm - tel_dist * cy;
    Double_t pt = time * ns - tel_dist / speed;

    for (Int_t j = 0; j < photons; j++) {
      // if the wavelength is not determined in CORSIKA (i.e. lambda == 0), we
      // randomize it now
      Double_t random_lambda =
          lambda == 0 ? 1. / (1. / fMinWavelength -
                              gRandom->Uniform() * (1. / fMinWavelength -
                                                    1. / fMaxPhotonBunches))
                      : lambda;
      ARay* ray = new ARay(0, random_lambda * nm, px, py, z, pt, cx, cy, cz);
      array->Add(ray);
    }
  }

  return array;
}

//_____________________________________________________________________________
Double_t ACorsikaIACTFile::GetTelescopeR(Int_t i) const {
  if (0 <= i and i < fNumberOfTelescopes) {
    return fTelescopePosition[3][i];
  } else {
    return atof("NaN");
  }
}

//_____________________________________________________________________________
Double_t ACorsikaIACTFile::GetTelescopeX(Int_t i) const {
  if (0 <= i and i < fNumberOfTelescopes) {
    return fTelescopePosition[0][i];
  } else {
    return atof("NaN");
  }
}

//_____________________________________________________________________________
Double_t ACorsikaIACTFile::GetTelescopeY(Int_t i) const {
  if (0 <= i and i < fNumberOfTelescopes) {
    return fTelescopePosition[1][i];
  } else {
    return atof("NaN");
  }
}

//_____________________________________________________________________________
Double_t ACorsikaIACTFile::GetTelescopeZ(Int_t i) const {
  if (0 <= i and i < fNumberOfTelescopes) {
    return fTelescopePosition[2][i];
  } else {
    return atof("NaN");
  }
}

//_____________________________________________________________________________
Bool_t ACorsikaIACTFile::IsAllocated() {
  if (fIOBuffer) {
    return kTRUE;
  } else {
    return kFALSE;
  }
}

//_____________________________________________________________________________
Bool_t ACorsikaIACTFile::IsOpen() {
  if (IsAllocated()) {
    if (fIOBuffer->input_file) {
      return kTRUE;
    }
  }

  return kFALSE;
}

//_____________________________________________________________________________
void ACorsikaIACTFile::Open(const Char_t* fname) {
  if (IsOpen()) {
    fprintf(stderr, "Already open.\n");
    Close();
  }

  if (IsAllocated()) {
    if ((fIOBuffer->input_file =
             fileopen(gSystem->ExpandPathName(fname), "r")) == 0) {
      fprintf(stderr, "Cannot open the file.\n");
      return;
    }
  }

  fFileName = TString(fname);

  /*********************************
    == IACT data file structure ==
    IO_TYPE_MC_RUNH     \
    IO_TYPE_MC_INPUTCFG  | RUN Header
    IO_TYPE_MC_TELPOS   /
    IO_TYPE_MC_EVTH     \
    IO_TYPE_MC_TELOFF    | Event data (*)
    IO_TYPE_MC_TELARRAY  |
    IO_TYPE_MC_EVTE     /
    ...Repeat(*)
    IO_TYPE_MC_RUNE        Run end
  **********************************/

  // Check if block type is CORSIKA run header
  if (ReadNextBlock() == IO_TYPE_MC_RUNH) {
    Float_t runh[273];
    read_tel_block(fIOBuffer, IO_TYPE_MC_RUNH, runh, 273);
    fRunHeader = new ACorsikaIACTRunHeader(runh);
  } else {
    fprintf(stderr, "The first header is not IO_TYPE_MC_RUNH.\n");
    Close();
    return;
  }

  // Check if block type is CORSIKA input configuration
  if (ReadNextBlock() == IO_TYPE_MC_INPUTCFG) {
    read_input_lines(fIOBuffer, &fCorsikaInputs);
  } else {
    fprintf(stderr, "The second header is not IO_TYPE_MC_INPUTCFG.\n");
    Close();
    return;
  }

  // Check if block type is telescope information
  if (ReadNextBlock() == IO_TYPE_MC_TELPOS) {
    read_tel_pos(fIOBuffer, kMaxTelescopes, &fNumberOfTelescopes,
                 fTelescopePosition[0], fTelescopePosition[1],
                 fTelescopePosition[2], fTelescopePosition[3]);
  } else {
    fprintf(stderr, "The third header is not IO_TYPE_MC_TELPOS.\n");
    Close();
    return;
  }
}

//_____________________________________________________________________________
void ACorsikaIACTFile::PrintInputCard() const {
  if (fCorsikaInputs.text != 0) {
    const struct linked_string* xl;
    printf("CORSIKA was run with the following input lines:\n");

    for (xl = &fCorsikaInputs; xl != 0; xl = xl->next) {
      printf("   %s\n", xl->text);
    }

    fflush(stdout);
  }
}

#define SET_FLAG(flag, key) \
  (flag |= (ULong64_t(0x1) << (key - IO_TYPE_MC_BASE)))
#define HAS_FLAG(flag, key) \
  Bool_t(flag&(ULong64_t(0x1) << (key - IO_TYPE_MC_BASE)))

//_____________________________________________________________________________
Int_t ACorsikaIACTFile::ReadEvent(Int_t num) {
  // Event number in CORSIKA starts from not 0 but 1
  if (!IsOpen()) {
    fprintf(stderr, "File is not open.\n");
    return -1;
  }

  if (fEventHeader) {
    if (fEventHeader->GetEventNumber() == num) {
      // Event is already read. Do nothing.
      return num;
    } else if (fEventHeader->GetEventNumber() > num) {
      // Cannot access previous data block in this version.
      // eventio.c does not have such a function.
      return -1;
    }
  }

  ULong64_t flag = 0x0;  // flag indicating what blocks we have read

  while (1) {
    Int_t numberOfArrays;          // ICERML of CSCAT option
    Double_t timeOffset;           // Time offset from the first interaction
    Double_t xOffset[kMaxArrays];  // X offset of core locations from (0, 0)
    Double_t yOffset[kMaxArrays];  // Y offset of core locations from (0, 0)

    Int_t telNo, arrayNo;
    Float_t x, y, zem, time, cx, cy, cz, lambda, photons;
    Double_t totalPhotons;

    Int_t headerType = ReadNextBlock();
    if (headerType == -1) {
      break;
    }
    switch (headerType) {
      case IO_TYPE_MC_EVTH:
        // fprintf(stderr, "IO_TYPE_MC_EVTH\n");
        flag = 0x0;  // initialize when we read the event header
        Float_t evth[273];
        read_tel_block(fIOBuffer, IO_TYPE_MC_EVTH, evth, 273);
        // Data blocks were OK, but event number != num. So skip.
        if (evth[1] != num) {
          break;
        }

        fMaxWavelength = evth[96];
        fMinWavelength = evth[95];

        SafeDelete(fEventHeader);
        fEventHeader = new ACorsikaIACTEventHeader(evth);
        SET_FLAG(flag, IO_TYPE_MC_EVTH);

        // Reset bunches
        SafeDelete(fBunches);
        fBunches = new TTree("tree", "Photon tree of CORSIKA IACT output.");

        fBunches->Branch("telNo", &telNo, "telNo/I");
        fBunches->Branch("arrayNo", &arrayNo, "arrayNo/I");
        fBunches->Branch("x", &x, "x/F");
        fBunches->Branch("y", &y, "y/F");
        fBunches->Branch("zem", &zem, "zem/F");
        fBunches->Branch("time", &time, "time/F");
        fBunches->Branch("cx", &cx, "cx/F");
        fBunches->Branch("cy", &cy, "cy/F");
        fBunches->Branch("cz", &cz, "cz/F");
        fBunches->Branch("lambda", &lambda, "lambda/F");
        fBunches->Branch("photons", &photons, "photons/F");

        break;

      case IO_TYPE_MC_TELOFF:
        // fprintf(stderr, "IO_TYPE_MC_TELOFF\n");
        if (HAS_FLAG(flag, IO_TYPE_MC_EVTH)) {
          read_tel_offset(fIOBuffer, kMaxArrays, &numberOfArrays, &timeOffset,
                          xOffset, yOffset);
          if (fEventHeader) {
            fEventHeader->SetMultipleUseHeader(numberOfArrays, timeOffset,
                                               xOffset, yOffset);
          }
          SET_FLAG(flag, IO_TYPE_MC_TELOFF);
        }
        break;

      case IO_TYPE_MC_EXTRA_PARAM:
        // fprintf(stderr, "IO_TYPE_MC_EXTRA_PARAM\n");
        // not implemented yet
        break;

      case IO_TYPE_MC_LONGI:
        // fprintf(stderr, "IO_TYPE_MC_LONGI\n");
        // not implemented yet
        break;

      case IO_TYPE_MC_TELARRAY:
      case IO_TYPE_MC_TELARRAY_HEAD: {
        // IO_TYPE_MC_TELARRAY will appear ICERML times in an event
        if (headerType == IO_TYPE_MC_TELARRAY) {
          // fprintf(stderr, "IO_TYPE_MC_TELARRAY\n");
        } else {
          // fprintf(stderr, "IO_TYPE_MC_TELARRAY_HEAD\n");
        }
        if (not(HAS_FLAG(flag, IO_TYPE_MC_EVTH) and
                HAS_FLAG(flag, IO_TYPE_MC_TELOFF))) {
          break;
        }

        Int_t instanceNumberOfArrays;
        IO_ITEM_HEADER itemHeader;

        Bool_t telIndividual;
        if (headerType == IO_TYPE_MC_TELARRAY) {
          telIndividual = false;
          begin_read_tel_array(fIOBuffer, &itemHeader, &instanceNumberOfArrays);
          SET_FLAG(flag, IO_TYPE_MC_TELARRAY);
        } else {
          telIndividual = true;
          read_tel_array_head(fIOBuffer, &itemHeader, &instanceNumberOfArrays);
          SET_FLAG(flag, IO_TYPE_MC_TELARRAY_HEAD);
        }

        struct bunch* bunches =
            (struct bunch*)malloc(fMaxPhotonBunches * sizeof(struct bunch));

        if (bunches == 0) {
          // fprintf(stderr, "Error in allocating memory for photon bunch
          // array.\n");
          return -1;
        }

        for (Int_t i = 0; i < fNumberOfTelescopes; i++) {
          if (not telIndividual) {
            IO_ITEM_HEADER subItemHeader;
            subItemHeader.type = IO_TYPE_MC_PHOTONS;
            if (search_sub_item(fIOBuffer, &itemHeader, &subItemHeader) < 0) {
              break;
            }
          } else {
            if (find_io_block(fIOBuffer, &fBlockHeader) != 0) {
              break;
            }
            if (read_io_block(fIOBuffer, &fBlockHeader) != 0) {
              break;
            }
            if (fBlockHeader.type == IO_TYPE_MC_TELARRAY_END) {
              telIndividual = false;
              break;
            }
            if (fBlockHeader.type != IO_TYPE_MC_PHOTONS) {
              telIndividual = false;
              break;
            }
          }

          Int_t nbunches;
          if (read_tel_photons(fIOBuffer, fMaxPhotonBunches, &arrayNo, &telNo,
                               &totalPhotons, bunches, &nbunches) < 0) {
            // fprintf(stderr,"Error reading %d photon bunches\n",nbunches);
            continue;
          }

          if (arrayNo != instanceNumberOfArrays) {
            // do nothing for now
          }
          if (i >= kMaxTelescopes or telNo < 0) {
            // fprintf(stderr, "Cannot process data for telescope #%d because
            // only %d are configured.\n", i + 1, kMaxTelescopes);
            continue;
          }

          for (Int_t j = 0; j < nbunches; j++) {
            x = bunches[j].x;
            y = bunches[j].y;
            zem = bunches[j].zem;
            time = bunches[j].ctime;
            cx = bunches[j].cx;
            cy = bunches[j].cy;
            cz = -1. * sqrt(1. - cx * cx - cy * cy);
            lambda = bunches[j].lambda;
            photons = bunches[j].photons;
            fBunches->Fill();
          }
        }

        free(bunches);

        if (fBlockHeader.type == IO_TYPE_MC_TELARRAY) {
          end_read_tel_array(fIOBuffer, &itemHeader);
        }

        break;
      }
      case IO_TYPE_MC_EVTE:
        SET_FLAG(flag, IO_TYPE_MC_EVTE);
        // fprintf(stderr, "IO_TYPE_MC_EVTE\n");
        break;

      case IO_TYPE_MC_RUNE:
        SET_FLAG(flag, IO_TYPE_MC_RUNE);
        // fprintf(stderr, "IO_TYPE_MC_RUNE\n");
        break;

      default:
        fprintf(stderr, "Unknown type\n");
        break;
    }

    if (HAS_FLAG(flag, IO_TYPE_MC_EVTH) and
        HAS_FLAG(flag, IO_TYPE_MC_TELOFF) and
        (HAS_FLAG(flag, IO_TYPE_MC_TELARRAY) or
         HAS_FLAG(flag, IO_TYPE_MC_TELARRAY_HEAD)) and
        HAS_FLAG(flag, IO_TYPE_MC_EVTE)) {
      return num;
    }
  }

  return -1;
}

//_____________________________________________________________________________
Int_t ACorsikaIACTFile::ReadNextBlock() {
  if (IsOpen()) {
    if (find_io_block(fIOBuffer, &fBlockHeader) != 0) {
      Close();
      return -1;
    }

    if (read_io_block(fIOBuffer, &fBlockHeader) != 0) {
      Close();
      return -1;
    }
  } else {
    return -1;
  }

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