Exchange information only through a data member
[u/mrichter/AliRoot.git] / SHUTTLE / TestShuttle / AliTestShuttle.cxx
CommitLineData
5c6b40ae 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16/*
17$Log$
77dc0223 18Revision 1.14 2007/08/06 12:25:47 acolla
19Function Bool_t GetHLTStatus added to preprocessor. It returns the status of HLT
20read from the run logbook.
21TestShuttle setup updated.
22TRD data point configuration updated.
23
87968cd5 24Revision 1.13 2007/05/30 06:35:21 jgrosseo
25Adding functionality to the Shuttle/TestShuttle:
26o) Function to retrieve list of sources from a given system (GetFileSources with id=0)
27o) Function to retrieve list of IDs for a given source (GetFileIDs)
28These functions are needed for dealing with the tag files that are saved for the GRP preprocessor
29Example code has been added to the TestProcessor in TestShuttle
30
4a33bdd9 31Revision 1.12 2007/04/27 07:06:48 jgrosseo
32GetFileSources returns empty list in case of no files, but successful query
33No mails sent in testmode
34
86aa42c3 35Revision 1.11 2007/04/04 10:33:36 jgrosseo
361) Storing of files to the Grid is now done _after_ your preprocessors succeeded. This is transparent, which means that you can still use the same functions (Store, StoreReferenceData) to store files to the Grid. However, the Shuttle first stores them locally and transfers them after the preprocessor finished. The return code of these two functions has changed from UInt_t to Bool_t which gives you the success of the storing.
37In case of an error with the Grid, the Shuttle will retry the storing later, the preprocessor does not need to be run again.
38
392) The meaning of the return code of the preprocessor has changed. 0 is now success and any other value means failure. This value is stored in the log and you can use it to keep details about the error condition.
40
413) New function StoreReferenceFile to _directly_ store a file (without opening it) to the reference storage.
42
434) The memory usage of the preprocessor is monitored. If it exceeds 2 GB it is terminated.
44
455) New function AliPreprocessor::ProcessDCS(). If you do not need to have DCS data in all cases, you can skip the processing by implemting this function and returning kFALSE under certain conditions. E.g. if there is a certain run type.
46If you always need DCS data (like before), you do not need to implement it.
47
486) The run type has been added to the monitoring page
49
9827400b 50Revision 1.10 2007/02/28 10:41:01 acolla
51Run type field added in SHUTTLE framework. Run type is read from "run type" logbook and retrieved by
52AliPreprocessor::GetRunType() function.
53Added some ldap definition files.
54
d461a8a7 55Revision 1.8 2007/02/13 11:22:25 acolla
56Shuttle getters and setters of main/local OCDB/Reference storages, temp and log
57folders moved to AliShuttleInterface
58
e19c88ea 59Revision 1.6 2006/11/06 14:22:47 jgrosseo
60major update (Alberto)
61o) reading of run parameters from the logbook
62o) online offline naming conversion
63o) standalone DCSclient package
64
eba76848 65Revision 1.5 2006/10/02 12:58:52 jgrosseo
66Small interface change in StoreReferenceData
67
8c77aee7 68Revision 1.4 2006/08/08 14:19:07 jgrosseo
69Update to shuttle classes (Alberto)
70
71- Possibility to set the full object's path in the Preprocessor's and
72Shuttle's Store functions
73- Possibility to extend the object's run validity in the same classes
74("startValidity" and "validityInfinite" parameters)
75- Implementation of the StoreReferenceData function to store reference
76data in a dedicated CDB storage.
77
84090f85 78Revision 1.3 2006/07/11 12:44:32 jgrosseo
79adding parameters for extended validity range of data produced by preprocessor
80
17111222 81Revision 1.2 2006/06/06 14:20:05 jgrosseo
82o) updated test preprocessor (alberto)
83o) added comments to example macro
84o) test shuttle implements new interface
85
5c6b40ae 86Revision 1.2 2006/03/07 07:52:34 hristov
87New version (B.Yordanov)
88
89Revision 1.3 2005/11/17 17:47:34 byordano
90TList changed to TObjArray
91
92Revision 1.2 2005/11/17 14:43:22 byordano
93import to local CVS
94
95Revision 1.1.1.1 2005/10/28 07:33:58 hristov
96Initial import as subdirectory in AliRoot
97
98Revision 1.1.1.1 2005/09/12 22:11:40 byordano
99SHUTTLE package
100
101Revision 1.2 2005/08/29 21:15:47 byordano
102some docs added
103
104*/
105
106//
107// test implementation of the AliShuttleInterface, to be used for local tests of preprocessors
108//
109// reads files from the local disk
110// stores to local CDB
111// logs to the screen
112//
113
114#include "AliTestShuttle.h"
115#include "AliLog.h"
116
117#include "AliCDBManager.h"
84090f85 118#include "AliCDBStorage.h"
5c6b40ae 119#include "AliCDBMetaData.h"
84090f85 120#include "AliCDBPath.h"
5c6b40ae 121#include "AliCDBId.h"
36137ac1 122#include "AliPreprocessor.h"
5c6b40ae 123
124#include <TMap.h>
125#include <TList.h>
5c6b40ae 126#include <TObjString.h>
e19c88ea 127#include <TSystem.h>
77dc0223 128#include <TTimeStamp.h>
5c6b40ae 129
130ClassImp(AliTestShuttle)
131
36137ac1 132//______________________________________________________________________________________________
17111222 133AliTestShuttle::AliTestShuttle(Int_t run, UInt_t startTime, UInt_t endTime) :
134 fRun(run),
135 fStartTime(startTime),
136 fEndTime(endTime),
36137ac1 137 fInputFiles(0),
eba76848 138 fRunParameters(0),
9827400b 139 fRunType(),
36137ac1 140 fPreprocessors(0),
141 fDcsAliasMap(0)
5c6b40ae 142{
143 // constructor
36137ac1 144
145 fInputFiles = new TMap;
eba76848 146 fRunParameters = new TMap;
36137ac1 147 fPreprocessors = new TObjArray;
441b0e9c 148
149 fInputFiles->SetOwner(1);
150 fRunParameters->SetOwner(1);
441b0e9c 151 fPreprocessors->SetOwner(1);
5c6b40ae 152}
153
36137ac1 154//______________________________________________________________________________________________
5c6b40ae 155AliTestShuttle::~AliTestShuttle()
156{
157 // destructor
36137ac1 158
159 delete fInputFiles;
160 fInputFiles = 0;
161
eba76848 162 delete fRunParameters;
163 fRunParameters = 0;
164
36137ac1 165 delete fPreprocessors;
166 fPreprocessors = 0;
167
168 delete fDcsAliasMap;
169 fDcsAliasMap = 0;
5c6b40ae 170}
171
36137ac1 172//______________________________________________________________________________________________
9827400b 173Bool_t AliTestShuttle::Store(const AliCDBPath& path, TObject* object, AliCDBMetaData* metaData,
84090f85 174 Int_t validityStart, Bool_t validityInfinite)
5c6b40ae 175{
176 // Stores the CDB object
177 // This function should be called at the end of the preprocessor cycle
178 //
179 // This implementation just stores it on the local disk, the full AliShuttle
180 // puts it to the Grid FileCatalog
181
84090f85 182 Int_t startRun = fRun - validityStart;
183 if(startRun < 0) {
184 AliError("First valid run happens to be less than 0! Setting it to 0...");
185 startRun=0;
186 }
17111222 187
84090f85 188 Int_t endRun = -1;
189 if(validityInfinite) {
190 endRun = AliCDBRunRange::Infinity();
191 } else {
192 endRun = fRun;
193 }
17111222 194
84090f85 195 AliCDBId id(path, startRun, endRun);
17111222 196
e19c88ea 197 return AliCDBManager::Instance()->GetStorage(fgkMainCDB)->Put(object, id, metaData);
84090f85 198}
17111222 199
84090f85 200//______________________________________________________________________________________________
9827400b 201Bool_t AliTestShuttle::StoreReferenceData(const AliCDBPath& path, TObject* object, AliCDBMetaData* metaData)
84090f85 202{
203 // Stores the object as reference data
204 // This function should be called at the end of the preprocessor cycle
205 //
206 // This implementation just stores it on the local disk, the full AliShuttle
207 // puts it to the Grid FileCatalog
208
8c77aee7 209 AliCDBId id(path, fRun, fRun);
84090f85 210
e19c88ea 211 return AliCDBManager::Instance()->GetStorage(fgkMainRefStorage)->Put(object, id, metaData);
5c6b40ae 212}
213
36137ac1 214//______________________________________________________________________________________________
9827400b 215Bool_t AliTestShuttle::StoreReferenceFile(const char* detector, const char* localFile, const char* gridFileName)
216{
217 //
218 // Stores reference file directly (without opening it).
219 //
220 // This implementation just stores it on the local disk, the full AliShuttle
221 // puts it to the Grid FileCatalog
222
223 AliCDBManager* man = AliCDBManager::Instance();
77dc0223 224 AliCDBStorage* sto = man->GetStorage(fgkLocalRefStorage);
9827400b 225
226 TString localBaseFolder = sto->GetBaseFolder();
227
77dc0223 228 TString targetDir = GetRefFilePrefix(localBaseFolder.Data(), detector);
9827400b 229
77dc0223 230 return CopyFileLocally(targetDir, localFile, gridFileName);
231}
232
233//______________________________________________________________________________________________
234Bool_t AliTestShuttle::StoreRunMetadataFile(const char* localFile, const char* gridFileName)
235{
236 //
237 // Stores Run metadata file to the Grid, in the run folder
238 //
239 // Only GRP can call this function.
9827400b 240
77dc0223 241 AliCDBManager* man = AliCDBManager::Instance();
242 AliCDBStorage* sto = man->GetStorage(fgkLocalRefStorage);
243
244 TString localBaseFolder = sto->GetBaseFolder();
245
246 // Build Run level folder
247 // folder = /alice/data/year/lhcPeriod/runNb/Raw
248
249 TTimeStamp startTime(fStartTime);
250
251 TString year = Form("%d",startTime.GetDate());
252 year = year(0,4);
253
254 TString lhcPeriod = GetRunParameter("LHCperiod");
255
256 if (lhcPeriod.Length() == 0)
9827400b 257 {
77dc0223 258 Log("SHUTTLE","StoreRunMetaDataFile - LHCPeriod not found in logbook!");
259 return 0;
260 }
261
262 // TODO: currently SHUTTLE cannot write in /alice/data/ !!!!!
263 //TString targetDir = Form("%s/GRP/RunMetadata/alice/data/%s/%s/%d/Raw",
264 // localBaseFolder.Data(), year.Data(),
265 // lhcPeriod.Data(), fRun);
266
267 TString targetDir = Form("%s/GRP/RunMetadata/alice/simulation/%s/%s/%d/Raw",
268 localBaseFolder.Data(), year.Data(),
269 lhcPeriod.Data(), fRun);
270
271 return CopyFileLocally(targetDir, localFile, gridFileName);
272}
273
274//______________________________________________________________________________________________
275Bool_t AliTestShuttle::CopyFileLocally(TString& targetDir, const char* localFile, const char* gridFileName)
276{
277 //
278 // Stores file locally. Called by StoreReferenceFile and StoreRunMetadataFile
279 //
280
281 //try to open folder, if it does not exist
282 void* dir = gSystem->OpenDirectory(targetDir.Data());
283 if (dir == NULL) {
284 if (gSystem->mkdir(targetDir.Data(), kTRUE)) {
285 Log("SHUTTLE", Form("StoreFileLocally - Can't open directory <%s>", targetDir.Data()));
9827400b 286 return kFALSE;
287 }
77dc0223 288
289 } else {
290 gSystem->FreeDirectory(dir);
9827400b 291 }
77dc0223 292
293 TString target = Form("%s/%s", targetDir.Data(), gridFileName);
294
295 Int_t result = gSystem->GetPathInfo(localFile, 0, (Long64_t*) 0, 0, 0);
296 if (result)
297 {
298 Log("SHUTTLE", Form("StoreFileLocally - %s does not exist", localFile));
299 return kFALSE;
300 }
301
9827400b 302 result = gSystem->CopyFile(localFile, target);
303
304 if (result == 0)
305 {
77dc0223 306 Log("SHUTTLE", Form("StoreFileLocally - File %s stored locally to %s", localFile, target.Data()));
9827400b 307 return kTRUE;
308 }
309 else
310 {
77dc0223 311 Log("SHUTTLE", Form("StoreFileLocally - Could not store file %s to %s!. Error code = %d",
312 localFile, target.Data(), result));
9827400b 313 return kFALSE;
77dc0223 314 }
315
316
317
318}
319
320//______________________________________________________________________________________________
321const char* AliTestShuttle::GetRefFilePrefix(const char* base, const char* detector)
322{
323 //
324 // Get folder name of reference files
325 //
326
327 TString offDetStr(GetOfflineDetName(detector));
0ffe41b3 328 static TString dir;
77dc0223 329 if (offDetStr == "ITS" || offDetStr == "MUON" || offDetStr == "PHOS")
330 {
331 dir.Form("%s/%s/%s", base, offDetStr.Data(), detector);
332 } else {
333 dir.Form("%s/%s", base, offDetStr.Data());
334 }
335
336 return dir.Data();
9827400b 337}
338
339//______________________________________________________________________________________________
5c6b40ae 340const char* AliTestShuttle::GetFile(Int_t system, const char* detector, const char* id, const char* source)
341{
342 // This function retrieves a file from the given system (kDAQ, kDCS, kHLT) with the given file id
343 // and from the given source in the system.
344 // The function returnes the path to the local file.
345 //
346 // test implementation of GetFile
347 // takes files from the local disks, files are passen in a TMap in the constructor
348
349 TString key;
350 key.Form("%s-%s-%s", fkSystemNames[system], detector, id);
351 TPair* sourceListPair = dynamic_cast<TPair*> (fInputFiles->FindObject(key.Data()));
352 TMap* sourceList = 0;
353 if (sourceListPair)
354 sourceList = dynamic_cast<TMap*> (sourceListPair->Value());
355 if (!sourceList)
356 {
357 AliError(Form("Could not find any file in %s with id %s (%s)", fkSystemNames[system], id, key.Data()));
358 return 0;
359 }
360
4a33bdd9 361 TObjString* fileName = 0;
5c6b40ae 362 TPair* fileNamePair = dynamic_cast<TPair*> (sourceList->FindObject(source));
4a33bdd9 363 if (fileNamePair)
364 fileName = dynamic_cast<TObjString*> (fileNamePair->Value());
5c6b40ae 365 if (!fileName)
366 {
36137ac1 367 AliError(Form("Could not find files from source %s in %s with id %s",
368 source, fkSystemNames[system], id));
5c6b40ae 369 return 0;
370 }
371
372 return fileName->GetString().Data();
373}
374
36137ac1 375//______________________________________________________________________________________________
5c6b40ae 376TList* AliTestShuttle::GetFileSources(Int_t system, const char* detector, const char* id)
377{
378 // Returns a list of sources in a given system that saved a file with the given id
379 //
380 // test implementation of GetFileSources
381 // takes files from the local disks, files are passen in a TMap in the constructor
382
383 TString key;
4a33bdd9 384 if (id)
385 key.Form("%s-%s-%s", fkSystemNames[system], detector, id);
386 else
387 key.Form("%s-%s", fkSystemNames[system], detector);
388
389 TList* list = new TList;
390
391 TIterator* iter = fInputFiles->MakeIterator();
392 TObject* obj = 0;
393 while ((obj = iter->Next()))
5c6b40ae 394 {
4a33bdd9 395 TObjString* objStr = dynamic_cast<TObjString*> (obj);
396 if (objStr)
397 {
398 Bool_t found = kFALSE;
399 if (id)
400 {
401 found = (objStr->String().CompareTo(key) == 0);
402 }
403 else
404 found = objStr->String().BeginsWith(key);
405
406 if (found)
407 {
408 TPair* sourceListPair = dynamic_cast<TPair*> (fInputFiles->FindObject(objStr->String().Data()));
409 TMap* sourceList = dynamic_cast<TMap*> (sourceListPair->Value());
410
411 TIterator* iter2 = sourceList->GetTable()->MakeIterator();
412 TObject* obj2 = 0;
413 while ((obj2 = iter2->Next()))
414 {
415 TPair* pair = dynamic_cast<TPair*> (obj2);
416 if (pair)
417 {
418 if (!list->FindObject(pair->Key()))
419 list->Add(new TObjString(pair->Key()->GetName()));
420 }
421 }
422
423 delete iter2;
424 }
425 }
5c6b40ae 426 }
4a33bdd9 427
428 if (list->GetEntries() == 0)
429 AliInfo(Form("Could not find any file in %s with id %s (%s)", fkSystemNames[system], id, key.Data()));
430
431 return list;
432}
5c6b40ae 433
4a33bdd9 434//______________________________________________________________________________________________
435TList* AliTestShuttle::GetFileIDs(Int_t system, const char* detector, const char* source)
436{
437 // Returns a list of ids in a given system that saved a file with the given source
438 //
439 // test implementation of GetFileSources
440 // takes files from the local disks, files are passen in a TMap in the constructor
441
442
443 TString key;
444 key.Form("%s-%s", fkSystemNames[system], detector);
445
5c6b40ae 446 TList* list = new TList;
4a33bdd9 447
448 TIterator* iter = fInputFiles->MakeIterator();
449 TObject* obj = 0;
5c6b40ae 450 while ((obj = iter->Next()))
451 {
4a33bdd9 452 TObjString* objStr = dynamic_cast<TObjString*> (obj);
453 if (objStr)
454 {
455 if (objStr->String().BeginsWith(key))
456 {
457 Bool_t found = kFALSE;
458
459 TPair* sourceListPair = dynamic_cast<TPair*> (fInputFiles->FindObject(objStr->String().Data()));
460 TMap* sourceList = dynamic_cast<TMap*> (sourceListPair->Value());
461
462 TIterator* iter2 = sourceList->GetTable()->MakeIterator();
463 TObject* obj2 = 0;
464 while ((obj2 = iter2->Next()))
465 {
466 TPair* pair = dynamic_cast<TPair*> (obj2);
467 if (pair)
468 {
469 if (strcmp(pair->Key()->GetName(), source) == 0)
470 found = kTRUE;
471 }
472 }
473
474 delete iter2;
475
476 if (found)
477 {
478 TObjArray* tokens = objStr->String().Tokenize("-");
479 if (tokens->GetEntries() == 3)
480 {
481 TObjString* id = dynamic_cast<TObjString*> (tokens->At(2));
482 if (id && !list->FindObject(id->String()))
483 list->Add(new TObjString(id->String()));
484 }
485
486 delete tokens;
487
488 }
489 }
490 }
5c6b40ae 491 }
4a33bdd9 492
493 if (list->GetEntries() == 0)
494 AliInfo(Form("Could not find any file in %s with source %s (%s)", fkSystemNames[system], source, key.Data()));
495
5c6b40ae 496 return list;
497}
498
36137ac1 499//______________________________________________________________________________________________
5c6b40ae 500void AliTestShuttle::Log(const char* detector, const char* message)
501{
502 // test implementation of Log
503 // just prints to the screen
504
505 AliInfo(Form("%s: %s", detector, message));
506}
507
36137ac1 508//______________________________________________________________________________________________
509void AliTestShuttle::AddInputFile(Int_t system, const char* detector, const char* id, const char* source, const char* fileName)
510{
4a33bdd9 511 //
36137ac1 512 // This function adds a file to the list of input files
4a33bdd9 513 // the list is stored in fInputFiles
514 // fInputFiles: TMap (key -> value)
515 // <system>-<detector>-<id> -> TMap (key -> value)
516 // <source> -> <filename>
517 //
518
36137ac1 519 TString key;
520 key.Form("%s-%s-%s", fkSystemNames[system], detector, id);
521 TPair* sourceListPair = dynamic_cast<TPair*> (fInputFiles->FindObject(key.Data()));
522 TMap* sourceList = 0;
523 if (sourceListPair)
524 sourceList = dynamic_cast<TMap*> (sourceListPair->Value());
525 if (!sourceList)
526 {
527 sourceList = new TMap;
528 fInputFiles->Add(new TObjString(key), sourceList);
529 }
530
531 sourceList->Add(new TObjString(source), new TObjString(fileName));
532}
533
534//______________________________________________________________________________________________
d461a8a7 535Bool_t AliTestShuttle::AddInputCDBEntry(AliCDBEntry* entry)
536{
537 // This function adds an object in the OCDB to be later retrieved with GetFromOCDB
538
539 AliCDBStorage *sto = AliCDBManager::Instance()->GetStorage(fgkMainCDB);
540 if (!sto)
541 {
542 Log("SHUTTLE", "GetFromOCDB - Cannot activate main OCDB for query!");
543 return 0;
544 }
545
546 return sto->Put(entry);
547}
548
549//______________________________________________________________________________________________
9827400b 550AliCDBEntry* AliTestShuttle::GetFromOCDB(const char* detector, const AliCDBPath& path)
d461a8a7 551{
552// returns obiect from OCDB valid for current run
553
554 AliCDBStorage *sto = AliCDBManager::Instance()->GetStorage(fgkMainCDB);
555 if (!sto)
556 {
557 Log("SHUTTLE", "GetFromOCDB - Cannot activate main OCDB for query!");
558 return 0;
559 }
560
561 return (AliCDBEntry*) sto->Get(path, fRun);
562}
563
564//______________________________________________________________________________________________
36137ac1 565void AliTestShuttle::Process()
566{
567 // This function tests all preprocessors that are registered to it
568 // All preprocessors get the same dcs alias map and have access to the same list of files.
569
570 for (Int_t i=0; i<fPreprocessors->GetEntries(); ++i)
571 {
572 AliPreprocessor* preprocessor = dynamic_cast<AliPreprocessor*> (fPreprocessors->At(i));
573 if (preprocessor)
574 {
0ffe41b3 575 if (preprocessor->ProcessRunType())
576 {
577 preprocessor->Initialize(fRun, fStartTime, fEndTime);
578 preprocessor->Process(fDcsAliasMap);
579 }
36137ac1 580 }
581 }
582}
583
584//______________________________________________________________________________________________
585void AliTestShuttle::RegisterPreprocessor(AliPreprocessor* preprocessor)
586{
587 // registers a preprocessor
588
eba76848 589 const char* detName = preprocessor->GetName();
590 if(strcmp("DET", detName) != 0) {
591 if(GetDetPos(detName) < 0)
592 AliFatal(Form("********** !!!!! Invalid detector name: %s !!!!! **********", detName));
441b0e9c 593 }
eba76848 594
595 fPreprocessors->Add(preprocessor);
596}
597
598//______________________________________________________________________________________________
599void AliTestShuttle::AddInputRunParameter(const char* key, const char* value){
600// set a run parameter (in reality it will be read from the DAQ logbook)
601
602 TObjString* keyObj = new TObjString(key);
603 if (fRunParameters->Contains(key)) {
604 AliWarning(Form("Parameter %s already existing and it will be replaced.", key));
605 delete fRunParameters->Remove(keyObj);
606
607 }
608 fRunParameters->Add(keyObj, new TObjString(value));
609 AliDebug(2, Form("Number of parameters: %d", fRunParameters->
610 GetEntries()));
611}
612
613//______________________________________________________________________________________________
9827400b 614const char* AliTestShuttle::GetRunType()
615{
616 //
617 // get a run parameter
618 //
441b0e9c 619
87968cd5 620 return fRunType.Data();
441b0e9c 621}
622
623//______________________________________________________________________________________________
eba76848 624const char* AliTestShuttle::GetRunParameter(const char* key){
625// get a run parameter
626
627 TObjString* value = dynamic_cast<TObjString*> (fRunParameters->GetValue(key));
628 if(!value) {
629 AliError(Form("No such parameter: %s", key));
630 return 0;
631 }
632 return value->GetName();
36137ac1 633}
e19c88ea 634
d461a8a7 635//______________________________________________________________________________________________
636void AliTestShuttle::SetShuttleTempDir(const char* tmpDir)
637{
638// sets Shuttle temp directory
639
640 fgkShuttleTempDir = gSystem->ExpandPathName(tmpDir);
641}
642
643//______________________________________________________________________________________________
644void AliTestShuttle::SetShuttleLogDir(const char* logDir)
645{
646// sets Shuttle log directory
647
648 fgkShuttleLogDir = gSystem->ExpandPathName(logDir);
649}
650