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 AliSurveyObj						   //
//  Retrieve and Convert survey data into ROOT Objects		   //
//                                                                 //
/////////////////////////////////////////////////////////////////////

#include "AliSurveyObj.h"

//ROOT includes
#include "TObjArray.h"
#include "TGrid.h"
#include "TGridResult.h"
#include "TFile.h"
#include "TObjString.h"

//AliROOT includes
#include "AliLog.h"
#include "AliSurveyPoint.h"

ClassImp(AliSurveyObj)


const TString AliSurveyObj::fgkStorage = "alien://alice.cern.ch";  
const TString AliSurveyObj::fgkBaseFolder = "/alice/data/Reference";
const TString AliSurveyObj::fgkValidDetectors = "ACORDE,BABYFRAME,BACKFRAME,\
EMCAL,FMD,HMPID,ITS,L3 MAGNET,MUON,MUON ABSORBERS,MUON DIPOLE,PHOS,PMD,\
SPACEFRAME,SUPERSTRUCTURE,T0,TOF,TPC,TRD,VZERO,ZDC,GRP";
const TString AliSurveyObj::fgkGRPDetectors = "BABYFRAME,BACKFRAME,L3 MAGNET,\
SPACEFRAME,MUON DIPOLE,MUON ABSORBERS,GRP";
const TString AliSurveyObj::fgkMUONDetectors = "MUON,SUPERSTRUCTURE";

  
//_____________________________________________________________________________
AliSurveyObj::AliSurveyObj():
  TObject(),
  fTitle(""),
  fDate(""),
  fDetector(""),
  fURL("http://edms.cern.ch/"),
  fReportNr(-1),
  fVersion(-1),
  fObs(""),
  fCoordSys(""),
  fUnits(""),
  fNrColumns(-1),
  fColNames(""),
  fIsValid(kFALSE),
  fGridUser(""),
  fDataPoints(new TObjArray(1))
{
  // constructor
  fDataPoints->SetOwner(kTRUE);
}


//_____________________________________________________________________________
AliSurveyObj::~AliSurveyObj() {
  //destructor
  if (fDataPoints) {
    fDataPoints->Delete();
    fDataPoints = 0;
  }
}


//_____________________________________________________________________________
AliSurveyObj::AliSurveyObj(const AliSurveyObj& surveyObj):
  TObject(),
  fTitle(surveyObj.fTitle),
  fDate(surveyObj.fDate),
  fDetector(surveyObj.fDetector),
  fURL(surveyObj.fURL),
  fReportNr(surveyObj.fReportNr),
  fVersion(surveyObj.fVersion),
  fObs(surveyObj.fObs),
  fCoordSys(surveyObj.fCoordSys),
  fUnits(surveyObj.fUnits),
  fNrColumns(surveyObj.fNrColumns),
  fColNames(surveyObj.fColNames),
  fIsValid(surveyObj.fIsValid),
  fGridUser(surveyObj.fGridUser),
  fDataPoints(new TObjArray(1))
{
  // copy constructor
  TObject *curr = surveyObj.fDataPoints->First();
  while (curr != 0) {
    fDataPoints->Add(curr);
    curr = surveyObj.fDataPoints->After(curr);
  }
}


//_____________________________________________________________________________
AliSurveyObj& AliSurveyObj::operator=(const AliSurveyObj& surveyObj)
{
  // assignment operator
  if (this != &surveyObj) {
    fTitle = surveyObj.fTitle;
    fDate = surveyObj.fDate;
    fDetector = surveyObj.fDetector;
    fURL = surveyObj.fURL;
    fReportNr = surveyObj.fReportNr;
    fVersion = surveyObj.fVersion;
    fObs = surveyObj.fObs;
    fCoordSys = surveyObj.fCoordSys;
    fUnits = surveyObj.fUnits;
    fNrColumns = surveyObj.fNrColumns;
    fColNames = surveyObj.fColNames;
    fIsValid = surveyObj.fIsValid;
    fGridUser = surveyObj.fGridUser;
    TObject *curr = surveyObj.fDataPoints->First();
    while (curr != 0) {
      fDataPoints->Add(curr);
      curr = surveyObj.fDataPoints->After(curr);
    }
  }
  return *this;
}


//_____________________________________________________________________________
void AliSurveyObj::AddPoint(AliSurveyPoint* point) {
  // Adds a point to the TObjArray which containst the list of points
  fDataPoints->Add(point);
  return;
}


//_____________________________________________________________________________
Bool_t AliSurveyObj::Connect(const char *gridUrl, const char *user) {
  // Connects to the grid

  // If the same "Grid" is alreay active, skip connection
  if (!gGrid || gridUrl != gGrid->GridUrl() ||
      (( strcmp(user,"") ) && ( strcmp(user,gGrid->GetUser()) )) ) {
    // connection to the Grid
    AliInfo("\nConnecting to the Grid...");
    if (gGrid) {
      AliInfo(Form("gGrid = %p; GridUrl = %s; gGrid->GridUrl() = %s", 
		   gGrid, gridUrl, gGrid->GridUrl()));
      AliInfo(Form("User = %s; gGrid->GetUser() = %s",
		   user, gGrid->GetUser()));
    }
    TGrid::Connect(gridUrl,user);
  }
	
  if(!gGrid) {
    AliError("Connection failed!");
    return kFALSE;
  }
  return kTRUE;
}


//_____________________________________________________________________________
Bool_t AliSurveyObj::OpenFile(TString openString) {
  // Opens the file and reads it to a buffer

  AliInfo(Form("Opening file \"%s\"\n for survey data", openString.Data()));

  if (openString.BeginsWith("alien://"))
    if (!Connect(fgkStorage.Data(), fGridUser.Data())) {
      AliError(Form("Error connecting to GRID"));
      return kFALSE;
    }

  TFile *file = TFile::Open(openString.Data(), "READ");
  if ( !file ) {
    AliError(Form("Error opening file \"%s\"", openString.Data()));
    return kFALSE;
  }

  Int_t size = file->GetSize();

  char *buf = new Char_t[size + 1];
  memset(buf, '\0', size + 1);

  file->Seek(0);  
  if ( file->ReadBuffer(buf, size) ) {
    AliError("Error reading file contents to buffer!");
    return kFALSE;
  }
  AliInfo(Form("%lld bytes read!\n", file->GetBytesRead()));
  
  Bool_t goodParsing = ParseBuffer(buf);

  file->Close();
  delete[] buf;
  return goodParsing;
}


//_____________________________________________________________________________
Bool_t AliSurveyObj::FillFromLocalFile(const Char_t* filename) {
  // Fills the object from a file in a local filesystem

  TString fullOpenString = "file://" + TString(filename) + "?filetype=raw";

  return OpenFile(fullOpenString);
}


//_____________________________________________________________________________
Bool_t AliSurveyObj::IsValidDetector(TString detector) const {
  // Checks if the detector name is valid

  detector.ToUpper();

  TObjArray *dets = fgkValidDetectors.Tokenize(',');
  TObject *found = dets->FindObject(detector);
  delete dets;

  if (!found) return kFALSE;
  else return kTRUE;
}


//_____________________________________________________________________________
TString AliSurveyObj::RealFolderName(TString detector) const {
  // Returns the actual folder name for a given detector 
  // Some "detectors" don't have a folder of their own

  detector.ToUpper();
  TString folderName = detector;

  TObjArray *dets = fgkGRPDetectors.Tokenize(',');
  if (dets->FindObject(detector)) folderName = "GRP";
  delete dets;

  dets = fgkMUONDetectors.Tokenize(',');
  if (dets->FindObject(detector)) folderName = "MUON";
  delete dets;
  
  return folderName;
}

//_____________________________________________________________________________
Bool_t AliSurveyObj::Fill(TString detector, Int_t reportNumber,
                          TString username) {
  // Fills the object from a file in the default storage location in AliEn.
  // The highest version available is selected.

  return Fill(detector, reportNumber, -1, username);
}

//_____________________________________________________________________________
Bool_t AliSurveyObj::Fill(TString detector, Int_t reportNumber,
                          Int_t reportVersion, TString username) {
  // Fills the object from a file in the default storage location in AliEn.
  // A specific version is selected.

  detector.ToUpper();
  
  // Check if <detector> is valid
  if (!IsValidDetector(detector)) {
    AliWarning(Form("Detector '%s' is not a valid detector/structure!", detector.Data()));
    return kFALSE;
  }

  // Some "detectors" don't have a folder of their own
  // TString detectorFolder = RealFolderName(detector);

  // Check if <year>, <reportNumber> and <reportVersion> are valid (roughly)
  if ((reportNumber < 1) || (reportVersion < -1) || (0 == reportVersion)) {
    AliError("Invalid parameter values for AliSurveyObj::Fill. (Report Number or Report Version)");
    return kFALSE;
  }

  // Check if the fGridUser is set, or specified
  if (username.Length() > 0) SetGridUser(username);
  else if (0 == fGridUser.Length()) {
    AliError("GRID username not specified and not previously set!");
    return kFALSE;
  }

  // Query AliEn for the available reports
  TGridResult *res = QueryReports(detector, -1, reportNumber, reportVersion);
  if (!res) AliError(Form("Error querying AliEn for detector '%s', \
                           report number '%d' and report version '%d'.",
			  detector.Data(), reportNumber, reportVersion));
  Int_t numberEntries = res->GetEntries();
  if (0 == numberEntries) {
    AliError(Form("No report found for detector '%s', report number '%d' and report version '%d'",
		  detector.Data(), reportNumber, reportVersion));
    return kFALSE;
  }

  TString fileNamePath = "";
  if (1 == numberEntries) fileNamePath = res->GetFileNamePath(0);
  else if (numberEntries > 1) {
    TString higherVerFNP = res->GetFileNamePath(0);
    Int_t lastYear = FileNamePathToReportYear(higherVerFNP);
    for (Int_t i = 1; i < numberEntries; ++i) {
      TString currFNP = res->GetFileNamePath(i);
      if (FileNamePathToReportVersion(currFNP) >
	  FileNamePathToReportVersion(higherVerFNP)) higherVerFNP = currFNP;
      if (lastYear != FileNamePathToReportYear(currFNP))
	AliWarning("Inconsistency detected, year differs for reports with the same report number! Please inform the responsible and check the report against the one in DCDB.");
    }
    fileNamePath = higherVerFNP;
  }

  TString fullOpenString = "alien://" + fileNamePath + "?filetype=raw";
  /*
  // Finally composes the full string
  TString fullOpenString = "alien://" + fgkBaseFolder + "/" + detectorFolder + "/RawSurvey/";
  fullOpenString += Form("%d/%d_v%d.txt?filetype=raw", year, reportNumber, reportVersion);
  */

  return OpenFile(fullOpenString);
}


//_____________________________________________________________________________
TString AliSurveyObj::FileNamePathToDetector(TString filename) const {
  // Get the report number from the complete path in the format:
  // /alice/data/Reference/HMPID/RawSurvey/2006/781282_v1.txt

  TString ret = "";

  if (filename.Length() > fgkBaseFolder.Length()) {
    ret = filename.Remove(0, fgkBaseFolder.Length());
    ret.Remove(TString::kLeading, '/');
    ret = ret(0, ret.First('/'));
    if (!IsValidDetector(ret)) ret = "";
  } 
  return ret;
}

///alice/cern.ch/user/r/rsilva/TRD/RawSurvey/2007/.816582_v2.txt/v1.0

//_____________________________________________________________________________
Int_t AliSurveyObj::FileNamePathToReportYear(TString filename) const {
  // Get the report year from the complete path in the format:
  // /alice/data/Reference/HMPID/RawSurvey/2006/781282_v1.txt

  TString ret = "";

  if (filename.Length() > fgkBaseFolder.Length()) {
    ret = filename.Remove(0, fgkBaseFolder.Length());
    ret.Remove(TString::kLeading, '/');
    Int_t beg = ret.First('/') + TString("RawSurvey/").Length() + 1;
    ret = ret(beg, ret.Last('/') - beg);
    return ret.Atoi();
  } 
  return -1;
}


//_____________________________________________________________________________
Int_t AliSurveyObj::FileNamePathToReportNumber(TString filename) const {
  // Get the report number from the complete path in the format:
  // /alice/data/Reference/HMPID/RawSurvey/2006/781282_v1.txt

  TString ret = "";

  if (filename.Length() > fgkBaseFolder.Length()) {
    ret = filename.Remove(0, fgkBaseFolder.Length());
    ret.Remove(TString::kLeading, '/');
    if ((ret.CountChar('/') > 3) || (ret.CountChar('.') > 1)) {
      AliWarning("Error getting the Report Number from the filename path!");
      return -1;
    }
    ret = ret(ret.Last('/') + 1 , ret.Last('_') - ret.Last('/') - 1);
    return ret.Atoi();
  } 
  AliWarning("Error getting the Report Number from the filename path!");
  return -1;
}


//_____________________________________________________________________________
Int_t AliSurveyObj::FileNamePathToReportVersion(TString filename) const {
  // Get the report version from the complete path in the format:
  // /alice/data/Reference/HMPID/RawSurvey/2006/781282_v1.txt

  TString ret = "";

  if (filename.Length() > fgkBaseFolder.Length()) {
    ret = filename.Remove(0, fgkBaseFolder.Length());
    ret.Remove(TString::kLeading, '/');
    if ((ret.CountChar('/') > 3) || (ret.CountChar('.') > 1)) {
      AliWarning("Error getting the Report Version from the filename path!");
      return -1;
    }
    ret = ret(ret.Last('_') + 1 + 1 , ret.Last('.') - ret.Last('_') - 1 - 1);
    return ret.Atoi();
  } 
  AliWarning("Error getting the Report Version from the filename path!");
  return -1;
}


//_____________________________________________________________________________
void AliSurveyObj::ListValidDetectors() {
    // List the valid detector names
    Printf("Listing all valid detectors:\n");
    TObjArray *dets = fgkValidDetectors.Tokenize(',');
    for (int i = 0; i < dets->GetEntries(); ++i) 
	Printf("%s", ((TObjString *) dets->At(i))->GetString().Data());
    delete dets;

    Printf("Some reports are stored in more general folders.\n"
	    "These reports can be opened using either name, the original or the\n"
	    "folder name. Example: 'SPACEFRAME' or 'GRP' are both valid when\n"
	    "opening a report for the Spaceframe.\n\n"
	    "Detectors stored in 'MUON' folder:");
    dets = fgkMUONDetectors.Tokenize(',');
    for (int i = 0; i < dets->GetEntries(); ++i) 
	Printf("%s", ((TObjString *) dets->At(i))->GetString().Data());
    delete dets;
    Printf("Detectors stored in 'GRP' folder:");
    dets = fgkGRPDetectors.Tokenize(',');
    for (int i = 0; i < dets->GetEntries(); ++i) 
	Printf("%s", ((TObjString *) dets->At(i))->GetString().Data());
    delete dets;
    return;
}


//_____________________________________________________________________________
TGridResult * AliSurveyObj::QueryReports(TString detector, Int_t year,
					 Int_t reportNumber,
					 Int_t reportVersion) {
  // Queries AliEn for existing reports matching the specified conditions
  TString lsArg = fgkBaseFolder;
  
  TString detectorFolder = "";
  if (detector.Length() > 0) {
    detector.ToUpper();
    // Check if <detector> is valid
    if (!IsValidDetector(detector)) {
      AliError(Form("Detector '%s' is not a valid detector/structure!",
		    detector.Data()));
      return 0;
    }
    // Some "detectors" don't have a folder of their own
    detectorFolder = "/" + RealFolderName(detector);
  } else detectorFolder = "/*";

  lsArg += detectorFolder + "/RawSurvey";

  TString yearFolder = "";
  if (year > 1950) yearFolder.Form("/%d", year);
  else yearFolder = "/*";

  TString reportFolder = "";
  if (reportNumber > 0) reportFolder.Form("/%d", reportNumber);
  else reportFolder = "/*";

  TString versionFolder = "";
  if (reportVersion > 0) versionFolder.Form("_v%d", reportVersion);
  else versionFolder = "_v*";

  lsArg += yearFolder + reportFolder + versionFolder + ".txt";

  AliInfo(Form("\nLooking for:  %s \n", lsArg.Data()));
  
  // Check if fGridUser is set and Connect to AliEn
  if (0 == fGridUser.Length()) {
    AliError("To use this method it's necessary to call SetGridUser(...) in advance.");
    return 0;
  } else if (!Connect(fgkStorage.Data(), fGridUser.Data())) {
    AliError(Form("Error connecting to GRID"));
    return 0;
  }
  return gGrid->Ls(lsArg);
}


//_____________________________________________________________________________
Int_t AliSurveyObj::ListReports(TString detector, Int_t year, 
				Int_t reportNumber,
				Int_t reportVersion) {
  // Lists all available reports matching the specified conditions
  // Returns the number of reports found

  TGridResult *res = QueryReports(detector, year, reportNumber, reportVersion);
  
  if (0 == res) {
    AliError("Query failed.");
    return 0;
  }

  TString fn = "";
  Int_t numberEntries = res->GetEntries();

  if (numberEntries > 0) {
    Printf("%d reports found:", numberEntries);
    for (int i = 0; i < res->GetEntries(); ++i) {
      fn = res->GetFileNamePath(i);
      Printf("Detector:%s\tYear:%d\tEDMS Report Number:%d\tVersion:%d",
		  FileNamePathToDetector(fn).Data(),
		  FileNamePathToReportYear(fn),
		  FileNamePathToReportNumber(fn),
		  FileNamePathToReportVersion(fn));
    }
    delete res;
    return numberEntries;
  } else {
    AliInfo("No results found for the requested query.");
    delete res;
    return 0;
  }
}


//_____________________________________________________________________________
void AliSurveyObj::SetGridUser(TString username){
  // Set the username used to connect to the GRID
  fGridUser = username;
  return;
}


//_____________________________________________________________________________
TString &AliSurveyObj::Sanitize(TString str) {
  // Cleans up a line of new line and carriage return characters.
  // (Specially usefull for files created in Windows.)

  str.Remove(TString::kTrailing, '\r');
  str.Remove(TString::kTrailing, '\n');
  str.Remove(TString::kTrailing, '\r');

  if (!str.IsAscii()) {
    AliWarning("Warning: Non-ASCII characters!\n");
    str = "";
  }
  return str.Remove(TString::kBoth, ' ');
}


//_____________________________________________________________________________
Bool_t AliSurveyObj::ParseBuffer(const Char_t* buf) {
  // Parses a character buffer assuming the format defined with the TS/SU
  // http://aliceinfo/Offline/Activities/Alignment/SurveyInformation.html

  // If the object is already filled clean it up
  if (fIsValid) Reset();

  // Copy the buffer to a TString to use Tokenize
  TString buffer = TString(buf);
  TObjArray *linesRaw = buffer.Tokenize('\n');
  // replace the array of lines with an array of sanitized lines
  // in the process we remove empty lines, particularly disturbing
  // in case of dos fileformat
  TString oneLine = "";
  TObjString* oneLineObj = 0;
  TObjArray *lines = new TObjArray();
  for(Int_t i=0; i<linesRaw->GetEntries(); i++)
  {
	  oneLine = ((TObjString *)(linesRaw->At(i)))->GetString().Data();
	  oneLine = Sanitize(oneLine);
	  if (oneLine.Length() == 0) continue;
	  oneLineObj = new TObjString(oneLine);
	  lines->Add(oneLineObj);
  }

  delete linesRaw;
  linesRaw = NULL;

  TObjArray *dataLine = NULL; // Used to Tokenize each point/line read
  TObjArray *colLine = NULL; // Used to Tokenize the column names

  // Some local variables declarations and initializations
  const Int_t kFieldCheck = 10;
  Bool_t check[kFieldCheck]; // used to check that mandatory column names are not missing
  for (Int_t i = 0; i < kFieldCheck; ++i) check[i] = kFALSE;
  TString tmpname = "";
  Float_t tmpx = 0.0, tmpy = 0.0, tmpz = 0.0;
  Float_t tmpprecX = -1., tmpprecY = -1., tmpprecZ = -1.;
  Char_t tmptype = '\0';
  Bool_t tmptarg = kTRUE;
  AliSurveyPoint *dp = 0;
  TString *orderedValues[9] = {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};
  TString value[9];

  Int_t nrLines = lines->GetEntries();
  Printf("Lines in file: %d\n", nrLines); 

  // The main cycle, the buffer is parsed a line at a time
  TString currLine = "", nextLine = "";
  for (Int_t i = 0; i < nrLines; ++i) {

    // Get the next line
    currLine = ((TObjString *)(lines->At(i)))->GetString().Data();
    nextLine = ((i + 1) < nrLines ? ((TObjString *)(lines->At(i + 1)))->GetString().Data() : "");
    // Printf("%d: \"%s\"", i, currLine.Data());
    // Printf("%d:  \"%s\"\n", i+1, nextLine.Data());
    
    // The line contains a keyword
    if (currLine.BeginsWith(">") && !nextLine.BeginsWith(">")) {
      currLine.Remove(TString::kLeading, '>');
      currLine.Remove(TString::kTrailing, ':');
      currLine.Remove(TString::kBoth, ' ');
      nextLine.Remove(TString::kBoth, ' ');
      AliDebug(2, Form(" -> field line: \"%s\"\n", currLine.Data()));
      AliDebug(2, Form(" -> value line: \"%s\"\n", nextLine.Data()));
      
      if (currLine.BeginsWith("Title", TString::kIgnoreCase)) {
	// Report Title
	fTitle = nextLine;
	++i;
      } else if (currLine.BeginsWith("Date", TString::kIgnoreCase)) {
	// Report(measurement) Date
	fDate = nextLine;
	++i;
      } else if (currLine.BeginsWith("Subdetector", TString::kIgnoreCase)) {
	// Subdetector or structure
	fDetector = nextLine;
	++i;
      } else if (currLine.BeginsWith("Report URL", TString::kIgnoreCase)) {
	// Report URL in EDMS
	if (nextLine.BeginsWith("http://edms.cern.ch/document/", TString::kIgnoreCase) ||
	    nextLine.BeginsWith("https://edms.cern.ch/document/", TString::kIgnoreCase)) {
 	  fURL = nextLine;
	  nextLine.Remove(TString::kTrailing, '/');
	  nextLine = nextLine(nextLine.Last('/') + 1, nextLine.Length() - nextLine.Last('/') + 1);
	  
	  if (!nextLine.IsDigit()) {
	    AliError("Survey text file sintax error! (incorrectly formatted Report URL)");
	    AliError(Form("Wrong report number string: \"%s\"",nextLine.Data()));
	    lines->Delete();
	    delete lines; lines = NULL;
	    return kFALSE;
	  }
	  fReportNr = nextLine.Atoi();
	  //Printf(" $$ %d $$\n", fReportNr);
	  ++i;
	} else { 
	  // URL incorrectly formatted
	  AliError("Survey text file sintax error! (incorrectly formatted Report URL)");
	  return kFALSE;
	}
      } else if (currLine.BeginsWith("Version", TString::kIgnoreCase)) {
	// Report version
	if (!nextLine.IsDigit()) {
	  lines->Delete();
	  delete lines; lines = NULL;
	  AliError("Survey text file sintax error! (incorrectly formatted Report Version)");
	  return kFALSE;
	}
	fVersion = nextLine.Atoi();
	++i;
      } else if (currLine.BeginsWith("General Observations", TString::kIgnoreCase)) {
	// Observations
	fObs = "";
	// Can be more than 1 line. Loop until another keyword is found
	while (('>' != nextLine[0]) && (nextLine.Length() > 0) && (i < nrLines)) {	
	  fObs += (0 == fObs.Length()) ? nextLine : " / " + nextLine;
	  ++i;
	  nextLine = ((i + 1) < nrLines ? ((TObjString *)(lines->At(i + 1)))->GetString().Data() : "");
	}
      } else if (currLine.BeginsWith("Coordinate System", TString::kIgnoreCase)) {
	// Coordinate System
	fCoordSys = nextLine;
	++i;
      } else if (currLine.BeginsWith("Units", TString::kIgnoreCase)) {
	// Measurement Unit
	fUnits = nextLine;
	++i;
      } else if (currLine.BeginsWith("Nr Columns", TString::kIgnoreCase)) {
	// Number of columns in the "Data" section
	if (!nextLine.IsDigit()) {
	  lines->Delete();
	  delete lines; lines = NULL;
	  AliError("Survey text file sintax error! (incorrectly formatted Number of Columns)");
	  return kFALSE;
	}
	fNrColumns = nextLine.Atoi();
	++i;
      } else if (currLine.BeginsWith("Column Names", TString::kIgnoreCase)) {
	// Column names separated by commas
	fColNames = nextLine;
	colLine = nextLine.Tokenize(',');
	if (colLine->GetEntries() != fNrColumns) {
	  AliError("Survey text file sintax error! (Declared number of Columns doesn't match number of column names)");
	  delete colLine;
	  lines->Delete();
	  delete lines; lines = NULL;
	  return kFALSE;
	}
	++i;
	
	// booleans to track if precision for 1 axis is defined in more than one column
	Bool_t prX = kFALSE;
	Bool_t prY = kFALSE;
	Bool_t prZ = kFALSE;
	
	for (Int_t j = 0; j < fNrColumns; ++j) {
	  TString cn = ((TObjString *)(colLine->At(j)))->GetString();
	  if (cn.BeginsWith("Point Name", TString::kIgnoreCase)) {
	    orderedValues[0] = &value[j];
	    check[0] = kTRUE;
	  } else if (cn.BeginsWith("X", TString::kIgnoreCase)) {
	    orderedValues[1] = &value[j];
	    check[1] = kTRUE;
	  } else if (cn.BeginsWith("Y", TString::kIgnoreCase)) {
	    orderedValues[2] = &value[j];
	    check[2] = kTRUE;
	  } else if (cn.BeginsWith("Z", TString::kIgnoreCase)) {
	    orderedValues[3] = &value[j];
	    check[3] = kTRUE;
	  } else if (cn.BeginsWith("Precision", TString::kIgnoreCase)) {
	    TString tmpCN = cn(0, cn.First('('));
	    Int_t precLength = TString("Precision").Length();
	    if (precLength == tmpCN.Length()) {
	      if(!orderedValues[6]){
		orderedValues[6] = &value[j];
	        check[6] = kTRUE;
	      }else{
		AliWarning("Global precision will not be used for X axis");
	      }
	      if(!orderedValues[7]){
		orderedValues[7] = &value[j];
	        check[7] = kTRUE;
	      }else{
		AliWarning("Global precision will not be used for Y axis");
	      }
	      if(!orderedValues[8]){
		orderedValues[8] = &value[j];
		check[8] = kTRUE;
	      }else{
		AliWarning("Global precision will not be used for Z axis");
	      }
	    } else {
	      Bool_t orXYZ = kFALSE;
	      TString axis = cn(precLength, tmpCN.Length() - precLength);
	      if (axis.Contains('X', TString::kIgnoreCase)) {
		if(!prX){
		  orderedValues[6] = &value[j];
		  check[6] = kTRUE;
		  orXYZ = kTRUE;
		  prX = kTRUE;
		}else{
		  AliError("Precision for X axis was already set!");
		  return kFALSE;
		}
	      }
	      if (axis.Contains('Y', TString::kIgnoreCase)) {
		if(!prY){
		  orderedValues[7] = &value[j];
		  check[7] = kTRUE;
		  orXYZ = kTRUE;
		  prY = kTRUE;
		}else{
		  AliError("Precision for Y axis was already set!");
		  return kFALSE;
		}
	      }
	      if (axis.Contains('Z', TString::kIgnoreCase)) {
		if(!prZ){
		  orderedValues[8] = &value[j];
		  check[8] = kTRUE;
		  orXYZ = kTRUE;
		  prZ = kTRUE;
		}else{
		  AliError("Precision for Z axis was already set!");
		  return kFALSE;
		}
	      }
	      if(!orXYZ)
	      {
		AliError("Survey text file sintax error: precision column name does not refer to any axis!");
		return kFALSE;
	      }
	    }
	  } else if (cn.BeginsWith("Point Type", TString::kIgnoreCase)) {
	    orderedValues[4] = &value[j];
	    check[4] = kTRUE;
	  } else if (cn.BeginsWith("Target Used", TString::kIgnoreCase)) {
	    orderedValues[5] = &value[j];
	    check[5] = kTRUE;
	  }
	}

	// Check if all the mandatory fields exist in the line with column names
	if(!check[0]){
	  AliError("Missing mandatory column \"Point Name\"!");
	  return kFALSE;
	}
	if(!(check[1]&&check[2]&&check[3])){
	  AliError("Missing one or more mandatory columns for coordinates \"X\",\"Y\",\"Z\"");
	  return kFALSE;
	}
	if(!check[4]){
	  AliError("Missing mandatory column \"Point Type\"!");
	  return kFALSE;
	}
	if(!(check[6]&&check[7]&&check[8])){
	  AliError("Missing one or more mandatory columns for precision along \"X\",\"Y\",\"Z\" axes");
	  return kFALSE;
	}

      } else if (currLine.BeginsWith("Data", TString::kIgnoreCase)) {
	// Data section!
	while ((nextLine.Length() > 0) && ('>' != nextLine[0])) {

	  // Printf("Data LINE: \"%s\": %d\n", nextLine.Data(), nextLine.Length());

	  // What is the separator used between fields?
	  // The allowed are: comma (','), tab ('\t'), and space (' ')
	  if (fNrColumns == nextLine.CountChar(',') + 1) dataLine = nextLine.Tokenize(',');
	  else if (fNrColumns == nextLine.CountChar('\t') + 1) dataLine = nextLine.Tokenize('\t');
	  else if (fNrColumns == nextLine.CountChar(' ') + 1) dataLine = nextLine.Tokenize(' ');
	  else {
	    // Error (No separator was found!)
	    AliError("Survey text file syntax error! Error processing data line!");
	    lines->Delete();
	    delete lines; lines = NULL;
	    return kFALSE;
	  }

	  if (dataLine->GetEntries() != fNrColumns) {
	    // The number of columns doesn't match the number specified in the header
	    AliError("Survey text file sintax error! (Number of entries in line is different from number of Columns)");
	    delete dataLine;
	    lines->Delete();
	    delete lines; lines = NULL;
	    return kFALSE;
	  }

	  // Process the data line using the column names as index
	  for (Int_t j = 0; j < dataLine->GetEntries(); ++j) {
	    value[j] = ((TObjString *)(dataLine->At(j)))->GetString();
	  }
	  tmpname = *orderedValues[0];
	  tmpx = orderedValues[1]->Atof();
	  tmpy = orderedValues[2]->Atof();
	  tmpz = orderedValues[3]->Atof();
	  tmpprecX = orderedValues[6]->Atof();
	  tmpprecY = orderedValues[7]->Atof();
	  tmpprecZ = orderedValues[8]->Atof();
	  tmptype = orderedValues[4]->Data()[0];
	  if(orderedValues[5]) tmptarg = (orderedValues[5]->Data()[0] == 'Y') ? kTRUE : kFALSE;

	  dp = new AliSurveyPoint(tmpname, tmpx, tmpy, tmpz, tmpprecX, tmpprecY, tmpprecZ, tmptype, tmptarg);
	  if(AliLog::GetDebugLevel("","AliSurveyObj")>1) dp->PrintPoint();
	  AddPoint(dp);

	  dataLine->Delete();
	  dataLine = NULL;
	  ++i;
	  nextLine = ((i + 1) < nrLines ? ((TObjString *)(lines->At(i + 1)))->GetString().Data() : "");
	}
      }
    } else {
      AliError("Survey text file sintax error!");
      lines->Delete();
      delete lines; lines = NULL;
      return kFALSE;
    }
  }
  lines->Delete();
  delete lines; lines = NULL;
  fIsValid = kTRUE;
  return kTRUE;
}

//_____________________________________________________________________________
void AliSurveyObj::Reset() {
  // Resets the AliSurveyObj to a clean object.
  // Used if the same object is filled more than once
  
  if (fDataPoints) {
    fDataPoints->Delete();
    fDataPoints = 0;
  }
  fTitle = "";
  fDate = "";
  fDetector = "";
  fURL = "http://edms.cern.ch/";
  fReportNr = -1;
  fVersion = -1;
  fObs = "";
  fCoordSys = "";
  fUnits = "";
  fNrColumns = -1;
  fColNames = "";
  fIsValid = kFALSE;
  fDataPoints = new TObjArray(1);
  fDataPoints->SetOwner(kTRUE);
  return;
}

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