ROOT logo
//
// Class to take survey data and 
// transform that to alignment objects. 
// 
// FMD
//
#include "AliFMDSurveyToAlignObjs.h"
#include "AliLog.h"
#include "AliSurveyPoint.h"
#include <TGraph2DErrors.h>
#include <TF2.h>
#include <TVector3.h>
#include <iostream>
#include <iomanip>
#include <TMath.h>
#include <TRotation.h>
#include <TGeoMatrix.h>
#include <TGeoManager.h>
#include <TGeoPhysicalNode.h>
#include "AliFMDGeometry.h"

//____________________________________________________________________
Double_t
AliFMDSurveyToAlignObjs::GetUnitFactor() const
{
  // Returns the conversion factor from the measured values to
  // centimeters. 
  if (!fSurveyObj) return 0;
  TString units(fSurveyObj->GetUnits());
  if      (units.CompareTo("mm", TString::kIgnoreCase) == 0) return .1;
  else if (units.CompareTo("cm", TString::kIgnoreCase) == 0) return 1.;
  else if (units.CompareTo("m",  TString::kIgnoreCase) == 0) return 100.;
  return 1;
}

//____________________________________________________________________
Bool_t
AliFMDSurveyToAlignObjs::GetPoint(const char* name, 
				  TVector3&   point, 
				  TVector3&   error) const
{
  // Get named point.   On return, point will contain the point
  // coordinates in centimeters, and error will contain the
  // meassurement errors in centimeters too.  If no point is found,
  // returns false, otherwise true. 
  if (!fSurveyPoints) return kFALSE;
  
  Double_t unit = GetUnitFactor();
  if (unit == 0) return kFALSE;
  
  TObject* obj  = fSurveyPoints->FindObject(name);
  if (!obj) return kFALSE;
  
  AliSurveyPoint* p = static_cast<AliSurveyPoint*>(obj);
  point.SetXYZ(unit * p->GetX(), 
	       unit * p->GetY(),
	       unit * p->GetZ());
  error.SetXYZ(unit * p->GetPrecisionX(),
	       unit * p->GetPrecisionY(),
	       unit * p->GetPrecisionZ());
  return kTRUE;
}

//____________________________________________________________________
Bool_t 
AliFMDSurveyToAlignObjs::CalculatePlane(const     TVector3& a, 
					const     TVector3& b,
					const     TVector3& c, 
					Double_t  depth,
					Double_t* trans,
					Double_t* rot) const
{
  // 
  // Calculate the plane translation and rotation from 3 survey points
  // 
  // Parameters:
  //    a     1st Survey point 
  //    b     2nd Survey point
  //    c     3rd Survey point
  //    trans Translation vector
  //    rot   Rotation matrix (direction cosines)
  // 
  // Return:
  //    
  //

  // Vector a->b, b->c, and normal to plane defined by these two
  // vectors. 
  TVector3 ab(b-a), bc(c-a);
  
  // Normal vector to the plane of the fiducial marks obtained
  // as cross product of the two vectors on the plane d0^d1
  TVector3 nn(ab.Cross(bc));
  if (nn.Mag() < 1e-8) { 
    Info("CalculatePlane", "Normal vector is null vector");
    return kFALSE;
  }
  
  // We express the plane in Hessian normal form.
  //
  //   n x = -p,
  //
  // where n is the normalised normal vector given by 
  // 
  //   n_x = a / l,   n_y = b / l,   n_z = c / l,  p = d / l
  //
  // with l = sqrt(a^2+b^2+c^2) and a, b, c, and d are from the
  // normal plane equation 
  //
  //  ax + by + cz + d = 0
  // 
  // Normalize
  TVector3 n(nn.Unit());
  // Double_t p = - (n * a);
  
  // The center of the square with the fiducial marks as the
  // corners.  The mid-point of one diagonal - md.  Used to get the
  // center of the surveyd box. 
  // TVector3 md(a + c);
  // md *= 1/2.;
  //Info("CalculatePlane", "corner=(%8f,%8f,%8f)", c.X(),c.Y(),c.Z());
  //Info("CalculatePlane", "corner=(%8f,%8f,%8f)", b.X(),b.Y(),b.Z());
  TVector3 md(c + b);
  md *= 1./2;
  //Info("CalculatePlane", "mid=(%8f,%8f,%8f)", md.X(),md.Y(),md.Z());
  //Info("CalculatePlane", "normal=(%8f,%8f,%8f)", n.X(),n.Y(),n.Z());

  // The center of the box. 
  TVector3 orig(md - depth * n);
  // Info("CalculatePlane", "orig=(%8f,%8f,%8f)", orig.X(),orig.Y(),orig.Z());
  trans[0] = orig[0];
  trans[1] = orig[1];
  trans[2] = orig[2];
  //Info("CalculatePlane", "trans=(%8f,%8f,%8f)", trans[0],trans[1],trans[2]);
  
  // Normalize the spanning vectors 
  TVector3 uab(ab.Unit());
  TVector3 ubc(bc.Unit());
  
  for (size_t i = 0; i < 3; i++) { 
    rot[i * 3 + 0] = ubc[i];
    rot[i * 3 + 1] = uab[i];
    // rot[i * 3 + 0] = uab[i];
    // rot[i * 3 + 1] = ubc[i];
    rot[i * 3 + 2] = n[i];
  }
  return kTRUE;
}

//____________________________________________________________________
Bool_t 
AliFMDSurveyToAlignObjs::FitPlane(const TObjArray& points, 
				  const TObjArray& errors,
				  Double_t         /* depth */,
				  Double_t*        trans,
				  Double_t*        rot) const
{
  // 
  // Calculate the plane rotation and translation by doing a fit of
  // the plane equation to the surveyed points.  At least 4 points
  // must be passed in the @a points array with corresponding errors
  // in the array @a errors.  The arrays are assumed to contain
  // TVector3 objects.
  // 
  // Parameters:
  //    points Array surveyed positions
  //    errors Array of errors corresponding to @a points
  //    depth  Survey targets depth (perpendicular to the plane)
  //    trans  On return, translation of the plane
  //    rot    On return, rotation (direction cosines) of the plane
  // 
  // Return:
  //    @c true on success, @c false otherwise
  //

  Int_t nPoints = points.GetEntries();
  if (nPoints < 4) { 
    AliError(Form("Cannot fit a plane equation to less than 4 survey points, "
		  "got only %d", nPoints));
    return kFALSE;
  }
  
  TGraph2DErrors g;
  // Loop and fill graph 
  for (int i = 0; i < nPoints; i++) {
    TVector3* p = static_cast<TVector3*>(points.At(i));
    TVector3* e = static_cast<TVector3*>(errors.At(i));
  
    if (!p || !e) continue;
    
    g.SetPoint(i, p->X(), p->Y(), p->Z());
    g.SetPointError(i, e->X(), e->Y(), e->Z());

  }

  // Check that we have enough points
  if (g.GetN() < 4) { 
    AliError(Form("Only got %d survey points - no good for plane fit",
		  g.GetN()));
    return kFALSE;
  }

  // Next, declare fitting function and fit to graph. 
  // Fit to the plane equation: 
  // 
  //   ax + by + cz + d = 0
  //
  // or 
  // 
  //   z = - ax/c - by/c - d/c
  //
  TF2 f("plane", "-[0]*x-[1]*y-[2]", 
        g.GetXmin(), g.GetXmax(), g.GetYmin(), g.GetYmax());
  g.Fit(&f, "Q");
  
  // Now, extract the normal and offset
  TVector3 nv(f.GetParameter(0), f.GetParameter(1), 1);
  TVector3 n(nv.Unit());
  Double_t p = -f.GetParameter(2);
  
  // Create two vectors spanning the plane 
  TVector3 a(1, 0, f.Eval(1, 0)-p);
  TVector3 b(0, -1, f.Eval(0, -1)-p);
  TVector3 ua(a.Unit());
  TVector3 ub(b.Unit());
  // Double_t angAb = ua.Angle(ub);
  // PrintVector("ua: ", ua);
  // PrintVector("ub: ", ub);
  // std::cout << "Angle: " << angAb * 180 / TMath::Pi() << std::endl;
    
  for (size_t i = 0; i < 3; i++) { 
    rot[i * 3 + 0] = ua[i];
    rot[i * 3 + 1] = ub[i];
    rot[i * 3 + 2] = n[i];
  }
    
  // The intersection of the plane is given by (0, 0, -d/c)
  trans[0] = 0;
  trans[1] = 0;
  trans[2] = p;
  
  return kTRUE;
}


//____________________________________________________________________
Bool_t
AliFMDSurveyToAlignObjs::MakeDelta(const char*  path, 
				   const Double_t*    rot, 
				   const Double_t*    trans, 
				   TGeoHMatrix& delta) const
{
  // 
  // Create a delta transform from a global rotation matrix and
  // translation. 
  // 
  // Parameters:
  //    path   Path of element to transform.
  //    rot    Rotation matrix (direction cosines)
  //    trans  Translation 
  //    delta  On return, the delta transform
  // 
  // Return:
  //    Newly 
  //
  if (!gGeoManager)           return kFALSE;
  if (!gGeoManager->cd(path)) return kFALSE;
  
  
  TGeoMatrix*  global = gGeoManager->GetCurrentMatrix();
#if 0
  PrintRotation(Form("%s rot:", global->GetName()),global->GetRotationMatrix());
  PrintVector(Form("%s trans:", global->GetName()),global->GetTranslation());
#endif

  return MakeDelta(global, rot, trans, delta);
}

//____________________________________________________________________
Bool_t
AliFMDSurveyToAlignObjs::MakeDelta(const TGeoMatrix*  global,
				   const Double_t*    rot, 
				   const Double_t*    trans, 
				   TGeoHMatrix& delta) const
{
  // 
  // Create a delta transform from a global rotation matrix and
  // translation. 
  // 
  // Parameters:
  //    global Global matrix of element to transform.
  //    rot    Rotation matrix (direction cosines)
  //    trans  Translation 
  //    delta  On return, the delta transform
  // 
  // Return:
  //    Newly 
  //
  TGeoHMatrix* geoM = new TGeoHMatrix;
  geoM->SetTranslation(trans);
  geoM->SetRotation(rot);
  // Info("MakeDelta", "The HMatrix from survey");
  // geoM->Print();
  // Info("MakeDelta", "The global matrix");
  // global->Print();

  delta = global->Inverse();
  // Info("MakeDelta", "The inverse global matrix");
  // delta.Print();
  delta.MultiplyLeft(geoM);
  // Info("MakeDelta", "The delta matrix");
  // delta.Print();
  return true;
}

namespace {
  Double_t getFMD1Offset()
  {
    static Double_t off = 0;
    return off;

#if 0
    if (off != 0) return off;
    
    const char* lidN = "FMD1_lid_mat0";
    TGeoMatrix* lidM = static_cast<TGeoMatrix*>(gGeoManager->GetListOfMatrices()
						->FindObject(lidN));
    if (!lidM) { 
      Error("getFMD1Offset", "Couldn't find FMD1 lid transformation %s", lidN);
      return 0;
    }

    const Double_t* lidT = lidM->GetTranslation();
    Double_t        lidZ = lidT[2];
    off                  = lidZ-3.3;
    
    return off;
#endif
  }
}

//____________________________________________________________________
Bool_t
AliFMDSurveyToAlignObjs::GetFMD1Plane(Double_t* rot, Double_t* trans) const
{
  // 
  // Get the FMD1 plane from the survey points
  // 
  // Parameters:
  //    rot    Rotation matrix (direction cosines)
  //    trans  Translation
  // 
  // Return:
  //    @c true on success, @c false otherwise.
  //

  // The possile survey points 
  TVector3  icb, ict, ocb, oct, eicb, eict, eocb, eoct;
  Int_t     missing = 0;
  if (!GetPoint("V0L_ICB", icb, eicb)) missing++;
  if (!GetPoint("V0L_ICT", ict, eict)) missing++;
  if (!GetPoint("V0L_OCB", ocb, eocb)) missing++;
  if (!GetPoint("V0L_OCT", oct, eoct)) missing++;

  // Check that we have enough points
  if (missing > 1) { 
    AliWarning(Form("Only got %d survey points - no good for FMD1 plane",
		    4-missing));
    return kFALSE;
  }
#if 0
  TObjArray points;
  TObjArray errors;
  points.Add(&icb); errors.Add(&eicb);
  points.Add(&ict); errors.Add(&eict);
  points.Add(&oct); errors.Add(&eoct);
  points.Add(&ocb); errors.Add(&eocb);
  
  Bool_t ret = FitPlane(points, errors, 0, trans, rot);
  if (!ret) { 
    Warning("GetFMD1Plane", "fit to plane failed");
  }
  for (Int_t i = 0; i < 4; i++) { 
    TVector3* v = static_cast<TVector3*>(points.At(i));
    TVector3* e = static_cast<TVector3*>(errors.At(i));
    Info("GetFMD1Plane", "p%d=(%8f,%8f,%8f)+/-(%8f,%8f,%8f)", 
	 i, v->X(), v->Y(), v->Z(), e->X(), e->Y(), e->Z());
  }
#else
  Double_t off = getFMD1Offset();
  Info("GetFMD1Plane", "Lid offset is %f", off);

  // if (!CalculatePlane(ocb, icb, ict, off, trans, rot)) return kFALSE;
  // Bool_t ret = CalculatePlane(ocb, icb, oct, off, trans, rot);
  Bool_t ret = CalculatePlane(oct, ocb, ict, off, trans, rot);
#endif
  PrintRotation("FMD1 rotation:",  rot);
  PrintVector("FMD1 translation:", trans);

  return ret;
}

//____________________________________________________________________
Bool_t
AliFMDSurveyToAlignObjs::DoFMD1()
{
  // 
  // Do the FMD1 analysis.  We have 4 survey targets on V0-A on the
  // C-side.  These are 
  //
  //  - V0A_ICT  In-side, C-side, top.
  //  - V0A_ICB  In-side, C-side, bottom.  
  //  - V0A_OCT  Out-side, C-side, top.	 
  //  - V0A_OCB	 Out-side, C-side, bottom.
  // 
  // These 4 survey targets sit 3.3mm over the V0-A C-side surface, or
  // 3.3mm over the back surface of FMD1.  
  //
  // Since these are really sitting on a plane, we can use the method
  // proposed by the CORE offline. 
  // 
  // Return:
  //    @c true on success, @c false otherwise.
  //

  // Do the FMD1 stuff
  Double_t rot[9], trans[3];
  if (!GetFMD1Plane(rot, trans)) return kFALSE;
  // const char* path = "/ALIC_1/F1MT_1/FMD1_lid_0";

#if 0  
  // TGeoHMatrix delta;
  Double_t gRot[9], gTrans[3];
  TVector3 ocb(-127, -220, 324.67);
  TVector3 oct(-127, +220, 324.67);
  TVector3 icb(+127, -220, 324.67);
  TVector3 ict(+127, +220, 324.67);
  if (!CalculatePlane(ocb, icb, oct, 0, gTrans, gRot)) { 
    Warning("DoFMD1", "Failed to make reference plane");
    return kFALSE;
  }
  PrintRotation("FMD1 ref rotation:",  gRot);
  PrintVector("FMD1 ref translation:", gTrans);
  TGeoRotation ggRot; ggRot.SetMatrix(gRot);
  TGeoCombiTrans global(gTrans[0], gTrans[1], gTrans[2], &ggRot);
#endif
  Double_t off = getFMD1Offset();
  Info("DoFMD1", "Lid offset is %f", off);

  TGeoTranslation global(0,0,324.670-off);
  if (!MakeDelta(&global, rot, trans, fFMD1Delta)) 
    return kFALSE;
  
  // PrintRotation("FMD1 delta rotation:",  fFMD1Delta.GetRotationMatrix());
  // PrintVector("FMD1 delta translation:", fFMD1Delta.GetTranslation());

  return kTRUE;
}

//____________________________________________________________________
Bool_t
AliFMDSurveyToAlignObjs::GetFMD2Plane(Double_t* rot, Double_t* trans) const
{
  // 
  // Get the surveyed plane corresponding to the backside of FMD2.
  // The plane is done as a best fit of the plane equation to at least
  // 4 of the available survey points.
  // 
  // Parameters:
  //    rot    Rotation matrix (direction cosines)
  //    trans  Translation vector.
  // 
  // Return:
  //    @c true on success, @c false otherwise
  //

  // The possible survey points 
  const char*    names[] = { "FMD2_ITOP",  "FMD2_OTOP", 
			     "FMD2_IBOTM", "FMD2_OBOTM", 
			     "FMD2_IBOT",  "FMD2_OBOT", 
			     0 };
  const char**   name    = names;

  TObjArray points;
  TObjArray errors;
  
  // Loop and fill graph 
  int i = 0;
  while (*name) {
    TVector3 p, e;
    if (!GetPoint(*name, p, e)) {
      name++;
      i++;
      continue;
    }
    
    if (i == 5) {
      Warning("GetFMD2plane", "Setting error on %d, %s to 0.4", i, *name);
      e.SetXYZ(0.4, 0.4, 0.4); // OBOT
    }
    points.Add(new TVector3(p));
    errors.Add(new TVector3(e));
    name++;
    i++;
  }
  if (points.GetEntries() < 4) { 
    AliWarning(Form("Only got %d survey points - no good for FMD2 plane",
		    points.GetEntries()));
    return kFALSE;
  }

  return FitPlane(points, errors, 0, trans, rot);
}

#define M(I,J) rot[(J-1) * 3 + (I-1)]
//____________________________________________________________________
Bool_t
AliFMDSurveyToAlignObjs::DoFMD2()
{
  // 
  // Do the FMD2 calculations.  We have 6 survey points of which only
  // 5 are normally surveyed.  These are all sittings 
  //
  //  - FMD2_ITOP   - In-side, top
  //  - FMD2_IBOTM  - In-side, middle bottom
  //  - FMD2_IBOT   - In-side, bottom
  //  - FMD2_OTOP   - Out-side, top
  //  - FMD2_OBOTM  - Out-side, middle bottom
  //  - FMD2_OBOT   - Out-side, bottom
  //
  // The nominal coordinates of these retro-fitted survey stickers
  // isn't known.  Also, these stickers are put on a thin (0.3mm
  // thick) carbon cover which flexes quite easily.  This means, that
  // to rotations and xy-translation obtained from the survey data
  // cannot be used, and left is only the z-translation.
  //
  // Further more, since FMD2 to is attached to the ITS SPD thermal
  // screen, it is questionable if the FMD2 survey will ever be used. 
  // 
  // Return:
  //    @c true on success, @c false otherwise.
  //

  // Do the FMD2 stuff
  Double_t rot[9], trans[3];
  if (!GetFMD2Plane(rot, trans)) return kFALSE;
  PrintRotation("FMD2 rotation:",  rot);
  PrintVector("FMD2 translation:", trans);

#if 0
  for (int i = 0; i < 3; i++) { 
    for (int j = 0; j < 3; j++) { 
      rot[i*3+j] = (i == j ? 1 : 0);
    }
  }
#endif
  trans[0] = trans[1] = 0;
  trans[2] += 0.015;
  // PrintRotation("FMD2 rotation:",  rot);
  // PrintVector("FMD2 translation:", trans);
  
  // TGeoHMatrix delta;
  if (!MakeDelta("/ALIC_1/F2MT_2/FMD2_support_0/FMD2_back_cover_2", 
		 rot, trans, fFMD2Delta)) return kFALSE;
  
  // PrintRotation("FMD2 delta rotation:",  fFMD2Delta.GetRotationMatrix());
  // PrintVector("FMD2 delta translation:", fFMD2Delta.GetTranslation());

  return kTRUE;
}

//____________________________________________________________________
void
AliFMDSurveyToAlignObjs::Run()
{
  // 
  // Run the task.
  // 
  //  

  AliFMDGeometry* geom = AliFMDGeometry::Instance();
  geom->Init();
  geom->InitTransformations();
  
  DoFMD1();
  DoFMD2();
}

//____________________________________________________________________
void
AliFMDSurveyToAlignObjs::Run(const char** files)
{
  // 
  // Run the task.
  // 
  //  

  AliFMDGeometry* geom = AliFMDGeometry::Instance();
  geom->Init();
  geom->InitTransformations();

  const char** file = files; 
  while (*file) { 
    if ((*file)[0] == '\0') { 
      Warning("Run", "no file specified");
      file++;
      continue;
    }
    if (!LoadSurveyFromLocalFile(*file)) { 
      Warning("Run", "Failed to load %s", *file);
      file++;
      continue;
    }
    TString sDet(fSurveyObj->GetDetector());
    Int_t   d    = Int_t(sDet[sDet.Length()-1] - '0');
    Info("Run", "Making alignment for %s (%d)", sDet.Data(), d);
    Bool_t ret = true;
    switch (d) { 
    case 1: ret = DoFMD1(); break;
    case 2: ret = DoFMD2(); break;
    default: 
      Warning("Run", "Do not know how to deal with %s", sDet.Data());
      break;
    }
    if (!ret) { 
      Warning("Run", "Calculation for %s failed", sDet.Data());
    }
    file++;
  }
  CreateAlignObjs();
  GetAlignObjArray()->Print();
  FillDefaultAlignObjs();
}

//____________________________________________________________________
AliAlignObjParams*
AliFMDSurveyToAlignObjs::CreateDefaultAlignObj(const TString& path, 
					       Int_t id)
{
  Int_t nAlign = fAlignObjArray->GetEntries();
  AliAlignObjParams* obj = 
    new ((*fAlignObjArray)[nAlign]) AliAlignObjParams(path.Data(),
						      id,0,0,0,0,0,0,kTRUE);
  if (!obj) {
    AliError(Form("Failed to create alignment object for %s", path.Data()));
    return 0;
  }
  if (!obj->SetLocalPars(0, 0, 0, 0, 0, 0)) {
    AliError(Form("Failed to set local transforms on %s", path.Data()));
    return obj;
  }
  return obj;
}

//____________________________________________________________________
AliAlignObjParams*
AliFMDSurveyToAlignObjs::FindAlignObj(const TString& path) const 
{
  AliAlignObjParams* p = 0;
  for (int i = 0; i < fAlignObjArray->GetEntries(); i++) { 
    p = static_cast<AliAlignObjParams*>(fAlignObjArray->At(i));
    if (path.EqualTo(p->GetSymName())) return p;
  }
  return 0;
}

//____________________________________________________________________
Bool_t 
AliFMDSurveyToAlignObjs::FillDefaultAlignObjs()
{
  for (int d = 1; d <= 3; d++) { 
    const char sides[] = { 'T', 'B', 0 };
    const char* side   = sides;
    while (*side) { 
      TString path = TString::Format("FMD/FMD%d_%c", d, *side);
      if (!FindAlignObj(path)) CreateDefaultAlignObj(path, 0);

      const char halves[] = { 'I', d == 1 ? '\0' : 'O', 0 };
      const char*  half = halves;
      while (*half) { 
	int nsec  = *half == 'I' ? 10 : 20;
	int start = *side == 'T' ? 0      : nsec/2;
	int end   = *side == 'T' ? nsec/2 : nsec;
	for (int s=start; s < end; s++) {
	  path = TString::Format("FMD/FMD%d_%c/FMD%c_%02d", 
				 d, *side, *half, s);
	  CreateDefaultAlignObj(path, 0);
	}
	half++;
      }
      side++;
    }
    
  }
  return true;
}

//____________________________________________________________________
Bool_t 
AliFMDSurveyToAlignObjs::CreateAlignObjs()
{
  // 
  // 
  // Method to create the alignment objects
  // 
  // Return:
  //    @c true on success, @c false otherwise
  //  
  TClonesArray& array = *fAlignObjArray;
  Int_t         n     = array.GetEntriesFast();

  if (!fFMD1Delta.IsIdentity()) { 
    new (array[n++]) AliAlignObjParams("FMD/FMD1_T", 0, fFMD1Delta, kTRUE);
    new (array[n++]) AliAlignObjParams("FMD/FMD1_B", 0, fFMD1Delta, kTRUE);
  }
  if (!fFMD2Delta.IsIdentity()) { 
    new (array[n++]) AliAlignObjParams("FMD/FMD2_T", 0, fFMD2Delta, kTRUE);
    new (array[n++]) AliAlignObjParams("FMD/FMD2_B", 0, fFMD2Delta, kTRUE);
  }
  // array.Print();
  
  return kTRUE;
}

//____________________________________________________________________
void 
AliFMDSurveyToAlignObjs::PrintVector(const char* text, const TVector3& v)
{
  // 
  // Service member function to print a vector
  // 
  // Parameters:
  //    text Prefix text
  //    v    Vector
  //
  Double_t va[] = { v.X(), v.Y(), v.Z() };
  PrintVector(text, va);
}
//____________________________________________________________________
void 
AliFMDSurveyToAlignObjs::PrintVector(const char* text, const Double_t* v)
{
  // 
  // Service member function to print a vector
  // 
  // Parameters:
  //    text Prefix text
  //    v    Vector (array of 3 doubles)
  //
  std::cout << text 
	    << std::setw(15) << v[0] 
	    << std::setw(15) << v[1]
	    << std::setw(15) << v[2]
	    << std::endl;
}


//____________________________________________________________________
void 
AliFMDSurveyToAlignObjs::PrintRotation(const char* text, const Double_t* rot)
{
  // 
  // Service member function to print a rotation matrix
  // 
  // Parameters:
  //    text Prefix text
  //    v    Matrix (array of 9 doubles)
  //

  std::cout << text << std::endl;
  for (size_t i = 0; i < 3; i++) { 
    for (size_t j = 0; j < 3; j++) 
      std::cout << std::setw(15) << rot[i * 3 + j];
    std::cout << std::endl;
  }
}

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