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.                  *
 **************************************************************************/

//-----------------------------------------------------------------------------
/// \class AliMUONSurveyUtil
/// Singleton utility class for the survey processing of the ALICE DiMuon spectrometer 
/// 
/// This class contains various functions to calculate misalignement parameters
/// from survey data and designed positions of survey targets.
/// Macro also includes a method to get the new AliMUONGeometryTranformer.
/// 
/// \author Javier Castillo
//-----------------------------------------------------------------------------

#include <TClonesArray.h>
#include <TMath.h>
#include <TMatrixDSym.h>
#include <TString.h>

#include "AliAlignObjMatrix.h"

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

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

int AliMUONSurveyUtil::fgNDetElemCh[10] = {4,4,4,4,18,18,26,26,26,26};
AliMUONSurveyUtil* AliMUONSurveyUtil::fgInstance(0x0);

AliMUONSurveyUtil::~AliMUONSurveyUtil(){
  printf("WHAT AM I DOING HERE????????????????\n");
  fgInstance = 0x0;
}

AliMUONSurveyUtil* AliMUONSurveyUtil::Instance() {
  ///  Return its instance 
  if (!fgInstance) 
    fgInstance = new AliMUONSurveyUtil();
  
  return fgInstance;
}

Bool_t AliMUONSurveyUtil::MatrixToAngles(const Double_t *rot, Double_t *angles)
{
  /// Calculates the Euler angles in "x y z" notation
  /// using the rotation matrix
  /// Returns false in case the rotation angles can not be

  // extracted from the matrix
  //
  if(TMath::Abs(rot[0])<1e-7 || TMath::Abs(rot[8])<1e-7) {
    printf("Failed to extract roll-pitch-yall angles!");
    return kFALSE;
  }
  //   Double_t raddeg = TMath::RadToDeg();
  angles[0]=TMath::ATan2(-rot[5],rot[8]);
  angles[1]=TMath::ASin(rot[2]);
  angles[2]=TMath::ATan2(-rot[1],rot[0]);
  return kTRUE;
}

void AliMUONSurveyUtil::AnglesToMatrix(const Double_t *angles, Double_t *rot)
{
  /// Calculates the rotation matrix using the 
  /// Euler angles in "x y z" notation
  ///
  //  Double_t degrad = TMath::DegToRad();
  Double_t degrad = 1.;
  Double_t sinpsi = TMath::Sin(degrad*angles[0]);
  Double_t cospsi = TMath::Cos(degrad*angles[0]);
  Double_t sinthe = TMath::Sin(degrad*angles[1]);
  Double_t costhe = TMath::Cos(degrad*angles[1]);
  Double_t sinphi = TMath::Sin(degrad*angles[2]);
  Double_t cosphi = TMath::Cos(degrad*angles[2]);

  rot[0] =  costhe*cosphi;
  rot[1] = -costhe*sinphi;
  rot[2] =  sinthe;
  rot[3] =  sinpsi*sinthe*cosphi + cospsi*sinphi;
  rot[4] = -sinpsi*sinthe*sinphi + cospsi*cosphi;
  rot[5] = -costhe*sinpsi;
  rot[6] = -cospsi*sinthe*cosphi + sinpsi*sinphi;
  rot[7] =  cospsi*sinthe*sinphi + sinpsi*cosphi;
  rot[8] =  costhe*cospsi;
}

Double_t AliMUONSurveyUtil::XpCenter(const Double_t *x, const Double_t *par) const{
  /// Returns center x position using x coord. of 2 button targets. + solution. 
  Double_t lCos2Tht = TMath::Cos(2*par[6]);
  Double_t lSinTht = TMath::Sin(par[6]);

  Double_t inSqrt = TMath::Abs((par[0] - par[3])*(par[0] - par[3]) 
			       -2*(x[0] -x[1])*(x[0] -x[1]) 
			       +(par[1] - par[4] + par[2] - par[5])*(par[1] - par[4] - par[2] + par[5]) 
			       +((par[0] - par[3])*(par[0] - par[3]) 
				 +(par[1] - par[4])*(par[1] - par[4]) 
				 +(par[2] - par[5])*(par[2] - par[5]))*lCos2Tht 
			       +4*(x[0] - x[1])*(par[2] - par[5])*lSinTht);

  if (inSqrt<0) return inSqrt*1e10;

  Double_t xD = ((2*(par[0]*par[0]*x[1] 
		     -par[0]*par[3]*(x[0] + x[1]) 
		     +x[1]*par[1]*(par[1] - par[4]) 
		     +x[0]*(par[3]*par[3] - par[1]*par[4] + par[4]*par[4])) 
		  -2*(par[3]*par[3]*par[2] 
		      +par[0]*par[0]*par[5] 
		      -par[0]*par[3]*(par[2] + par[5]) 
		      +(par[1] - par[4])*(-par[4]*par[2] +par[1]*par[5]))*lSinTht 
		  +TMath::Sqrt(2)*(-par[3]*par[1] + par[0]*par[4])
		  *TMath::Sqrt(inSqrt))
		 /(2*((par[0] - par[3])*(par[0] - par[3]) + (par[1] - par[4])*(par[1] - par[4]))));

  return xD;
}

Double_t AliMUONSurveyUtil::XnCenter(const Double_t *x, const Double_t *par) const{
  /// Returns center x position using x coord. of 2 button targets. - solution. 
  Double_t lCos2Tht = TMath::Cos(2*par[6]);
  Double_t lSinTht = TMath::Sin(par[6]);

  Double_t inSqrt = TMath::Abs((par[0] - par[3])*(par[0] - par[3]) 
			       -2*(x[0] - x[1])*(x[0] - x[1]) 
			       +(par[1] - par[4] + par[2] - par[5])*(par[1] - par[4] - par[2] + par[5]) 
			       +((par[0] - par[3])*(par[0] - par[3]) 
				 +(par[1] - par[4])*(par[1] - par[4]) 
				 +(par[2] - par[5])*(par[2] - par[5]))*lCos2Tht
			       +4*(x[0] - x[1])*(par[2] - par[5])*lSinTht);

  if (inSqrt<0) return inSqrt*1e10;

  Double_t xD = ((2*(par[0]*par[0]*x[1] 
		     -par[0]*par[3]*(x[0] + x[1]) 
		     +x[1]*par[1]*(par[1] - par[4]) 
		     +x[0]*(par[3]*par[3] - par[1]*par[4] + par[4]*par[4])) 
		  -2*(par[3]*par[3]*par[2] + par[0]*par[0]*par[5] 
		      -par[0]*par[3]*(par[2] + par[5]) 
		      +(par[1] - par[4])*(-par[4]*par[2] + par[1]*par[5]))*lSinTht 
		  +TMath::Sqrt(2)*(par[3]*par[1] - par[0]*par[4])
		  *TMath::Sqrt(inSqrt))
		 /(2*((par[0] - par[3])*(par[0] - par[3]) + (par[1] - par[4])*(par[1] - par[4]))));

  return xD;
}

Double_t AliMUONSurveyUtil::PhiXpn(const Double_t *x, const Double_t *par) const{
  /// Returns phi rot. using x coord. of 2 button targets. +- solution. 
  Double_t inSqrt = TMath::Abs(((par[0] - par[3])*(par[0] - par[3]) 
				-2*(x[0] - x[1])*(x[0] - x[1]) 
				+(par[1] - par[4] + par[2] - par[5])*(par[1] - par[4] - par[2] + par[5]) 
				+(+(par[0] - par[3])*(par[0] - par[3]) 
				  +(par[1] - par[4])*(par[1] - par[4]) 
				  +(par[2] - par[5])*(par[2] - par[5]))*TMath::Cos(2*par[6]) 
				+4*(x[0] - x[1])*(par[2] - par[5])*TMath::Sin(par[6])));

  if (inSqrt<0) return inSqrt*1e10;
  
  Double_t phix = ((+2*(par[0] - par[3])*(x[0] - x[1]) 
		    -2*(par[0] - par[3])*(par[2] - par[5])*TMath::Sin(par[6]) 
		    +TMath::Sqrt(2)*(par[1] - par[4])
		    *TMath::Sqrt(inSqrt))
		   /(2*(+(par[0] - par[3])*(par[0] - par[3]) 
			+(par[1] - par[4])*(par[1] - par[4]))*TMath::Cos(par[6])));

  phix = -TMath::ACos(phix);

  return phix;
}

Double_t AliMUONSurveyUtil::PhiXpp(const Double_t *x, const Double_t *par) const{
  /// Returns phi rot. using x coord. of 2 button targets. ++ solution. 
  Double_t inSqrt = TMath::Abs(+(par[0] - par[3])*(par[0] - par[3]) 
			       -2*(x[0] - x[1])*(x[0] - x[1]) 
			       +(par[1] - par[4] + par[2] - par[5])*(par[1] - par[4] - par[2] + par[5]) 
			       +(+(par[0] - par[3])*(par[0] - par[3]) 
				 +(par[1] - par[4])*(par[1] - par[4]) 
				 +(par[2] - par[5])*(par[2] - par[5]))*TMath::Cos(2*par[6]) 
			       +4*(x[0] - x[1])*(par[2] - par[5])*TMath::Sin(par[6]));

  if (inSqrt<0) return inSqrt*1e10;

  Double_t phix = ((+2*(par[0] - par[3])*(x[0] - x[1]) 
		    -2*(par[0] - par[3])*(par[2] - par[5])*TMath::Sin(par[6]) 
		    +TMath::Sqrt(2)*(par[1] - par[4])
		    *TMath::Sqrt(inSqrt))
		   /(2*(+(par[0] - par[3])*(par[0] - par[3]) 
			+(par[1] - par[4])*(par[1] - par[4]))*TMath::Cos(par[6])));

  phix = TMath::ACos(phix);

  return phix;
}

Double_t AliMUONSurveyUtil::PhiXnn(const Double_t *x, const Double_t *par) const{
  /// Returns phi rot. using x coord. of 2 button targets. -- solution. 
  Double_t inSqrt = TMath::Abs(+(par[0] - par[3])*(par[0] - par[3]) 
			       -2*(x[0] - x[1])*(x[0] - x[1]) 
			       +(par[1] - par[4] + par[2] - par[5])*(par[1] - par[4] - par[2] + par[5]) 
			       +(+(par[0] - par[3])*(par[0] - par[3]) 
				 +(par[1] - par[4])*(par[1] - par[4]) 
				 +(par[2] - par[5])*(par[2] - par[5]))*TMath::Cos(2*par[6]) 
			       + 4*(x[0] - x[1])*(par[2] - par[5])*TMath::Sin(par[6]));

  if (inSqrt<0) return inSqrt*1e10;
  
  Double_t phix = (+(+2*(par[0] - par[3])*(x[0] - x[1]) 
		     -2*(par[0] - par[3])*(par[2] - par[5])*TMath::Sin(par[6]) 
		     +TMath::Sqrt(2)*(-par[1] + par[4])
		     *TMath::Sqrt(inSqrt))
		   /(2*(+(par[0] - par[3])*(par[0] - par[3]) 
			+(par[1] - par[4])*(par[1] - par[4]))*TMath::Cos(par[6])));

  phix = -TMath::ACos(phix);

  return phix;
}

Double_t AliMUONSurveyUtil::PhiXnp(const Double_t *x, const Double_t *par) const{
  /// Returns phi rot. using x coord. of 2 button targets. +- solution. 
  Double_t inSqrt = TMath::Abs(+(par[0] - par[3])*(par[0] - par[3]) 
			       -2*(x[0] - x[1])*(x[0] - x[1]) 
			       +(par[1] - par[4] + par[2] - par[5])*(par[1] - par[4] - par[2] + par[5]) 
			       +(+(par[0] - par[3])*(par[0] - par[3]) 
				 +(par[1] - par[4])*(par[1] - par[4]) 
				 +(par[2] - par[5])*(par[2] - par[5]))*TMath::Cos(2*par[6]) 
			       +4*(x[0] - x[1])*(par[2] - par[5])*TMath::Sin(par[6]));

  if (inSqrt<0) return inSqrt*1e10;

  Double_t phix = (+(+2*(par[0] - par[3])*(x[0] - x[1]) 
		     -2*(par[0] - par[3])*(par[2] - par[5])*TMath::Sin(par[6]) 
		     +TMath::Sqrt(2)*(-par[1] + par[4])
		     *TMath::Sqrt(inSqrt))
		   /(2*(+(par[0] - par[3])*(par[0] - par[3]) 
			+(par[1] - par[4])*(par[1] - par[4]))*TMath::Cos(par[6])));

  phix = TMath::ACos(phix);

  return phix;
}

Double_t AliMUONSurveyUtil::YpCenter(const Double_t *x, const Double_t *par) const{
  /// Returns center y position using y coord. of 2 button targets. + solution. 

  // par : x1l, y1l, z1l, x2l, y2l, z2, lpsi, tht,
  Double_t lCosPsi = TMath::Cos(par[6]);
  Double_t lSinPsi = TMath::Sin(par[6]);
  Double_t lCosTht = TMath::Cos(par[7]);
  Double_t lSinTht = TMath::Sin(par[7]);

  Double_t yD = ((1./((par[0] - par[3])*(par[0] - par[3]) + (par[1] - par[4])*(par[1] - par[4])))
		 *(+par[3]*par[3]*x[0] 
		   +par[0]*par[0]*x[1] 
		   -par[0]*par[3]*(x[0] + x[1]) 
		   +(par[1] - par[4])*(-x[0]*par[4] + par[1]*x[1]) 
		   +(par[3]*par[3]*par[2] 
		     +par[0]*par[0]*par[5] 
		     -par[0]*par[3]*(par[2] + par[5]) 
		     +(par[1] - par[4])*(-par[4]*par[2] + par[1]*par[5]))*lCosTht*lSinPsi 
		   +(-par[3]*par[1] + par[0]*par[4])
		   *TMath::Sqrt(-(x[0] - x[1] 
				  +(par[2] - par[5])*lCosTht*lSinPsi)
				*(x[0] - x[1] 
				  +(par[2] - par[5])*lCosTht*lSinPsi) 
				+ ((par[0] - par[3])*(par[0] - par[3]) 
				   +(par[1] - par[4])*(par[1] - par[4]))*(lCosPsi*lCosPsi 
									  +lSinPsi*lSinPsi*lSinTht*lSinTht))));

  return yD;  
}

Double_t AliMUONSurveyUtil::PhiYpn(const Double_t *x, const Double_t *par) const{
  /// Returns phi rot. using y coord. of 2 button targets. +- solution. 

  Double_t lCosPsi = TMath::Cos(par[6]);
  Double_t lSinPsi = TMath::Sin(par[6]);
  Double_t lCosTht = TMath::Cos(par[7]);
  Double_t lSinTht = TMath::Sin(par[7]);

  Double_t phiy = ((lCosPsi*((par[1] - par[4])*(x[0] - x[1]) 
			     +(par[1] - par[4])*(par[2] - par[5])*lCosTht*lSinPsi 
			     +(-par[0] + par[3])
			     *TMath::Sqrt(-(x[0] - x[1] 
					    +(par[2] - par[5])*lCosTht*lSinPsi)
					  *(x[0] - x[1] 
					    +(par[2] - par[5])*lCosTht*lSinPsi) 
					  +(+(par[0] - par[3])*(par[0] - par[3]) 
					    +(par[1] - par[4])*(par[1] - par[4]))*(lCosPsi*lCosPsi
										   +lSinPsi*lSinPsi*lSinTht*lSinTht))) 
		    +lSinPsi*lSinTht*((par[0] - par[3])*(x[0] - x[1]) 
				      +(par[0] - par[3])*(par[2] - par[5])*lCosTht*lSinPsi 
				      +(par[1] - par[4])
				      *TMath::Sqrt(-(x[0] - x[1] 
						     +(par[2] - par[5])*lCosTht*lSinPsi)
						   *(x[0] - x[1] 
						     +(par[2] - par[5])*lCosTht*lSinPsi) 
						   + ((par[0] - par[3])*(par[0] - par[3]) 
						      +(par[1] - par[4])*(par[1] - par[4]))*(lCosPsi*lCosPsi 
											     +lSinPsi*lSinPsi*lSinTht*lSinTht))))
		   /((+(par[0] - par[3])*(par[0] - par[3]) 
		      +(par[1] - par[4])*(par[1] - par[4]))*(lCosPsi*lCosPsi 
							     +lSinPsi*lSinPsi*lSinTht*lSinTht)));
  
  phiy = -TMath::ACos(phiy);


  return phiy;
}

Double_t AliMUONSurveyUtil::PhiYpp(const Double_t *x, const Double_t *par) const{
  /// Returns phi rot. using y coord. of 2 button targets. ++ solution. 

  Double_t lCosPsi = TMath::Cos(par[6]);
  Double_t lSinPsi = TMath::Sin(par[6]);
  Double_t lCosTht = TMath::Cos(par[7]);
  Double_t lSinTht = TMath::Sin(par[7]);

  Double_t phiy = ((lCosPsi*((par[1] - par[4])*(x[0] - x[1]) 
			     +(par[1] - par[4])*(par[2] - par[5])*lCosTht*lSinPsi 
			     +(-par[0] + par[3])
			     *TMath::Sqrt(-(x[0] - x[1] 
					    +(par[2] - par[5])*lCosTht*lSinPsi)
					  *(x[0] - x[1] 
					    +(par[2] - par[5])*lCosTht*lSinPsi) 
					  +((par[0] - par[3])*(par[0] - par[3]) 
					    +(par[1] - par[4])*(par[1] - par[4]))*(lCosPsi*lCosPsi 
										   +lSinPsi*lSinPsi*lSinTht*lSinTht))) 
		    +lSinPsi*lSinTht*((par[0] - par[3])*(x[0] - x[1]) 
				      +(par[0] - par[3])*(par[2] - par[5])*lCosTht*lSinPsi 
				      +(par[1] - par[4])*TMath::Sqrt(-(x[0] - x[1] 
								       +(par[2] - par[5])*lCosTht*lSinPsi)
								     *(x[0] - x[1] 
								       +(par[2] - par[5])*lCosTht*lSinPsi) 
								     +((par[0] - par[3])*(par[0] - par[3])
								       +(par[1] - par[4])*(par[1] - par[4]))*(lCosPsi*lCosPsi 
													      +lSinPsi*lSinPsi*lSinTht*lSinTht))))
		   /(((par[0] - par[3])*(par[0] - par[3]) 
		      +(par[1] - par[4])*(par[1] - par[4]))*(lCosPsi*lCosPsi 
							     +lSinPsi*lSinPsi*lSinTht*lSinTht)));
  
  phiy = TMath::ACos(phiy);

  return phiy;
}
 
Double_t AliMUONSurveyUtil::YnCenter(const Double_t *x, const Double_t *par) const{
  /// Returns center y position using y coord. of 2 button targets. - solution. 
  Double_t lCosPsi = TMath::Cos(par[6]);
  Double_t lSinPsi = TMath::Sin(par[6]);
  Double_t lCosTht = TMath::Cos(par[7]);
  Double_t lSinTht = TMath::Sin(par[7]);

  Double_t yD = ((1./(+(par[0] - par[3])*(par[0] - par[3]) 
		      +(par[1] - par[4])*(par[1] - par[4])))
		 *(+par[3]*par[3]*x[0] 
		   +par[0]*par[0]*x[1] 
		   -par[0]*par[3]*(x[0] + x[1]) 
		   +(par[1] - par[4])*(-x[0]*par[4] + par[1]*x[1]) 
		   +(+par[3]*par[3]*par[2] 
		     +par[0]*par[0]*par[5] 
		     -par[0]*par[3]*(par[2] + par[5]) 
		     +(par[1] - par[4])*(-par[4]*par[2] + par[1]*par[5]))*lCosTht*lSinPsi 
		   +(par[3]*par[1] - par[0]*par[4])
		   *TMath::Sqrt(-(+x[0] - x[1] 
				  +(par[2] - par[5])*lCosTht*lSinPsi)
				*(x[0] - x[1] 
				  +(par[2] - par[5])*lCosTht*lSinPsi) 
				+((par[0] - par[3])*(par[0] - par[3]) 
				  +(par[1] - par[4])*(par[1] - par[4]))*(+lCosPsi*lCosPsi 
									 +lSinPsi*lSinPsi*lSinTht*lSinTht))));
  
  return yD;  
}
 

Double_t AliMUONSurveyUtil::PhiYnn(const Double_t *x, const Double_t *par) const{
  /// Returns phi rot. using y coord. of 2 button targets. -- solution. 

  Double_t lCosPsi = TMath::Cos(par[6]);
  Double_t lSinPsi = TMath::Sin(par[6]);
  Double_t lCosTht = TMath::Cos(par[7]);
  Double_t lSinTht = TMath::Sin(par[7]);

  Double_t phiy = ((lCosPsi*(+(par[1] - par[4])*(x[0] - x[1]) 
			     +(par[1] - par[4])*(par[2] - par[5])*lCosTht*lSinPsi 
			     +(par[0] - par[3])
			     *TMath::Sqrt(-(x[0] - x[1] 
					    +(par[2] - par[5])*lCosTht*lSinPsi)
					  *(x[0] - x[1] 
					    +(par[2] - par[5])*lCosTht*lSinPsi) 
					  +(+(par[0] - par[3])*(par[0] - par[3]) 
					    +(par[1] - par[4])*(par[1] - par[4]))*(+lCosPsi*lCosPsi 
										   +lSinPsi*lSinPsi*lSinTht*lSinTht))) 
		    +lSinPsi*lSinTht*(+(par[0] - par[3])*(x[0] - x[1]) 
				      +(par[0] - par[3])*(par[2] - par[5])*lCosTht*lSinPsi 
				      +(-par[1] + par[4])
				      *TMath::Sqrt(-(x[0] - x[1] 
						     +(par[2] - par[5])*lCosTht*lSinPsi)
						   *(x[0] - x[1] 
						     +(par[2] - par[5])*lCosTht*lSinPsi) 
						   +(+(par[0] - par[3])*(par[0] - par[3]) 
						     +(par[1] - par[4])*(par[1] - par[4]))*(+lCosPsi*lCosPsi 
											    +lSinPsi*lSinPsi*lSinTht*lSinTht))))
		   /((+(par[0] - par[3])*(par[0] - par[3]) 
		      +(par[1] - par[4])*(par[1] - par[4]))*(+lCosPsi*lCosPsi 
							     +lSinPsi*lSinPsi*lSinTht*lSinTht)));
  
  phiy = -TMath::ACos(phiy);
  
  return phiy;
}


Double_t AliMUONSurveyUtil::PhiYnp(const Double_t *x, const Double_t *par) const{
  /// Returns phi rot. using y coord. of 2 button targets. -+ solution. 

  Double_t lCosPsi = TMath::Cos(par[6]);
  Double_t lSinPsi = TMath::Sin(par[6]);
  Double_t lCosTht = TMath::Cos(par[7]);
  Double_t lSinTht = TMath::Sin(par[7]);

  Double_t phiy = ((lCosPsi*(+(par[1] - par[4])*(x[0] - x[1]) 
			     +(par[1] - par[4])*(par[2] - par[5])*lCosTht*lSinPsi 
			     +(par[0] - par[3])
			     *TMath::Sqrt(-(x[0] - x[1] 
					    +(par[2] - par[5])*lCosTht*lSinPsi)
					  *(x[0] - x[1] 
					    +(par[2] - par[5])*lCosTht*lSinPsi) 
					  +((par[0] - par[3])*(par[0] - par[3]) 
					    +(par[1] - par[4])*(par[1] - par[4]))*(+lCosPsi*lCosPsi 
										   +lSinPsi*lSinPsi*lSinTht*lSinTht))) 
		    +lSinPsi*lSinTht*(+(par[0] - par[3])*(x[0] - x[1]) 
				      +(par[0] - par[3])*(par[2] - par[5])*lCosTht*lSinPsi 
				      +(-par[1] + par[4])
				      *TMath::Sqrt(-(x[0] - x[1] 
						     +(par[2] - par[5])*lCosTht*lSinPsi)
						   *(x[0] - x[1] 
						     +(par[2] - par[5])*lCosTht*lSinPsi) 
						   +((par[0] - par[3])*(par[0] - par[3]) 
						     +(par[1] - par[4])*(par[1] - par[4]))*(+lCosPsi*lCosPsi 
											    +lSinPsi*lSinPsi*lSinTht*lSinTht))))
		   /((+(par[0] - par[3])*(par[0] - par[3])
		      +(par[1] - par[4])*(par[1] - par[4]))*(+lCosPsi*lCosPsi 
							     +lSinPsi*lSinPsi*lSinTht*lSinTht)));
  
  phiy = TMath::ACos(phiy);
  
  return phiy;
}

Double_t AliMUONSurveyUtil::ZnCenter(const Double_t *x, const Double_t *par) const{
  /// Returns center z position using z coord. of 2 button targets. - solution. 

  // par :  x1l, y1l, z1l, x2l, y2l, z2l, psi, tht
  Double_t lCosPsi = TMath::Cos(par[6]);
  Double_t lSinPsi = TMath::Sin(par[6]);
  Double_t lCosTht = TMath::Cos(par[7]);
  Double_t lSinTht = TMath::Sin(par[7]);

  Double_t inSqrt = ((par[3]*par[1] - par[0]*par[4])*(par[3]*par[1] - par[0]*par[4])
		     *((-(x[0] - x[1])*(x[0] - x[1]))
		       +(((par[0] - par[3])*(par[0] - par[3])
			  +(par[1] - par[4])*(par[1] - par[4])))*lSinPsi*lSinPsi
		       +lCosPsi*((-(par[2] - par[5]))
				 *lCosTht*(-2*x[0]+2*x[1]
					   +(par[2] - par[5])*lCosPsi*lCosTht)
				 +((par[0] - par[3])*(par[0] - par[3])
				   +(par[1] - par[4])*(par[1] - par[4]))*lCosPsi*lSinTht*lSinTht)));

  if (inSqrt<0) return inSqrt*1e10;

  Double_t zD = ((1./((par[0] - par[3])*(par[0] - par[3]) 
		      +(par[1] - par[4])*(par[1] - par[4])))
		 *(-par[1]*par[4]*x[0] 
		   +par[4]*par[4]*x[0] 
		   +par[0]*par[0]*x[1] 
		   +par[1]*par[1]*x[1] 
		   -par[1]*par[4]*x[1] 
		   -par[0]*par[3]*(x[0] + x[1]) 
		   +par[3]*par[3]*x[0]
		   +(+par[1]*par[4]*par[2] 
		     -par[4]*par[4]*par[2] 
		     -par[0]*par[0]*par[5] 
		     -par[1]*par[1]*par[5] 
		     +par[1]*par[4]*par[5] 
		     +par[0]*par[3]*(par[2] + par[5])
		     -par[3]*par[3]*par[2])*lCosPsi*lCosTht
		   -TMath::Sqrt(inSqrt)));
  
  return zD;
}

Double_t AliMUONSurveyUtil::ZpCenter(const Double_t *x, const Double_t *par) const{
  /// Returns center z position using z coord. of 2 button targets. + solution. 

  // par :  x1l, y1l, z1l, x2l, y2l, z2l, psi, tht
  Double_t lCosPsi = TMath::Cos(par[6]);
  Double_t lSinPsi = TMath::Sin(par[6]);
  Double_t lCosTht = TMath::Cos(par[7]);
  Double_t lSinTht = TMath::Sin(par[7]);

  Double_t inSqrt = ((par[3]*par[1] - par[0]*par[4])*(par[3]*par[1] - par[0]*par[4])
		     *((-(x[0] - x[1])*(x[0] - x[1]))
		       +(((par[0] - par[3])*(par[0] - par[3])
			  +(par[1] - par[4])*(par[1] - par[4])))*lSinPsi*lSinPsi
		       +lCosPsi*((-(par[2] - par[5]))
				 *lCosTht*(-2*x[0]+2*x[1]
					   +(par[2] - par[5])*lCosPsi*lCosTht)
				 +((par[0] - par[3])*(par[0] - par[3])
				   +(par[1] - par[4])*(par[1] - par[4]))*lCosPsi*lSinTht*lSinTht)));

  if (inSqrt<0) return inSqrt*1e10;  

  Double_t zD = ((1./((par[0] - par[3])*(par[0] - par[3]) 
		      +(par[1] - par[4])*(par[1] - par[4])))
		 *(-par[1]*par[4]*x[0] 
		   +par[4]*par[4]*x[0] 
		   +par[0]*par[0]*x[1] 
		   +par[1]*par[1]*x[1] 
		   -par[1]*par[4]*x[1] 
		   -par[0]*par[3]*(x[0] + x[1]) 
		   +par[3]*par[3]*x[0]
		   +(+par[1]*par[4]*par[2] 
		     -par[4]*par[4]*par[2] 
		     -par[0]*par[0]*par[5] 
		     -par[1]*par[1]*par[5] 
		     +par[1]*par[4]*par[5] 
		     +par[0]*par[3]*(par[2] + par[5])
		     -par[3]*par[3]*par[2])*lCosPsi*lCosTht
		   +TMath::Sqrt(inSqrt)));

  return zD;
}

//______________________________________________________________________
AliMUONGeometryTransformer* AliMUONSurveyUtil::ReAlign(const AliMUONGeometryTransformer * transformer, 
						       int rMod, int rNDetElems, int rDetElemPseudoIdToDetElem[], TGeoCombiTrans deltaDetElemTransf[], Bool_t verbose)
{
  /////////////////////////////////////////////////////////////////////
  ///   Takes the internal geometry module transformers, copies them
  /// and gets the Detection Elements from them.
  /// Takes misalignment parameters and applies these
  /// to the local transform of the Detection Element
  /// Obtains the global transform by multiplying the module transformer
  /// transformation with the local transformation 
  /// Applies the global transform to a new detection element
  /// Adds the new detection element to a new module transformer
  /// Adds the new module transformer to a new geometry transformer
  /// Returns the new geometry transformer

  Int_t iDetElemId = 0;
  Int_t iDetElemPseudoId = 0;

  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;
    if ((rMod<4 && iMt==rMod) || (rMod>=4 && (iMt==4+(rMod-4)*2||iMt==4+(rMod-4)*2+1))) {
      newModuleTransform = new TGeoCombiTrans(moduleTransform*deltaDetElemTransf[rNDetElems]);
    } else {
      newModuleTransform = new TGeoCombiTrans(moduleTransform);
    }
    newModuleTransformer->SetTransformation(*newModuleTransform);
    
    // For the selected chamber add misalign module
    if ((rMod<4 && iMt==rMod) || (rMod>=4 && (iMt==4+(rMod-4)*2||iMt==4+(rMod-4)*2+1))) {
      // 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)
      printf("%i DEs in old GeometryStore  %i\n",detElements->GetSize(), iMt);
    TGeoCombiTrans *deltaLocalTransform;
    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());
      TString lDetElemName(detElement->GetDEName());
      lDetElemName.ReplaceAll("DE","");
      iDetElemId = lDetElemName.Atoi();
      iDetElemPseudoId = iDetElemId%100;
      if ((rMod<4 && iMt==rMod) || (rMod>=4 && (iMt==4+(rMod-4)*2||iMt==4+(rMod-4)*2+1))) {
	deltaLocalTransform = new TGeoCombiTrans(deltaDetElemTransf[rDetElemPseudoIdToDetElem[iDetElemPseudoId]]);       
      } else {
	deltaLocalTransform = new TGeoCombiTrans(*gGeoIdentity);
      }
      
      // local transformation of this detection element.
      TGeoCombiTrans localTransform
	= TGeoCombiTrans(*detElement->GetLocalTransformation());
      //      TGeoHMatrix newLocalMatrix = localTransform * (*deltaLocalTransform);
      TGeoCombiTrans newLocalTransform 
	= TGeoCombiTrans(localTransform * (*deltaLocalTransform));
      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)
      printf("Added module transformer %i to the transformer\n", iMt);
    newGeometryTransformer->AddModuleTransformer(newModuleTransformer);
  }
  return newGeometryTransformer;
}

void AliMUONSurveyUtil::SetAlignmentResolution(const TClonesArray* misAlignArray, Int_t chId, Double_t chResX, Double_t chResY, Double_t deResX, Double_t deResY){
  /// Sets the alignment resolution to the AliAlignObjMatrix correlation matrix

  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;

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