ROOT logo
/************************************************************************** 
 * Copyright(c) 2007-2009, 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.                  * 
 **************************************************************************/ 
 
/* $Id$    */ 
//----------------------------------------------------------------------------- 
/// \class AliITSAlignMilleModule
/// Alignment class for the ALICE ITS detector 
/// 
/// This class is used by AliITSAlignMille to build custom supermodules    
/// made of ITS sensitive modules. These supermodules are then aligned
/// 
/// Custom supermodules must have VolumeID > 14335
///
/// \author M. Lunardon  
//----------------------------------------------------------------------------- 
 
#include <TGeoManager.h> 
//#include <TGeoMatrix.h> 
 
#include "AliITSAlignMilleModule.h" 
#include "AliITSgeomTGeo.h" 
#include "AliGeomManager.h" 
#include "AliAlignObjParams.h" 
#include "AliLog.h" 
 
/// \cond CLASSIMP 
ClassImp(AliITSAlignMilleModule) 
/// \endcond 
    
//-------------------------------------------------------------
AliITSAlignMilleModule::AliITSAlignMilleModule() : TNamed(), 
  fNSensVol(0), 
  fIndex(-1),  
  fVolumeID(0),  
  fMatrix(NULL),
  fSensVolMatrix(NULL),
  fSensVolModifMatrix(NULL),
  fTempAlignObj(NULL)
{ 
  /// void constructor  
  fMatrix = new TGeoHMatrix; 
  fSensVolMatrix = new TGeoHMatrix; 
  fSensVolModifMatrix = new TGeoHMatrix; 
  fTempAlignObj=new AliAlignObjParams;
  for(Int_t k=0; k<fgkSensModules; k++){
    fSensVolIndex[k] = 0;
    fSensVolVolumeID[k] = 0;
  }
} 
//-------------------------------------------------------------
AliITSAlignMilleModule::AliITSAlignMilleModule(Int_t index, UShort_t volid, char* symname, const TGeoHMatrix *m, Int_t nsv, const UShort_t *volidsv) : TNamed(), 
  fNSensVol(0), 
  fIndex(-1),  
  fVolumeID(0),  
  fMatrix(NULL),
  fSensVolMatrix(NULL),
  fSensVolModifMatrix(NULL),
  fTempAlignObj(NULL)
{ 
  /// void constructor  
  fMatrix = new TGeoHMatrix; 
  fSensVolMatrix = new TGeoHMatrix; 
  fSensVolModifMatrix = new TGeoHMatrix; 
  fTempAlignObj=new AliAlignObjParams;
  if (Set(index,volid,symname,m,nsv,volidsv)) {
    AliInfo("Error in AliITSAlignMilleModule::Set() - initializing void supermodule...");

  }
  for(Int_t k=0; k<fgkSensModules; k++){
    fSensVolIndex[k] = 0;
    fSensVolVolumeID[k] = 0;
  }
}
//-------------------------------------------------------------
AliITSAlignMilleModule::AliITSAlignMilleModule(UShort_t volid) : TNamed(), 
  fNSensVol(0), 
  fIndex(-1),  
  fVolumeID(0),  
  fMatrix(NULL),
  fSensVolMatrix(NULL),
  fSensVolModifMatrix(NULL),
  fTempAlignObj(NULL)
{ 
  /// simple constructor building a supermodule from a single sensitive volume 
  fMatrix = new TGeoHMatrix; 
  fSensVolMatrix = new TGeoHMatrix; 
  fSensVolModifMatrix = new TGeoHMatrix;   
  // temporary align object, just use the rotation...
  fTempAlignObj=new AliAlignObjParams;

  fIndex = GetIndexFromVolumeID(volid);  
  if (fIndex>=0 && gGeoManager) { // good sensitive module and geometry loaded
    SetName(AliGeomManager::SymName(volid));
    fVolumeID = volid;
    AddSensitiveVolume(volid);
    if (SensVolMatrix(volid, fMatrix))
       AliInfo("Matrix not defined");
  }
  else {
    AliInfo("Wrong VolumeID or Geometry not loaded - initializing void supermodule...");
  for(Int_t k=0; k<fgkSensModules; k++){
    fSensVolIndex[k] = 0;
    fSensVolVolumeID[k] = 0;
  }
  }
} 
//-------------------------------------------------------------
AliITSAlignMilleModule::~AliITSAlignMilleModule() { 
  /// Destructor 
  delete fMatrix; 
  delete fSensVolMatrix; 
  delete fSensVolModifMatrix; 
  delete fTempAlignObj;
} 
//-------------------------------------------------------------
Int_t AliITSAlignMilleModule::Set(Int_t index, UShort_t volid, char* symname, const TGeoHMatrix * const m, Int_t nsv, const UShort_t *volidsv) 
{
  // initialize a custom supermodule
  // index, volid, symname and matrix must be given
  // if (volidsv) add nsv sensitive volumes to the supermodules
  // return 0 if success

  if (index<2198) {
    AliInfo("Index must be >= 2198");
    return -1;
  }
  if (volid<14336) {
    AliInfo("VolumeID must be >= 14336");
    return -2;
  }
  
  if (!symname) return -3;
  for (Int_t i=0; i<2198; i++) {
    if (!strcmp(symname,AliITSgeomTGeo::GetSymName(i))) {
      AliInfo("Symname already used by a Sensitive Volume");
      return -3;
    }
  }
  
  if (!m) return -4;

  // can initialize needed stuffs
  fIndex = index;
  fVolumeID = volid;
  SetName(symname);
  (*fMatrix) = (*m);

  // add sensitive volumes
  for (Int_t i=0; i<nsv; i++) AddSensitiveVolume(volidsv[i]);

  return 0;
}
//-------------------------------------------------------------
Int_t AliITSAlignMilleModule::GetIndexFromVolumeID(UShort_t voluid) {
  /// index from volume ID
  AliGeomManager::ELayerID lay = AliGeomManager::VolUIDToLayer(voluid);
  if (lay<1|| lay>6) return -1;
  Int_t idx=Int_t(voluid)-2048*lay;
  if (idx>=AliGeomManager::LayerSize(lay)) return -1;
  for (Int_t ilay=1; ilay<lay; ilay++) 
    idx += AliGeomManager::LayerSize(ilay);
  return idx;
}
//-------------------------------------------------------------
void AliITSAlignMilleModule::AddSensitiveVolume(UShort_t voluid)
{
  /// add a sensitive volume to this supermodule
  if (GetIndexFromVolumeID(voluid)<0) return; // bad volid
  fSensVolVolumeID[fNSensVol] = voluid;
  fSensVolIndex[fNSensVol] = GetIndexFromVolumeID(voluid);
  fNSensVol++;
}
//-------------------------------------------------------------
Bool_t AliITSAlignMilleModule::IsIn(UShort_t voluid) const 
{
  /// check if voluid is defined
  if (!voluid) return kFALSE; // only positive voluid are accepted
  for (Int_t i=0; i<fNSensVol; i++) {
    if (fSensVolVolumeID[i]==voluid) return kTRUE;
  }
  return kFALSE;
}
//-------------------------------------------------------------
TGeoHMatrix *AliITSAlignMilleModule::GetSensitiveVolumeModifiedMatrix(UShort_t voluid, const Double_t * const deltalocal)
{
  // modify the original TGeoHMatrix of the sensitive module 'voluid' according
  // with a delta transform. applied to the supermodule matrix
  // return NULL if error

  if (!IsIn(voluid)) return NULL;
  if (!gGeoManager) return NULL;

  // prepare the TGeoHMatrix
  Double_t tr[3],ang[3];
  tr[0]=deltalocal[0]; // in centimeter
  tr[1]=deltalocal[1]; 
  tr[2]=deltalocal[2];
  ang[0]=deltalocal[3]; // psi   (X)  in deg
  ang[1]=deltalocal[4]; // theta (Y)
  ang[2]=deltalocal[5]; // phi   (Z)

  // reset align object (may not be needed...)
  fTempAlignObj->SetVolUID(0);
  fTempAlignObj->SetSymName("");
  fTempAlignObj->SetRotation(ang[0],ang[1],ang[2]);
  fTempAlignObj->SetTranslation(tr[0],tr[1],tr[2]);
  AliDebug(3,Form("Delta angles: psi=%f  theta=%f   phi=%f",ang[0],ang[1],ang[2]));
  TGeoHMatrix hm;
  fTempAlignObj->GetMatrix(hm);
  //printf("\n0: delta matrix\n");hm.Print();

  // 1) start setting fSensVolModif = fSensVol
  if (SensVolMatrix(voluid, fSensVolModifMatrix)) return NULL;
  //printf("\n1: modif=orig del sensvol\n");fSensVolModifMatrix->Print();

  // 2) set fSensVolModif = SensVolRel
  fSensVolModifMatrix->MultiplyLeft( &fMatrix->Inverse() );
  //printf("\n2: modif=relative del sensvol\n");fSensVolModifMatrix->Print();
 
  // 3) multiply left by delta
  fSensVolModifMatrix->MultiplyLeft( &hm );
  //printf("\n3: modif= delta*relative\n");fSensVolModifMatrix->Print();
  
  // 4) multiply left by fMatrix
  fSensVolModifMatrix->MultiplyLeft( fMatrix );
  //printf("\n4: modif=finale\n");fSensVolModifMatrix->Print();

  return fSensVolModifMatrix;
}
//-------------------------------------------------------------
AliAlignObjParams *AliITSAlignMilleModule::GetSensitiveVolumeMisalignment(UShort_t voluid, const Double_t * const deltalocal)
{
  // calculate misalignment of sens.vol. 'voluid' according with a displacement 'deltalocal'
  // of the mother volume. The misalignment is returned as AliAlignObjParams object

  if (!IsIn(voluid)) return NULL;
  if (!gGeoManager) return NULL;
  
  // prepare the TGeoHMatrix
  Double_t tr[3],ang[3];
  tr[0]=deltalocal[0]; // in centimeter
  tr[1]=deltalocal[1]; 
  tr[2]=deltalocal[2];
  ang[0]=deltalocal[3]; // psi   (X)  in deg
  ang[1]=deltalocal[4]; // theta (Y)
  ang[2]=deltalocal[5]; // phi   (Z)

  // reset align object (may not be needed...)
  fTempAlignObj->SetVolUID(0);
  fTempAlignObj->SetSymName("");
  fTempAlignObj->SetRotation(ang[0],ang[1],ang[2]);
  fTempAlignObj->SetTranslation(tr[0],tr[1],tr[2]);
  AliDebug(3,Form("Delta angles: psi=%f  theta=%f   phi=%f",ang[0],ang[1],ang[2]));
  
  return GetSensitiveVolumeMisalignment(voluid,fTempAlignObj);
}
//-------------------------------------------------------------
AliAlignObjParams *AliITSAlignMilleModule::GetSensitiveVolumeMisalignment(UShort_t voluid, const AliAlignObjParams *a)
{
  // return the misalignment of the sens. vol. 'voluid' corresponding with 
  // a misalignment 'a' in the mother volume
  // return NULL if error

  // Gsv = Gg * Gg-1 * Gsv   -> Lsv,g = Gg-1 * Gsv
  // G'sv = Gg * Dg * Lsv,g === Gsv * Dsv
  // Gg * Dg * Gg-1 * Gsv = Gsv * Gsv-1 * Gg * Dg * Gg-1 * Gsv
  //
  // => Dsv = (Gsv-1 * Gg * Dg * Gg-1 * Gsv)
  //

  if (!IsIn(voluid)) return NULL;
  if (!gGeoManager) return NULL;

  //a->Print("");

  // prepare the Delta matrix Dg
  TGeoHMatrix dg;
  a->GetMatrix(dg);
  //dg.Print();

  // 1) start setting fSensVolModif = Gsv
  if (SensVolMatrix(voluid, fSensVolModifMatrix)) return NULL;
  //printf("\n1: modif=orig del sensvol\n");fSensVolModifMatrix->Print();

  // 2) set fSensVolModif = Gg-1 * Gsv
  fSensVolModifMatrix->MultiplyLeft( &fMatrix->Inverse() );
  //printf("\n2: modif=relative del sensvol\n");fSensVolModifMatrix->Print();
 
  // 3) set fSensVolModif = Dg * Gg-1 * Gsv
  fSensVolModifMatrix->MultiplyLeft( &dg );
  //printf("\n3: modif= delta*relative\n");fSensVolModifMatrix->Print();
  
  // 4) set fSensVolModif = Gg * Dg * Gg-1 * Gsv
  fSensVolModifMatrix->MultiplyLeft( fMatrix );
  //printf("\n4: modif=quasi,manca il Gsv-1...\n");fSensVolModifMatrix->Print();

  // 5) set fSensVolModif = Gsv-1 * Gg * Dg * Gg-1 * Gsv
  if (SensVolMatrix(voluid, &dg)) return NULL;
  fSensVolModifMatrix->MultiplyLeft( &dg.Inverse() );
  //printf("\n5: modif=finale\n");fSensVolModifMatrix->Print();

  // 6) mo' fSensVolModif dovrebbe essere la Dsv(loc) t.c. G'sv = Gsv*Dsv(loc)
  // per trasformarla in Dsv(loc rispetto al Gsv0, non modificato) dovrebbe essere:
  // Dsv(loc) -> Dpre * Dsv(loc) * Dpre-1
  //TGeoHMatrix dpre; // dpre = Gsv0-1*Gsv
  //if (SensVolOrigGlobalMatrix(voluid, &dg)) return NULL;
  //if (SensVolMatrix(voluid, &dpre)) return NULL;
  //dpre.MultiplyLeft( &dg.Inverse() );
  //fSensVolModifMatrix->Multiply( &dpre.Inverse() );
  //fSensVolModifMatrix->MultiplyLeft( &dpre );
  // direi che NON FUNZIONA!!!!

  // reset align object (may not be needed...)
  fTempAlignObj->SetVolUID(0);
  fTempAlignObj->SetSymName("");
  fTempAlignObj->SetTranslation(0,0,0);
  fTempAlignObj->SetRotation(0,0,0);

  // correction for SPD y-shift
  if (voluid>=2048 && voluid<4256) {
    TGeoHMatrix deltay;
    double dy[3]={0.,0.0081,0.};
    deltay.SetTranslation(dy);
    fSensVolModifMatrix->MultiplyLeft( &deltay );
    fSensVolModifMatrix->Multiply( &deltay.Inverse() );
  }
  
  if (!fTempAlignObj->SetMatrix(*fSensVolModifMatrix)) return NULL;
  fTempAlignObj->SetVolUID(voluid);
  fTempAlignObj->SetSymName(AliGeomManager::SymName(voluid));
  
  //fTempAlignObj->Print("");

  return fTempAlignObj;
}
//-------------------------------------------------------------


//-------------------------------------------------------------
AliAlignObjParams *AliITSAlignMilleModule::GetSensitiveVolumeTotalMisalignment(UShort_t voluid, const Double_t * const deltalocal)
{
  // calculate misalignment of sens.vol. 'voluid' according with a displacement 'deltalocal'
  // of the mother volume. The misalignment is returned as AliAlignObjParams object including
  // the (evenctual) prealignment => no merging needed

  if (!IsIn(voluid)) return NULL;
  if (!gGeoManager) return NULL;
  
  // prepare the TGeoHMatrix
  Double_t tr[3],ang[3];
  tr[0]=deltalocal[0]; // in centimeter
  tr[1]=deltalocal[1]; 
  tr[2]=deltalocal[2];
  ang[0]=deltalocal[3]; // psi   (X)  in deg
  ang[1]=deltalocal[4]; // theta (Y)
  ang[2]=deltalocal[5]; // phi   (Z)

  // reset align object (may not be needed...)
  fTempAlignObj->SetVolUID(0);
  fTempAlignObj->SetSymName("");
  fTempAlignObj->SetRotation(ang[0],ang[1],ang[2]);
  fTempAlignObj->SetTranslation(tr[0],tr[1],tr[2]);
  AliDebug(3,Form("Delta angles: psi=%f  theta=%f   phi=%f",ang[0],ang[1],ang[2]));

  // Gsv = Gg * Gg-1 * Gsv   -> Lsv,g = Gg-1 * Gsv
  // G'sv = Gg * Dg * Lsv,g === DGsv * Gsv 
  //
  // => Dsv = (G0sv-1 * Gg * Dg * Gg-1 * GMsv)  //
  //

  // prepare the Delta matrix Dg
  TGeoHMatrix dg;
  fTempAlignObj->GetMatrix(dg);
  //dg.Print();

  // 1) start setting fSensVolModif = Gsv
  if (SensVolMatrix(voluid, fSensVolModifMatrix)) return NULL;
  //printf("\n1: modif=orig del sensvol\n");fSensVolModifMatrix->Print();

  // 2) set fSensVolModif = Gg-1 * Gsv
  fSensVolModifMatrix->MultiplyLeft( &fMatrix->Inverse() );
  //printf("\n2: modif=relative del sensvol\n");fSensVolModifMatrix->Print();
 
  // 3) set fSensVolModif = Dg * Gg-1 * Gsv
  fSensVolModifMatrix->MultiplyLeft( &dg );
  //printf("\n3: modif= delta*relative\n");fSensVolModifMatrix->Print();
  
  // 4) set fSensVolModif = Gg * Dg * Gg-1 * Gsv
  fSensVolModifMatrix->MultiplyLeft( fMatrix );
  //printf("\n4: modif=quasi,manca il Gsv-1...\n");fSensVolModifMatrix->Print();

  // 5) set fSensVolModif = G0sv-1 * Gg * Dg * Gg-1 * Gsv
  // qui usa l'orig anziche' la prealigned...
  if (SensVolOrigGlobalMatrix(voluid, &dg)) return NULL;
  fSensVolModifMatrix->MultiplyLeft( &dg.Inverse() );
  //printf("\n5: modif=finale\n");fSensVolModifMatrix->Print();

  // reset align object (may not be needed...)
  fTempAlignObj->SetVolUID(0);
  fTempAlignObj->SetSymName("");
  fTempAlignObj->SetTranslation(0,0,0);
  fTempAlignObj->SetRotation(0,0,0);

  // correction for SPD y-shift
  if (voluid>=2048 && voluid<4256) {
    TGeoHMatrix deltay;
    double dy[3]={0.,0.0081,0.};
    deltay.SetTranslation(dy);
    fSensVolModifMatrix->MultiplyLeft( &deltay );
    fSensVolModifMatrix->Multiply( &deltay.Inverse() );
  }
  if (!fTempAlignObj->SetMatrix(*fSensVolModifMatrix)) return NULL;
  fTempAlignObj->SetVolUID(voluid);
  fTempAlignObj->SetSymName(AliGeomManager::SymName(voluid));

  
  //fTempAlignObj->Print("");

  return fTempAlignObj;
}
//-------------------------------------------------------------

// //-------------------------------------------------------------
// AliAlignObjParams *AliITSAlignMilleModule::GetSensitiveVolumeTotalMisalignment(UShort_t voluid, Double_t *deltalocal)
// {
//   // calculate misalignment of sens.vol. 'voluid' according with a displacement 'deltalocal'
//   // of the mother volume. The misalignment is returned as AliAlignObjParams object including
//   // the (evenctual) prealignment => no merging needed

//   if (!IsIn(voluid)) return NULL;
//   if (!gGeoManager) return NULL;
  
//   // prepare the TGeoHMatrix
//   Double_t tr[3],ang[3];
//   tr[0]=deltalocal[0]; // in centimeter
//   tr[1]=deltalocal[1]; 
//   tr[2]=deltalocal[2];
//   ang[0]=deltalocal[3]; // psi   (X)  in deg
//   ang[1]=deltalocal[4]; // theta (Y)
//   ang[2]=deltalocal[5]; // phi   (Z)

//   // reset align object (may not be needed...)
//   fTempAlignObj->SetVolUID(0);
//   fTempAlignObj->SetSymName("");
//   fTempAlignObj->SetRotation(ang[0],ang[1],ang[2]);
//   fTempAlignObj->SetTranslation(tr[0],tr[1],tr[2]);
//   AliDebug(3,Form("Delta angles: psi=%f  theta=%f   phi=%f",ang[0],ang[1],ang[2]));

//   // Gsv = Gg * Gg-1 * Gsv   -> Lsv,g = Gg-1 * Gsv
//   // G'sv = Gg * Dg * Lsv,g === DGsv * Gsv 
//   //
//   // => Dsv = (G0sv-1 * Gg * Dg * Gg-1 * GMsv)  //
//   //

//   // prepare the Delta matrix Dg
//   TGeoHMatrix dg;
//   fTempAlignObj->GetMatrix(dg);
//   //dg.Print();

//   // 1) start setting fSensVolModif = Gsv
//   if (SensVolMatrix(voluid, fSensVolModifMatrix)) return NULL;
//   //printf("\n1: modif=orig del sensvol\n");fSensVolModifMatrix->Print();

//   // 2) set dg = Gg * Dg * Gg-1 
//   dg.Multiply( &fMatrix->Inverse() );
//   dg.MultiplyLeft( fMatrix );
 
//   // 3) set dg = Gsv-1 * dg * Gsv locale nel sistema del SV preallineato
//   dg.Multiply( fSensVolModifMatrix );
//   dg.MultiplyLeft( &fSensVolModifMatrix->Inverse() );

//   // calcola la deltaPre
//   TGeoHMatrix hp;
//   if (SensVolOrigGlobalMatrix(voluid, &hp)) return NULL;
//   fSensVolModifMatrix->MultiplyLeft( &hp.Inverse() );

//   // mo' fSensVolModifMatrix e' la deltapre ideale
//   // col dg diventa la deltatot ideale
//   fSensVolModifMatrix->Multiply( &dg );
//   //fSensVolModifMatrix->MultiplyLeft( &dg );
  
//   // reset align object (may not be needed...)
//   fTempAlignObj->SetVolUID(0);
//   fTempAlignObj->SetSymName("");
//   fTempAlignObj->SetTranslation(0,0,0);
//   fTempAlignObj->SetRotation(0,0,0);

//   // correction for SPD y-shift
//   if (voluid>=2048 && voluid<4256) {
//     TGeoHMatrix deltay;
//     double dy[3]={0.,0.0081,0.};
//     deltay.SetTranslation(dy);
//     fSensVolModifMatrix->MultiplyLeft( &deltay );
//     fSensVolModifMatrix->Multiply( &deltay.Inverse() );
//   }
//   if (!fTempAlignObj->SetMatrix(*fSensVolModifMatrix)) return NULL;
//   fTempAlignObj->SetVolUID(voluid);
//   fTempAlignObj->SetSymName(AliGeomManager::SymName(voluid));

  
//   //fTempAlignObj->Print("");

//   return fTempAlignObj;
// }
// //-------------------------------------------------------------


//-------------------------------------------------------------
AliAlignObjParams *AliITSAlignMilleModule::GetSensitiveVolumeGlobalMisalignment(UShort_t voluid, const Double_t * const deltalocal)
{
  // calculate misalignment of sens.vol. 'voluid' according with a displacement 'deltalocal'
  // of the mother volume. The misalignment is returned as AliAlignObjParams object

  if (!IsIn(voluid)) return NULL;
  if (!gGeoManager) return NULL;
  
  // prepare the TGeoHMatrix
  Double_t tr[3],ang[3];
  tr[0]=deltalocal[0]; // in centimeter
  tr[1]=deltalocal[1]; 
  tr[2]=deltalocal[2];
  ang[0]=deltalocal[3]; // psi   (X)  in deg
  ang[1]=deltalocal[4]; // theta (Y)
  ang[2]=deltalocal[5]; // phi   (Z)

  // reset align object (may not be needed...)
  fTempAlignObj->SetTranslation(0,0,0);
  fTempAlignObj->SetRotation(0,0,0);

  fTempAlignObj->SetRotation(ang[0],ang[1],ang[2]);
  fTempAlignObj->SetTranslation(tr[0],tr[1],tr[2]);
  AliDebug(3,Form("Delta angles: psi=%f  theta=%f   phi=%f",ang[0],ang[1],ang[2]));

  // Gsv = Gg * Gg-1 * Gsv   -> Lsv,g = Gg-1 * Gsv
  // G'sv = Gg * Dg * Lsv,g === DGsv * Gsv 
  //
  // => DGsv = (Gg * Dg * Gg-1)
  //

  // prepare the Delta matrix Dg
  TGeoHMatrix dg;
  fTempAlignObj->GetMatrix(dg);
  //dg.Print();

  dg.MultiplyLeft( fMatrix );
  dg.Multiply( &fMatrix->Inverse() );

  // reset align object (may not be needed...)
  fTempAlignObj->SetTranslation(0,0,0);
  fTempAlignObj->SetRotation(0,0,0);

  fTempAlignObj->SetVolUID(voluid);
  fTempAlignObj->SetSymName(AliGeomManager::SymName(voluid));

  if (!fTempAlignObj->SetMatrix(dg)) return NULL;
  
  //fTempAlignObj->Print("");

  return fTempAlignObj;
}
//-------------------------------------------------------------

TGeoHMatrix *AliITSAlignMilleModule::GetSensitiveVolumeMatrix(UShort_t voluid)
{
  // return TGeoHMatrix of the sens.vol. 'voluid' in the current geometry
  if (SensVolMatrix(voluid,fSensVolMatrix)) return NULL;
  return fSensVolMatrix;
}
//-------------------------------------------------------------
TGeoHMatrix *AliITSAlignMilleModule::GetSensitiveVolumeOrigGlobalMatrix(UShort_t voluid)
{
  // return original ideal position (from AliGeomManager::GetOrigGlobalMatrix())
  if (SensVolOrigGlobalMatrix(voluid,fSensVolMatrix)) return NULL;
  return fSensVolMatrix;
}
//-------------------------------------------------------------
Int_t AliITSAlignMilleModule::SensVolMatrix(UShort_t volid, TGeoHMatrix *m) 
{
  // set matrix for sensitive modules (SPD corrected)
  // return 0 if success
  Double_t rot[9];
  Int_t idx=GetIndexFromVolumeID(volid);
  if (idx<0) return -1;
  if (!AliITSgeomTGeo::GetRotation(idx,rot)) return -2;
  m->SetRotation(rot);
  Double_t oLoc[3]={0,0,0};
  Double_t oGlo[3]={0,0,0};
  if (!AliITSgeomTGeo::LocalToGlobal(idx,oLoc,oGlo)) return -3;
  m->SetTranslation(oGlo);
  return 0;
}
//-------------------------------------------------------------
Int_t AliITSAlignMilleModule::SensVolOrigGlobalMatrix(UShort_t volid, TGeoHMatrix *m) 
{
  // set original global matrix for sensitive modules (SPD corrected)
  // return 0 if success
  Int_t idx=GetIndexFromVolumeID(volid);
  if (idx<0) return -1;
  TGeoHMatrix mo;
  if (!AliGeomManager::GetOrigGlobalMatrix(AliGeomManager::SymName(volid),mo)) return -1;

  (*m)=mo;

  // SPD y-shift by 81 mu
  if (volid<5000) { 
    Double_t oLoc[3]={0.0,0.0081,0.0};
    Double_t oGlo[3]={0,0,0};
    m->LocalToMaster(oLoc,oGlo);
    m->SetTranslation(oGlo);
  }
  return 0;
}
//-------------------------------------------------------------
UShort_t AliITSAlignMilleModule::GetVolumeIDFromSymname(const Char_t *symname) {
  /// volume ID from symname
  if (!symname) return 0;

  for (UShort_t voluid=2000; voluid<13300; voluid++) {
    Int_t modId;
    AliGeomManager::ELayerID layerId = AliGeomManager::VolUIDToLayer(voluid,modId);
    if (layerId>0 && layerId<7 && modId>=0 && modId<AliGeomManager::LayerSize(layerId)) {
      if (!strcmp(symname,AliGeomManager::SymName(layerId,modId))) return voluid;
    }
  }

  return 0;
}

UShort_t AliITSAlignMilleModule::GetVolumeIDFromIndex(Int_t index) {
  /// volume ID from index
  if (index<0 || index>2197) return 0;
  return GetVolumeIDFromSymname(AliITSgeomTGeo::GetSymName(index));
}
//-------------------------------------------------------------
void AliITSAlignMilleModule::Print(Option_t*) const 
{
  ///
  printf("*** ITS SuperModule for AliITSAlignMille ***\n");
  printf("symname  : %s\n",GetName());
  printf("volumeID : %d\n",fVolumeID);
  printf("index    : %d\n",fIndex);
  fMatrix->Print();
  printf("number of sensitive modules : %d\n",fNSensVol);
  for (Int_t i=0; i<fNSensVol; i++) printf("   voluid[%d] = %d\n",i,fSensVolVolumeID[i]);
}
//_____________________________________________________________________________
AliITSAlignMilleModule::AliITSAlignMilleModule(const AliITSAlignMilleModule &m) :
  TNamed(m),
  fNSensVol(m.fNSensVol),
  fIndex(m.fIndex),
  fVolumeID(m.fVolumeID),
  fMatrix(new TGeoHMatrix(*m.GetMatrix())),
  fSensVolMatrix(new TGeoHMatrix),
  fSensVolModifMatrix(new TGeoHMatrix),
  fTempAlignObj(new AliAlignObjParams)
{
  // Copy constructor
  for(Int_t k=0; k<fgkSensModules; k++){
    fSensVolIndex[k] = 0;
    fSensVolVolumeID[k] = 0;
  }
  for (int i=0; i<fNSensVol; i++) {
    fSensVolIndex[i]=m.fSensVolIndex[i];
    fSensVolVolumeID[i]=m.fSensVolVolumeID[i];
  }
}
//_____________________________________________________________________________
AliITSAlignMilleModule& AliITSAlignMilleModule::operator=(const AliITSAlignMilleModule &m)  
{
  // operator =
  //
  if(this==&m) return *this;
  ((TNamed *)this)->operator=(m);
  
  fNSensVol=m.fNSensVol;
  fIndex=m.fIndex;
  fVolumeID=m.fVolumeID;
  delete fMatrix;
  fMatrix=new TGeoHMatrix(*m.GetMatrix());
  for (int i=0; i<fNSensVol; i++) {
    fSensVolIndex[i]=m.fSensVolIndex[i];
    fSensVolVolumeID[i]=m.fSensVolVolumeID[i];
  }
  return *this;
}

//_____________________________________________________________________________


 AliITSAlignMilleModule.cxx:1
 AliITSAlignMilleModule.cxx:2
 AliITSAlignMilleModule.cxx:3
 AliITSAlignMilleModule.cxx:4
 AliITSAlignMilleModule.cxx:5
 AliITSAlignMilleModule.cxx:6
 AliITSAlignMilleModule.cxx:7
 AliITSAlignMilleModule.cxx:8
 AliITSAlignMilleModule.cxx:9
 AliITSAlignMilleModule.cxx:10
 AliITSAlignMilleModule.cxx:11
 AliITSAlignMilleModule.cxx:12
 AliITSAlignMilleModule.cxx:13
 AliITSAlignMilleModule.cxx:14
 AliITSAlignMilleModule.cxx:15
 AliITSAlignMilleModule.cxx:16
 AliITSAlignMilleModule.cxx:17
 AliITSAlignMilleModule.cxx:18
 AliITSAlignMilleModule.cxx:19
 AliITSAlignMilleModule.cxx:20
 AliITSAlignMilleModule.cxx:21
 AliITSAlignMilleModule.cxx:22
 AliITSAlignMilleModule.cxx:23
 AliITSAlignMilleModule.cxx:24
 AliITSAlignMilleModule.cxx:25
 AliITSAlignMilleModule.cxx:26
 AliITSAlignMilleModule.cxx:27
 AliITSAlignMilleModule.cxx:28
 AliITSAlignMilleModule.cxx:29
 AliITSAlignMilleModule.cxx:30
 AliITSAlignMilleModule.cxx:31
 AliITSAlignMilleModule.cxx:32
 AliITSAlignMilleModule.cxx:33
 AliITSAlignMilleModule.cxx:34
 AliITSAlignMilleModule.cxx:35
 AliITSAlignMilleModule.cxx:36
 AliITSAlignMilleModule.cxx:37
 AliITSAlignMilleModule.cxx:38
 AliITSAlignMilleModule.cxx:39
 AliITSAlignMilleModule.cxx:40
 AliITSAlignMilleModule.cxx:41
 AliITSAlignMilleModule.cxx:42
 AliITSAlignMilleModule.cxx:43
 AliITSAlignMilleModule.cxx:44
 AliITSAlignMilleModule.cxx:45
 AliITSAlignMilleModule.cxx:46
 AliITSAlignMilleModule.cxx:47
 AliITSAlignMilleModule.cxx:48
 AliITSAlignMilleModule.cxx:49
 AliITSAlignMilleModule.cxx:50
 AliITSAlignMilleModule.cxx:51
 AliITSAlignMilleModule.cxx:52
 AliITSAlignMilleModule.cxx:53
 AliITSAlignMilleModule.cxx:54
 AliITSAlignMilleModule.cxx:55
 AliITSAlignMilleModule.cxx:56
 AliITSAlignMilleModule.cxx:57
 AliITSAlignMilleModule.cxx:58
 AliITSAlignMilleModule.cxx:59
 AliITSAlignMilleModule.cxx:60
 AliITSAlignMilleModule.cxx:61
 AliITSAlignMilleModule.cxx:62
 AliITSAlignMilleModule.cxx:63
 AliITSAlignMilleModule.cxx:64
 AliITSAlignMilleModule.cxx:65
 AliITSAlignMilleModule.cxx:66
 AliITSAlignMilleModule.cxx:67
 AliITSAlignMilleModule.cxx:68
 AliITSAlignMilleModule.cxx:69
 AliITSAlignMilleModule.cxx:70
 AliITSAlignMilleModule.cxx:71
 AliITSAlignMilleModule.cxx:72
 AliITSAlignMilleModule.cxx:73
 AliITSAlignMilleModule.cxx:74
 AliITSAlignMilleModule.cxx:75
 AliITSAlignMilleModule.cxx:76
 AliITSAlignMilleModule.cxx:77
 AliITSAlignMilleModule.cxx:78
 AliITSAlignMilleModule.cxx:79
 AliITSAlignMilleModule.cxx:80
 AliITSAlignMilleModule.cxx:81
 AliITSAlignMilleModule.cxx:82
 AliITSAlignMilleModule.cxx:83
 AliITSAlignMilleModule.cxx:84
 AliITSAlignMilleModule.cxx:85
 AliITSAlignMilleModule.cxx:86
 AliITSAlignMilleModule.cxx:87
 AliITSAlignMilleModule.cxx:88
 AliITSAlignMilleModule.cxx:89
 AliITSAlignMilleModule.cxx:90
 AliITSAlignMilleModule.cxx:91
 AliITSAlignMilleModule.cxx:92
 AliITSAlignMilleModule.cxx:93
 AliITSAlignMilleModule.cxx:94
 AliITSAlignMilleModule.cxx:95
 AliITSAlignMilleModule.cxx:96
 AliITSAlignMilleModule.cxx:97
 AliITSAlignMilleModule.cxx:98
 AliITSAlignMilleModule.cxx:99
 AliITSAlignMilleModule.cxx:100
 AliITSAlignMilleModule.cxx:101
 AliITSAlignMilleModule.cxx:102
 AliITSAlignMilleModule.cxx:103
 AliITSAlignMilleModule.cxx:104
 AliITSAlignMilleModule.cxx:105
 AliITSAlignMilleModule.cxx:106
 AliITSAlignMilleModule.cxx:107
 AliITSAlignMilleModule.cxx:108
 AliITSAlignMilleModule.cxx:109
 AliITSAlignMilleModule.cxx:110
 AliITSAlignMilleModule.cxx:111
 AliITSAlignMilleModule.cxx:112
 AliITSAlignMilleModule.cxx:113
 AliITSAlignMilleModule.cxx:114
 AliITSAlignMilleModule.cxx:115
 AliITSAlignMilleModule.cxx:116
 AliITSAlignMilleModule.cxx:117
 AliITSAlignMilleModule.cxx:118
 AliITSAlignMilleModule.cxx:119
 AliITSAlignMilleModule.cxx:120
 AliITSAlignMilleModule.cxx:121
 AliITSAlignMilleModule.cxx:122
 AliITSAlignMilleModule.cxx:123
 AliITSAlignMilleModule.cxx:124
 AliITSAlignMilleModule.cxx:125
 AliITSAlignMilleModule.cxx:126
 AliITSAlignMilleModule.cxx:127
 AliITSAlignMilleModule.cxx:128
 AliITSAlignMilleModule.cxx:129
 AliITSAlignMilleModule.cxx:130
 AliITSAlignMilleModule.cxx:131
 AliITSAlignMilleModule.cxx:132
 AliITSAlignMilleModule.cxx:133
 AliITSAlignMilleModule.cxx:134
 AliITSAlignMilleModule.cxx:135
 AliITSAlignMilleModule.cxx:136
 AliITSAlignMilleModule.cxx:137
 AliITSAlignMilleModule.cxx:138
 AliITSAlignMilleModule.cxx:139
 AliITSAlignMilleModule.cxx:140
 AliITSAlignMilleModule.cxx:141
 AliITSAlignMilleModule.cxx:142
 AliITSAlignMilleModule.cxx:143
 AliITSAlignMilleModule.cxx:144
 AliITSAlignMilleModule.cxx:145
 AliITSAlignMilleModule.cxx:146
 AliITSAlignMilleModule.cxx:147
 AliITSAlignMilleModule.cxx:148
 AliITSAlignMilleModule.cxx:149
 AliITSAlignMilleModule.cxx:150
 AliITSAlignMilleModule.cxx:151
 AliITSAlignMilleModule.cxx:152
 AliITSAlignMilleModule.cxx:153
 AliITSAlignMilleModule.cxx:154
 AliITSAlignMilleModule.cxx:155
 AliITSAlignMilleModule.cxx:156
 AliITSAlignMilleModule.cxx:157
 AliITSAlignMilleModule.cxx:158
 AliITSAlignMilleModule.cxx:159
 AliITSAlignMilleModule.cxx:160
 AliITSAlignMilleModule.cxx:161
 AliITSAlignMilleModule.cxx:162
 AliITSAlignMilleModule.cxx:163
 AliITSAlignMilleModule.cxx:164
 AliITSAlignMilleModule.cxx:165
 AliITSAlignMilleModule.cxx:166
 AliITSAlignMilleModule.cxx:167
 AliITSAlignMilleModule.cxx:168
 AliITSAlignMilleModule.cxx:169
 AliITSAlignMilleModule.cxx:170
 AliITSAlignMilleModule.cxx:171
 AliITSAlignMilleModule.cxx:172
 AliITSAlignMilleModule.cxx:173
 AliITSAlignMilleModule.cxx:174
 AliITSAlignMilleModule.cxx:175
 AliITSAlignMilleModule.cxx:176
 AliITSAlignMilleModule.cxx:177
 AliITSAlignMilleModule.cxx:178
 AliITSAlignMilleModule.cxx:179
 AliITSAlignMilleModule.cxx:180
 AliITSAlignMilleModule.cxx:181
 AliITSAlignMilleModule.cxx:182
 AliITSAlignMilleModule.cxx:183
 AliITSAlignMilleModule.cxx:184
 AliITSAlignMilleModule.cxx:185
 AliITSAlignMilleModule.cxx:186
 AliITSAlignMilleModule.cxx:187
 AliITSAlignMilleModule.cxx:188
 AliITSAlignMilleModule.cxx:189
 AliITSAlignMilleModule.cxx:190
 AliITSAlignMilleModule.cxx:191
 AliITSAlignMilleModule.cxx:192
 AliITSAlignMilleModule.cxx:193
 AliITSAlignMilleModule.cxx:194
 AliITSAlignMilleModule.cxx:195
 AliITSAlignMilleModule.cxx:196
 AliITSAlignMilleModule.cxx:197
 AliITSAlignMilleModule.cxx:198
 AliITSAlignMilleModule.cxx:199
 AliITSAlignMilleModule.cxx:200
 AliITSAlignMilleModule.cxx:201
 AliITSAlignMilleModule.cxx:202
 AliITSAlignMilleModule.cxx:203
 AliITSAlignMilleModule.cxx:204
 AliITSAlignMilleModule.cxx:205
 AliITSAlignMilleModule.cxx:206
 AliITSAlignMilleModule.cxx:207
 AliITSAlignMilleModule.cxx:208
 AliITSAlignMilleModule.cxx:209
 AliITSAlignMilleModule.cxx:210
 AliITSAlignMilleModule.cxx:211
 AliITSAlignMilleModule.cxx:212
 AliITSAlignMilleModule.cxx:213
 AliITSAlignMilleModule.cxx:214
 AliITSAlignMilleModule.cxx:215
 AliITSAlignMilleModule.cxx:216
 AliITSAlignMilleModule.cxx:217
 AliITSAlignMilleModule.cxx:218
 AliITSAlignMilleModule.cxx:219
 AliITSAlignMilleModule.cxx:220
 AliITSAlignMilleModule.cxx:221
 AliITSAlignMilleModule.cxx:222
 AliITSAlignMilleModule.cxx:223
 AliITSAlignMilleModule.cxx:224
 AliITSAlignMilleModule.cxx:225
 AliITSAlignMilleModule.cxx:226
 AliITSAlignMilleModule.cxx:227
 AliITSAlignMilleModule.cxx:228
 AliITSAlignMilleModule.cxx:229
 AliITSAlignMilleModule.cxx:230
 AliITSAlignMilleModule.cxx:231
 AliITSAlignMilleModule.cxx:232
 AliITSAlignMilleModule.cxx:233
 AliITSAlignMilleModule.cxx:234
 AliITSAlignMilleModule.cxx:235
 AliITSAlignMilleModule.cxx:236
 AliITSAlignMilleModule.cxx:237
 AliITSAlignMilleModule.cxx:238
 AliITSAlignMilleModule.cxx:239
 AliITSAlignMilleModule.cxx:240
 AliITSAlignMilleModule.cxx:241
 AliITSAlignMilleModule.cxx:242
 AliITSAlignMilleModule.cxx:243
 AliITSAlignMilleModule.cxx:244
 AliITSAlignMilleModule.cxx:245
 AliITSAlignMilleModule.cxx:246
 AliITSAlignMilleModule.cxx:247
 AliITSAlignMilleModule.cxx:248
 AliITSAlignMilleModule.cxx:249
 AliITSAlignMilleModule.cxx:250
 AliITSAlignMilleModule.cxx:251
 AliITSAlignMilleModule.cxx:252
 AliITSAlignMilleModule.cxx:253
 AliITSAlignMilleModule.cxx:254
 AliITSAlignMilleModule.cxx:255
 AliITSAlignMilleModule.cxx:256
 AliITSAlignMilleModule.cxx:257
 AliITSAlignMilleModule.cxx:258
 AliITSAlignMilleModule.cxx:259
 AliITSAlignMilleModule.cxx:260
 AliITSAlignMilleModule.cxx:261
 AliITSAlignMilleModule.cxx:262
 AliITSAlignMilleModule.cxx:263
 AliITSAlignMilleModule.cxx:264
 AliITSAlignMilleModule.cxx:265
 AliITSAlignMilleModule.cxx:266
 AliITSAlignMilleModule.cxx:267
 AliITSAlignMilleModule.cxx:268
 AliITSAlignMilleModule.cxx:269
 AliITSAlignMilleModule.cxx:270
 AliITSAlignMilleModule.cxx:271
 AliITSAlignMilleModule.cxx:272
 AliITSAlignMilleModule.cxx:273
 AliITSAlignMilleModule.cxx:274
 AliITSAlignMilleModule.cxx:275
 AliITSAlignMilleModule.cxx:276
 AliITSAlignMilleModule.cxx:277
 AliITSAlignMilleModule.cxx:278
 AliITSAlignMilleModule.cxx:279
 AliITSAlignMilleModule.cxx:280
 AliITSAlignMilleModule.cxx:281
 AliITSAlignMilleModule.cxx:282
 AliITSAlignMilleModule.cxx:283
 AliITSAlignMilleModule.cxx:284
 AliITSAlignMilleModule.cxx:285
 AliITSAlignMilleModule.cxx:286
 AliITSAlignMilleModule.cxx:287
 AliITSAlignMilleModule.cxx:288
 AliITSAlignMilleModule.cxx:289
 AliITSAlignMilleModule.cxx:290
 AliITSAlignMilleModule.cxx:291
 AliITSAlignMilleModule.cxx:292
 AliITSAlignMilleModule.cxx:293
 AliITSAlignMilleModule.cxx:294
 AliITSAlignMilleModule.cxx:295
 AliITSAlignMilleModule.cxx:296
 AliITSAlignMilleModule.cxx:297
 AliITSAlignMilleModule.cxx:298
 AliITSAlignMilleModule.cxx:299
 AliITSAlignMilleModule.cxx:300
 AliITSAlignMilleModule.cxx:301
 AliITSAlignMilleModule.cxx:302
 AliITSAlignMilleModule.cxx:303
 AliITSAlignMilleModule.cxx:304
 AliITSAlignMilleModule.cxx:305
 AliITSAlignMilleModule.cxx:306
 AliITSAlignMilleModule.cxx:307
 AliITSAlignMilleModule.cxx:308
 AliITSAlignMilleModule.cxx:309
 AliITSAlignMilleModule.cxx:310
 AliITSAlignMilleModule.cxx:311
 AliITSAlignMilleModule.cxx:312
 AliITSAlignMilleModule.cxx:313
 AliITSAlignMilleModule.cxx:314
 AliITSAlignMilleModule.cxx:315
 AliITSAlignMilleModule.cxx:316
 AliITSAlignMilleModule.cxx:317
 AliITSAlignMilleModule.cxx:318
 AliITSAlignMilleModule.cxx:319
 AliITSAlignMilleModule.cxx:320
 AliITSAlignMilleModule.cxx:321
 AliITSAlignMilleModule.cxx:322
 AliITSAlignMilleModule.cxx:323
 AliITSAlignMilleModule.cxx:324
 AliITSAlignMilleModule.cxx:325
 AliITSAlignMilleModule.cxx:326
 AliITSAlignMilleModule.cxx:327
 AliITSAlignMilleModule.cxx:328
 AliITSAlignMilleModule.cxx:329
 AliITSAlignMilleModule.cxx:330
 AliITSAlignMilleModule.cxx:331
 AliITSAlignMilleModule.cxx:332
 AliITSAlignMilleModule.cxx:333
 AliITSAlignMilleModule.cxx:334
 AliITSAlignMilleModule.cxx:335
 AliITSAlignMilleModule.cxx:336
 AliITSAlignMilleModule.cxx:337
 AliITSAlignMilleModule.cxx:338
 AliITSAlignMilleModule.cxx:339
 AliITSAlignMilleModule.cxx:340
 AliITSAlignMilleModule.cxx:341
 AliITSAlignMilleModule.cxx:342
 AliITSAlignMilleModule.cxx:343
 AliITSAlignMilleModule.cxx:344
 AliITSAlignMilleModule.cxx:345
 AliITSAlignMilleModule.cxx:346
 AliITSAlignMilleModule.cxx:347
 AliITSAlignMilleModule.cxx:348
 AliITSAlignMilleModule.cxx:349
 AliITSAlignMilleModule.cxx:350
 AliITSAlignMilleModule.cxx:351
 AliITSAlignMilleModule.cxx:352
 AliITSAlignMilleModule.cxx:353
 AliITSAlignMilleModule.cxx:354
 AliITSAlignMilleModule.cxx:355
 AliITSAlignMilleModule.cxx:356
 AliITSAlignMilleModule.cxx:357
 AliITSAlignMilleModule.cxx:358
 AliITSAlignMilleModule.cxx:359
 AliITSAlignMilleModule.cxx:360
 AliITSAlignMilleModule.cxx:361
 AliITSAlignMilleModule.cxx:362
 AliITSAlignMilleModule.cxx:363
 AliITSAlignMilleModule.cxx:364
 AliITSAlignMilleModule.cxx:365
 AliITSAlignMilleModule.cxx:366
 AliITSAlignMilleModule.cxx:367
 AliITSAlignMilleModule.cxx:368
 AliITSAlignMilleModule.cxx:369
 AliITSAlignMilleModule.cxx:370
 AliITSAlignMilleModule.cxx:371
 AliITSAlignMilleModule.cxx:372
 AliITSAlignMilleModule.cxx:373
 AliITSAlignMilleModule.cxx:374
 AliITSAlignMilleModule.cxx:375
 AliITSAlignMilleModule.cxx:376
 AliITSAlignMilleModule.cxx:377
 AliITSAlignMilleModule.cxx:378
 AliITSAlignMilleModule.cxx:379
 AliITSAlignMilleModule.cxx:380
 AliITSAlignMilleModule.cxx:381
 AliITSAlignMilleModule.cxx:382
 AliITSAlignMilleModule.cxx:383
 AliITSAlignMilleModule.cxx:384
 AliITSAlignMilleModule.cxx:385
 AliITSAlignMilleModule.cxx:386
 AliITSAlignMilleModule.cxx:387
 AliITSAlignMilleModule.cxx:388
 AliITSAlignMilleModule.cxx:389
 AliITSAlignMilleModule.cxx:390
 AliITSAlignMilleModule.cxx:391
 AliITSAlignMilleModule.cxx:392
 AliITSAlignMilleModule.cxx:393
 AliITSAlignMilleModule.cxx:394
 AliITSAlignMilleModule.cxx:395
 AliITSAlignMilleModule.cxx:396
 AliITSAlignMilleModule.cxx:397
 AliITSAlignMilleModule.cxx:398
 AliITSAlignMilleModule.cxx:399
 AliITSAlignMilleModule.cxx:400
 AliITSAlignMilleModule.cxx:401
 AliITSAlignMilleModule.cxx:402
 AliITSAlignMilleModule.cxx:403
 AliITSAlignMilleModule.cxx:404
 AliITSAlignMilleModule.cxx:405
 AliITSAlignMilleModule.cxx:406
 AliITSAlignMilleModule.cxx:407
 AliITSAlignMilleModule.cxx:408
 AliITSAlignMilleModule.cxx:409
 AliITSAlignMilleModule.cxx:410
 AliITSAlignMilleModule.cxx:411
 AliITSAlignMilleModule.cxx:412
 AliITSAlignMilleModule.cxx:413
 AliITSAlignMilleModule.cxx:414
 AliITSAlignMilleModule.cxx:415
 AliITSAlignMilleModule.cxx:416
 AliITSAlignMilleModule.cxx:417
 AliITSAlignMilleModule.cxx:418
 AliITSAlignMilleModule.cxx:419
 AliITSAlignMilleModule.cxx:420
 AliITSAlignMilleModule.cxx:421
 AliITSAlignMilleModule.cxx:422
 AliITSAlignMilleModule.cxx:423
 AliITSAlignMilleModule.cxx:424
 AliITSAlignMilleModule.cxx:425
 AliITSAlignMilleModule.cxx:426
 AliITSAlignMilleModule.cxx:427
 AliITSAlignMilleModule.cxx:428
 AliITSAlignMilleModule.cxx:429
 AliITSAlignMilleModule.cxx:430
 AliITSAlignMilleModule.cxx:431
 AliITSAlignMilleModule.cxx:432
 AliITSAlignMilleModule.cxx:433
 AliITSAlignMilleModule.cxx:434
 AliITSAlignMilleModule.cxx:435
 AliITSAlignMilleModule.cxx:436
 AliITSAlignMilleModule.cxx:437
 AliITSAlignMilleModule.cxx:438
 AliITSAlignMilleModule.cxx:439
 AliITSAlignMilleModule.cxx:440
 AliITSAlignMilleModule.cxx:441
 AliITSAlignMilleModule.cxx:442
 AliITSAlignMilleModule.cxx:443
 AliITSAlignMilleModule.cxx:444
 AliITSAlignMilleModule.cxx:445
 AliITSAlignMilleModule.cxx:446
 AliITSAlignMilleModule.cxx:447
 AliITSAlignMilleModule.cxx:448
 AliITSAlignMilleModule.cxx:449
 AliITSAlignMilleModule.cxx:450
 AliITSAlignMilleModule.cxx:451
 AliITSAlignMilleModule.cxx:452
 AliITSAlignMilleModule.cxx:453
 AliITSAlignMilleModule.cxx:454
 AliITSAlignMilleModule.cxx:455
 AliITSAlignMilleModule.cxx:456
 AliITSAlignMilleModule.cxx:457
 AliITSAlignMilleModule.cxx:458
 AliITSAlignMilleModule.cxx:459
 AliITSAlignMilleModule.cxx:460
 AliITSAlignMilleModule.cxx:461
 AliITSAlignMilleModule.cxx:462
 AliITSAlignMilleModule.cxx:463
 AliITSAlignMilleModule.cxx:464
 AliITSAlignMilleModule.cxx:465
 AliITSAlignMilleModule.cxx:466
 AliITSAlignMilleModule.cxx:467
 AliITSAlignMilleModule.cxx:468
 AliITSAlignMilleModule.cxx:469
 AliITSAlignMilleModule.cxx:470
 AliITSAlignMilleModule.cxx:471
 AliITSAlignMilleModule.cxx:472
 AliITSAlignMilleModule.cxx:473
 AliITSAlignMilleModule.cxx:474
 AliITSAlignMilleModule.cxx:475
 AliITSAlignMilleModule.cxx:476
 AliITSAlignMilleModule.cxx:477
 AliITSAlignMilleModule.cxx:478
 AliITSAlignMilleModule.cxx:479
 AliITSAlignMilleModule.cxx:480
 AliITSAlignMilleModule.cxx:481
 AliITSAlignMilleModule.cxx:482
 AliITSAlignMilleModule.cxx:483
 AliITSAlignMilleModule.cxx:484
 AliITSAlignMilleModule.cxx:485
 AliITSAlignMilleModule.cxx:486
 AliITSAlignMilleModule.cxx:487
 AliITSAlignMilleModule.cxx:488
 AliITSAlignMilleModule.cxx:489
 AliITSAlignMilleModule.cxx:490
 AliITSAlignMilleModule.cxx:491
 AliITSAlignMilleModule.cxx:492
 AliITSAlignMilleModule.cxx:493
 AliITSAlignMilleModule.cxx:494
 AliITSAlignMilleModule.cxx:495
 AliITSAlignMilleModule.cxx:496
 AliITSAlignMilleModule.cxx:497
 AliITSAlignMilleModule.cxx:498
 AliITSAlignMilleModule.cxx:499
 AliITSAlignMilleModule.cxx:500
 AliITSAlignMilleModule.cxx:501
 AliITSAlignMilleModule.cxx:502
 AliITSAlignMilleModule.cxx:503
 AliITSAlignMilleModule.cxx:504
 AliITSAlignMilleModule.cxx:505
 AliITSAlignMilleModule.cxx:506
 AliITSAlignMilleModule.cxx:507
 AliITSAlignMilleModule.cxx:508
 AliITSAlignMilleModule.cxx:509
 AliITSAlignMilleModule.cxx:510
 AliITSAlignMilleModule.cxx:511
 AliITSAlignMilleModule.cxx:512
 AliITSAlignMilleModule.cxx:513
 AliITSAlignMilleModule.cxx:514
 AliITSAlignMilleModule.cxx:515
 AliITSAlignMilleModule.cxx:516
 AliITSAlignMilleModule.cxx:517
 AliITSAlignMilleModule.cxx:518
 AliITSAlignMilleModule.cxx:519
 AliITSAlignMilleModule.cxx:520
 AliITSAlignMilleModule.cxx:521
 AliITSAlignMilleModule.cxx:522
 AliITSAlignMilleModule.cxx:523
 AliITSAlignMilleModule.cxx:524
 AliITSAlignMilleModule.cxx:525
 AliITSAlignMilleModule.cxx:526
 AliITSAlignMilleModule.cxx:527
 AliITSAlignMilleModule.cxx:528
 AliITSAlignMilleModule.cxx:529
 AliITSAlignMilleModule.cxx:530
 AliITSAlignMilleModule.cxx:531
 AliITSAlignMilleModule.cxx:532
 AliITSAlignMilleModule.cxx:533
 AliITSAlignMilleModule.cxx:534
 AliITSAlignMilleModule.cxx:535
 AliITSAlignMilleModule.cxx:536
 AliITSAlignMilleModule.cxx:537
 AliITSAlignMilleModule.cxx:538
 AliITSAlignMilleModule.cxx:539
 AliITSAlignMilleModule.cxx:540
 AliITSAlignMilleModule.cxx:541
 AliITSAlignMilleModule.cxx:542
 AliITSAlignMilleModule.cxx:543
 AliITSAlignMilleModule.cxx:544
 AliITSAlignMilleModule.cxx:545
 AliITSAlignMilleModule.cxx:546
 AliITSAlignMilleModule.cxx:547
 AliITSAlignMilleModule.cxx:548
 AliITSAlignMilleModule.cxx:549
 AliITSAlignMilleModule.cxx:550
 AliITSAlignMilleModule.cxx:551
 AliITSAlignMilleModule.cxx:552
 AliITSAlignMilleModule.cxx:553
 AliITSAlignMilleModule.cxx:554
 AliITSAlignMilleModule.cxx:555
 AliITSAlignMilleModule.cxx:556
 AliITSAlignMilleModule.cxx:557
 AliITSAlignMilleModule.cxx:558
 AliITSAlignMilleModule.cxx:559
 AliITSAlignMilleModule.cxx:560
 AliITSAlignMilleModule.cxx:561
 AliITSAlignMilleModule.cxx:562
 AliITSAlignMilleModule.cxx:563
 AliITSAlignMilleModule.cxx:564
 AliITSAlignMilleModule.cxx:565
 AliITSAlignMilleModule.cxx:566
 AliITSAlignMilleModule.cxx:567
 AliITSAlignMilleModule.cxx:568
 AliITSAlignMilleModule.cxx:569
 AliITSAlignMilleModule.cxx:570
 AliITSAlignMilleModule.cxx:571
 AliITSAlignMilleModule.cxx:572
 AliITSAlignMilleModule.cxx:573
 AliITSAlignMilleModule.cxx:574
 AliITSAlignMilleModule.cxx:575
 AliITSAlignMilleModule.cxx:576
 AliITSAlignMilleModule.cxx:577
 AliITSAlignMilleModule.cxx:578
 AliITSAlignMilleModule.cxx:579
 AliITSAlignMilleModule.cxx:580
 AliITSAlignMilleModule.cxx:581
 AliITSAlignMilleModule.cxx:582
 AliITSAlignMilleModule.cxx:583
 AliITSAlignMilleModule.cxx:584
 AliITSAlignMilleModule.cxx:585
 AliITSAlignMilleModule.cxx:586
 AliITSAlignMilleModule.cxx:587
 AliITSAlignMilleModule.cxx:588
 AliITSAlignMilleModule.cxx:589
 AliITSAlignMilleModule.cxx:590
 AliITSAlignMilleModule.cxx:591
 AliITSAlignMilleModule.cxx:592
 AliITSAlignMilleModule.cxx:593
 AliITSAlignMilleModule.cxx:594
 AliITSAlignMilleModule.cxx:595
 AliITSAlignMilleModule.cxx:596
 AliITSAlignMilleModule.cxx:597
 AliITSAlignMilleModule.cxx:598
 AliITSAlignMilleModule.cxx:599
 AliITSAlignMilleModule.cxx:600
 AliITSAlignMilleModule.cxx:601
 AliITSAlignMilleModule.cxx:602
 AliITSAlignMilleModule.cxx:603
 AliITSAlignMilleModule.cxx:604
 AliITSAlignMilleModule.cxx:605
 AliITSAlignMilleModule.cxx:606
 AliITSAlignMilleModule.cxx:607
 AliITSAlignMilleModule.cxx:608
 AliITSAlignMilleModule.cxx:609
 AliITSAlignMilleModule.cxx:610
 AliITSAlignMilleModule.cxx:611
 AliITSAlignMilleModule.cxx:612
 AliITSAlignMilleModule.cxx:613
 AliITSAlignMilleModule.cxx:614
 AliITSAlignMilleModule.cxx:615
 AliITSAlignMilleModule.cxx:616
 AliITSAlignMilleModule.cxx:617
 AliITSAlignMilleModule.cxx:618
 AliITSAlignMilleModule.cxx:619
 AliITSAlignMilleModule.cxx:620
 AliITSAlignMilleModule.cxx:621
 AliITSAlignMilleModule.cxx:622
 AliITSAlignMilleModule.cxx:623
 AliITSAlignMilleModule.cxx:624
 AliITSAlignMilleModule.cxx:625
 AliITSAlignMilleModule.cxx:626
 AliITSAlignMilleModule.cxx:627
 AliITSAlignMilleModule.cxx:628
 AliITSAlignMilleModule.cxx:629
 AliITSAlignMilleModule.cxx:630
 AliITSAlignMilleModule.cxx:631
 AliITSAlignMilleModule.cxx:632
 AliITSAlignMilleModule.cxx:633
 AliITSAlignMilleModule.cxx:634
 AliITSAlignMilleModule.cxx:635
 AliITSAlignMilleModule.cxx:636
 AliITSAlignMilleModule.cxx:637
 AliITSAlignMilleModule.cxx:638
 AliITSAlignMilleModule.cxx:639
 AliITSAlignMilleModule.cxx:640
 AliITSAlignMilleModule.cxx:641
 AliITSAlignMilleModule.cxx:642
 AliITSAlignMilleModule.cxx:643
 AliITSAlignMilleModule.cxx:644
 AliITSAlignMilleModule.cxx:645
 AliITSAlignMilleModule.cxx:646
 AliITSAlignMilleModule.cxx:647
 AliITSAlignMilleModule.cxx:648
 AliITSAlignMilleModule.cxx:649
 AliITSAlignMilleModule.cxx:650
 AliITSAlignMilleModule.cxx:651
 AliITSAlignMilleModule.cxx:652
 AliITSAlignMilleModule.cxx:653
 AliITSAlignMilleModule.cxx:654
 AliITSAlignMilleModule.cxx:655
 AliITSAlignMilleModule.cxx:656
 AliITSAlignMilleModule.cxx:657
 AliITSAlignMilleModule.cxx:658
 AliITSAlignMilleModule.cxx:659
 AliITSAlignMilleModule.cxx:660
 AliITSAlignMilleModule.cxx:661
 AliITSAlignMilleModule.cxx:662
 AliITSAlignMilleModule.cxx:663
 AliITSAlignMilleModule.cxx:664
 AliITSAlignMilleModule.cxx:665
 AliITSAlignMilleModule.cxx:666
 AliITSAlignMilleModule.cxx:667
 AliITSAlignMilleModule.cxx:668
 AliITSAlignMilleModule.cxx:669
 AliITSAlignMilleModule.cxx:670
 AliITSAlignMilleModule.cxx:671
 AliITSAlignMilleModule.cxx:672
 AliITSAlignMilleModule.cxx:673
 AliITSAlignMilleModule.cxx:674
 AliITSAlignMilleModule.cxx:675
 AliITSAlignMilleModule.cxx:676
 AliITSAlignMilleModule.cxx:677
 AliITSAlignMilleModule.cxx:678
 AliITSAlignMilleModule.cxx:679
 AliITSAlignMilleModule.cxx:680
 AliITSAlignMilleModule.cxx:681
 AliITSAlignMilleModule.cxx:682
 AliITSAlignMilleModule.cxx:683
 AliITSAlignMilleModule.cxx:684
 AliITSAlignMilleModule.cxx:685
 AliITSAlignMilleModule.cxx:686
 AliITSAlignMilleModule.cxx:687
 AliITSAlignMilleModule.cxx:688
 AliITSAlignMilleModule.cxx:689
 AliITSAlignMilleModule.cxx:690
 AliITSAlignMilleModule.cxx:691
 AliITSAlignMilleModule.cxx:692
 AliITSAlignMilleModule.cxx:693
 AliITSAlignMilleModule.cxx:694
 AliITSAlignMilleModule.cxx:695
 AliITSAlignMilleModule.cxx:696
 AliITSAlignMilleModule.cxx:697
 AliITSAlignMilleModule.cxx:698
 AliITSAlignMilleModule.cxx:699
 AliITSAlignMilleModule.cxx:700
 AliITSAlignMilleModule.cxx:701