#include "AliSurveyObj.h"
//ROOT includes
-#include "TROOT.h"
-#include "Riostream.h"
+//#include "TROOT.h"
+//#include "Riostream.h"
#include "TObjArray.h"
#include "TGrid.h"
#include "TGridResult.h"
//AliROOT includes
#include "AliLog.h"
+#include "AliSurveyPoint.h"
ClassImp(AliSurveyObj)
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,V0,ZDC,GRP";
+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";
// If the same "Grid" is alreay active, skip connection
if (!gGrid || gridUrl != gGrid->GridUrl() ||
- (( user != "" ) && ( user != gGrid->GetUser() )) ) {
+ (( strcmp(user,"") ) && ( strcmp(user,gGrid->GetUser()) )) ) {
// connection to the Grid
AliInfo("\nConnecting to the Grid...");
if (gGrid) {
// Some local variables declarations and initializations
const Int_t kFieldCheck = 10;
- Bool_t check[kFieldCheck];
- TString tmp_name = "";
- Float_t tmp_x = 0.0, tmp_y = 0.0, tmp_z = 0.0;
- Float_t tmp_precX = 0.0, tmp_precY = 0.0, tmp_precZ = 0.0;
- Char_t tmp_type = '\0';
- Bool_t tmp_targ = kTRUE;
- AliSurveyPoint *dp = 0;
+ 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);
currLine.Remove(TString::kTrailing, ':');
currLine.Remove(TString::kBoth, ' ');
nextLine.Remove(TString::kBoth, ' ');
- // Printf(" -> Field: \"%s\"\n", currLine.Data());
+ 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
nextLine.Remove(TString::kTrailing, '/');
nextLine = nextLine(nextLine.Last('/') + 1, nextLine.Length() - nextLine.Last('/') + 1);
- Int_t sscanf_tmp = 0;
- if (1 != sscanf(nextLine.Data(), "%d", &sscanf_tmp)) {
+ Int_t sscanftmp = 0;
+ if (1 != sscanf(nextLine.Data(), "%d", &sscanftmp)) {
AliError("Survey text file sintax error! (incorrectly formated Report URL)");
lines->Delete();
return kFALSE;
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]){
+ Printf("Missing mandatory column \"Point Name\"!");
+ return kFALSE;
+ }
+ if(!(check[1]&&check[2]&&check[3])){
+ Printf("Missing one or more mandatory columns for coordinates \"X\",\"Y\",\"Z\"");
+ return kFALSE;
+ }
+ if(!check[4]){
+ Printf("Missing mandatory column \"Point Type\"!");
+ return kFALSE;
+ }
+ if(!(check[6]&&check[7]&&check[8])){
+ Printf("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])) {
// 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();
- return kFALSE;
- }
-
+ 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();
+ 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 declared Number of Columns)");
+ AliError("Survey text file sintax error! (Number of entries in line is different from number of Columns)");
dataLine->Delete();
lines->Delete();
return kFALSE;
}
- // Reset the bits used to check if all the required fields are present
- for (Int_t t = 0; t < kFieldCheck; ++t) check[t] = 0;
-
// Process the data line using the column names as index
for (Int_t j = 0; j < dataLine->GetEntries(); ++j) {
- TString cn = ((TObjString *)(colLine->At(j)))->GetString();
- TString value = ((TObjString *)(dataLine->At(j)))->GetString();
- if (cn.BeginsWith("Point Name", TString::kIgnoreCase)) {
- tmp_name = value;
- check[0] = kTRUE;
- } else if (cn.BeginsWith("X", TString::kIgnoreCase)) {
- tmp_x = value.Atof();
- check[1] = kTRUE;
- } else if (cn.BeginsWith("Y", TString::kIgnoreCase)) {
- tmp_y = value.Atof();
- check[2] = kTRUE;
- } else if (cn.BeginsWith("Z", TString::kIgnoreCase)) {
- tmp_z = value.Atof();
- check[3] = kTRUE;
- } else if (cn.BeginsWith("Precision", TString::kIgnoreCase)) {
- TString tmpCN = cn(0, cn.First('('));
- Int_t precLength = TString("Precision").Length();
- //Printf(" ====== %d ======= %d ====== \n", precLength, tmpCN.Length());
- //Printf(" ====== %s ======= \n", tmpCN.Data());
- if (precLength == tmpCN.Length()) {
- tmp_precX = tmp_precY = tmp_precZ = value.Atof();
- check[6] = kTRUE;
- } else {
- TString axis = cn(precLength, tmpCN.Length() - precLength);
- if (axis.Contains('X', TString::kIgnoreCase)) {
- tmp_precX = value.Atof();
- check[7] = kTRUE;
- } else if (axis.Contains('Y', TString::kIgnoreCase)) {
- tmp_precY = value.Atof();
- check[8] = kTRUE;
- } else if (axis.Contains('Z', TString::kIgnoreCase)) {
- tmp_precZ = value.Atof();
- check[9] = kTRUE;
- } else {
- AliError("Survey text file sintax error! (Precision column name invalid)");
- dataLine->Delete();
- lines->Delete();
- return kFALSE;
- }
- }
- } else if (cn.BeginsWith("Point Type", TString::kIgnoreCase)) {
- tmp_type = value.Data()[0];
- check[4] = kTRUE;
- } else if (cn.BeginsWith("Target Used", TString::kIgnoreCase)) {
- tmp_targ = (value.Data()[0] == 'Y') ? kTRUE : kFALSE;
- check[5] = kTRUE;
- }
-
- //Printf("--> %s\n", ((TObjString *)(dataLine->At(j)))->GetString().Data());
- }
-
- // Check if all the mandatory fields exist
- Bool_t res = kTRUE, precInd = kTRUE;
-
- // Target
- if (kFALSE == check[5]) {
- tmp_targ = kTRUE;
- check[5] = kTRUE;
+ value[j] = ((TObjString *)(dataLine->At(j)))->GetString();
}
-
- // Individual axis precisions
- for (Int_t t = 7; t < 10; ++t) precInd &= check[t];
- if ((kFALSE == check[6]) && (kTRUE == precInd)) check[6] = kTRUE;
+ 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);
+ dp->PrintPoint();
+ AddPoint(dp);
- for (Int_t t = 0; t < kFieldCheck - 3; ++t) {
- //Printf("RES(%d): %d\n", t, check[t]);
- res &= check[t];
- }
- if (kTRUE == res) {
- dp = new AliSurveyPoint(tmp_name, tmp_x, tmp_y, tmp_z, tmp_precX, tmp_precY, tmp_precZ, tmp_type, tmp_targ);
- dp->PrintPoint();
- AddPoint(dp);
- } else {
- AliError("Parsing error processing data line!");
- dataLine->Delete();
- lines->Delete();
- return kFALSE;
- }
-
dataLine->Delete();
dataLine = NULL;
++i;