ROOT logo
#include "TDirectory.h"
#include "TSystem.h"
#include "TRandom.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];
  } // if
  fCorsikaInputs.text = 0;
  fCorsikaInputs.next = 0;
}

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

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

  // 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);
    } // if
  } // xl

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

  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

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

  ARayArray* array = new ARayArray;

  Int_t telNo_, arrayNo_;
  Float_t x, y, zem, time, cx, cy, cz, lambda, photons;
  Double_t totalPhotons;
  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;
    } // if

    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);
    } // j
  } // i

  return array;
}

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

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

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

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

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

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

  return kFALSE;
}

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

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

  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;
  } // if

  // 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;
  } // if

  // 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;
  } // if
}

//_____________________________________________________________________________
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);
    } // xl

    fflush(stdout);
  } // if
}

#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
  
  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;
    } // if
  } // if

  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;
    } // if
    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;
      } // if

      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);
        } // if
        SET_FLAG(flag, IO_TYPE_MC_TELOFF);
      } // if
      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
      if(not (HAS_FLAG(flag, IO_TYPE_MC_EVTH) and HAS_FLAG(flag, IO_TYPE_MC_TELOFF))){
        break;
      } // if

      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);
      } // if

      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;
      } // if

      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;
          } // if
        } else {
          if(find_io_block(fIOBuffer, &fBlockHeader) != 0){
            break;
          } // if
          if(read_io_block(fIOBuffer, &fBlockHeader) != 0){
            break;
          } // if
          if(fBlockHeader.type == IO_TYPE_MC_TELARRAY_END){
            telIndividual = false;
            break;
          } // if
          if(fBlockHeader.type != IO_TYPE_MC_PHOTONS){
            telIndividual = false;
            break;
          } // if
        } // if

        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

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

      free(bunches);

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

      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;

    } // switch

    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;
    } // if
  } // while

  return -1;
}

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

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

  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