ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *      SigmaEffect_thetadegrees                                          * 
 * 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 purpeateose. It is      *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

// $Id$
//
//-----------------------------------------------------------------------------
/// \class AliMUONGeometryMisAligner
///
/// This performs the misalignment on an existing muon arm geometry
/// based on the standard definition of the detector elements in 
/// $ALICE_ROOT/MUON/data
///
/// --> User has to specify the magnitude of the alignments, in the Cartesian 
/// co-ordiantes (which are used to apply translation misalignments) and in the
/// spherical co-ordinates (which are used to apply angular displacements)
///
/// --> If the constructor is used with no arguments, user has to set 
/// misalignment ranges by hand using the methods : 
/// SetApplyMisAlig, SetMaxCartMisAlig, SetMaxAngMisAlig, SetXYAngMisAligFactor
/// (last method takes account of the fact that the misalingment is greatest in 
/// the XY plane, since the detection elements are fixed to a support structure
/// in this plane. Misalignments in the XZ and YZ plane will be very small 
/// compared to those in the XY plane, which are small already - of the order 
/// of microns)
///
/// Note : If the detection elements are allowed to be misaligned in all
/// directions, this has consequences for the alignment algorithm
/// (AliMUONAlignment), which needs to know the number of free parameters. 
/// Eric only allowed 3 :  x,y,theta_xy, but in principle z and the other 
/// two angles are alignable as well.
///
/// \author Bruce Becker, Javier Castillo
//-----------------------------------------------------------------------------

#include "AliMUONGeometryMisAligner.h"
#include "AliMUONGeometryTransformer.h"
#include "AliMUONGeometryModuleTransformer.h"
#include "AliMUONGeometryDetElement.h"
#include "AliMUONGeometryBuilder.h"
#include "AliMpExMap.h"
#include "AliMpExMapIterator.h"

#include "AliAlignObjMatrix.h"
#include "AliMathBase.h"
#include "AliLog.h"

#include <TClonesArray.h>
#include <TGeoMatrix.h>
#include <TMatrixDSym.h>
#include <TMath.h>
#include <TRandom.h>
#include <Riostream.h>

/// \cond CLASSIMP
ClassImp(AliMUONGeometryMisAligner)
/// \endcond

//______________________________________________________________________________
AliMUONGeometryMisAligner::AliMUONGeometryMisAligner(Double_t cartXMisAligM, Double_t cartXMisAligW, Double_t cartYMisAligM, Double_t cartYMisAligW, Double_t angMisAligM, Double_t angMisAligW)
  : TObject(),
    fUseUni(kFALSE),
    fUseGaus(kTRUE),
    fXYAngMisAligFactor(0.0),
    fZCartMisAligFactor(0.0)
{
  /// Standard constructor
  for (Int_t i=0; i<6; i++){
    for (Int_t j=0; j<2; j++){
      fDetElemMisAlig[i][j] = 0.0;
      fModuleMisAlig[i][j] = 0.0;
    }
  }
  fDetElemMisAlig[0][0] = cartXMisAligM; 
  fDetElemMisAlig[0][1] = cartXMisAligW; 
  fDetElemMisAlig[1][0] = cartYMisAligM; 
  fDetElemMisAlig[1][1] = cartYMisAligW; 
  fDetElemMisAlig[5][0] = angMisAligM; 
  fDetElemMisAlig[5][1] = angMisAligW;

}

//______________________________________________________________________________
AliMUONGeometryMisAligner::AliMUONGeometryMisAligner(Double_t cartMisAligM, Double_t cartMisAligW, Double_t angMisAligM, Double_t angMisAligW)
  : TObject(), 
    fUseUni(kFALSE),
    fUseGaus(kTRUE),
    fXYAngMisAligFactor(0.0),
    fZCartMisAligFactor(0.0)
{
  /// Standard constructor
  for (Int_t i=0; i<6; i++){
    for (Int_t j=0; j<2; j++){
      fDetElemMisAlig[i][j] = 0.0;
      fModuleMisAlig[i][j] = 0.0;
    }
  }
  fDetElemMisAlig[0][0] = cartMisAligM; 
  fDetElemMisAlig[0][1] = cartMisAligW; 
  fDetElemMisAlig[1][0] = cartMisAligM; 
  fDetElemMisAlig[1][1] = cartMisAligW; 
  fDetElemMisAlig[5][0] = angMisAligM; 
  fDetElemMisAlig[5][1] = angMisAligW;

}

//______________________________________________________________________________
AliMUONGeometryMisAligner::AliMUONGeometryMisAligner(Double_t cartMisAlig, Double_t angMisAlig)
  : TObject(), 
    fUseUni(kTRUE),
    fUseGaus(kFALSE),
    fXYAngMisAligFactor(0.0),
    fZCartMisAligFactor(0.0)
{
  /// Standard constructor
  for (Int_t i=0; i<6; i++){
    for (Int_t j=0; j<2; j++){
      fDetElemMisAlig[i][j] = 0.0;
      fModuleMisAlig[i][j] = 0.0;
    }
  }
  fDetElemMisAlig[0][1] = cartMisAlig; 
  fDetElemMisAlig[1][1] = cartMisAlig; 
  fDetElemMisAlig[5][1] = angMisAlig;

}

//_____________________________________________________________________________
AliMUONGeometryMisAligner::AliMUONGeometryMisAligner()
  : TObject(), 
    fUseUni(kTRUE),
    fUseGaus(kFALSE),
    fXYAngMisAligFactor(0.0),
    fZCartMisAligFactor(0.0)
{
  /// Default constructor
  for (Int_t i=0; i<6; i++){
    for (Int_t j=0; j<2; j++){
      fDetElemMisAlig[i][j] = 0.0;
      fModuleMisAlig[i][j] = 0.0;
    }
  }
}

//______________________________________________________________________________
AliMUONGeometryMisAligner::~AliMUONGeometryMisAligner()
{
/// Destructor

}

//_________________________________________________________________________
void
AliMUONGeometryMisAligner::SetXYAngMisAligFactor(Double_t factor)
{
  /// Set XY angular misalign factor 

  if (TMath::Abs(factor) > 1.0 && factor > 0.){
    fXYAngMisAligFactor = factor;
    fDetElemMisAlig[3][0] = fDetElemMisAlig[5][0]*factor; // These lines were 
    fDetElemMisAlig[3][1] = fDetElemMisAlig[5][1]*factor; // added to keep
    fDetElemMisAlig[4][0] = fDetElemMisAlig[5][0]*factor; // backward 
    fDetElemMisAlig[4][1] = fDetElemMisAlig[5][1]*factor; // compatibility 
  }
  else
    AliError(Form("Invalid XY angular misalign factor, %f", factor));
}

//_________________________________________________________________________
void AliMUONGeometryMisAligner::SetZCartMisAligFactor(Double_t factor) 
{
  /// Set XY angular misalign factor 
  if (TMath::Abs(factor)<1.0 && factor>0.) {
    fZCartMisAligFactor = factor;
    fDetElemMisAlig[2][0] = fDetElemMisAlig[0][0];        // These lines were added to 
    fDetElemMisAlig[2][1] = fDetElemMisAlig[0][1]*factor; // keep backward compatibility
  }
  else
    AliError(Form("Invalid Z cartesian misalign factor, %f", factor));
}

//_________________________________________________________________________
void AliMUONGeometryMisAligner::GetUniMisAlign(Double_t cartMisAlig[3], Double_t angMisAlig[3], const Double_t lParMisAlig[6][2]) const
{
  /// Misalign using uniform distribution
  /**
    misalign the centre of the local transformation
    rotation axes : 
    fAngMisAlig[1,2,3] = [x,y,z]
    Assume that misalignment about the x and y axes (misalignment of z plane)
    is much smaller, since the entire detection plane has to be moved (the 
    detection elements are on a support structure), while rotation of the x-y
    plane is more free.
  */
  cartMisAlig[0] = gRandom->Uniform(-lParMisAlig[0][1]+lParMisAlig[0][0], lParMisAlig[0][0]+lParMisAlig[0][1]);
  cartMisAlig[1] = gRandom->Uniform(-lParMisAlig[1][1]+lParMisAlig[1][0], lParMisAlig[1][0]+lParMisAlig[1][1]);
  cartMisAlig[2] = gRandom->Uniform(-lParMisAlig[2][1]+lParMisAlig[2][0], lParMisAlig[2][0]+lParMisAlig[2][1]);  
 
  angMisAlig[0] = gRandom->Uniform(-lParMisAlig[3][1]+lParMisAlig[3][0], lParMisAlig[3][0]+lParMisAlig[3][1]);
  angMisAlig[1] = gRandom->Uniform(-lParMisAlig[4][1]+lParMisAlig[4][0], lParMisAlig[4][0]+lParMisAlig[4][1]);
  angMisAlig[2] = gRandom->Uniform(-lParMisAlig[5][1]+lParMisAlig[5][0], lParMisAlig[5][0]+lParMisAlig[5][1]);	// degrees
}

//_________________________________________________________________________
void AliMUONGeometryMisAligner::GetGausMisAlign(Double_t cartMisAlig[3], Double_t angMisAlig[3], const Double_t lParMisAlig[6][2]) const
{
  /// Misalign using gaussian distribution
  /**
    misalign the centre of the local transformation
    rotation axes : 
    fAngMisAlig[1,2,3] = [x,y,z]
    Assume that misalignment about the x and y axes (misalignment of z plane)
    is much smaller, since the entire detection plane has to be moved (the 
    detection elements are on a support structure), while rotation of the x-y
    plane is more free.
  */
  cartMisAlig[0] = AliMathBase::TruncatedGaus(lParMisAlig[0][0], lParMisAlig[0][1], 3.*lParMisAlig[0][1]);
  cartMisAlig[1] = AliMathBase::TruncatedGaus(lParMisAlig[1][0], lParMisAlig[1][1], 3.*lParMisAlig[1][1]);
  cartMisAlig[2] = AliMathBase::TruncatedGaus(lParMisAlig[2][0], lParMisAlig[2][1], 3.*lParMisAlig[2][1]);
 
  angMisAlig[0] = AliMathBase::TruncatedGaus(lParMisAlig[3][0], lParMisAlig[3][1], 3.*lParMisAlig[3][1]);
  angMisAlig[1] = AliMathBase::TruncatedGaus(lParMisAlig[4][0], lParMisAlig[4][1], 3.*lParMisAlig[4][1]);
  angMisAlig[2] = AliMathBase::TruncatedGaus(lParMisAlig[5][0], lParMisAlig[5][1], 3.*lParMisAlig[5][1]);	// degrees
}

//_________________________________________________________________________
TGeoCombiTrans AliMUONGeometryMisAligner::MisAlignDetElem(const TGeoCombiTrans & transform) const
{
  /// Misalign given transformation and return the misaligned transformation. 
  /// Use misalignment parameters for detection elements.
  /// Note that applied misalignments are small deltas with respect to the detection 
  /// element own ideal local reference frame. Thus deltaTransf represents 
  /// the transformation to go from the misaligned d.e. local coordinates to the 
  /// ideal d.e. local coordinates. 
  /// Also note that this -is not- what is in the ALICE alignment framework known 
  /// as local nor global (see AliMUONGeometryMisAligner::MisAlign) 
  
  Double_t cartMisAlig[3] = {0,0,0};
  Double_t angMisAlig[3] = {0,0,0};

  if (fUseUni) { 
    GetUniMisAlign(cartMisAlig,angMisAlig,fDetElemMisAlig);
  }
  else { 
    if (!fUseGaus) {
      AliWarning("Neither uniform nor gausian distribution is set! Will use gausian...");
    } 
    GetGausMisAlign(cartMisAlig,angMisAlig,fDetElemMisAlig);
  }

  TGeoTranslation deltaTrans(cartMisAlig[0], cartMisAlig[1], cartMisAlig[2]);
  TGeoRotation deltaRot;
  deltaRot.RotateX(angMisAlig[0]);
  deltaRot.RotateY(angMisAlig[1]);
  deltaRot.RotateZ(angMisAlig[2]);

  TGeoCombiTrans deltaTransf(deltaTrans,deltaRot);
  TGeoHMatrix newTransfMat = transform * deltaTransf;
    
  AliInfo(Form("Rotated DE by %f about Z axis.", angMisAlig[2]));

  return TGeoCombiTrans(newTransfMat);
}

//_________________________________________________________________________
TGeoCombiTrans AliMUONGeometryMisAligner::MisAlignModule(const TGeoCombiTrans & transform) const
{
  /// Misalign given transformation and return the misaligned transformation. 
  /// Use misalignment parameters for modules.
  /// Note that applied misalignments are small deltas with respect to the module 
  /// own ideal local reference frame. Thus deltaTransf represents 
  /// the transformation to go from the misaligned module local coordinates to the 
  /// ideal module local coordinates. 
  /// Also note that this -is not- what is in the ALICE alignment framework known 
  /// as local nor global (see AliMUONGeometryMisAligner::MisAlign) 
  
  Double_t cartMisAlig[3] = {0,0,0};
  Double_t angMisAlig[3] = {0,0,0};

  if (fUseUni) { 
    GetUniMisAlign(cartMisAlig,angMisAlig,fModuleMisAlig);
  }
  else { 
    if (!fUseGaus) {
      AliWarning("Neither uniform nor gausian distribution is set! Will use gausian...");
    } 
    GetGausMisAlign(cartMisAlig,angMisAlig,fModuleMisAlig);
  }

  TGeoTranslation deltaTrans(cartMisAlig[0], cartMisAlig[1], cartMisAlig[2]);
  TGeoRotation deltaRot;
  deltaRot.RotateX(angMisAlig[0]);
  deltaRot.RotateY(angMisAlig[1]);
  deltaRot.RotateZ(angMisAlig[2]);

  TGeoCombiTrans deltaTransf(deltaTrans,deltaRot);
  TGeoHMatrix newTransfMat = transform * deltaTransf;

  AliInfo(Form("Rotated Module by %f about Z axis.", angMisAlig[2]));

  return TGeoCombiTrans(newTransfMat);
}

//______________________________________________________________________
AliMUONGeometryTransformer *
AliMUONGeometryMisAligner::MisAlign(const AliMUONGeometryTransformer *
				    transformer, Bool_t verbose)
{
  /// Takes the internal geometry module transformers, copies them to
  /// new geometry module transformers. 
  /// Calculates  module misalignment parameters and applies these
  /// to the new module transformer.
  /// Calculates the module misalignment delta transformation in the 
  /// Alice Alignment Framework newTransf = delta * oldTransf.
  /// Add a module misalignment to the new geometry transformer.
  /// Gets the Detection Elements from the module transformer. 
  /// Calculates misalignment parameters and applies these
  /// to the local transformation of the Detection Element.
  /// Obtains the new global transformation by multiplying the new 
  /// module transformer transformation with the new local transformation. 
  /// Applies the new global transform to a new detection element.
  /// Adds the new detection element to a new module transformer.
  /// Calculates the d.e. misalignment delta transformation in the 
  /// Alice Alignment Framework (newGlobalTransf = delta * oldGlobalTransf).
  /// Add a d.e. misalignment to the new geometry transformer.
  /// Adds the new module transformer to a new geometry transformer.
  /// Returns the new geometry transformer.


  AliMUONGeometryTransformer *newGeometryTransformer =
    new AliMUONGeometryTransformer();
  for (Int_t iMt = 0; iMt < transformer->GetNofModuleTransformers(); iMt++)
    {				// module transformers
      const AliMUONGeometryModuleTransformer *kModuleTransformer =
	transformer->GetModuleTransformer(iMt, true);
      
      AliMUONGeometryModuleTransformer *newModuleTransformer =
	new AliMUONGeometryModuleTransformer(iMt);
      newGeometryTransformer->AddModuleTransformer(newModuleTransformer);

      TGeoCombiTrans moduleTransform =
	TGeoCombiTrans(*kModuleTransformer->GetTransformation());
      // New module transformation
      TGeoCombiTrans newModuleTransform = MisAlignModule(moduleTransform);
      newModuleTransformer->SetTransformation(newModuleTransform);

      // Get delta transformation: 
      // Tdelta = Tnew * Told.inverse
      TGeoHMatrix deltaModuleTransform = 
	AliMUONGeometryBuilder::Multiply(
	  newModuleTransform, 
	  kModuleTransformer->GetTransformation()->Inverse());

      // Create module mis alignment matrix
      newGeometryTransformer
	->AddMisAlignModule(kModuleTransformer->GetModuleId(), deltaModuleTransform);

      AliMpExMap *detElements = kModuleTransformer->GetDetElementStore();

      if (verbose)
	AliInfo(Form("%i DEs in old GeometryStore  %i",detElements->GetSize(), iMt));

      TIter next(detElements->CreateIterator());
      AliMUONGeometryDetElement *detElement;
      
      while ( ( detElement = static_cast<AliMUONGeometryDetElement*>(next()) ) )
      {
	  /// make a new detection element
	  AliMUONGeometryDetElement *newDetElement =
	    new AliMUONGeometryDetElement(detElement->GetId(),
					  detElement->GetVolumePath());

	  // local transformation of this detection element.
          TGeoCombiTrans localTransform
	    = TGeoCombiTrans(*detElement->GetLocalTransformation());
	  TGeoCombiTrans newLocalTransform = MisAlignDetElem(localTransform);
          newDetElement->SetLocalTransformation(newLocalTransform);


	  // global transformation
	  TGeoHMatrix newGlobalTransform =
	    AliMUONGeometryBuilder::Multiply(newModuleTransform,
					     newLocalTransform);
	  newDetElement->SetGlobalTransformation(newGlobalTransform);
	  
	  // add this det element to module
	  newModuleTransformer->GetDetElementStore()->Add(newDetElement->GetId(),
							  newDetElement);

	  // In the Alice Alignment Framework misalignment objects store
	  // global delta transformation
	  // Get detection "intermediate" global transformation
	  TGeoHMatrix newOldGlobalTransform = newModuleTransform * localTransform;
          // Get detection element global delta transformation: 
	  // Tdelta = Tnew * Told.inverse
	  TGeoHMatrix  deltaGlobalTransform
	    = AliMUONGeometryBuilder::Multiply(
	        newGlobalTransform, 
		newOldGlobalTransform.Inverse());
	  
	  // Create mis alignment matrix
	  newGeometryTransformer
	    ->AddMisAlignDetElement(detElement->GetId(), deltaGlobalTransform);
	}

      
      if (verbose)
	AliInfo(Form("Added module transformer %i to the transformer", iMt));
      newGeometryTransformer->AddModuleTransformer(newModuleTransformer);
    }
  return newGeometryTransformer;
}


void AliMUONGeometryMisAligner::SetAlignmentResolution(const TClonesArray* misAlignArray, Int_t rChId, Double_t rChResX, Double_t rChResY, Double_t rDeResX, Double_t rDeResY){

  Int_t chIdMin = (rChId<0)? 0 : rChId;
  Int_t chIdMax = (rChId<0)? 9 : rChId;
  Double_t chResX = (rChResX<0)? fModuleMisAlig[0][1] : rChResX;
  Double_t chResY = (rChResY<0)? fModuleMisAlig[1][1] : rChResY;
  Double_t deResX = (rDeResX<0)? fDetElemMisAlig[0][1] : rDeResX;
  Double_t deResY = (rDeResY<0)? fDetElemMisAlig[1][1] : rDeResY;

  TMatrixDSym mChCorrMatrix(6);
  mChCorrMatrix[0][0]=chResX*chResX;
  mChCorrMatrix[1][1]=chResY*chResY;
  //  mChCorrMatrix.Print();

  TMatrixDSym mDECorrMatrix(6);
  mDECorrMatrix[0][0]=deResX*deResX;
  mDECorrMatrix[1][1]=deResY*deResY;
  //  mDECorrMatrix.Print();

  AliAlignObjMatrix *alignMat = 0x0;

  for(Int_t chId=chIdMin; chId<=chIdMax; chId++) {
    TString chName1;
    TString chName2;
    if (chId<4){
      chName1 = Form("GM%d",chId);
      chName2 = Form("GM%d",chId);
    } else {
      chName1 = Form("GM%d",4+(chId-4)*2);
      chName2 = Form("GM%d",4+(chId-4)*2+1);
    }
    
    for (int i=0; i<misAlignArray->GetEntries(); i++) {
      alignMat = (AliAlignObjMatrix*)misAlignArray->At(i);
      TString volName(alignMat->GetSymName());
      if((volName.Contains(chName1)&&
	  ((volName.Last('/')==volName.Index(chName1)+chName1.Length())||
	   (volName.Length()==volName.Index(chName1)+chName1.Length())))||
	 (volName.Contains(chName2)&&
	  ((volName.Last('/')==volName.Index(chName2)+chName2.Length())||
	   (volName.Length()==volName.Index(chName2)+chName2.Length())))){
	volName.Remove(0,volName.Last('/')+1);
	if (volName.Contains("GM")) {
	  //	alignMat->Print("NULL");
	  alignMat->SetCorrMatrix(mChCorrMatrix);
	} else if (volName.Contains("DE")) {
	  //	alignMat->Print("NULL");
	  alignMat->SetCorrMatrix(mDECorrMatrix);
	}
      }
    }
  }
}



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