ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

///////////////////////////////////////////////////////////////////////////
//    AliITSUGeomTGeo is a simple interface class to TGeoManager       //
//    It is used in the simulation and reconstruction in order to        //
//    query the TGeo ITS geometry                                        //
//                                                                       //
//    author - cvetan.cheshkov@cern.ch                                   //
//    15/02/2007                                                         //
//    adapted to ITSupg 18/07/2012 - ruben.shahoyan@cern.ch              //
//                                                                       //
//    ATTENTION: In opposite to ols AliITSgeomTGeo, all indices start    //
//    from 0, not from 1!!!                                              //
//                                                                       //
///////////////////////////////////////////////////////////////////////////

#include <TClass.h>
#include <TString.h>
#include <TGeoManager.h>
#include <TGeoPhysicalNode.h>
#include <TGeoShape.h>
#include <TGeoBBox.h>
#include <TDatime.h>
#include <TMath.h>
#include <TSystem.h>

#include "AliITSUGeomTGeo.h"
#include "AliLog.h"
#include "AliAlignObj.h"
#include "AliITSsegmentation.h"
#include "AliITSUSegmentationPix.h"
using namespace TMath;

ClassImp(AliITSUGeomTGeo)

UInt_t AliITSUGeomTGeo::fgUIDShift = 16;                // bit shift to go from mod.id to modUUID for TGeo
TString AliITSUGeomTGeo::fgITSVolName = "ITSV";
TString AliITSUGeomTGeo::fgITSLrName  = "ITSULayer";
TString AliITSUGeomTGeo::fgITSStaveName = "ITSUStave";
TString AliITSUGeomTGeo::fgITSHalfStaveName = "ITSUHalfStave";
TString AliITSUGeomTGeo::fgITSModuleName = "ITSUModule";
TString AliITSUGeomTGeo::fgITSChipName = "ITSUChip";
TString AliITSUGeomTGeo::fgITSSensName = "ITSUSensor";
TString AliITSUGeomTGeo::fgITSWrapVolName = "ITSUWrapVol";
TString AliITSUGeomTGeo::fgITSChipTypeName[AliITSUGeomTGeo::kNChipTypes] = {"Pix"};
//
TString AliITSUGeomTGeo::fgITSsegmFileName = "itsSegmentations.root";

//______________________________________________________________________
AliITSUGeomTGeo::AliITSUGeomTGeo(Bool_t build, Bool_t loadSegm)
  :fVersion(kITSVNA)
  ,fNLayers(0)
  ,fNChips(0)
  ,fNStaves(0)
  ,fNHalfStaves(0)
  ,fNModules(0)
  ,fNChipsPerModule(0)
  ,fNChipRowsPerModule(0)
  ,fNChipsPerHalfStave(0)
  ,fNChipsPerStave(0)
  ,fNChipsPerLayer(0)
  ,fLrChipType(0)
  ,fLastChipIndex(0)
  ,fMatSens(0)
  ,fMatT2L(0)
  ,fSegm(0)
{
  // default c-tor
  for (int i=AliITSUAux::kMaxLayers;i--;) fLr2Wrapper[i] = -1;
  if (build) BuildITS(loadSegm);
}

//______________________________________________________________________
AliITSUGeomTGeo::AliITSUGeomTGeo(const AliITSUGeomTGeo &src)
  :TObject(src)
  ,fVersion(src.fVersion)
  ,fNLayers(src.fNLayers)
  ,fNChips(src.fNChips)
  ,fNStaves(0)
  ,fNHalfStaves(0)
  ,fNModules(0)
  ,fNChipsPerModule(0)
  ,fNChipRowsPerModule(0)
  ,fNChipsPerHalfStave(0)
  ,fNChipsPerStave(0)
  ,fNChipsPerLayer(0)
  ,fLrChipType(0)
  ,fLastChipIndex(0)
  ,fMatSens(0)
  ,fMatT2L(0)
  ,fSegm(0)
{
  // copy c-tor
  if (fNLayers) {
    fNStaves   = new Int_t[fNLayers];
    fNChipsPerModule = new Int_t[fNLayers];
    fNChipRowsPerModule = new Int_t[fNLayers];
    fLrChipType  = new Int_t[fNLayers];
    fLastChipIndex   = new Int_t[fNLayers];
    fNChipsPerHalfStave = new Int_t[fNLayers];
    fNChipsPerStave = new Int_t[fNLayers];
    fNChipsPerLayer = new Int_t[fNLayers];
    //
    for (int i=fNLayers;i--;) {
      fNStaves[i] = src.fNStaves[i];
      fNHalfStaves[i] = src.fNHalfStaves[i];
      fNModules[i] = src.fNModules[i];
      fNChipsPerModule[i] = src.fNChipsPerModule[i];
      fNChipRowsPerModule[i] = src.fNChipRowsPerModule[i];
      fNChipsPerHalfStave[i] = src.fNChipsPerHalfStave[i];
      fNChipsPerStave[i] = src.fNChipsPerStave[i];
      fNChipsPerLayer[i] = src.fNChipsPerLayer[i];
      fLrChipType[i]  = src.fLrChipType[i];
      fLastChipIndex[i] = src.fLastChipIndex[i];
    }
    if (src.fMatSens) {
      fMatSens = new TObjArray(fNChips);
      fMatSens->SetOwner(kTRUE);
      for (int i=0;i<fNChips;i++) {
	const TGeoHMatrix* mat = (TGeoHMatrix*)src.fMatSens->At(i);
	fMatSens->AddAt(new TGeoHMatrix(*mat),i);
      }
    }
    if (src.fMatT2L) {
      fMatT2L = new TObjArray(fNChips);
      fMatT2L->SetOwner(kTRUE);
      for (int i=0;i<fNChips;i++) {
	const TGeoHMatrix* mat =(TGeoHMatrix*) src.fMatT2L->At(i);
	fMatT2L->AddAt(new TGeoHMatrix(*mat),i);
      }
    }
    if (src.fSegm) {
      int sz = src.fSegm->GetEntriesFast();
      fSegm = new TObjArray(sz);
      fSegm->SetOwner(kTRUE);
      for (int i=0;i<sz;i++) {
	AliITSsegmentation* sg = (AliITSsegmentation*)src.fSegm->UncheckedAt(i);
	if (!sg) continue;
	fSegm->AddAt(sg->Clone(),i);
      }
    }
  }
  for (int i=AliITSUAux::kMaxLayers;i--;) fLr2Wrapper[i] = src.fLr2Wrapper[i];
}

//______________________________________________________________________
AliITSUGeomTGeo::~AliITSUGeomTGeo()
{
  //d-tor
  delete[] fNStaves;
  delete[] fNHalfStaves;
  delete[] fNModules;
  delete[] fLrChipType;
  delete[] fNChipsPerModule;
  delete[] fNChipRowsPerModule;
  delete[] fNChipsPerHalfStave;
  delete[] fNChipsPerStave;
  delete[] fNChipsPerLayer;
  delete[] fLastChipIndex;
  delete fMatT2L;
  delete fMatSens;
  delete fSegm;
}


//______________________________________________________________________
AliITSUGeomTGeo& AliITSUGeomTGeo::operator=(const AliITSUGeomTGeo &src)
{
  // cp op.
  if (this!=&src) {
    delete[] fNStaves;
    delete[] fNHalfStaves;
    delete[] fNModules;
    delete[] fLrChipType;
    delete[] fNChipsPerModule;
    delete[] fNChipRowsPerModule;
    delete[] fNChipsPerHalfStave;
    delete[] fNChipsPerStave;
    delete[] fNChipsPerLayer;
    delete[] fLastChipIndex;
    fNStaves = fNHalfStaves = fNModules = fLrChipType = fNChipsPerModule = fLastChipIndex = 0;
    fVersion = src.fVersion;
    fNLayers = src.fNLayers;
    fNChips = src.fNChips;
    if (src.fMatSens) {
      delete fMatSens; 
      fMatSens = new TObjArray(fNChips);
      fMatSens->SetOwner(kTRUE);
      for (int i=0;i<fNChips;i++) {
	const TGeoHMatrix* mat = (TGeoHMatrix*) src.fMatSens->At(i);
	fMatSens->AddAt(new TGeoHMatrix(*mat),i);
      }
    }
    if (src.fMatT2L) {
      delete fMatT2L; 
      fMatT2L = new TObjArray(fNChips);
      fMatT2L->SetOwner(kTRUE);
      for (int i=0;i<fNChips;i++) {
	const TGeoHMatrix* mat = (TGeoHMatrix*) src.fMatT2L->At(i);
	fMatT2L->AddAt(new TGeoHMatrix(*mat),i);
      }
    }
    if (src.fSegm) {
      int sz = src.fSegm->GetEntriesFast();
      fSegm = new TObjArray(sz);
      fSegm->SetOwner(kTRUE);
      for (int i=0;i<sz;i++) {
	AliITSsegmentation* sg = (AliITSsegmentation*)src.fSegm->UncheckedAt(i);
	if (!sg) continue;
	fSegm->AddAt(sg->Clone(),i);
      }
    }
    //
    if (fNLayers) {
      fNStaves   = new Int_t[fNLayers];
      fNHalfStaves   = new Int_t[fNLayers];
      fNModules     = new Int_t[fNLayers];
      fNChipsPerModule = new Int_t[fNLayers];
      fNChipRowsPerModule = new Int_t[fNLayers];
      fNChipsPerHalfStave = new Int_t[fNLayers];
      fNChipsPerStave = new Int_t[fNLayers];
      fNChipsPerLayer = new Int_t[fNLayers];
      fLrChipType  = new Int_t[fNLayers];
      fLastChipIndex   = new Int_t[fNLayers];
      for (int i=fNLayers;i--;) {
	fNStaves[i] = src.fNStaves[i];
	fNHalfStaves[i] = src.fNHalfStaves[i];
	fNModules[i]   = src.fNModules[i];
	fNChipsPerModule[i] = src.fNChipsPerModule[i];
	fNChipRowsPerModule[i] = src.fNChipRowsPerModule[i];
	fNChipsPerHalfStave[i] = src.fNChipsPerHalfStave[i];
	fNChipsPerStave[i] = src.fNChipsPerStave[i];
	fNChipsPerLayer[i] = src.fNChipsPerLayer[i];
	fLrChipType[i]  = src.fLrChipType[i];
	fLastChipIndex[i] = src.fLastChipIndex[i];
      }
    }    
  }
  return *this;
}

//______________________________________________________________________
Int_t AliITSUGeomTGeo::GetChipIndex(Int_t lay,Int_t sta,Int_t chipInStave) const
{
  // This routine computes the chip index number from the layer,
  // stave, and chip number in stave. 
  // Inputs:
  //    Int_t lay  The layer number. Starting from 0.
  //    Int_t sta  The stave number. Starting from 0
  //    Int_t chipInStave  The chip number in the stave. Starting from 0
  //
  return GetFirstChipIndex(lay) + fNChipsPerStave[lay]*sta + chipInStave;
}

//______________________________________________________________________
Int_t AliITSUGeomTGeo::GetChipIndex(Int_t lay,Int_t sta, Int_t substa, Int_t chipInSStave) const
{
  // This routine computes the chip index number from the layer,
  // stave, substave and chip number in substave. 
  // Inputs:
  //    Int_t lay  The layer number. Starting from 0.
  //    Int_t sta  The stave number. Starting from 0
  //    Int_t substa  The substave number. Starting from 0
  //    Int_t chipInSStave  The chip number in the sub stave. Starting from 0
  //
  int n = GetFirstChipIndex(lay) + fNChipsPerStave[lay]*sta + chipInSStave;
  if (fNHalfStaves[lay] && substa>0) n += fNChipsPerHalfStave[lay]*substa;
  return n;
}

//______________________________________________________________________
Int_t AliITSUGeomTGeo::GetChipIndex(Int_t lay,Int_t sta, Int_t substa, Int_t md, Int_t chipInMod) const
{
  // This routine computes the chip index number from the layer,
  // stave, substave module and chip number in module. 
  // Inputs:
  //    Int_t lay  The layer number. Starting from 0.
  //    Int_t sta  The stave number. Starting from 0
  //    Int_t substa  The substave number. Starting from 0
  //    Int_t module  The module number ...
  //    Int_t chipInSStave  The chip number in the module. Starting from 0
  //
  int n = GetFirstChipIndex(lay) + fNChipsPerStave[lay]*sta + chipInMod;
  if (fNHalfStaves[lay] && substa>0) n += fNChipsPerHalfStave[lay]*substa;
  if (fNModules[lay] && md>0)       n += fNChipsPerModule[lay]*md;
  return n;
}

//______________________________________________________________________
Bool_t AliITSUGeomTGeo::GetLayer(Int_t index,Int_t &lay,Int_t &indexInLr)  const
{
  // This routine computes the layer number a
  // given the chip index. The 
  // Inputs:
  //     Int_t index  The chip index number, starting from zero.
  // Outputs:
  //     Int_t indexInLr The chip index inside a layer, starting from zero.
  //     Int_t lay    The layer number. Starting from 0.
  //
  lay = GetLayer(index);
  indexInLr = index - GetFirstChipIndex(lay);
  return kTRUE;
  //
}

//______________________________________________________________________
Int_t AliITSUGeomTGeo::GetLayer(Int_t index) const
{
  // Get chip layer, from 0
  //
  int lay = 0;
  while(index>fLastChipIndex[lay]) lay++;
  return lay;
}

//______________________________________________________________________
Int_t AliITSUGeomTGeo::GetStave(Int_t index) const
{
  // Get chip stave, from 0
  //
  int lay = 0;
  while(index>fLastChipIndex[lay]) lay++;
  index -= GetFirstChipIndex(lay);
  return index/fNChipsPerStave[lay];
}

//______________________________________________________________________
Int_t AliITSUGeomTGeo::GetHalfStave(Int_t index) const
{
  // Get chip substave id in stave, from 0
  //
  int lay = 0;
  while(index>fLastChipIndex[lay]) lay++;
  if (fNHalfStaves[lay]<0) return -1;
  index -= GetFirstChipIndex(lay);
  index %= fNChipsPerStave[lay];
  return index/fNChipsPerHalfStave[lay];
}

//______________________________________________________________________
Int_t AliITSUGeomTGeo::GetModule(Int_t index) const
{
  // Get chip module id in substave, from 0
  //
  int lay = 0;
  while(index>fLastChipIndex[lay]) lay++;
  if (fNModules[lay]<0) return 0;
  index -= GetFirstChipIndex(lay);
  index %= fNChipsPerStave[lay];
  if (fNHalfStaves[lay]) index %= fNChipsPerHalfStave[lay];
  return index/fNChipsPerModule[lay];
}

//______________________________________________________________________
Int_t AliITSUGeomTGeo::GetChipIdInLayer(Int_t index) const
{
  // Get chip number within layer, from 0
  //
  int lay = 0;
  while(index>fLastChipIndex[lay]) lay++;
  index -= GetFirstChipIndex(lay);
  return index;
}

//______________________________________________________________________
Int_t AliITSUGeomTGeo::GetChipIdInStave(Int_t index) const
{
  // Get chip number within stave, from 0
  //
  int lay = 0;
  while(index>fLastChipIndex[lay]) lay++;
  index -= GetFirstChipIndex(lay);
  return index%fNChipsPerStave[lay];
}

//______________________________________________________________________
Int_t AliITSUGeomTGeo::GetChipIdInHalfStave(Int_t index) const
{
  // Get chip number within stave, from 0
  //
  int lay = 0;
  while(index>fLastChipIndex[lay]) lay++;
  index -= GetFirstChipIndex(lay);
  return index%fNChipsPerHalfStave[lay];
}

//______________________________________________________________________
Int_t AliITSUGeomTGeo::GetChipIdInModule(Int_t index) const
{
  // Get chip number within module, from 0
  //
  int lay = 0;
  while(index>fLastChipIndex[lay]) lay++;
  index -= GetFirstChipIndex(lay);
  return index%fNChipsPerModule[lay];
}

//______________________________________________________________________
Bool_t AliITSUGeomTGeo::GetChipId(Int_t index,Int_t &lay,Int_t &sta,Int_t &hsta, Int_t &mod, Int_t &chip)  const
{
  //
  // This routine computes the layer, stave, substave, module and chip number 
  // given the chip index number. 
  // Inputs:
  //     Int_t index  The chip index number, starting from zero.
  // Outputs:
  //     Int_t lay    The layer number. Starting from 0
  //     Int_t sta    The stave number. Starting from 0
  //     Int_t ssta   The halfstave number. Starting from 0
  //     Int_t mod    The module number. Starting from 0
  //     Int_t chip   The detector number. Starting from 0
  //
  lay  = GetLayer(index);
  index -= GetFirstChipIndex(lay);
  sta  = index/fNChipsPerStave[lay];
  index %= fNChipsPerStave[lay];
  hsta = fNHalfStaves[lay]>0 ? index/fNChipsPerHalfStave[lay] : -1;
  index %= fNChipsPerHalfStave[lay];
  mod  = fNModules[lay]>0 ? index/fNChipsPerModule[lay] : -1;
  chip = index%fNChipsPerModule[lay];
  //
  return kTRUE;
}

//______________________________________________________________________
const char* AliITSUGeomTGeo::GetSymName(Int_t index)  const
{
  // Get the TGeoPNEntry symbolic name
  // for a given chip identified by 'index'
  //
  Int_t lay, index2;
  if (!GetLayer(index,lay,index2)) return NULL;
  // return AliGeomManager::SymName((AliGeomManager::ELayerID)((lay-1)+AliGeomManager::kSPD1),index2);
  // RS: this is not optimal, but we cannod access directly AliGeomManager, since the latter has hardwired layers 
  //  TGeoPNEntry* pne = gGeoManager->GetAlignableEntryByUID( AliGeomManager::LayerToVolUID(lay+1,index2) );
  TGeoPNEntry* pne = gGeoManager->GetAlignableEntryByUID( ChipVolUID(index) );
  if (!pne) {
    AliError(Form("Failed to find alignable entry with index %d: (Lr%d Chip:%d) !",index,lay,index2));
    return NULL;
  }
  return pne->GetName();
}

//______________________________________________________________________
const char* AliITSUGeomTGeo::ComposeSymNameITS()
{
  // sym name of the layer
  return "ITS";
}

//______________________________________________________________________
const char* AliITSUGeomTGeo::ComposeSymNameLayer(Int_t lr)
{
  // sym name of the layer
  return Form("%s/%s%d",ComposeSymNameITS(),GetITSLayerPattern(),lr);
}

//______________________________________________________________________
const char* AliITSUGeomTGeo::ComposeSymNameStave(Int_t lr, Int_t stave)
{
  // sym name of the stave at given layer
  return Form("%s/%s%d",ComposeSymNameLayer(lr),GetITSStavePattern(),stave);
}

//______________________________________________________________________
const char* AliITSUGeomTGeo::ComposeSymNameHalfStave(Int_t lr, Int_t stave, Int_t substave)
{
  // sym name of the stave at given layer
  return substave>=0 ? 
    Form("%s/%s%d",ComposeSymNameStave(lr,stave),GetITSHalfStavePattern(),substave) :
    ComposeSymNameStave(lr,stave);
}

//______________________________________________________________________
const char* AliITSUGeomTGeo::ComposeSymNameModule(Int_t lr, Int_t stave, Int_t substave, Int_t mod)
{
  // sym name of the substave at given layer/stave
  return mod>=0 ? 
    Form("%s/%s%d",ComposeSymNameHalfStave(lr,stave,substave),GetITSModulePattern(),mod) :
    ComposeSymNameHalfStave(lr,stave,substave);    
}

//______________________________________________________________________
const char* AliITSUGeomTGeo::ComposeSymNameChip(Int_t lr, Int_t sta, Int_t substave, Int_t mod, Int_t chip)
{
  // sym name of the chip in the given layer/stave/substave/module
  return Form("%s/%s%d",ComposeSymNameModule(lr,sta,substave,mod),GetITSChipPattern(),chip);
}

//______________________________________________________________________
TGeoHMatrix* AliITSUGeomTGeo::GetMatrix(Int_t index)  const
{
  // Get the transformation matrix for a given chip 'index'
  // by quering the TGeoManager
  static TGeoHMatrix matTmp;
  TGeoPNEntry *pne = GetPNEntry(index);
  if (!pne) return NULL;

  TGeoPhysicalNode *pnode = pne->GetPhysicalNode();
  if (pnode) return pnode->GetMatrix();

  const char* path = pne->GetTitle();
  gGeoManager->PushPath(); // Preserve the modeler state.
  if (!gGeoManager->cd(path)) {
    gGeoManager->PopPath();
    AliError(Form("Volume path %s not valid!",path));
    return NULL;
  }
  matTmp = *gGeoManager->GetCurrentMatrix();
  gGeoManager->PopPath();
  return &matTmp;
}

//______________________________________________________________________
Bool_t AliITSUGeomTGeo::GetTranslation(Int_t index, Double_t t[3])  const
{
  // Get the translation vector for a given chip 'index'
  // by quering the TGeoManager
  TGeoHMatrix *m = GetMatrix(index);
  if (!m) return kFALSE;

  Double_t *trans = m->GetTranslation();
  for (Int_t i = 0; i < 3; i++) t[i] = trans[i];

  return kTRUE;
}

//______________________________________________________________________
Bool_t AliITSUGeomTGeo::GetRotation(Int_t index, Double_t r[9])  const
{
  // Get the rotation matrix for a given chip 'index'
  // by quering the TGeoManager
  TGeoHMatrix *m = GetMatrix(index);
  if (!m) return kFALSE;

  Double_t *rot = m->GetRotationMatrix();
  for (Int_t i = 0; i < 9; i++) r[i] = rot[i];

  return kTRUE;
}

//______________________________________________________________________
Bool_t AliITSUGeomTGeo::GetOrigMatrix(Int_t index, TGeoHMatrix &m) const
{
  // Get the original (ideal geometry) TGeo matrix for
  // a given chip identified by 'index'.
  // The method is slow, so it should be used
  // with great care.
  m.Clear();

  const char *symname = GetSymName(index);
  if (!symname) return kFALSE;

  return AliGeomManager::GetOrigGlobalMatrix(symname,m);
}

//______________________________________________________________________
Bool_t AliITSUGeomTGeo::GetOrigTranslation(Int_t index, Double_t t[3])  const
{
  // Get the original translation vector (ideal geometry)
  // for a given chip 'index' by quering the TGeoManager
  TGeoHMatrix m;
  if (!GetOrigMatrix(index,m)) return kFALSE;

  Double_t *trans = m.GetTranslation();
  for (Int_t i = 0; i < 3; i++) t[i] = trans[i];

  return kTRUE;
}

//______________________________________________________________________
Bool_t AliITSUGeomTGeo::GetOrigRotation(Int_t index, Double_t r[9])  const
{
  // Get the original rotation matrix (ideal geometry)
  // for a given chip 'index' by quering the TGeoManager
  TGeoHMatrix m;
  if (!GetOrigMatrix(index,m)) return kFALSE;

  Double_t *rot = m.GetRotationMatrix();
  for (Int_t i = 0; i < 9; i++) r[i] = rot[i];

  return kTRUE;
}

//______________________________________________________________________
TGeoHMatrix* AliITSUGeomTGeo::ExtractMatrixT2L(Int_t index) const
{
  // Get the matrix which transforms from the tracking to local r.s.
  // The method queries directly the TGeoPNEntry
  TGeoPNEntry *pne = GetPNEntry(index);
  if (!pne) return NULL;

  TGeoHMatrix *m = (TGeoHMatrix*) pne->GetMatrix();
  if (!m) AliError(Form("TGeoPNEntry (%s) contains no matrix !",pne->GetName()));

  return m;
}

//______________________________________________________________________
Bool_t AliITSUGeomTGeo::GetTrackingMatrix(Int_t index, TGeoHMatrix &m)
{
  // Get the matrix which transforms from the tracking r.s. to
  // the global one.
  // Returns kFALSE in case of error.
  m.Clear();

  TGeoHMatrix *m1 = GetMatrix(index);
  if (!m1) return kFALSE;

  const TGeoHMatrix *m2 = GetMatrixT2L(index);
  if (!m2) return kFALSE;

  m = *m1;
  m.Multiply(m2);

  return kTRUE;
}

//______________________________________________________________________
TGeoHMatrix* AliITSUGeomTGeo::ExtractMatrixSens(Int_t index) const
{
  // Get the transformation matrix of the SENSOR (not necessary the same as the chip) 
  // for a given chip 'index' by quering the TGeoManager
  Int_t lay,stav,sstav,mod,chipInMod;
  GetChipId(index,lay,stav,sstav,mod,chipInMod);
  int wrID = fLr2Wrapper[lay];
  TString path = Form("/ALIC_1/%s_2/",AliITSUGeomTGeo::GetITSVolPattern());
  if (wrID>=0) path += Form("%s%d_1/",GetITSWrapVolPattern(),wrID);
  path += Form("%s%d_1/%s%d_%d/",AliITSUGeomTGeo::GetITSLayerPattern(),lay,AliITSUGeomTGeo::GetITSStavePattern(),lay,stav);
  if (fNHalfStaves[lay]>0) path += Form("%s%d_%d/",AliITSUGeomTGeo::GetITSHalfStavePattern(),lay,sstav);
  if (fNModules[lay]>0)   path += Form("%s%d_%d/",AliITSUGeomTGeo::GetITSModulePattern(),lay,mod);
  path += Form("%s%d_%d/%s%d_1",AliITSUGeomTGeo::GetITSChipPattern(),lay,chipInMod,AliITSUGeomTGeo::GetITSSensorPattern(),lay);
  static TGeoHMatrix matTmp;
  gGeoManager->PushPath();
  if (!gGeoManager->cd(path.Data())) {
    gGeoManager->PopPath();
    AliError(Form("Error in cd-ing to %s",path.Data()));
    return 0;
  } // end if !gGeoManager
  matTmp = *gGeoManager->GetCurrentMatrix(); // matrix may change after cd
  //RSS
  //  printf("%d/%d/%d %s\n",lay,stav,detInSta,path.Data());
  //  mat->Print();
  // Retstore the modeler state.
  gGeoManager->PopPath();
  return &matTmp;
}


//______________________________________________________________________
TGeoPNEntry* AliITSUGeomTGeo::GetPNEntry(Int_t index) const
{
  // Get a pointer to the TGeoPNEntry of a chip
  // identified by 'index'
  // Returns NULL in case of invalid index,
  // missing TGeoManager or invalid symbolic name
  //
  if (index >= fNChips) {
    AliError(Form("Invalid ITS chip index: %d (0 -> %d) !",index,fNChips));
    return NULL;
  }
  
  if (!gGeoManager || !gGeoManager->IsClosed()) {
    AliError("Can't get the matrix! gGeoManager doesn't exist or it is still opened!");
    return NULL;
  }
  TGeoPNEntry* pne = gGeoManager->GetAlignableEntryByUID( ChipVolUID(index) );
  //  TGeoPNEntry* pne = gGeoManager->GetAlignableEntry(GetSymName(index));
  if (!pne) AliError(Form("The index %d does not correspond to a physical entry!",index));
  //
  return pne;
}

//______________________________________________________________________
void AliITSUGeomTGeo::BuildITS(Bool_t loadSegm)
{
  // exract upg ITS parameters from TGeo
  if (fVersion!=kITSVNA) {AliWarning("Already built"); return;} // already initialized
  if (!gGeoManager) AliFatal("Geometry is not loaded");
  fNLayers    = ExtractNumberOfLayers();
  if (!fNLayers) return;
  //
  fNStaves         = new Int_t[fNLayers];
  fNHalfStaves     = new Int_t[fNLayers];
  fNModules        = new Int_t[fNLayers];
  fNChipsPerModule = new Int_t[fNLayers];
  fNChipRowsPerModule = new Int_t[fNLayers];
  fNChipsPerHalfStave = new Int_t[fNLayers];
  fNChipsPerStave  = new Int_t[fNLayers];
  fNChipsPerLayer  = new Int_t[fNLayers];
  fLrChipType      = new Int_t[fNLayers];
  fLastChipIndex   = new Int_t[fNLayers];
  fNChips = 0;
  
  for (int i=0;i<fNLayers;i++) {
    fLrChipType[i]      = ExtractLayerChipType(i);
    fNStaves[i]         = ExtractNumberOfStaves(i);
    fNHalfStaves[i]     = ExtractNumberOfHalfStaves(i);
    fNModules[i]        = ExtractNumberOfModules(i);
    fNChipsPerModule[i] = ExtractNChipsPerModule(i,fNChipRowsPerModule[i]);
    fNChipsPerHalfStave[i]= fNChipsPerModule[i]*Max(1,fNModules[i]);
    fNChipsPerStave[i]    = fNChipsPerHalfStave[i]*Max(1,fNHalfStaves[i]);
    fNChipsPerLayer[i]    = fNChipsPerStave[i]*fNStaves[i];
    fNChips              += fNChipsPerLayer[i];
    fLastChipIndex[i]     = fNChips-1;
  }
  //
  FetchMatrices();
  fVersion = kITSVUpg;
  //
  if (loadSegm) {  // fetch segmentations
    fSegm = new TObjArray();
    AliITSUSegmentationPix::LoadSegmentations(fSegm,GetITSsegmentationFileName());
  }
  //
}

//______________________________________________________________________
Int_t AliITSUGeomTGeo::ExtractNumberOfLayers()
{
  // Determines the number of layers in the Upgrade Geometry
  //
  Int_t numberOfLayers = 0;
  //
  TGeoVolume *itsV = gGeoManager->GetVolume(GetITSVolPattern());
  if (!itsV) AliFatal(Form("ITS volume %s is not in the geometry",GetITSVolPattern()));
  SetUIDShift(itsV->GetUniqueID());
  //
  // Loop on all ITSV nodes, count Layer volumes by checking names
  // Build on the fly layer - wrapper correspondence
  TObjArray* nodes = itsV->GetNodes();
  Int_t nNodes = nodes->GetEntriesFast();
  //
  for (Int_t j=0; j<nNodes; j++) {
    int lrID = -1;
    TGeoNode* nd = (TGeoNode*)nodes->At(j);
    const char* name = nd->GetName();
    if (strstr(name,GetITSLayerPattern())) {
      numberOfLayers++;
      if ( (lrID=ExtractVolumeCopy(name,AliITSUGeomTGeo::GetITSLayerPattern()))<0 ) {
	AliFatal(Form("Failed to extract layer ID from the %s",name));
	exit(1);
      }
      //
      fLr2Wrapper[lrID] = -1; // not wrapped
    }
    else if (strstr(name,GetITSWrapVolPattern())) { // this is a wrapper volume, may cointain layers
      int wrID = -1;
      if ( (wrID=ExtractVolumeCopy(name,AliITSUGeomTGeo::GetITSWrapVolPattern()))<0 ) {
	AliFatal(Form("Failed to extract wrapper ID from the %s",name));
	exit(1);
      }
      //
      TObjArray* nodesW = nd->GetNodes();
      int nNodesW = nodesW->GetEntriesFast();
      for (Int_t jw=0; jw<nNodesW; jw++) {
	TGeoNode* ndW = (TGeoNode*)nodesW->At(jw);
	if (strstr(ndW->GetName(),GetITSLayerPattern())) {
	  if ( (lrID=ExtractVolumeCopy(ndW->GetName(),AliITSUGeomTGeo::GetITSLayerPattern()))<0 ) {
	    AliFatal(Form("Failed to extract layer ID from the %s",name));
	    exit(1);
	  }
	  numberOfLayers++;
	  fLr2Wrapper[lrID] = wrID;
	}
      }
    }
  }
  //  
  return numberOfLayers;
}

//______________________________________________________________________
Int_t AliITSUGeomTGeo::ExtractNumberOfStaves(Int_t lay) const
{
  // Determines the number of layers in the Upgrade Geometry
  //
  // Inputs:
  //   lay: layer number, starting from 0
  //
  // MS
  Int_t numberOfStaves = 0;
  char laynam[30];
  snprintf(laynam, 30, "%s%d",GetITSLayerPattern(),lay);
  TGeoVolume* volLr = gGeoManager->GetVolume(laynam);
  if (!volLr) { AliFatal(Form("can't find %s volume",laynam)); return -1; }
  //
  // Loop on all layer nodes, count Stave volumes by checking names
  Int_t nNodes = volLr->GetNodes()->GetEntries();
  for (Int_t j=0; j<nNodes; j++) {
    //    AliInfo(Form("L%d %d of %d %s %s -> %d",lay,j,nNodes,volLr->GetNodes()->At(j)->GetName(),GetITSStavePattern(),numberOfStaves));
    if (strstr(volLr->GetNodes()->At(j)->GetName(),GetITSStavePattern())) numberOfStaves++;
  }
  //
  return numberOfStaves;
  //
}

//______________________________________________________________________
Int_t AliITSUGeomTGeo::ExtractNumberOfHalfStaves(Int_t lay) const
{
  // Determines the number of substaves in the stave of the layer
  //
  // Inputs:
  //   lay: layer number, starting from 0
  //
  // MS
  if (fgITSHalfStaveName.IsNull()) return 0; // for the setup w/o substave defined the stave and the substave is the same thing
  Int_t nSS = 0;
  char stavnam[30];
  snprintf(stavnam, 30, "%s%d", GetITSStavePattern(),lay);
  TGeoVolume* volLd = gGeoManager->GetVolume(stavnam);
  if (!volLd) AliFatal(Form("can't find %s volume",stavnam));
  //
  // Loop on all stave nodes, count Chip volumes by checking names
  Int_t nNodes = volLd->GetNodes()->GetEntries();
  for (Int_t j=0; j<nNodes; j++) if (strstr(volLd->GetNodes()->At(j)->GetName(),GetITSHalfStavePattern())) nSS++;
  //
  return nSS;
  //
}

//______________________________________________________________________
Int_t AliITSUGeomTGeo::ExtractNumberOfModules(Int_t lay) const
{
  // Determines the number of modules in substave in the stave of the layer
  //
  // Inputs:
  //   lay: layer number, starting from 0
  //
  // for the setup w/o modules defined the module and the stave or the substave is the same thing
  if (fgITSModuleName.IsNull()) return 0;
  char stavnam[30];
  TGeoVolume* volLd = 0;
  if (!fgITSHalfStaveName.IsNull()) {
    snprintf(stavnam, 30, "%s%d", GetITSHalfStavePattern(),lay); 
    volLd = gGeoManager->GetVolume(stavnam);
  }
  if (!volLd) { // no substaves, check staves
    snprintf(stavnam, 30, "%s%d", GetITSStavePattern(),lay); 
    volLd = gGeoManager->GetVolume(stavnam);
  }
  if (!volLd) return 0;
  Int_t nMod = 0;
  //
  // Loop on all substave nodes, count module volumes by checking names
  Int_t nNodes = volLd->GetNodes()->GetEntries();
  for (Int_t j=0; j<nNodes; j++) if (strstr(volLd->GetNodes()->At(j)->GetName(),GetITSModulePattern())) nMod++;
  //
  return nMod;
  //
}

//______________________________________________________________________
Int_t AliITSUGeomTGeo::ExtractNChipsPerModule(Int_t lay, int &nrow)  const
{
  // Determines the number of chips per module on the (sub)stave in the Upgrade Geometry
  // Also extract the layout: span of module centers in Z and X
  // Inputs:
  //   lay: layer number from 0
  // MS
  Int_t numberOfChips = 0;
  char stavnam[30];
  TGeoVolume* volLd = 0;
  if (!fgITSModuleName.IsNull()) {
    snprintf(stavnam, 30, "%s%d", GetITSModulePattern(),lay); 
    volLd = gGeoManager->GetVolume(stavnam);
  }
  if (!volLd) { // no modules on this layer, check substaves
    if (!fgITSHalfStaveName.IsNull()) {
      snprintf(stavnam, 30, "%s%d", GetITSHalfStavePattern(),lay); 
      volLd = gGeoManager->GetVolume(stavnam);
    }
  }
  if (!volLd) { // no substaves on this layer, check staves
    snprintf(stavnam, 30, "%s%d", GetITSStavePattern(),lay);
    volLd = gGeoManager->GetVolume(stavnam);
  }
  if (!volLd) AliFatal(Form("can't find volume containing chips on layer %d",lay));
  //
  // Loop on all stave nodes, count Chip volumes by checking names
  Int_t nNodes = volLd->GetNodes()->GetEntries();
  //
  double xmin=1e9,xmax=-1e9, zmin=1e9,zmax=-1e9;
  double lab[3],loc[3]={0,0,0};
  double dx=-1,dz=-1;
  for (Int_t j=0; j<nNodes; j++) {
    //    AliInfo(Form("L%d %d of %d %s %s -> %d",lay,j,nNodes,volLd->GetNodes()->At(j)->GetName(),GetITSChipPattern(),numberOfChips));
    TGeoNodeMatrix* node = (TGeoNodeMatrix*)volLd->GetNodes()->At(j);
    if (!strstr(node->GetName(),GetITSChipPattern())) continue;
    node->LocalToMaster(loc,lab);
    if (lab[0]>xmax) xmax=lab[0];
    if (lab[0]<xmin) xmin=lab[0];    
    if (lab[2]>zmax) zmax=lab[2];
    if (lab[2]<zmin) zmin=lab[2];    
    //
    numberOfChips++;
    //
    if (dx<0) {
      TGeoShape* chShape = node->GetVolume()->GetShape();
      TGeoBBox* bbox = dynamic_cast<TGeoBBox*>(chShape);
      if (!bbox) {
	AliFatal(Form("Chip %s volume is of unprocessed shape %s",node->GetName(),chShape->IsA()->GetName()));
      }
      else {
	dx = 2*bbox->GetDX();
	dz = 2*bbox->GetDZ();
      }
    }
  }
  //
  double spanX = xmax-xmin;
  double spanZ = zmax-zmin;  
  nrow = TMath::Nint(spanX/dx + 1);
  int ncol = TMath::Nint(spanZ/dz + 1);
  if (nrow*ncol != numberOfChips) 
    AliError(Form("Inconsistency between Nchips=%d and Nrow*Ncol=%d*%d->%d\n"
		  "Extracted chip dimensions (x,z): %.4f %.4f, Module Span: %.4f %.4f",
		  numberOfChips,nrow,ncol,nrow*ncol,
		  dx,dz,spanX,spanZ));
  return numberOfChips;
  //
}

//______________________________________________________________________
Int_t AliITSUGeomTGeo::ExtractLayerChipType(Int_t lay)  const
{
  // Determines the layer detector type the Upgrade Geometry
  //
  // Inputs:
  //   lay: layer number from 0
  // Outputs:
  //   none
  // Return:
  //   detector type id for the layer
  // MS
  char stavnam[30];
  snprintf(stavnam, 30, "%s%d", GetITSLayerPattern(),lay);
  TGeoVolume* volLd = gGeoManager->GetVolume(stavnam);
  if (!volLd) {AliFatal(Form("can't find %s volume",stavnam)); return -1;}
  //
  return volLd->GetUniqueID();
  //
}

//______________________________________________________________________
UInt_t AliITSUGeomTGeo::ComposeChipTypeID(UInt_t segmId)
{
  if (segmId>=kMaxSegmPerChipType) AliFatalClass(Form("Id=%d is >= max.allowed %d",segmId,kMaxSegmPerChipType));
  return segmId + kChipTypePix*kMaxSegmPerChipType;
}

//______________________________________________________________________
void AliITSUGeomTGeo::Print(Option_t *) const
{
  // print
  printf("Geometry version %d, NLayers:%d NChips:%d\n",fVersion,fNLayers,fNChips);
  if (fVersion==kITSVNA) return;
  for (int i=0;i<fNLayers;i++) {
    printf("Lr%2d\tNStav:%2d\tNChips:%2d (%dx%-2d)\tNMod:%d\tNSubSt:%d\tNSt:%3d\tChipType:%3d\tChip#:%5d:%-5d\tWrapVol:%d\n",
	   i,fNStaves[i],fNChipsPerModule[i],fNChipRowsPerModule[i],
	   fNChipRowsPerModule[i] ? fNChipsPerModule[i]/fNChipRowsPerModule[i] : 0,
	   fNModules[i],fNHalfStaves[i],fNStaves[i],
	   fLrChipType[i],GetFirstChipIndex(i),GetLastChipIndex(i),fLr2Wrapper[i]);
  }
}

//______________________________________________________________________
void AliITSUGeomTGeo::FetchMatrices()
{
  // store pointer on often used matrices for faster access
  if (!gGeoManager) AliFatal("Geometry is not loaded");
  fMatSens = new TObjArray(fNChips);
  fMatSens->SetOwner(kTRUE);
  for (int i=0;i<fNChips;i++) fMatSens->AddAt(new TGeoHMatrix(*ExtractMatrixSens(i)),i);
  CreateT2LMatrices();
}

//______________________________________________________________________
void AliITSUGeomTGeo::CreateT2LMatrices()
{
  // create tracking to local (Sensor!) matrices
  fMatT2L  = new TObjArray(fNChips);  
  fMatT2L->SetOwner(kTRUE);
  TGeoHMatrix matLtoT;
  double locA[3]={-100,0,0},locB[3]={100,0,0},gloA[3],gloB[3];
  for (int isn=0;isn<fNChips;isn++) {
    const TGeoHMatrix* matSens = GetMatrixSens(isn);
    if (!matSens) {AliFatal(Form("Failed to get matrix for sensor %d",isn)); return;}
    matSens->LocalToMaster(locA,gloA);
    matSens->LocalToMaster(locB,gloB);
    double dx = gloB[0]-gloA[0];
    double dy = gloB[1]-gloA[1];
    double t = (gloB[0]*dx+gloB[1]*dy)/(dx*dx+dy*dy),x=gloB[0]-dx*t,y=gloB[1]-dy*t;
    TGeoHMatrix* t2l = new TGeoHMatrix();
    t2l->RotateZ(ATan2(y,x)*RadToDeg()); // rotate in direction of normal to the sensor plane
    t2l->SetDx(x);
    t2l->SetDy(y);
    t2l->MultiplyLeft(&matSens->Inverse());
    fMatT2L->AddAt(t2l,isn);
    /*
    const double *gtrans = matSens->GetTranslation();
    memcpy(&rotMatrix[0], matSens->GetRotationMatrix(), 9*sizeof(Double_t));
    Double_t al = -ATan2(rotMatrix[1],rotMatrix[0]);
    Double_t rSens = Sqrt(gtrans[0]*gtrans[0] + gtrans[1]*gtrans[1]);
    Double_t tanAl = ATan2(gtrans[1],gtrans[0]) - Pi()/2; //angle of tangent
    Double_t alTr = tanAl - al;
    //
    // The X axis of tracking frame must always look outward
    loc[1] = rSens/2;
    matSens->LocalToMaster(loc,glo);
    double rPos = Sqrt(glo[0]*glo[0] + glo[1]*glo[1]);
    Bool_t rotOutward = rPos>rSens ? kFALSE : kTRUE;
    //
    // Transformation matrix
    matLtoT.Clear();
    matLtoT.SetDx(-rSens*Sin(alTr)); // translation
    matLtoT.SetDy(0.);
    matLtoT.SetDz(gtrans[2]);
    // Rotation matrix
    rotMatrix[0]= 0;  rotMatrix[1]= 1;  rotMatrix[2]= 0; // + rotation
    rotMatrix[3]=-1;  rotMatrix[4]= 0;  rotMatrix[5]= 0;
    rotMatrix[6]= 0;  rotMatrix[7]= 0;  rotMatrix[8]= 1;
    //
    TGeoRotation rot;
    rot.SetMatrix(rotMatrix);
    matLtoT.MultiplyLeft(&rot);
    if (rotOutward) matLtoT.RotateZ(180.);
    // Inverse transformation Matrix
    fMatT2L->AddAt(new TGeoHMatrix(matLtoT.Inverse()),isn);
    */
  }
  //
}

//______________________________________________________________________
Int_t AliITSUGeomTGeo::ExtractVolumeCopy(const char* name, const char* prefix) const
{
  // extract Number following the prefix in the name string
  TString nms = name;
  if (!nms.BeginsWith(prefix)) return -1;
  nms.Remove(0,strlen(prefix));
  if (!isdigit(nms.Data()[0])) return -1;
  return nms.Atoi();
  //
}
 AliITSUGeomTGeo.cxx:1
 AliITSUGeomTGeo.cxx:2
 AliITSUGeomTGeo.cxx:3
 AliITSUGeomTGeo.cxx:4
 AliITSUGeomTGeo.cxx:5
 AliITSUGeomTGeo.cxx:6
 AliITSUGeomTGeo.cxx:7
 AliITSUGeomTGeo.cxx:8
 AliITSUGeomTGeo.cxx:9
 AliITSUGeomTGeo.cxx:10
 AliITSUGeomTGeo.cxx:11
 AliITSUGeomTGeo.cxx:12
 AliITSUGeomTGeo.cxx:13
 AliITSUGeomTGeo.cxx:14
 AliITSUGeomTGeo.cxx:15
 AliITSUGeomTGeo.cxx:16
 AliITSUGeomTGeo.cxx:17
 AliITSUGeomTGeo.cxx:18
 AliITSUGeomTGeo.cxx:19
 AliITSUGeomTGeo.cxx:20
 AliITSUGeomTGeo.cxx:21
 AliITSUGeomTGeo.cxx:22
 AliITSUGeomTGeo.cxx:23
 AliITSUGeomTGeo.cxx:24
 AliITSUGeomTGeo.cxx:25
 AliITSUGeomTGeo.cxx:26
 AliITSUGeomTGeo.cxx:27
 AliITSUGeomTGeo.cxx:28
 AliITSUGeomTGeo.cxx:29
 AliITSUGeomTGeo.cxx:30
 AliITSUGeomTGeo.cxx:31
 AliITSUGeomTGeo.cxx:32
 AliITSUGeomTGeo.cxx:33
 AliITSUGeomTGeo.cxx:34
 AliITSUGeomTGeo.cxx:35
 AliITSUGeomTGeo.cxx:36
 AliITSUGeomTGeo.cxx:37
 AliITSUGeomTGeo.cxx:38
 AliITSUGeomTGeo.cxx:39
 AliITSUGeomTGeo.cxx:40
 AliITSUGeomTGeo.cxx:41
 AliITSUGeomTGeo.cxx:42
 AliITSUGeomTGeo.cxx:43
 AliITSUGeomTGeo.cxx:44
 AliITSUGeomTGeo.cxx:45
 AliITSUGeomTGeo.cxx:46
 AliITSUGeomTGeo.cxx:47
 AliITSUGeomTGeo.cxx:48
 AliITSUGeomTGeo.cxx:49
 AliITSUGeomTGeo.cxx:50
 AliITSUGeomTGeo.cxx:51
 AliITSUGeomTGeo.cxx:52
 AliITSUGeomTGeo.cxx:53
 AliITSUGeomTGeo.cxx:54
 AliITSUGeomTGeo.cxx:55
 AliITSUGeomTGeo.cxx:56
 AliITSUGeomTGeo.cxx:57
 AliITSUGeomTGeo.cxx:58
 AliITSUGeomTGeo.cxx:59
 AliITSUGeomTGeo.cxx:60
 AliITSUGeomTGeo.cxx:61
 AliITSUGeomTGeo.cxx:62
 AliITSUGeomTGeo.cxx:63
 AliITSUGeomTGeo.cxx:64
 AliITSUGeomTGeo.cxx:65
 AliITSUGeomTGeo.cxx:66
 AliITSUGeomTGeo.cxx:67
 AliITSUGeomTGeo.cxx:68
 AliITSUGeomTGeo.cxx:69
 AliITSUGeomTGeo.cxx:70
 AliITSUGeomTGeo.cxx:71
 AliITSUGeomTGeo.cxx:72
 AliITSUGeomTGeo.cxx:73
 AliITSUGeomTGeo.cxx:74
 AliITSUGeomTGeo.cxx:75
 AliITSUGeomTGeo.cxx:76
 AliITSUGeomTGeo.cxx:77
 AliITSUGeomTGeo.cxx:78
 AliITSUGeomTGeo.cxx:79
 AliITSUGeomTGeo.cxx:80
 AliITSUGeomTGeo.cxx:81
 AliITSUGeomTGeo.cxx:82
 AliITSUGeomTGeo.cxx:83
 AliITSUGeomTGeo.cxx:84
 AliITSUGeomTGeo.cxx:85
 AliITSUGeomTGeo.cxx:86
 AliITSUGeomTGeo.cxx:87
 AliITSUGeomTGeo.cxx:88
 AliITSUGeomTGeo.cxx:89
 AliITSUGeomTGeo.cxx:90
 AliITSUGeomTGeo.cxx:91
 AliITSUGeomTGeo.cxx:92
 AliITSUGeomTGeo.cxx:93
 AliITSUGeomTGeo.cxx:94
 AliITSUGeomTGeo.cxx:95
 AliITSUGeomTGeo.cxx:96
 AliITSUGeomTGeo.cxx:97
 AliITSUGeomTGeo.cxx:98
 AliITSUGeomTGeo.cxx:99
 AliITSUGeomTGeo.cxx:100
 AliITSUGeomTGeo.cxx:101
 AliITSUGeomTGeo.cxx:102
 AliITSUGeomTGeo.cxx:103
 AliITSUGeomTGeo.cxx:104
 AliITSUGeomTGeo.cxx:105
 AliITSUGeomTGeo.cxx:106
 AliITSUGeomTGeo.cxx:107
 AliITSUGeomTGeo.cxx:108
 AliITSUGeomTGeo.cxx:109
 AliITSUGeomTGeo.cxx:110
 AliITSUGeomTGeo.cxx:111
 AliITSUGeomTGeo.cxx:112
 AliITSUGeomTGeo.cxx:113
 AliITSUGeomTGeo.cxx:114
 AliITSUGeomTGeo.cxx:115
 AliITSUGeomTGeo.cxx:116
 AliITSUGeomTGeo.cxx:117
 AliITSUGeomTGeo.cxx:118
 AliITSUGeomTGeo.cxx:119
 AliITSUGeomTGeo.cxx:120
 AliITSUGeomTGeo.cxx:121
 AliITSUGeomTGeo.cxx:122
 AliITSUGeomTGeo.cxx:123
 AliITSUGeomTGeo.cxx:124
 AliITSUGeomTGeo.cxx:125
 AliITSUGeomTGeo.cxx:126
 AliITSUGeomTGeo.cxx:127
 AliITSUGeomTGeo.cxx:128
 AliITSUGeomTGeo.cxx:129
 AliITSUGeomTGeo.cxx:130
 AliITSUGeomTGeo.cxx:131
 AliITSUGeomTGeo.cxx:132
 AliITSUGeomTGeo.cxx:133
 AliITSUGeomTGeo.cxx:134
 AliITSUGeomTGeo.cxx:135
 AliITSUGeomTGeo.cxx:136
 AliITSUGeomTGeo.cxx:137
 AliITSUGeomTGeo.cxx:138
 AliITSUGeomTGeo.cxx:139
 AliITSUGeomTGeo.cxx:140
 AliITSUGeomTGeo.cxx:141
 AliITSUGeomTGeo.cxx:142
 AliITSUGeomTGeo.cxx:143
 AliITSUGeomTGeo.cxx:144
 AliITSUGeomTGeo.cxx:145
 AliITSUGeomTGeo.cxx:146
 AliITSUGeomTGeo.cxx:147
 AliITSUGeomTGeo.cxx:148
 AliITSUGeomTGeo.cxx:149
 AliITSUGeomTGeo.cxx:150
 AliITSUGeomTGeo.cxx:151
 AliITSUGeomTGeo.cxx:152
 AliITSUGeomTGeo.cxx:153
 AliITSUGeomTGeo.cxx:154
 AliITSUGeomTGeo.cxx:155
 AliITSUGeomTGeo.cxx:156
 AliITSUGeomTGeo.cxx:157
 AliITSUGeomTGeo.cxx:158
 AliITSUGeomTGeo.cxx:159
 AliITSUGeomTGeo.cxx:160
 AliITSUGeomTGeo.cxx:161
 AliITSUGeomTGeo.cxx:162
 AliITSUGeomTGeo.cxx:163
 AliITSUGeomTGeo.cxx:164
 AliITSUGeomTGeo.cxx:165
 AliITSUGeomTGeo.cxx:166
 AliITSUGeomTGeo.cxx:167
 AliITSUGeomTGeo.cxx:168
 AliITSUGeomTGeo.cxx:169
 AliITSUGeomTGeo.cxx:170
 AliITSUGeomTGeo.cxx:171
 AliITSUGeomTGeo.cxx:172
 AliITSUGeomTGeo.cxx:173
 AliITSUGeomTGeo.cxx:174
 AliITSUGeomTGeo.cxx:175
 AliITSUGeomTGeo.cxx:176
 AliITSUGeomTGeo.cxx:177
 AliITSUGeomTGeo.cxx:178
 AliITSUGeomTGeo.cxx:179
 AliITSUGeomTGeo.cxx:180
 AliITSUGeomTGeo.cxx:181
 AliITSUGeomTGeo.cxx:182
 AliITSUGeomTGeo.cxx:183
 AliITSUGeomTGeo.cxx:184
 AliITSUGeomTGeo.cxx:185
 AliITSUGeomTGeo.cxx:186
 AliITSUGeomTGeo.cxx:187
 AliITSUGeomTGeo.cxx:188
 AliITSUGeomTGeo.cxx:189
 AliITSUGeomTGeo.cxx:190
 AliITSUGeomTGeo.cxx:191
 AliITSUGeomTGeo.cxx:192
 AliITSUGeomTGeo.cxx:193
 AliITSUGeomTGeo.cxx:194
 AliITSUGeomTGeo.cxx:195
 AliITSUGeomTGeo.cxx:196
 AliITSUGeomTGeo.cxx:197
 AliITSUGeomTGeo.cxx:198
 AliITSUGeomTGeo.cxx:199
 AliITSUGeomTGeo.cxx:200
 AliITSUGeomTGeo.cxx:201
 AliITSUGeomTGeo.cxx:202
 AliITSUGeomTGeo.cxx:203
 AliITSUGeomTGeo.cxx:204
 AliITSUGeomTGeo.cxx:205
 AliITSUGeomTGeo.cxx:206
 AliITSUGeomTGeo.cxx:207
 AliITSUGeomTGeo.cxx:208
 AliITSUGeomTGeo.cxx:209
 AliITSUGeomTGeo.cxx:210
 AliITSUGeomTGeo.cxx:211
 AliITSUGeomTGeo.cxx:212
 AliITSUGeomTGeo.cxx:213
 AliITSUGeomTGeo.cxx:214
 AliITSUGeomTGeo.cxx:215
 AliITSUGeomTGeo.cxx:216
 AliITSUGeomTGeo.cxx:217
 AliITSUGeomTGeo.cxx:218
 AliITSUGeomTGeo.cxx:219
 AliITSUGeomTGeo.cxx:220
 AliITSUGeomTGeo.cxx:221
 AliITSUGeomTGeo.cxx:222
 AliITSUGeomTGeo.cxx:223
 AliITSUGeomTGeo.cxx:224
 AliITSUGeomTGeo.cxx:225
 AliITSUGeomTGeo.cxx:226
 AliITSUGeomTGeo.cxx:227
 AliITSUGeomTGeo.cxx:228
 AliITSUGeomTGeo.cxx:229
 AliITSUGeomTGeo.cxx:230
 AliITSUGeomTGeo.cxx:231
 AliITSUGeomTGeo.cxx:232
 AliITSUGeomTGeo.cxx:233
 AliITSUGeomTGeo.cxx:234
 AliITSUGeomTGeo.cxx:235
 AliITSUGeomTGeo.cxx:236
 AliITSUGeomTGeo.cxx:237
 AliITSUGeomTGeo.cxx:238
 AliITSUGeomTGeo.cxx:239
 AliITSUGeomTGeo.cxx:240
 AliITSUGeomTGeo.cxx:241
 AliITSUGeomTGeo.cxx:242
 AliITSUGeomTGeo.cxx:243
 AliITSUGeomTGeo.cxx:244
 AliITSUGeomTGeo.cxx:245
 AliITSUGeomTGeo.cxx:246
 AliITSUGeomTGeo.cxx:247
 AliITSUGeomTGeo.cxx:248
 AliITSUGeomTGeo.cxx:249
 AliITSUGeomTGeo.cxx:250
 AliITSUGeomTGeo.cxx:251
 AliITSUGeomTGeo.cxx:252
 AliITSUGeomTGeo.cxx:253
 AliITSUGeomTGeo.cxx:254
 AliITSUGeomTGeo.cxx:255
 AliITSUGeomTGeo.cxx:256
 AliITSUGeomTGeo.cxx:257
 AliITSUGeomTGeo.cxx:258
 AliITSUGeomTGeo.cxx:259
 AliITSUGeomTGeo.cxx:260
 AliITSUGeomTGeo.cxx:261
 AliITSUGeomTGeo.cxx:262
 AliITSUGeomTGeo.cxx:263
 AliITSUGeomTGeo.cxx:264
 AliITSUGeomTGeo.cxx:265
 AliITSUGeomTGeo.cxx:266
 AliITSUGeomTGeo.cxx:267
 AliITSUGeomTGeo.cxx:268
 AliITSUGeomTGeo.cxx:269
 AliITSUGeomTGeo.cxx:270
 AliITSUGeomTGeo.cxx:271
 AliITSUGeomTGeo.cxx:272
 AliITSUGeomTGeo.cxx:273
 AliITSUGeomTGeo.cxx:274
 AliITSUGeomTGeo.cxx:275
 AliITSUGeomTGeo.cxx:276
 AliITSUGeomTGeo.cxx:277
 AliITSUGeomTGeo.cxx:278
 AliITSUGeomTGeo.cxx:279
 AliITSUGeomTGeo.cxx:280
 AliITSUGeomTGeo.cxx:281
 AliITSUGeomTGeo.cxx:282
 AliITSUGeomTGeo.cxx:283
 AliITSUGeomTGeo.cxx:284
 AliITSUGeomTGeo.cxx:285
 AliITSUGeomTGeo.cxx:286
 AliITSUGeomTGeo.cxx:287
 AliITSUGeomTGeo.cxx:288
 AliITSUGeomTGeo.cxx:289
 AliITSUGeomTGeo.cxx:290
 AliITSUGeomTGeo.cxx:291
 AliITSUGeomTGeo.cxx:292
 AliITSUGeomTGeo.cxx:293
 AliITSUGeomTGeo.cxx:294
 AliITSUGeomTGeo.cxx:295
 AliITSUGeomTGeo.cxx:296
 AliITSUGeomTGeo.cxx:297
 AliITSUGeomTGeo.cxx:298
 AliITSUGeomTGeo.cxx:299
 AliITSUGeomTGeo.cxx:300
 AliITSUGeomTGeo.cxx:301
 AliITSUGeomTGeo.cxx:302
 AliITSUGeomTGeo.cxx:303
 AliITSUGeomTGeo.cxx:304
 AliITSUGeomTGeo.cxx:305
 AliITSUGeomTGeo.cxx:306
 AliITSUGeomTGeo.cxx:307
 AliITSUGeomTGeo.cxx:308
 AliITSUGeomTGeo.cxx:309
 AliITSUGeomTGeo.cxx:310
 AliITSUGeomTGeo.cxx:311
 AliITSUGeomTGeo.cxx:312
 AliITSUGeomTGeo.cxx:313
 AliITSUGeomTGeo.cxx:314
 AliITSUGeomTGeo.cxx:315
 AliITSUGeomTGeo.cxx:316
 AliITSUGeomTGeo.cxx:317
 AliITSUGeomTGeo.cxx:318
 AliITSUGeomTGeo.cxx:319
 AliITSUGeomTGeo.cxx:320
 AliITSUGeomTGeo.cxx:321
 AliITSUGeomTGeo.cxx:322
 AliITSUGeomTGeo.cxx:323
 AliITSUGeomTGeo.cxx:324
 AliITSUGeomTGeo.cxx:325
 AliITSUGeomTGeo.cxx:326
 AliITSUGeomTGeo.cxx:327
 AliITSUGeomTGeo.cxx:328
 AliITSUGeomTGeo.cxx:329
 AliITSUGeomTGeo.cxx:330
 AliITSUGeomTGeo.cxx:331
 AliITSUGeomTGeo.cxx:332
 AliITSUGeomTGeo.cxx:333
 AliITSUGeomTGeo.cxx:334
 AliITSUGeomTGeo.cxx:335
 AliITSUGeomTGeo.cxx:336
 AliITSUGeomTGeo.cxx:337
 AliITSUGeomTGeo.cxx:338
 AliITSUGeomTGeo.cxx:339
 AliITSUGeomTGeo.cxx:340
 AliITSUGeomTGeo.cxx:341
 AliITSUGeomTGeo.cxx:342
 AliITSUGeomTGeo.cxx:343
 AliITSUGeomTGeo.cxx:344
 AliITSUGeomTGeo.cxx:345
 AliITSUGeomTGeo.cxx:346
 AliITSUGeomTGeo.cxx:347
 AliITSUGeomTGeo.cxx:348
 AliITSUGeomTGeo.cxx:349
 AliITSUGeomTGeo.cxx:350
 AliITSUGeomTGeo.cxx:351
 AliITSUGeomTGeo.cxx:352
 AliITSUGeomTGeo.cxx:353
 AliITSUGeomTGeo.cxx:354
 AliITSUGeomTGeo.cxx:355
 AliITSUGeomTGeo.cxx:356
 AliITSUGeomTGeo.cxx:357
 AliITSUGeomTGeo.cxx:358
 AliITSUGeomTGeo.cxx:359
 AliITSUGeomTGeo.cxx:360
 AliITSUGeomTGeo.cxx:361
 AliITSUGeomTGeo.cxx:362
 AliITSUGeomTGeo.cxx:363
 AliITSUGeomTGeo.cxx:364
 AliITSUGeomTGeo.cxx:365
 AliITSUGeomTGeo.cxx:366
 AliITSUGeomTGeo.cxx:367
 AliITSUGeomTGeo.cxx:368
 AliITSUGeomTGeo.cxx:369
 AliITSUGeomTGeo.cxx:370
 AliITSUGeomTGeo.cxx:371
 AliITSUGeomTGeo.cxx:372
 AliITSUGeomTGeo.cxx:373
 AliITSUGeomTGeo.cxx:374
 AliITSUGeomTGeo.cxx:375
 AliITSUGeomTGeo.cxx:376
 AliITSUGeomTGeo.cxx:377
 AliITSUGeomTGeo.cxx:378
 AliITSUGeomTGeo.cxx:379
 AliITSUGeomTGeo.cxx:380
 AliITSUGeomTGeo.cxx:381
 AliITSUGeomTGeo.cxx:382
 AliITSUGeomTGeo.cxx:383
 AliITSUGeomTGeo.cxx:384
 AliITSUGeomTGeo.cxx:385
 AliITSUGeomTGeo.cxx:386
 AliITSUGeomTGeo.cxx:387
 AliITSUGeomTGeo.cxx:388
 AliITSUGeomTGeo.cxx:389
 AliITSUGeomTGeo.cxx:390
 AliITSUGeomTGeo.cxx:391
 AliITSUGeomTGeo.cxx:392
 AliITSUGeomTGeo.cxx:393
 AliITSUGeomTGeo.cxx:394
 AliITSUGeomTGeo.cxx:395
 AliITSUGeomTGeo.cxx:396
 AliITSUGeomTGeo.cxx:397
 AliITSUGeomTGeo.cxx:398
 AliITSUGeomTGeo.cxx:399
 AliITSUGeomTGeo.cxx:400
 AliITSUGeomTGeo.cxx:401
 AliITSUGeomTGeo.cxx:402
 AliITSUGeomTGeo.cxx:403
 AliITSUGeomTGeo.cxx:404
 AliITSUGeomTGeo.cxx:405
 AliITSUGeomTGeo.cxx:406
 AliITSUGeomTGeo.cxx:407
 AliITSUGeomTGeo.cxx:408
 AliITSUGeomTGeo.cxx:409
 AliITSUGeomTGeo.cxx:410
 AliITSUGeomTGeo.cxx:411
 AliITSUGeomTGeo.cxx:412
 AliITSUGeomTGeo.cxx:413
 AliITSUGeomTGeo.cxx:414
 AliITSUGeomTGeo.cxx:415
 AliITSUGeomTGeo.cxx:416
 AliITSUGeomTGeo.cxx:417
 AliITSUGeomTGeo.cxx:418
 AliITSUGeomTGeo.cxx:419
 AliITSUGeomTGeo.cxx:420
 AliITSUGeomTGeo.cxx:421
 AliITSUGeomTGeo.cxx:422
 AliITSUGeomTGeo.cxx:423
 AliITSUGeomTGeo.cxx:424
 AliITSUGeomTGeo.cxx:425
 AliITSUGeomTGeo.cxx:426
 AliITSUGeomTGeo.cxx:427
 AliITSUGeomTGeo.cxx:428
 AliITSUGeomTGeo.cxx:429
 AliITSUGeomTGeo.cxx:430
 AliITSUGeomTGeo.cxx:431
 AliITSUGeomTGeo.cxx:432
 AliITSUGeomTGeo.cxx:433
 AliITSUGeomTGeo.cxx:434
 AliITSUGeomTGeo.cxx:435
 AliITSUGeomTGeo.cxx:436
 AliITSUGeomTGeo.cxx:437
 AliITSUGeomTGeo.cxx:438
 AliITSUGeomTGeo.cxx:439
 AliITSUGeomTGeo.cxx:440
 AliITSUGeomTGeo.cxx:441
 AliITSUGeomTGeo.cxx:442
 AliITSUGeomTGeo.cxx:443
 AliITSUGeomTGeo.cxx:444
 AliITSUGeomTGeo.cxx:445
 AliITSUGeomTGeo.cxx:446
 AliITSUGeomTGeo.cxx:447
 AliITSUGeomTGeo.cxx:448
 AliITSUGeomTGeo.cxx:449
 AliITSUGeomTGeo.cxx:450
 AliITSUGeomTGeo.cxx:451
 AliITSUGeomTGeo.cxx:452
 AliITSUGeomTGeo.cxx:453
 AliITSUGeomTGeo.cxx:454
 AliITSUGeomTGeo.cxx:455
 AliITSUGeomTGeo.cxx:456
 AliITSUGeomTGeo.cxx:457
 AliITSUGeomTGeo.cxx:458
 AliITSUGeomTGeo.cxx:459
 AliITSUGeomTGeo.cxx:460
 AliITSUGeomTGeo.cxx:461
 AliITSUGeomTGeo.cxx:462
 AliITSUGeomTGeo.cxx:463
 AliITSUGeomTGeo.cxx:464
 AliITSUGeomTGeo.cxx:465
 AliITSUGeomTGeo.cxx:466
 AliITSUGeomTGeo.cxx:467
 AliITSUGeomTGeo.cxx:468
 AliITSUGeomTGeo.cxx:469
 AliITSUGeomTGeo.cxx:470
 AliITSUGeomTGeo.cxx:471
 AliITSUGeomTGeo.cxx:472
 AliITSUGeomTGeo.cxx:473
 AliITSUGeomTGeo.cxx:474
 AliITSUGeomTGeo.cxx:475
 AliITSUGeomTGeo.cxx:476
 AliITSUGeomTGeo.cxx:477
 AliITSUGeomTGeo.cxx:478
 AliITSUGeomTGeo.cxx:479
 AliITSUGeomTGeo.cxx:480
 AliITSUGeomTGeo.cxx:481
 AliITSUGeomTGeo.cxx:482
 AliITSUGeomTGeo.cxx:483
 AliITSUGeomTGeo.cxx:484
 AliITSUGeomTGeo.cxx:485
 AliITSUGeomTGeo.cxx:486
 AliITSUGeomTGeo.cxx:487
 AliITSUGeomTGeo.cxx:488
 AliITSUGeomTGeo.cxx:489
 AliITSUGeomTGeo.cxx:490
 AliITSUGeomTGeo.cxx:491
 AliITSUGeomTGeo.cxx:492
 AliITSUGeomTGeo.cxx:493
 AliITSUGeomTGeo.cxx:494
 AliITSUGeomTGeo.cxx:495
 AliITSUGeomTGeo.cxx:496
 AliITSUGeomTGeo.cxx:497
 AliITSUGeomTGeo.cxx:498
 AliITSUGeomTGeo.cxx:499
 AliITSUGeomTGeo.cxx:500
 AliITSUGeomTGeo.cxx:501
 AliITSUGeomTGeo.cxx:502
 AliITSUGeomTGeo.cxx:503
 AliITSUGeomTGeo.cxx:504
 AliITSUGeomTGeo.cxx:505
 AliITSUGeomTGeo.cxx:506
 AliITSUGeomTGeo.cxx:507
 AliITSUGeomTGeo.cxx:508
 AliITSUGeomTGeo.cxx:509
 AliITSUGeomTGeo.cxx:510
 AliITSUGeomTGeo.cxx:511
 AliITSUGeomTGeo.cxx:512
 AliITSUGeomTGeo.cxx:513
 AliITSUGeomTGeo.cxx:514
 AliITSUGeomTGeo.cxx:515
 AliITSUGeomTGeo.cxx:516
 AliITSUGeomTGeo.cxx:517
 AliITSUGeomTGeo.cxx:518
 AliITSUGeomTGeo.cxx:519
 AliITSUGeomTGeo.cxx:520
 AliITSUGeomTGeo.cxx:521
 AliITSUGeomTGeo.cxx:522
 AliITSUGeomTGeo.cxx:523
 AliITSUGeomTGeo.cxx:524
 AliITSUGeomTGeo.cxx:525
 AliITSUGeomTGeo.cxx:526
 AliITSUGeomTGeo.cxx:527
 AliITSUGeomTGeo.cxx:528
 AliITSUGeomTGeo.cxx:529
 AliITSUGeomTGeo.cxx:530
 AliITSUGeomTGeo.cxx:531
 AliITSUGeomTGeo.cxx:532
 AliITSUGeomTGeo.cxx:533
 AliITSUGeomTGeo.cxx:534
 AliITSUGeomTGeo.cxx:535
 AliITSUGeomTGeo.cxx:536
 AliITSUGeomTGeo.cxx:537
 AliITSUGeomTGeo.cxx:538
 AliITSUGeomTGeo.cxx:539
 AliITSUGeomTGeo.cxx:540
 AliITSUGeomTGeo.cxx:541
 AliITSUGeomTGeo.cxx:542
 AliITSUGeomTGeo.cxx:543
 AliITSUGeomTGeo.cxx:544
 AliITSUGeomTGeo.cxx:545
 AliITSUGeomTGeo.cxx:546
 AliITSUGeomTGeo.cxx:547
 AliITSUGeomTGeo.cxx:548
 AliITSUGeomTGeo.cxx:549
 AliITSUGeomTGeo.cxx:550
 AliITSUGeomTGeo.cxx:551
 AliITSUGeomTGeo.cxx:552
 AliITSUGeomTGeo.cxx:553
 AliITSUGeomTGeo.cxx:554
 AliITSUGeomTGeo.cxx:555
 AliITSUGeomTGeo.cxx:556
 AliITSUGeomTGeo.cxx:557
 AliITSUGeomTGeo.cxx:558
 AliITSUGeomTGeo.cxx:559
 AliITSUGeomTGeo.cxx:560
 AliITSUGeomTGeo.cxx:561
 AliITSUGeomTGeo.cxx:562
 AliITSUGeomTGeo.cxx:563
 AliITSUGeomTGeo.cxx:564
 AliITSUGeomTGeo.cxx:565
 AliITSUGeomTGeo.cxx:566
 AliITSUGeomTGeo.cxx:567
 AliITSUGeomTGeo.cxx:568
 AliITSUGeomTGeo.cxx:569
 AliITSUGeomTGeo.cxx:570
 AliITSUGeomTGeo.cxx:571
 AliITSUGeomTGeo.cxx:572
 AliITSUGeomTGeo.cxx:573
 AliITSUGeomTGeo.cxx:574
 AliITSUGeomTGeo.cxx:575
 AliITSUGeomTGeo.cxx:576
 AliITSUGeomTGeo.cxx:577
 AliITSUGeomTGeo.cxx:578
 AliITSUGeomTGeo.cxx:579
 AliITSUGeomTGeo.cxx:580
 AliITSUGeomTGeo.cxx:581
 AliITSUGeomTGeo.cxx:582
 AliITSUGeomTGeo.cxx:583
 AliITSUGeomTGeo.cxx:584
 AliITSUGeomTGeo.cxx:585
 AliITSUGeomTGeo.cxx:586
 AliITSUGeomTGeo.cxx:587
 AliITSUGeomTGeo.cxx:588
 AliITSUGeomTGeo.cxx:589
 AliITSUGeomTGeo.cxx:590
 AliITSUGeomTGeo.cxx:591
 AliITSUGeomTGeo.cxx:592
 AliITSUGeomTGeo.cxx:593
 AliITSUGeomTGeo.cxx:594
 AliITSUGeomTGeo.cxx:595
 AliITSUGeomTGeo.cxx:596
 AliITSUGeomTGeo.cxx:597
 AliITSUGeomTGeo.cxx:598
 AliITSUGeomTGeo.cxx:599
 AliITSUGeomTGeo.cxx:600
 AliITSUGeomTGeo.cxx:601
 AliITSUGeomTGeo.cxx:602
 AliITSUGeomTGeo.cxx:603
 AliITSUGeomTGeo.cxx:604
 AliITSUGeomTGeo.cxx:605
 AliITSUGeomTGeo.cxx:606
 AliITSUGeomTGeo.cxx:607
 AliITSUGeomTGeo.cxx:608
 AliITSUGeomTGeo.cxx:609
 AliITSUGeomTGeo.cxx:610
 AliITSUGeomTGeo.cxx:611
 AliITSUGeomTGeo.cxx:612
 AliITSUGeomTGeo.cxx:613
 AliITSUGeomTGeo.cxx:614
 AliITSUGeomTGeo.cxx:615
 AliITSUGeomTGeo.cxx:616
 AliITSUGeomTGeo.cxx:617
 AliITSUGeomTGeo.cxx:618
 AliITSUGeomTGeo.cxx:619
 AliITSUGeomTGeo.cxx:620
 AliITSUGeomTGeo.cxx:621
 AliITSUGeomTGeo.cxx:622
 AliITSUGeomTGeo.cxx:623
 AliITSUGeomTGeo.cxx:624
 AliITSUGeomTGeo.cxx:625
 AliITSUGeomTGeo.cxx:626
 AliITSUGeomTGeo.cxx:627
 AliITSUGeomTGeo.cxx:628
 AliITSUGeomTGeo.cxx:629
 AliITSUGeomTGeo.cxx:630
 AliITSUGeomTGeo.cxx:631
 AliITSUGeomTGeo.cxx:632
 AliITSUGeomTGeo.cxx:633
 AliITSUGeomTGeo.cxx:634
 AliITSUGeomTGeo.cxx:635
 AliITSUGeomTGeo.cxx:636
 AliITSUGeomTGeo.cxx:637
 AliITSUGeomTGeo.cxx:638
 AliITSUGeomTGeo.cxx:639
 AliITSUGeomTGeo.cxx:640
 AliITSUGeomTGeo.cxx:641
 AliITSUGeomTGeo.cxx:642
 AliITSUGeomTGeo.cxx:643
 AliITSUGeomTGeo.cxx:644
 AliITSUGeomTGeo.cxx:645
 AliITSUGeomTGeo.cxx:646
 AliITSUGeomTGeo.cxx:647
 AliITSUGeomTGeo.cxx:648
 AliITSUGeomTGeo.cxx:649
 AliITSUGeomTGeo.cxx:650
 AliITSUGeomTGeo.cxx:651
 AliITSUGeomTGeo.cxx:652
 AliITSUGeomTGeo.cxx:653
 AliITSUGeomTGeo.cxx:654
 AliITSUGeomTGeo.cxx:655
 AliITSUGeomTGeo.cxx:656
 AliITSUGeomTGeo.cxx:657
 AliITSUGeomTGeo.cxx:658
 AliITSUGeomTGeo.cxx:659
 AliITSUGeomTGeo.cxx:660
 AliITSUGeomTGeo.cxx:661
 AliITSUGeomTGeo.cxx:662
 AliITSUGeomTGeo.cxx:663
 AliITSUGeomTGeo.cxx:664
 AliITSUGeomTGeo.cxx:665
 AliITSUGeomTGeo.cxx:666
 AliITSUGeomTGeo.cxx:667
 AliITSUGeomTGeo.cxx:668
 AliITSUGeomTGeo.cxx:669
 AliITSUGeomTGeo.cxx:670
 AliITSUGeomTGeo.cxx:671
 AliITSUGeomTGeo.cxx:672
 AliITSUGeomTGeo.cxx:673
 AliITSUGeomTGeo.cxx:674
 AliITSUGeomTGeo.cxx:675
 AliITSUGeomTGeo.cxx:676
 AliITSUGeomTGeo.cxx:677
 AliITSUGeomTGeo.cxx:678
 AliITSUGeomTGeo.cxx:679
 AliITSUGeomTGeo.cxx:680
 AliITSUGeomTGeo.cxx:681
 AliITSUGeomTGeo.cxx:682
 AliITSUGeomTGeo.cxx:683
 AliITSUGeomTGeo.cxx:684
 AliITSUGeomTGeo.cxx:685
 AliITSUGeomTGeo.cxx:686
 AliITSUGeomTGeo.cxx:687
 AliITSUGeomTGeo.cxx:688
 AliITSUGeomTGeo.cxx:689
 AliITSUGeomTGeo.cxx:690
 AliITSUGeomTGeo.cxx:691
 AliITSUGeomTGeo.cxx:692
 AliITSUGeomTGeo.cxx:693
 AliITSUGeomTGeo.cxx:694
 AliITSUGeomTGeo.cxx:695
 AliITSUGeomTGeo.cxx:696
 AliITSUGeomTGeo.cxx:697
 AliITSUGeomTGeo.cxx:698
 AliITSUGeomTGeo.cxx:699
 AliITSUGeomTGeo.cxx:700
 AliITSUGeomTGeo.cxx:701
 AliITSUGeomTGeo.cxx:702
 AliITSUGeomTGeo.cxx:703
 AliITSUGeomTGeo.cxx:704
 AliITSUGeomTGeo.cxx:705
 AliITSUGeomTGeo.cxx:706
 AliITSUGeomTGeo.cxx:707
 AliITSUGeomTGeo.cxx:708
 AliITSUGeomTGeo.cxx:709
 AliITSUGeomTGeo.cxx:710
 AliITSUGeomTGeo.cxx:711
 AliITSUGeomTGeo.cxx:712
 AliITSUGeomTGeo.cxx:713
 AliITSUGeomTGeo.cxx:714
 AliITSUGeomTGeo.cxx:715
 AliITSUGeomTGeo.cxx:716
 AliITSUGeomTGeo.cxx:717
 AliITSUGeomTGeo.cxx:718
 AliITSUGeomTGeo.cxx:719
 AliITSUGeomTGeo.cxx:720
 AliITSUGeomTGeo.cxx:721
 AliITSUGeomTGeo.cxx:722
 AliITSUGeomTGeo.cxx:723
 AliITSUGeomTGeo.cxx:724
 AliITSUGeomTGeo.cxx:725
 AliITSUGeomTGeo.cxx:726
 AliITSUGeomTGeo.cxx:727
 AliITSUGeomTGeo.cxx:728
 AliITSUGeomTGeo.cxx:729
 AliITSUGeomTGeo.cxx:730
 AliITSUGeomTGeo.cxx:731
 AliITSUGeomTGeo.cxx:732
 AliITSUGeomTGeo.cxx:733
 AliITSUGeomTGeo.cxx:734
 AliITSUGeomTGeo.cxx:735
 AliITSUGeomTGeo.cxx:736
 AliITSUGeomTGeo.cxx:737
 AliITSUGeomTGeo.cxx:738
 AliITSUGeomTGeo.cxx:739
 AliITSUGeomTGeo.cxx:740
 AliITSUGeomTGeo.cxx:741
 AliITSUGeomTGeo.cxx:742
 AliITSUGeomTGeo.cxx:743
 AliITSUGeomTGeo.cxx:744
 AliITSUGeomTGeo.cxx:745
 AliITSUGeomTGeo.cxx:746
 AliITSUGeomTGeo.cxx:747
 AliITSUGeomTGeo.cxx:748
 AliITSUGeomTGeo.cxx:749
 AliITSUGeomTGeo.cxx:750
 AliITSUGeomTGeo.cxx:751
 AliITSUGeomTGeo.cxx:752
 AliITSUGeomTGeo.cxx:753
 AliITSUGeomTGeo.cxx:754
 AliITSUGeomTGeo.cxx:755
 AliITSUGeomTGeo.cxx:756
 AliITSUGeomTGeo.cxx:757
 AliITSUGeomTGeo.cxx:758
 AliITSUGeomTGeo.cxx:759
 AliITSUGeomTGeo.cxx:760
 AliITSUGeomTGeo.cxx:761
 AliITSUGeomTGeo.cxx:762
 AliITSUGeomTGeo.cxx:763
 AliITSUGeomTGeo.cxx:764
 AliITSUGeomTGeo.cxx:765
 AliITSUGeomTGeo.cxx:766
 AliITSUGeomTGeo.cxx:767
 AliITSUGeomTGeo.cxx:768
 AliITSUGeomTGeo.cxx:769
 AliITSUGeomTGeo.cxx:770
 AliITSUGeomTGeo.cxx:771
 AliITSUGeomTGeo.cxx:772
 AliITSUGeomTGeo.cxx:773
 AliITSUGeomTGeo.cxx:774
 AliITSUGeomTGeo.cxx:775
 AliITSUGeomTGeo.cxx:776
 AliITSUGeomTGeo.cxx:777
 AliITSUGeomTGeo.cxx:778
 AliITSUGeomTGeo.cxx:779
 AliITSUGeomTGeo.cxx:780
 AliITSUGeomTGeo.cxx:781
 AliITSUGeomTGeo.cxx:782
 AliITSUGeomTGeo.cxx:783
 AliITSUGeomTGeo.cxx:784
 AliITSUGeomTGeo.cxx:785
 AliITSUGeomTGeo.cxx:786
 AliITSUGeomTGeo.cxx:787
 AliITSUGeomTGeo.cxx:788
 AliITSUGeomTGeo.cxx:789
 AliITSUGeomTGeo.cxx:790
 AliITSUGeomTGeo.cxx:791
 AliITSUGeomTGeo.cxx:792
 AliITSUGeomTGeo.cxx:793
 AliITSUGeomTGeo.cxx:794
 AliITSUGeomTGeo.cxx:795
 AliITSUGeomTGeo.cxx:796
 AliITSUGeomTGeo.cxx:797
 AliITSUGeomTGeo.cxx:798
 AliITSUGeomTGeo.cxx:799
 AliITSUGeomTGeo.cxx:800
 AliITSUGeomTGeo.cxx:801
 AliITSUGeomTGeo.cxx:802
 AliITSUGeomTGeo.cxx:803
 AliITSUGeomTGeo.cxx:804
 AliITSUGeomTGeo.cxx:805
 AliITSUGeomTGeo.cxx:806
 AliITSUGeomTGeo.cxx:807
 AliITSUGeomTGeo.cxx:808
 AliITSUGeomTGeo.cxx:809
 AliITSUGeomTGeo.cxx:810
 AliITSUGeomTGeo.cxx:811
 AliITSUGeomTGeo.cxx:812
 AliITSUGeomTGeo.cxx:813
 AliITSUGeomTGeo.cxx:814
 AliITSUGeomTGeo.cxx:815
 AliITSUGeomTGeo.cxx:816
 AliITSUGeomTGeo.cxx:817
 AliITSUGeomTGeo.cxx:818
 AliITSUGeomTGeo.cxx:819
 AliITSUGeomTGeo.cxx:820
 AliITSUGeomTGeo.cxx:821
 AliITSUGeomTGeo.cxx:822
 AliITSUGeomTGeo.cxx:823
 AliITSUGeomTGeo.cxx:824
 AliITSUGeomTGeo.cxx:825
 AliITSUGeomTGeo.cxx:826
 AliITSUGeomTGeo.cxx:827
 AliITSUGeomTGeo.cxx:828
 AliITSUGeomTGeo.cxx:829
 AliITSUGeomTGeo.cxx:830
 AliITSUGeomTGeo.cxx:831
 AliITSUGeomTGeo.cxx:832
 AliITSUGeomTGeo.cxx:833
 AliITSUGeomTGeo.cxx:834
 AliITSUGeomTGeo.cxx:835
 AliITSUGeomTGeo.cxx:836
 AliITSUGeomTGeo.cxx:837
 AliITSUGeomTGeo.cxx:838
 AliITSUGeomTGeo.cxx:839
 AliITSUGeomTGeo.cxx:840
 AliITSUGeomTGeo.cxx:841
 AliITSUGeomTGeo.cxx:842
 AliITSUGeomTGeo.cxx:843
 AliITSUGeomTGeo.cxx:844
 AliITSUGeomTGeo.cxx:845
 AliITSUGeomTGeo.cxx:846
 AliITSUGeomTGeo.cxx:847
 AliITSUGeomTGeo.cxx:848
 AliITSUGeomTGeo.cxx:849
 AliITSUGeomTGeo.cxx:850
 AliITSUGeomTGeo.cxx:851
 AliITSUGeomTGeo.cxx:852
 AliITSUGeomTGeo.cxx:853
 AliITSUGeomTGeo.cxx:854
 AliITSUGeomTGeo.cxx:855
 AliITSUGeomTGeo.cxx:856
 AliITSUGeomTGeo.cxx:857
 AliITSUGeomTGeo.cxx:858
 AliITSUGeomTGeo.cxx:859
 AliITSUGeomTGeo.cxx:860
 AliITSUGeomTGeo.cxx:861
 AliITSUGeomTGeo.cxx:862
 AliITSUGeomTGeo.cxx:863
 AliITSUGeomTGeo.cxx:864
 AliITSUGeomTGeo.cxx:865
 AliITSUGeomTGeo.cxx:866
 AliITSUGeomTGeo.cxx:867
 AliITSUGeomTGeo.cxx:868
 AliITSUGeomTGeo.cxx:869
 AliITSUGeomTGeo.cxx:870
 AliITSUGeomTGeo.cxx:871
 AliITSUGeomTGeo.cxx:872
 AliITSUGeomTGeo.cxx:873
 AliITSUGeomTGeo.cxx:874
 AliITSUGeomTGeo.cxx:875
 AliITSUGeomTGeo.cxx:876
 AliITSUGeomTGeo.cxx:877
 AliITSUGeomTGeo.cxx:878
 AliITSUGeomTGeo.cxx:879
 AliITSUGeomTGeo.cxx:880
 AliITSUGeomTGeo.cxx:881
 AliITSUGeomTGeo.cxx:882
 AliITSUGeomTGeo.cxx:883
 AliITSUGeomTGeo.cxx:884
 AliITSUGeomTGeo.cxx:885
 AliITSUGeomTGeo.cxx:886
 AliITSUGeomTGeo.cxx:887
 AliITSUGeomTGeo.cxx:888
 AliITSUGeomTGeo.cxx:889
 AliITSUGeomTGeo.cxx:890
 AliITSUGeomTGeo.cxx:891
 AliITSUGeomTGeo.cxx:892
 AliITSUGeomTGeo.cxx:893
 AliITSUGeomTGeo.cxx:894
 AliITSUGeomTGeo.cxx:895
 AliITSUGeomTGeo.cxx:896
 AliITSUGeomTGeo.cxx:897
 AliITSUGeomTGeo.cxx:898
 AliITSUGeomTGeo.cxx:899
 AliITSUGeomTGeo.cxx:900
 AliITSUGeomTGeo.cxx:901
 AliITSUGeomTGeo.cxx:902
 AliITSUGeomTGeo.cxx:903
 AliITSUGeomTGeo.cxx:904
 AliITSUGeomTGeo.cxx:905
 AliITSUGeomTGeo.cxx:906
 AliITSUGeomTGeo.cxx:907
 AliITSUGeomTGeo.cxx:908
 AliITSUGeomTGeo.cxx:909
 AliITSUGeomTGeo.cxx:910
 AliITSUGeomTGeo.cxx:911
 AliITSUGeomTGeo.cxx:912
 AliITSUGeomTGeo.cxx:913
 AliITSUGeomTGeo.cxx:914
 AliITSUGeomTGeo.cxx:915
 AliITSUGeomTGeo.cxx:916
 AliITSUGeomTGeo.cxx:917
 AliITSUGeomTGeo.cxx:918
 AliITSUGeomTGeo.cxx:919
 AliITSUGeomTGeo.cxx:920
 AliITSUGeomTGeo.cxx:921
 AliITSUGeomTGeo.cxx:922
 AliITSUGeomTGeo.cxx:923
 AliITSUGeomTGeo.cxx:924
 AliITSUGeomTGeo.cxx:925
 AliITSUGeomTGeo.cxx:926
 AliITSUGeomTGeo.cxx:927
 AliITSUGeomTGeo.cxx:928
 AliITSUGeomTGeo.cxx:929
 AliITSUGeomTGeo.cxx:930
 AliITSUGeomTGeo.cxx:931
 AliITSUGeomTGeo.cxx:932
 AliITSUGeomTGeo.cxx:933
 AliITSUGeomTGeo.cxx:934
 AliITSUGeomTGeo.cxx:935
 AliITSUGeomTGeo.cxx:936
 AliITSUGeomTGeo.cxx:937
 AliITSUGeomTGeo.cxx:938
 AliITSUGeomTGeo.cxx:939
 AliITSUGeomTGeo.cxx:940
 AliITSUGeomTGeo.cxx:941
 AliITSUGeomTGeo.cxx:942
 AliITSUGeomTGeo.cxx:943
 AliITSUGeomTGeo.cxx:944
 AliITSUGeomTGeo.cxx:945
 AliITSUGeomTGeo.cxx:946
 AliITSUGeomTGeo.cxx:947
 AliITSUGeomTGeo.cxx:948
 AliITSUGeomTGeo.cxx:949
 AliITSUGeomTGeo.cxx:950
 AliITSUGeomTGeo.cxx:951
 AliITSUGeomTGeo.cxx:952
 AliITSUGeomTGeo.cxx:953
 AliITSUGeomTGeo.cxx:954
 AliITSUGeomTGeo.cxx:955
 AliITSUGeomTGeo.cxx:956
 AliITSUGeomTGeo.cxx:957
 AliITSUGeomTGeo.cxx:958
 AliITSUGeomTGeo.cxx:959
 AliITSUGeomTGeo.cxx:960
 AliITSUGeomTGeo.cxx:961
 AliITSUGeomTGeo.cxx:962
 AliITSUGeomTGeo.cxx:963
 AliITSUGeomTGeo.cxx:964
 AliITSUGeomTGeo.cxx:965
 AliITSUGeomTGeo.cxx:966
 AliITSUGeomTGeo.cxx:967
 AliITSUGeomTGeo.cxx:968
 AliITSUGeomTGeo.cxx:969
 AliITSUGeomTGeo.cxx:970
 AliITSUGeomTGeo.cxx:971
 AliITSUGeomTGeo.cxx:972
 AliITSUGeomTGeo.cxx:973
 AliITSUGeomTGeo.cxx:974
 AliITSUGeomTGeo.cxx:975
 AliITSUGeomTGeo.cxx:976
 AliITSUGeomTGeo.cxx:977
 AliITSUGeomTGeo.cxx:978
 AliITSUGeomTGeo.cxx:979
 AliITSUGeomTGeo.cxx:980
 AliITSUGeomTGeo.cxx:981
 AliITSUGeomTGeo.cxx:982
 AliITSUGeomTGeo.cxx:983
 AliITSUGeomTGeo.cxx:984
 AliITSUGeomTGeo.cxx:985
 AliITSUGeomTGeo.cxx:986
 AliITSUGeomTGeo.cxx:987
 AliITSUGeomTGeo.cxx:988
 AliITSUGeomTGeo.cxx:989
 AliITSUGeomTGeo.cxx:990
 AliITSUGeomTGeo.cxx:991
 AliITSUGeomTGeo.cxx:992
 AliITSUGeomTGeo.cxx:993
 AliITSUGeomTGeo.cxx:994
 AliITSUGeomTGeo.cxx:995
 AliITSUGeomTGeo.cxx:996
 AliITSUGeomTGeo.cxx:997
 AliITSUGeomTGeo.cxx:998
 AliITSUGeomTGeo.cxx:999
 AliITSUGeomTGeo.cxx:1000
 AliITSUGeomTGeo.cxx:1001
 AliITSUGeomTGeo.cxx:1002
 AliITSUGeomTGeo.cxx:1003
 AliITSUGeomTGeo.cxx:1004
 AliITSUGeomTGeo.cxx:1005
 AliITSUGeomTGeo.cxx:1006
 AliITSUGeomTGeo.cxx:1007
 AliITSUGeomTGeo.cxx:1008
 AliITSUGeomTGeo.cxx:1009
 AliITSUGeomTGeo.cxx:1010
 AliITSUGeomTGeo.cxx:1011
 AliITSUGeomTGeo.cxx:1012
 AliITSUGeomTGeo.cxx:1013
 AliITSUGeomTGeo.cxx:1014
 AliITSUGeomTGeo.cxx:1015
 AliITSUGeomTGeo.cxx:1016
 AliITSUGeomTGeo.cxx:1017
 AliITSUGeomTGeo.cxx:1018
 AliITSUGeomTGeo.cxx:1019
 AliITSUGeomTGeo.cxx:1020
 AliITSUGeomTGeo.cxx:1021
 AliITSUGeomTGeo.cxx:1022
 AliITSUGeomTGeo.cxx:1023
 AliITSUGeomTGeo.cxx:1024
 AliITSUGeomTGeo.cxx:1025
 AliITSUGeomTGeo.cxx:1026
 AliITSUGeomTGeo.cxx:1027
 AliITSUGeomTGeo.cxx:1028
 AliITSUGeomTGeo.cxx:1029
 AliITSUGeomTGeo.cxx:1030
 AliITSUGeomTGeo.cxx:1031
 AliITSUGeomTGeo.cxx:1032
 AliITSUGeomTGeo.cxx:1033
 AliITSUGeomTGeo.cxx:1034
 AliITSUGeomTGeo.cxx:1035
 AliITSUGeomTGeo.cxx:1036
 AliITSUGeomTGeo.cxx:1037
 AliITSUGeomTGeo.cxx:1038
 AliITSUGeomTGeo.cxx:1039
 AliITSUGeomTGeo.cxx:1040
 AliITSUGeomTGeo.cxx:1041
 AliITSUGeomTGeo.cxx:1042
 AliITSUGeomTGeo.cxx:1043
 AliITSUGeomTGeo.cxx:1044
 AliITSUGeomTGeo.cxx:1045
 AliITSUGeomTGeo.cxx:1046
 AliITSUGeomTGeo.cxx:1047
 AliITSUGeomTGeo.cxx:1048
 AliITSUGeomTGeo.cxx:1049
 AliITSUGeomTGeo.cxx:1050
 AliITSUGeomTGeo.cxx:1051
 AliITSUGeomTGeo.cxx:1052
 AliITSUGeomTGeo.cxx:1053
 AliITSUGeomTGeo.cxx:1054
 AliITSUGeomTGeo.cxx:1055
 AliITSUGeomTGeo.cxx:1056
 AliITSUGeomTGeo.cxx:1057
 AliITSUGeomTGeo.cxx:1058
 AliITSUGeomTGeo.cxx:1059