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 AliMUONSurveyObj
/// Base class for the survey processing of the ALICE DiMuon spectrometer 
///
/// This base object provides methods to process the survey+photogrammetry
/// data of the Chambers (frames) and Detection Elements of the DiMuon
/// Spectrometer and calculate their misalignments. 
///
/// \author Javier Castillo
//-----------------------------------------------------------------------------

#include <fstream>

#include "TMath.h"
#include "TVector3.h"
#include "TGeoMatrix.h"
#include "TFitter.h"
#include "TMinuit.h"
#include "TString.h"
#include "TH2.h"
#include "TF2.h"
#include "TGraph2DErrors.h"
#include "TArrayD.h"

#include "AliLog.h"
#include "AliSurveyPoint.h"

#include "AliMUONSurveyObj.h"
#include "AliMUONSurveyUtil.h"

void SurveyFcn(int &npar, double *g, double &f, double *par, int iflag);

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

AliMUONSurveyObj::AliMUONSurveyObj() 
  : TObject() 
  , fSTargets(0x0)
  , fGBTargets(0x0)
  , fLBTargets(0x0)
  , fLocalTrf(0x0)
  , fAlignTrf(0x0)
  , fBaseTrf(0x0)
  , fOwnerLocalTrf(kFALSE)
  , fOwnerAlignTrf(kTRUE)
  , fOwnerBaseTrf(kFALSE)
  , fUseCM(kTRUE)
  , fPlane(0x0)
  , fFitter(0x0)
  , fXMin(-400.)
  , fXMax(400.)
  , fYMin(-400.)
  , fYMax(400.)
  , fZMin(-2000.)
  , fZMax(2000.)
{
  /// Default constructor

  fSTargets = new TObjArray();  
  fSTargets->SetOwner(kFALSE);
  fGBTargets = new TObjArray();  
  fGBTargets->SetOwner(kFALSE);
  fLBTargets = new TObjArray();  
  fLBTargets->SetOwner(kFALSE);  

  fAlignTrf = new TGeoCombiTrans();

  fFitter = new TFitter(100);
}

AliMUONSurveyObj::~AliMUONSurveyObj() {
  /// Destructor
  if(fSTargets) {
    fSTargets->Delete();
    fSTargets = 0x0;
  }
  if(fGBTargets) {
    fGBTargets->Delete();
    fGBTargets = 0x0;
  }
  if(fLBTargets) {
    fLBTargets->Delete();
    fLBTargets = 0x0;
  }
  if (fPlane) {
    fPlane->Delete();
    fPlane = 0x0;
  }
  if(fOwnerLocalTrf && fLocalTrf) {
    fLocalTrf->Delete();
    fLocalTrf = 0x0;
  }
  if(fOwnerAlignTrf && fAlignTrf) {
    fAlignTrf->Delete();
    fAlignTrf = 0x0;
  }
  if(fOwnerBaseTrf && fBaseTrf) {
    fBaseTrf->Delete();
    fBaseTrf = 0x0;
  }
  if (fFitter){
    fFitter->Delete();
    fFitter = 0x0;
  }
}

void AliMUONSurveyObj::AddStickerTarget(AliSurveyPoint *stPoint){
  /// Add sticker target
  if (fUseCM) {
    fSTargets->Add(ConvertPointUnits(stPoint,0.1));
  } else {
    fSTargets->Add(stPoint);
  }
}

void AliMUONSurveyObj::AddGButtonTarget(AliSurveyPoint *btPoint){
  /// Add global button target
  if (fUseCM) {
    fGBTargets->Add(ConvertPointUnits(btPoint,0.1));
  } else {
    fGBTargets->Add(btPoint);
  }  
}

void AliMUONSurveyObj::AddLButtonTarget(AliSurveyPoint *btPoint){
  /// Add local button target target; AliSurveyPoint
  if (fUseCM) {
    fLBTargets->Add(ConvertPointUnits(btPoint,0.1));
  } else {
    fLBTargets->Add(btPoint);
  }  
}

void AliMUONSurveyObj::AddLButtonTarget(TVector3 *btVector){
  /// Add local button target target; TVector3
  fLBTargets->Add(btVector);
}

Int_t AliMUONSurveyObj::AddStickerTargets(TObjArray *pArray, TString stBaseName, Int_t lTargetMax){
  /// Add a maximum of lTargetMax sticker targets with stBaseName from pArray 
  if (!pArray) {
    AliError(Form("Survey points array is empty %p!",pArray));
    return 0;
  }
  if (stBaseName.IsNull()) {
    AliError(Form("Need base name for sticker targets %s!",stBaseName.Data()));
    return 0;
  }
  
  Int_t stIndex = 0;
  AliSurveyPoint *pointSST = 0x0;

  TString stNumber;
  
  for (int iPoint=0; iPoint<lTargetMax; iPoint++) {
    TString stFullName(stBaseName);
    stNumber = Form("%d",iPoint+1);
    if(lTargetMax>9&&iPoint+1<10) {
      stFullName+="0";
    }
    stFullName+=stNumber;

    pointSST = (AliSurveyPoint *)pArray->FindObject(stFullName.Data());

    if(pointSST) {
      AddStickerTarget(pointSST);
      AliInfo(Form("Added survey sticker target %s at index %d",pointSST->GetName(),stIndex));
      stIndex++;
    }
  }

  AliInfo(Form("Found %d sticker targets with base name %s",fSTargets->GetEntries(),stBaseName.Data()));
  return stIndex;
}

Int_t AliMUONSurveyObj::AddGButtonTargets(TObjArray *pArray, TString btBaseName, Int_t lTargetMax){
  /// Add a maximum of lTargetMax global button targets with stBaseName from pArray 
  printf("%s \n",btBaseName.Data());
  if (!pArray) {
    AliError(Form("Survey points array is empty %p!",pArray));
    return 0;
  }
  if (btBaseName.IsNull()) {
    AliError(Form("Need base name for button targets %s!",btBaseName.Data()));
    return 0;
  }
  
  Int_t btIndex = 0;
  AliSurveyPoint *pointSBT = 0x0;

  TString btNumber;
  
  for (int iPoint=0; iPoint<lTargetMax; iPoint++) {
    TString btFullName(btBaseName);
    btNumber = Form("%d",iPoint+1);
    if(lTargetMax>9&&iPoint+1<10) {
      btFullName+="0";
    }
    btFullName+=btNumber;
    printf("%s \n",btFullName.Data());
    pointSBT = (AliSurveyPoint *)pArray->FindObject(btFullName.Data());

    if(pointSBT) {
      AddGButtonTarget(pointSBT);
      AliInfo(Form("Added survey button target %s at index %d",pointSBT->GetName(),btIndex));
      btIndex++;
    }
  }

  AliInfo(Form("Found %d button targets with base name %s",fGBTargets->GetEntries(),btBaseName.Data()));
  return btIndex;
}

Int_t AliMUONSurveyObj::AddLButtonTargets(TObjArray *pArray, TString btBaseName, Int_t lTargetMax){
  /// Add a maximum of lTargetMax local button targets with stBaseName from pArray 
  printf("%s \n",btBaseName.Data());
  if (!pArray) {
    AliError(Form("Local points array is empty %p!",pArray));
    return 0;
  }
  if (btBaseName.IsNull()) {
    AliError(Form("Need base name for button targets %s!",btBaseName.Data()));
    return 0;
  }
  
  Int_t btIndex = 0;
  AliSurveyPoint *pointSBT = 0x0;

  TString btNumber;
  
  for (int iPoint=0; iPoint<lTargetMax; iPoint++) {
    TString btFullName(btBaseName);
    btNumber = Form("%d",iPoint+1);
    if(lTargetMax>9&&iPoint+1<10) {
      btFullName+="0";
    }
    btFullName+=btNumber;
    printf("%s \n",btFullName.Data());
    pointSBT = (AliSurveyPoint *)pArray->FindObject(btFullName.Data());

    if(pointSBT) {
      AddLButtonTarget(pointSBT);
      AliInfo(Form("Added local button target %s at index %d",pointSBT->GetName(),btIndex));
      btIndex++;
    }
  }

  AliInfo(Form("Found %d local button targets with base name %s",fLBTargets->GetEntries(),btBaseName.Data()));
  return btIndex;
}

Int_t AliMUONSurveyObj::GetNStickerTargets() {
  /// return number of sticker targets
  return fSTargets->GetEntriesFast();
}

AliSurveyPoint* AliMUONSurveyObj::GetStickerTarget(Int_t stIndex){
  /// return sticker target at stIndex
  if (stIndex<0||stIndex>=fSTargets->GetEntriesFast()) {
    AliError(Form("No sticker target at index %d",stIndex));
    return 0x0;
  }
  else {
    return (AliSurveyPoint*)fSTargets->At(stIndex);
  }
}

Int_t AliMUONSurveyObj::GetNGButtonTargets() {
  /// return number of global button targets
  return fGBTargets->GetEntriesFast();
}

AliSurveyPoint* AliMUONSurveyObj::GetGButtonTarget(Int_t btIndex){
  /// return global button target at btIndex
  if (btIndex<0||btIndex>=fGBTargets->GetEntriesFast()) {
    AliError(Form("No surveyed button target at index %d",btIndex));
    return 0x0;
  }
  else {
    return (AliSurveyPoint*)fGBTargets->At(btIndex);
  }
}

Int_t AliMUONSurveyObj::GetNLButtonTargets() {
  /// return number of local button targets
  return fGBTargets->GetEntriesFast();
}

AliSurveyPoint* AliMUONSurveyObj::GetLButtonTarget(Int_t btIndex){
  /// return local button target at btIndex
  if (btIndex<0||btIndex>=fLBTargets->GetEntriesFast()) {
    AliError(Form("No surveyed button target at index %d",btIndex));
    return 0x0;
  }
  else {
    if(fLBTargets->At(btIndex)->IsA()==TVector3::Class()){
      TVector3 *lBT = (TVector3*)fLBTargets->At(btIndex);
      TString str("B");
      return (new AliSurveyPoint(TString("local"),(float)lBT->X(),(float)lBT->Y(),(float)lBT->Z(),(float)0.,(float)0.,(float)0.,'B',kTRUE));
    } else if(fLBTargets->At(btIndex)->IsA()==AliSurveyPoint::Class()) {
      AliSurveyPoint *lBT = (AliSurveyPoint*)fLBTargets->At(btIndex);
      return lBT;
    } else {
      AliError(Form("Unexpected class %s ! Valid classes are TVector3 or AliSurveyPoint",fLBTargets->At(btIndex)->ClassName()));
      return 0;
    }
  }
}

void AliMUONSurveyObj::SetPlane(TString pName, Double_t xMin, Double_t xMax, Double_t yMin, Double_t yMax){
  /// Set the plane function for the plane fitting
  if(fPlane) {
    fPlane->Delete();
    fPlane = 0x0;
  }
  fPlane = new TF2(pName,this,&AliMUONSurveyObj::EqPlane,xMin,xMax,yMin,yMax,3,"AliMUONSurveyObj","EqPlane");
}

void AliMUONSurveyObj::SetPlaneParameters(Double_t p0, Double_t p1, Double_t p2) {
  /// Set the parameters of plane function for the plane fitting
  if (!fPlane) {
    AliError("Must use SetPlane before SetPlaneParameters!!!");
  }
  else {
    fPlane->SetParameter(0,p0);
    fPlane->SetParameter(1,p1);
    fPlane->SetParameter(2,p2);
  }
}

void AliMUONSurveyObj::DrawSTargets() {
  /// Draw a graph of the sticker targets
  TGraph2DErrors *gST = new TGraph2DErrors(3);
  AliSurveyPoint *pST = 0x0;
  for (Int_t iPoint=0; iPoint<GetNStickerTargets(); iPoint++) {
    pST = GetStickerTarget(iPoint);
    //    pST->PrintPoint();
    gST->SetPoint(iPoint,pST->GetX(),pST->GetY(),pST->GetZ());
    gST->SetPointError(iPoint,pST->GetPrecisionX(),pST->GetPrecisionY(),pST->GetPrecisionZ());
  }
  gST->DrawClone("P0");

  delete gST;
}

Double_t AliMUONSurveyObj::FitPlane() {
  /// Fit plane to sticker targets
  if (!fPlane) {
    AliError("Must use SetPlane before FitPlane!!!");
    return 0.;
  }
  if (fSTargets->GetEntriesFast()<3) {
    AliError("Not enough sticker targets (%d) for plane fitting!!!");
    return 0.;
  }

  Double_t pl[3] = {0};
  Double_t pg[3] = {0};
    
  TGraph2DErrors *gST = new TGraph2DErrors(3);
  AliSurveyPoint *pST = 0x0;
  for (Int_t iPoint=0; iPoint<GetNStickerTargets(); iPoint++) {
    pST = GetStickerTarget(iPoint);
    //    pST->PrintPoint();
    pg[0] =  pST->GetX(); 
    pg[1] =  pST->GetY(); 
    pg[2] =  pST->GetZ(); 
    fBaseTrf->MasterToLocal(pg,pl);
    gST->SetPoint(iPoint,pl[0],pl[1],pl[2]);
    printf("%d %f %f %f\n",iPoint,pl[0],pl[1],pl[2]);
    gST->SetPointError(iPoint,pST->GetPrecisionX(),pST->GetPrecisionY(),pST->GetPrecisionZ());
  }
  gST->Fit(fPlane);

  delete gST;

  return fPlane->GetChisquare();
}

Double_t AliMUONSurveyObj::SurveyChi2(Double_t *par){
  /// Returns the chisquare between local2global transform of local button targets and their surveyed position
  TGeoTranslation transTemp;
  TGeoRotation rotTemp;
  TGeoCombiTrans trfTemp;

  Double_t lChi2=0.;

  trfTemp.SetTranslation(transTemp);
  trfTemp.SetRotation(rotTemp);
  trfTemp.Clear();
  trfTemp.RotateZ(TMath::RadToDeg()*par[5]);
  trfTemp.RotateY(TMath::RadToDeg()*par[4]);
  trfTemp.RotateX(TMath::RadToDeg()*par[3]);
  trfTemp.SetTranslation(par[0],par[1],par[2]);

  TGeoHMatrix matGlo = (*fBaseTrf)*trfTemp;
  TGeoCombiTrans trfGlo(matGlo);
		
  Double_t pl[3] = {0};
  Double_t pg[3] = {0};
  
  for(Int_t iPoint=0; iPoint<fGBTargets->GetEntries(); iPoint++){
    AliSurveyPoint *gBT = (AliSurveyPoint*)fGBTargets->At(iPoint);
    if(fLBTargets->At(iPoint)->IsA()==TVector3::Class()){
      TVector3 *lBT = (TVector3*)fLBTargets->At(iPoint);
      pl[0]=lBT->X();
      pl[1]=lBT->Y();
      pl[2]=lBT->Z();
    } else if(fLBTargets->At(iPoint)->IsA()==AliSurveyPoint::Class()) {
      AliSurveyPoint *lBT = (AliSurveyPoint*)fLBTargets->At(iPoint);
      pl[0]=lBT->GetX();
      pl[1]=lBT->GetY();
      pl[2]=lBT->GetZ();
    } else {
      AliError(Form("Unexpected class %s ! Valid classes are TVector3 or AliSurveyPoint",fLBTargets->At(iPoint)->ClassName()));
      return 0;
    }

    trfGlo.LocalToMaster(pl, pg);
    //    printf("%d %f %f %f\n",iPoint,pg[0],pg[1],pg[2]);
    if(fLBTargets->At(iPoint)->IsA()==TVector3::Class()){
      lChi2 += (pg[0]-gBT->GetX())*(pg[0]-gBT->GetX())/(gBT->GetPrecisionX()*gBT->GetPrecisionX());
      lChi2 += (pg[1]-gBT->GetY())*(pg[1]-gBT->GetY())/(gBT->GetPrecisionY()*gBT->GetPrecisionY());
      lChi2 += (pg[2]-gBT->GetZ())*(pg[2]-gBT->GetZ())/(gBT->GetPrecisionZ()*gBT->GetPrecisionZ());
    } else if(fLBTargets->At(iPoint)->IsA()==AliSurveyPoint::Class()) {
      AliSurveyPoint *lBT = (AliSurveyPoint*)fLBTargets->At(iPoint);
      lChi2 += (pg[0]-gBT->GetX())*(pg[0]-gBT->GetX())/(gBT->GetPrecisionX()*gBT->GetPrecisionX()+lBT->GetPrecisionX()*lBT->GetPrecisionX());
      lChi2 += (pg[1]-gBT->GetY())*(pg[1]-gBT->GetY())/(gBT->GetPrecisionY()*gBT->GetPrecisionY()+lBT->GetPrecisionY()*lBT->GetPrecisionY());
      lChi2 += (pg[2]-gBT->GetZ())*(pg[2]-gBT->GetZ())/(gBT->GetPrecisionZ()*gBT->GetPrecisionZ()+lBT->GetPrecisionZ()*lBT->GetPrecisionZ());
    } else {
      AliError(Form("Unexpected class %s ! Valid classes are TVector3 or AliSurveyPoint",fLBTargets->At(iPoint)->ClassName()));
      return 0;
    }
  }

  return lChi2;
}

//_____________________________________________________________________________
void SurveyFcn(int &npar, double *g, double &f, double *par, int iflag) {
  /// 
  /// Standard function as needed by Minuit-like minimization procedures. 
  /// For the set of parameters par calculates and returns chi-squared.
  ///

  // smuggle a C++ object into a C function
  AliMUONSurveyObj *aSurveyObj = (AliMUONSurveyObj*) gMinuit->GetObjectFit(); 

  f = aSurveyObj->SurveyChi2(par);
  if (iflag==3) {}
  if (npar) {} 
  if (g) {} // no warnings about unused stuff...

}

//_____________________________________________________________________________
Int_t AliMUONSurveyObj::SurveyToAlign(TGeoCombiTrans &quadTransf, Double_t *parErr, Double_t psi, Double_t tht, Double_t epsi, Double_t etht) {
  /// Main function to obtain the misalignments from the surveyed position of the button targets; 
  if (fGBTargets->GetEntries()!=fLBTargets->GetEntries()){
    AliError(Form("Different number of button targets: %d survey points and %d local coord!",
		  fGBTargets->GetEntries(),fLBTargets->GetEntries()));
    return 0;
  }

  TFitter fitter(100);
  gMinuit->SetObjectFit(this);
  fitter.SetFCN(SurveyFcn);
  fitter.SetParameter(0,"dx",0,0.1,-20,20);
  fitter.SetParameter(1,"dy",0,0.1,-20,20);
  fitter.SetParameter(2,"dz",0,0.1,0,0);
  fitter.SetParameter(3,"rx",psi,0.0001,-0.05,0.05);
  fitter.SetParameter(4,"ry",tht,0.0001,-0.05,0.05);
//   fitter.SetParameter(3,"rx",psi,0.0001,psi-5*epsi,psi+5*epsi);
//   fitter.SetParameter(4,"ry",tht,0.0001,tht-5*etht,tht+5*etht);
  fitter.SetParameter(5,"rz",0,0.0001,0,0);

  if(psi) fitter.FixParameter(3);
  if(tht) fitter.FixParameter(4);

  double arglist[100];
  arglist[0] = 2;
  fitter.ExecuteCommand("SET PRINT", arglist, 1);
  fitter.ExecuteCommand("SET ERR", arglist, 1);
  arglist[0]=0;
  //fitter.ExecuteCommand("SIMPLEX", arglist, 1);
  //  fitter.ExecuteCommand("MINIMIZE", arglist, 1);
  fitter.ExecuteCommand("MIGRAD", arglist, 1);
  fitter.ExecuteCommand("IMPROVE", arglist, 1);
  //  fitter.ExecuteCommand("MINOS", arglist, 1);
  //  fitter.ExecuteCommand("CALL 3", arglist,0);

  for (int j=0; j<3; j++) printf("%10.3f ",fitter.GetParameter(j));   
  for (int j=3; j<6; j++) printf("%10.3f ",1000*fitter.GetParameter(j));   
  printf("\n");
  for (int j=0; j<3; j++) printf("%10.3f ",fitter.GetParError(j));
  for (int j=3; j<6; j++) printf("%10.3f ",1000*fitter.GetParError(j));
  printf("\n");

  quadTransf.Clear();
  quadTransf.RotateZ(TMath::RadToDeg()*fitter.GetParameter(5));
  quadTransf.RotateY(TMath::RadToDeg()*fitter.GetParameter(4));
  quadTransf.RotateX(TMath::RadToDeg()*fitter.GetParameter(3));
  quadTransf.SetTranslation(fitter.GetParameter(0),fitter.GetParameter(1),fitter.GetParameter(2));

  for(Int_t iPar=0; iPar<6; iPar++){
    parErr[iPar] = fitter.GetParError(iPar);
  }
  if(epsi) parErr[3] = epsi;
  if(etht) parErr[4] = etht;

  return 1;

}

//_____________________________________________________________________________
Int_t AliMUONSurveyObj::SurveyToAlign(Double_t psi, Double_t tht, Double_t epsi, Double_t etht) {
  /// Main function to obtain the misalignments from the surveyed position of the button targets; 
  if (fGBTargets->GetEntries()!=fLBTargets->GetEntries()){
    AliError(Form("Different number of button targets: %d survey points and %d local coord!",
		  fGBTargets->GetEntries(),fLBTargets->GetEntries()));
    return 0;
  }

  //  TFitter fitter(100);
  gMinuit->SetObjectFit(this);
  fFitter->SetFCN(SurveyFcn);
  fFitter->SetParameter(0,"dx",0,0.1,-20,20);
  fFitter->SetParameter(1,"dy",0,0.1,-20,20);
  fFitter->SetParameter(2,"dz",0,0.1,0,0);
  if(psi)
      fFitter->SetParameter(3,"rx",psi,epsi,psi-5*epsi,psi+5*epsi);
  else
    fFitter->SetParameter(3,"rx",psi,0.0001,-0.05,0.05);
  if(tht)
    fFitter->SetParameter(4,"ry",tht,etht,tht-5*etht,tht+5*etht);
  else
    fFitter->SetParameter(4,"ry",tht,0.0001,-0.05,0.05);
//   fFitter->SetParameter(3,"rx",psi,0.0001,psi-5*epsi,psi+5*epsi);
//   fFitter->SetParameter(4,"ry",tht,0.0001,tht-5*etht,tht+5*etht);
  fFitter->SetParameter(5,"rz",0,0.0001,0,0);

  if(psi) fFitter->FixParameter(3);
  if(tht) fFitter->FixParameter(4);

  double arglist[100];
  arglist[0] = 2;
  fFitter->ExecuteCommand("SET PRINT", arglist, 1);
  fFitter->ExecuteCommand("SET ERR", arglist, 1);
  arglist[0]=0;
  //fFitter->ExecuteCommand("SIMPLEX", arglist, 1);
  //  fFitter->ExecuteCommand("MINIMIZE", arglist, 1);
  fFitter->ExecuteCommand("MIGRAD", arglist, 1);
  fFitter->ExecuteCommand("IMPROVE", arglist, 1);
//   fFitter->ExecuteCommand("MINOS", arglist, 1);
//   fFitter->ExecuteCommand("CALL 3", arglist,0);

  for (int j=0; j<3; j++) printf("%10.3f ",fFitter->GetParameter(j));   
  for (int j=3; j<6; j++) printf("%10.3f ",1000*fFitter->GetParameter(j));   
  printf("\n");
  for (int j=0; j<3; j++) printf("%10.3f ",fFitter->GetParError(j));
  for (int j=3; j<6; j++) printf("%10.3f ",1000*fFitter->GetParError(j));
  printf("\n");

  fAlignTrf->Clear();
  fAlignTrf->RotateZ(TMath::RadToDeg()*fFitter->GetParameter(5));
  fAlignTrf->RotateY(TMath::RadToDeg()*fFitter->GetParameter(4));
  fAlignTrf->RotateX(TMath::RadToDeg()*fFitter->GetParameter(3));
  fAlignTrf->SetTranslation(fFitter->GetParameter(0),fFitter->GetParameter(1),fFitter->GetParameter(2));

  if(epsi) fFitter->ReleaseParameter(3); // To get error
  if(etht) fFitter->ReleaseParameter(4); // To get error

  TGeoCombiTrans lGlobalTrf = TGeoCombiTrans((*fBaseTrf)*(*fAlignTrf));
  AliSurveyPoint *pointGBT;
  AliSurveyPoint *pointLBT;
  Double_t pl[3] = {0};
  Double_t pg[3] = {0};
  for (int iPoint=0; iPoint<GetNGButtonTargets(); iPoint++){
    pointGBT=GetGButtonTarget(iPoint);
    pointLBT=GetLButtonTarget(iPoint);
    pl[0] = pointLBT->GetX();
    pl[1] = pointLBT->GetY();
    pl[2] = pointLBT->GetZ();
    lGlobalTrf.LocalToMaster(pl,pg);
    printf("Point %d  local: %.3f %.3f %.3f\n",iPoint,pl[0],pl[1],pl[2]);
    printf("Point %d global: %.3f %.3f %.3f\n",iPoint,pg[0],pg[1],pg[2]);
    printf("Point %d survey: %.3f %.3f %.3f\n",iPoint,pointGBT->GetX(),pointGBT->GetY(),pointGBT->GetZ());
  }

  return 1;

}

Double_t AliMUONSurveyObj::EvalFunction(const TF2 *lFunction, Int_t iP1, Int_t iP2, const Char_t *lCoord) {
  /// Evaluate the given function at the given points for the given coordinate
  if (!lFunction) {
    AliError("No function given!!!");
    return 0;
  }
  AliSurveyPoint *gP1 = GetGButtonTarget(iP1);
  AliSurveyPoint *gP2 = GetGButtonTarget(iP2);
  
  if(!gP1||!gP2){
    AliError("Missing global button target!!!");
    return 0;
  }

  //  AliInfo(Form("Function %s parameters %f %f %f %f %f %f",lFunction->GetName(),lFunction->GetParameter(0),lFunction->GetParameter(1),lFunction->GetParameter(2),lFunction->GetParameter(3),lFunction->GetParameter(4),lFunction->GetParameter(5)));
  Double_t pl1[3] = {0};
  Double_t pl2[3] = {0};
  Double_t pg1[3] = {0};
  Double_t pg2[3] = {0};
    
  pg1[0] =  gP1->GetX(); 
  pg1[1] =  gP1->GetY(); 
  pg1[2] =  gP1->GetZ(); 
  pg2[0] =  gP2->GetX(); 
  pg2[1] =  gP2->GetY(); 
  pg2[2] =  gP2->GetZ(); 

  fBaseTrf->MasterToLocal(pg1,pl1);
  fBaseTrf->MasterToLocal(pg2,pl2);

  Double_t lVal = 0.;
  switch (lCoord[0]) {
  case 'X':
    {
      lVal = lFunction->Eval(pl1[0],pl2[0]);
      //      lVal = lFunction->Eval(gP1->GetX(),gP2->GetX());
      //      AliInfo(Form("case X, lVal = %f",lVal));
      return lVal;
    }
  case 'Y':
    {
      lVal = lFunction->Eval(pl1[1],pl2[1]);
      //      lVal = lFunction->Eval(gP1->GetY(),gP2->GetY());
      //      AliInfo(Form("case Y, lVal = %f",lVal));
      return lVal;
    }
  case 'Z':
    {
      lVal = lFunction->Eval(pl1[2],pl2[2]);
      //      lVal = lFunction->Eval(gP1->GetZ(),gP2->GetZ());
      //      AliInfo(Form("case Z, lVal = %f",lVal));
      return lVal;
    }
  default:
    {
      AliError(Form("Coordinate %s is not valid, options are X Y Z",lCoord));
      return 0;
    }
  }
}

void AliMUONSurveyObj::CalculateTranslation(TF2 *xFunc, TF2 *yFunc, TF2 *zFunc, Int_t iP1, Int_t iP2, Double_t *lCenTemp) {
  /// Calculate the center translation using analytic functions
  lCenTemp[0] = EvalFunction(xFunc,iP1,iP2,"X");
  lCenTemp[1] = EvalFunction(yFunc,iP1,iP2,"Y");
  lCenTemp[2] = EvalFunction(zFunc,iP1,iP2,"Z");

}

Double_t AliMUONSurveyObj::CalculateGlobalDiff(TGeoCombiTrans &lTransf, Int_t nPoints, TArrayD &lDiff){
  /// By hand computation of distance between local2global transform of target position and its surveyed position
  if (nPoints > GetNGButtonTargets()) {
    nPoints = GetNGButtonTargets();
  }

  for(Int_t iVal=0; iVal<nPoints*(3+1)+1; iVal++){
    lDiff[iVal] = 0.;
  }

  Double_t pl[3] = {0};
  Double_t pg[3] = {0};
  Double_t pml[3] = {0};
  Double_t pmg[3] = {0};
  AliSurveyPoint *gBT = 0x0;
  for(Int_t iPoint=0; iPoint<nPoints; iPoint++){
    gBT = GetGButtonTarget(iPoint);
    if(!gBT||!fLBTargets->At(iPoint)){
      AliError(Form("The local or global target %d is missing!",iPoint));
      lDiff[nPoints*(3+1)] = 1.e7;
      return lDiff[nPoints*(3+1)];
    }
    if(fLBTargets->At(iPoint)->IsA()==TVector3::Class()){
      TVector3 *lBT = (TVector3*)fLBTargets->At(iPoint);
      pl[0]=lBT->X();
      pl[1]=lBT->Y();
      pl[2]=lBT->Z();
    } else if(fLBTargets->At(iPoint)->IsA()==AliSurveyPoint::Class()) {
      AliSurveyPoint *lBT = (AliSurveyPoint*)fLBTargets->At(iPoint);
      pl[0]=lBT->GetX();
      pl[1]=lBT->GetY();
      pl[2]=lBT->GetZ();
    } else {
      AliError(Form("Unexpected class %s ! Valid classes are TVector3 or AliSurveyPoint",fLBTargets->At(iPoint)->ClassName()));
      return 0;
    }

    lTransf.LocalToMaster(pl,pg);
    pmg[0] = gBT->GetX();
    pmg[1] = gBT->GetY();
    pmg[2] = gBT->GetZ();
    fBaseTrf->MasterToLocal(pmg,pml);
//     printf("l %d %f %f %f\n",iPoint,pl[0],pl[1],pl[2]);
//     printf("g %d %f %f %f\n",iPoint,pg[0],pg[1],pg[2]);
//     printf("ml %d %f %f %f\n",iPoint,pml[0],pml[1],pml[2]);
//     printf("mg %d %f %f %f\n",iPoint,gBT->GetX(),gBT->GetY(),gBT->GetZ());
    lDiff[iPoint*(3+1)+0] = (pml[0]-pg[0]);
    lDiff[iPoint*(3+1)+1] = (pml[1]-pg[1]);
    lDiff[iPoint*(3+1)+2] = (pml[2]-pg[2]);
    
    lDiff[iPoint*(3+1)+3] = TMath::Sqrt(lDiff[iPoint*(3+1)+0]*lDiff[iPoint*(3+1)+0]+
					lDiff[iPoint*(3+1)+1]*lDiff[iPoint*(3+1)+1]+
					lDiff[iPoint*(3+1)+2]*lDiff[iPoint*(3+1)+2]);

    lDiff[nPoints*(3+1)] += lDiff[iPoint*(3+1)+3]*lDiff[iPoint*(3+1)+3];
  }
		
  lDiff[nPoints*(3+1)] = TMath::Sqrt(lDiff[nPoints*(3+1)]);
  return lDiff[nPoints*(3+1)];
}

Int_t AliMUONSurveyObj::CalculateBestTransf(Int_t iP1, Int_t iP2, Double_t *lXYZ, Double_t *lPTP) {
  /// By hand calculation of the best local to global transform using 2 button targets
  Double_t lPsi = lPTP[0];
  Double_t lTht = lPTP[1];

  Double_t pl1[3] = {0};
  Double_t pl2[3] = {0};

  if(!fLBTargets->At(iP1)||!fLBTargets->At(iP2)){
    AliError(Form("Local target %d or %d is missing!",iP1,iP2));
    return 0;
  }

  if(fLBTargets->At(iP1)->IsA()==TVector3::Class()){
    TVector3 *lBT1 = (TVector3*)fLBTargets->At(iP1);
    pl1[0]=lBT1->X();
    pl1[1]=lBT1->Y();
    pl1[2]=lBT1->Z();
  } else if(fLBTargets->At(iP1)->IsA()==AliSurveyPoint::Class()) {
    AliSurveyPoint *lBT1 = (AliSurveyPoint*)fLBTargets->At(iP1);
    pl1[0]=lBT1->GetX();
    pl1[1]=lBT1->GetY();
    pl1[2]=lBT1->GetZ();
  } else {
    AliError(Form("Unexpected class %s ! Valid classes are TVector3 or AliSurveyPoint",fLBTargets->At(iP1)->ClassName()));
    return 0;
  }
  if(fLBTargets->At(iP2)->IsA()==TVector3::Class()){
    TVector3 *lBT2 = (TVector3*)fLBTargets->At(iP2);
    pl2[0]=lBT2->X();
    pl2[1]=lBT2->Y();
    pl2[2]=lBT2->Z();
  } else if(fLBTargets->At(iP2)->IsA()==AliSurveyPoint::Class()) {
    AliSurveyPoint *lBT2 = (AliSurveyPoint*)fLBTargets->At(iP2);
    pl2[0]=lBT2->GetX();
    pl2[1]=lBT2->GetY();
    pl2[2]=lBT2->GetZ();
  } else {
    AliError(Form("Unexpected class %s ! Valid classes are TVector3 or AliSurveyPoint",fLBTargets->At(iP2)->ClassName()));
    return 0;
  }

  
  AliMUONSurveyUtil *surveyUtil = AliMUONSurveyUtil::Instance();

  // Xcenter functions
  const char *fxcName = "fXcn00"; 
  TF2 **fXc = new TF2*[2];
  fxcName = "fXcn";
  fXc[0] = new TF2(fxcName,surveyUtil,&AliMUONSurveyUtil::XnCenter,fXMin,fXMax,fYMin,fYMax,7,"AliMUONSurveyUtil","XnCenter");
  fxcName = "fXcp";
  fXc[1] = new TF2(fxcName,surveyUtil,&AliMUONSurveyUtil::XpCenter,fXMin,fXMax,fYMin,fYMax,7,"AliMUONSurveyUtil","XpCenter");

  // Ycenter functions
  const char *fycName = "fYcn00"; 
  TF2 **fYc = new TF2*[2];
  fycName = "fYcn";
  fYc[0] = new TF2(fycName,surveyUtil,&AliMUONSurveyUtil::YnCenter,fYMin,fYMax,fYMin,fYMax,8,"AliMUONSurveyUtil","YnCenter");
  fycName = "fYcp";
  fYc[1] = new TF2(fycName,surveyUtil,&AliMUONSurveyUtil::YpCenter,fYMin,fYMax,fYMin,fYMax,8,"AliMUONSurveyUtil","YpCenter");   

  // Zcenter functions
  const char *fzcName = "fZcn00"; 
  TF2 **fZc = new TF2*[2];
  fzcName = "fZcn";
  fZc[0] = new TF2(fzcName,surveyUtil,&AliMUONSurveyUtil::ZnCenter,fZMin,fZMax,fZMin,fZMax,8,"AliMUONSurveyUtil","ZnCenter");
  fzcName = "fZcp";
  fZc[1] = new TF2(fzcName,surveyUtil,&AliMUONSurveyUtil::ZpCenter,fZMin,fZMax,fZMin,fZMax,8,"AliMUONSurveyUtil","ZpCenter");   

  // Phi rotation using xglobal coords functions
  const char *fphixName = "fPhiXnn00"; 
  TF2 ***fPhiX = new TF2**[2];
  for (Int_t iX =0; iX<2; iX++) {
    fPhiX[iX] = new TF2*[2];
  }
  fphixName = "fPhiXnn";
  fPhiX[0][0] = new TF2(fphixName,surveyUtil,&AliMUONSurveyUtil::PhiXnn,fXMin,fXMax,fXMin,fXMax,7,"AliMUONSurveyUtil","PhiXnn");
  fphixName = "fPhiXnp";
  fPhiX[0][1] = new TF2(fphixName,surveyUtil,&AliMUONSurveyUtil::PhiXnp,fXMin,fXMax,fXMin,fXMax,7,"AliMUONSurveyUtil","PhiXnp");   
  fphixName = "fPhiXpn";
  fPhiX[1][0] = new TF2(fphixName,surveyUtil,&AliMUONSurveyUtil::PhiXpn,fXMin,fXMax,fXMin,fXMax,7,"AliMUONSurveyUtil","PhiXpn");
  fphixName = "fPhiXpp";
  fPhiX[1][1] = new TF2(fphixName,surveyUtil,&AliMUONSurveyUtil::PhiXpp,fXMin,fXMax,fXMin,fXMax,7,"AliMUONSurveyUtil","PhiXpp");   

  // Phi rotation using yglobal coords functions
  const char *fphiyName = "fPhiYnn00"; 
  TF2 ***fPhiY = new TF2**[2];
  for (Int_t iY =0; iY<2; iY++) {
    fPhiY[iY] = new TF2*[2];
  }
  fphiyName = "fPhiYnn";
  fPhiY[0][0] = new TF2(fphiyName,surveyUtil,&AliMUONSurveyUtil::PhiYnn,fYMin,fYMax,fYMin,fYMax,8,"AliMUONSurveyUtil","PhiYnn");
  fphiyName = "fPhiYnp";
  fPhiY[0][1] = new TF2(fphiyName,surveyUtil,&AliMUONSurveyUtil::PhiYnp,fYMin,fYMax,fYMin,fYMax,8,"AliMUONSurveyUtil","PhiYnp");   
  fphiyName = "fPhiYpn";
  fPhiY[1][0] = new TF2(fphiyName,surveyUtil,&AliMUONSurveyUtil::PhiYpn,fYMin,fYMax,fYMin,fYMax,8,"AliMUONSurveyUtil","PhiYpn");
  fphiyName = "fPhiYpp";
  fPhiY[1][1] = new TF2(fphiyName,surveyUtil,&AliMUONSurveyUtil::PhiYpp,fYMin,fYMax,fYMin,fYMax,8,"AliMUONSurveyUtil","PhiYpp");   
  

  // Set Parameters of functions
  for(Int_t iS=0; iS<2; iS++){
    fXc[iS]->SetParameters(pl1[0],pl1[1],pl1[2],pl2[0],pl2[1],pl2[2],lTht);
    fYc[iS]->SetParameters(pl1[0],pl1[1],pl1[2],pl2[0],pl2[1],pl2[2],lPsi,lTht);
    fZc[iS]->SetParameters(pl1[0],pl1[1],pl1[2],pl2[0],pl2[1],pl2[2],lPsi,lTht);
//     fXc[iS]->SetParameters(lBT1->X(),lBT1->Y(),lBT1->Z(),lBT2->X(),lBT2->Y(),lBT2->Z(),lTht);
//     fYc[iS]->SetParameters(lBT1->X(),lBT1->Y(),lBT1->Z(),lBT2->X(),lBT2->Y(),lBT2->Z(),lPsi,lTht);
//     fZc[iS]->SetParameters(lBT1->X(),lBT1->Y(),lBT1->Z(),lBT2->X(),lBT2->Y(),lBT2->Z(),lPsi,lTht);
    for(Int_t jS=0; jS<2; jS++){
      fPhiX[iS][jS]->SetParameters(pl1[0],pl1[1],pl1[2],pl2[0],pl2[1],pl2[2],lTht);
      fPhiY[iS][jS]->SetParameters(pl1[0],pl1[1],pl1[2],pl2[0],pl2[1],pl2[2],lPsi,lTht);
//     fPhiX[iS][jS]->SetParameters(lBT1->X(),lBT1->Y(),lBT1->Z(),lBT2->X(),lBT2->Y(),lBT2->Z(),lTht);
//     fPhiY[iS][jS]->SetParameters(lBT1->X(),lBT1->Y(),lBT1->Z(),lBT2->X(),lBT2->Y(),lBT2->Z(),lPsi,lTht);
    }
  }

  Double_t lCenTemp[3];
  Double_t lRotTemp[3];

  TGeoCombiTrans trfTemp;

  Int_t nPoints = GetNGButtonTargets();

  TArrayD lDiffTemp(nPoints*(3+1)+1);
  TArrayD lDiffMin(nPoints*(3+1)+1);

  for(Int_t i=0; i<nPoints*(3+1)+1; i++){
    lDiffMin[i]=1000000.;
    lDiffTemp[i]=0.;
  }

  //
  // Calculate Detection Element Center from button targets
  //	
  
  // Trying 2x*2y*2z*(2phi+2phi) possibilities
  for(Int_t iX=0; iX<2; iX++){
    for(Int_t iY=0; iY<2; iY++){
      for(Int_t iZ=0; iZ<2; iZ++){
	CalculateTranslation(fXc[iX],fYc[iY],fZc[iZ],iP1,iP2,lCenTemp);
	
	lRotTemp[0] = lPsi;
	lRotTemp[1] = lTht;
	for(Int_t iP=0; iP<2; iP++){
	  lRotTemp[2] = EvalFunction(fPhiX[iX][iP],iP1,iP2,"X");
	  
	  trfTemp.Clear();
	  trfTemp.RotateZ(TMath::RadToDeg()*lRotTemp[2]);
	  trfTemp.RotateY(TMath::RadToDeg()*lRotTemp[1]);
	  trfTemp.RotateX(TMath::RadToDeg()*lRotTemp[0]);
	  trfTemp.SetTranslation(lCenTemp);
	  
	  if(CalculateGlobalDiff(trfTemp,nPoints,lDiffTemp)<lDiffMin[nPoints*(3+1)]){
	    printf("Diffs");
	    for(Int_t i=0; i<nPoints*(3+1)+1; i++){
	      printf(" %f",lDiffTemp[i]); 
	    }
	    printf("\n");
	    printf(" : mycenX%dY%dZ%d(%f,%f,%f); rotx%d(%f,%f,%f)\n",iX,iY,iZ,lCenTemp[0],lCenTemp[1],lCenTemp[2],iP,lRotTemp[0],lRotTemp[1],lRotTemp[2]);
	    printf("Transformation improved ...\n");
	    for (int i=0; i<3; i++) {
	      lXYZ[i] = lCenTemp[i];
	    } 
	    lPTP[2] = lRotTemp[2];
	    for(Int_t i=0; i<nPoints*(3+1)+1; i++){
	      lDiffMin[i]=lDiffTemp[i];
	    }
	  }
	}
	for(Int_t iP=0; iP<2; iP++){
	  lRotTemp[2] = EvalFunction(fPhiY[iY][iP],iP1,iP2,"Y");
	  
	  trfTemp.Clear();
	  trfTemp.RotateZ(TMath::RadToDeg()*lRotTemp[2]);
	  trfTemp.RotateY(TMath::RadToDeg()*lRotTemp[1]);
	  trfTemp.RotateX(TMath::RadToDeg()*lRotTemp[0]);
	  trfTemp.SetTranslation(lCenTemp);
	  
	  if(CalculateGlobalDiff(trfTemp,nPoints,lDiffTemp)<lDiffMin[nPoints*(3+1)]){
	    printf("Diffs");
	    for(Int_t i=0; i<nPoints*(3+1)+1; i++){
	      printf(" %f",lDiffTemp[i]); 
	    }
	    printf("\n");
	    printf(" : mycenX%dY%dZ%d(%f,%f,%f); roty%d(%f,%f,%f)\n",iX,iY,iZ,lCenTemp[0],lCenTemp[1],lCenTemp[2],iP,lRotTemp[0],lRotTemp[1],lRotTemp[2]);
	    printf("Transformation improved ...\n");
	    for (int i=0; i<3; i++) {
	      lXYZ[i] = lCenTemp[i];
	    } 
	    lPTP[2] = lRotTemp[2];
	    for(Int_t i=0; i<nPoints*(3+1)+1; i++){
	      lDiffMin[i]=lDiffTemp[i];
	    }
	  }
	}
      }
    }
  }

  for (Int_t i=0; i<2; i++) {
    delete fXc[i];
    delete fYc[i];
    delete fZc[i];
    for (Int_t j=0; j<2; j++) {
      delete fPhiX[i][j];
      delete fPhiY[i][j];
    }
    delete[] fPhiX[i];
    delete[] fPhiY[i];
  }
  delete[] fXc;
  delete[] fYc;
  delete[] fZc;
  delete[] fPhiX;
  delete[] fPhiY;

  if (lDiffMin[nPoints*(3+1)]>20) return 0;

  return 1;
}

void AliMUONSurveyObj::CalculateMeanTransf(Double_t *lXYZ, Double_t *lPTP) {
  /// By hand calculation of the mean (for nPairs of targets) of the best local to global transform using 2 button targets
    Double_t xce=0.;
    Double_t yce=0.;
    Double_t zce=0.;
    Double_t phi=0.;
    
    Int_t nPairs = 0;
    Int_t nPoints = GetNGButtonTargets();
    // Loop over all possible pairs of button tragets
    for(Int_t iP1=0; iP1<nPoints; iP1++){
      for(Int_t iP2=iP1+1; iP2<nPoints; iP2++){
 	printf("%d and %d\n",iP1,iP2);

	if(CalculateBestTransf(iP1,iP2,lXYZ,lPTP)) {
	  nPairs++;
	
	  xce+=lXYZ[0];
	  yce+=lXYZ[1];
	  zce+=lXYZ[2];
	  phi+=lPTP[2];
	}
      }
    }

    if (!nPairs) return;
    
    lXYZ[0]=xce/nPairs;
    lXYZ[1]=yce/nPairs;
    lXYZ[2]=zce/nPairs;
    lPTP[2]=phi/nPairs;
}

void AliMUONSurveyObj::PrintLocalTrf() {
  /// Print the local transformation
  Double_t lRotTemp[3];
  AliMUONSurveyUtil::MatrixToAngles(fLocalTrf->GetRotationMatrix(),lRotTemp);
  printf("(%.3f %.3f %.3f), (%.6f %.6f %.6f)\n",fLocalTrf->GetTranslation()[0],fLocalTrf->GetTranslation()[1],fLocalTrf->GetTranslation()[2],lRotTemp[0],lRotTemp[1],lRotTemp[2]);
}

void AliMUONSurveyObj::PrintAlignTrf() {
  /// Print the alignment transformation
  Double_t lRotTemp[3];
  AliMUONSurveyUtil::MatrixToAngles(fAlignTrf->GetRotationMatrix(),lRotTemp);
  printf("(%.3f %.3f %.3f), (%.6f %.6f %.6f)\n",fAlignTrf->GetTranslation()[0],fAlignTrf->GetTranslation()[1],fAlignTrf->GetTranslation()[2],lRotTemp[0],lRotTemp[1],lRotTemp[2]);
}

void AliMUONSurveyObj::FillSTHistograms(TString baseNameC, TH2 *hSTc, TString baseNameA, TH2 *hSTa) {
  /// Fill sticker target histograms for monitoring
  if(baseNameC.IsNull()||!hSTc){
    AliError("Need base name for points on side C and/or a histogram for them!");
    return;
  }
  AliSurveyPoint *pointST = 0x0;
  for (Int_t iPoint=0; iPoint<GetNStickerTargets(); iPoint++) {
    pointST = GetStickerTarget(iPoint);
    if (!pointST) continue;
    if (pointST->GetPointName().Contains(baseNameC)){
      hSTc->Fill(pointST->GetX(),pointST->GetY(),-pointST->GetZ());
    } else if ((!baseNameA.IsNull()) && 
	      (pointST->GetPointName().Contains(baseNameA))) {
      if (!hSTa){
	AliError("Base name for points on side A provided but no histogram for them!");
	continue;
      }
      hSTa->Fill(pointST->GetX(),pointST->GetY(),-pointST->GetZ());
    }
  }
}

Double_t AliMUONSurveyObj::GetAlignResX() {
  /// Returns the uncertainty of the x translation parameter 
  if(!fFitter) {
    AliError("There is no fitter for this object! X resolution will be 0.");
    return 0.;
  }
  return fFitter->GetParError(0);
}

Double_t AliMUONSurveyObj::GetAlignResY() {
  /// Returns the uncertainty of the y translation parameter 
  if(!fFitter) {
    AliError("There is no fitter for this object! Y resolution will be 0.");
    return 0.;
  }
  return fFitter->GetParError(1);
}

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