1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 Revision 1.27 2007/12/17 03:23:32 jgrosseo
20 added "empty preprocessor" as placeholder for Acorde in FDR
22 Revision 1.26 2007/12/07 19:14:36 acolla
25 Added automatic collection of new runs on a regular time basis (settable from the configuration)
27 in AliShuttleConfig: new members
29 - triggerWait: time to wait for DIM trigger (s) before starting automatic collection of new runs
30 - mode: run mode (test, prod) -> used to build log folder (logs or logs_PROD)
34 - logs now stored in logs/#RUN/DET_#RUN.log
36 Revision 1.25 2007/11/26 16:58:37 acolla
37 Monalisa configuration added: host and table name
39 Revision 1.24 2007/10/24 10:44:08 acolla
43 Revision 1.23 2007/09/28 15:27:40 acolla
45 AliDCSClient "multiSplit" option added in the DCS configuration
46 in AliDCSMessage: variable MAX_BODY_SIZE set to 500000
48 Revision 1.22 2007/09/27 16:53:13 acolla
49 Detectors can have more than one AMANDA server. SHUTTLE queries the servers sequentially,
50 merges the dcs aliases/DPs in one TMap and sends it to the preprocessor.
52 Revision 1.21 2007/04/27 07:06:48 jgrosseo
53 GetFileSources returns empty list in case of no files, but successful query
54 No mails sent in testmode
56 Revision 1.20 2007/04/04 10:33:36 jgrosseo
57 1) 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.
58 In case of an error with the Grid, the Shuttle will retry the storing later, the preprocessor does not need to be run again.
60 2) 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.
62 3) New function StoreReferenceFile to _directly_ store a file (without opening it) to the reference storage.
64 4) The memory usage of the preprocessor is monitored. If it exceeds 2 GB it is terminated.
66 5) 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.
67 If you always need DCS data (like before), you do not need to implement it.
69 6) The run type has been added to the monitoring page
71 Revision 1.19 2007/02/28 10:41:56 acolla
72 Run type field added in SHUTTLE framework. Run type is read from "run type" logbook and retrieved by
73 AliPreprocessor::GetRunType() function.
74 Added some ldap definition files.
76 Revision 1.18 2007/01/23 19:20:03 acolla
77 Removed old ldif files, added TOF, MCH ldif files. Added some options in
78 AliShuttleConfig::Print. Added in Ali Shuttle: SetShuttleTempDir and
81 Revision 1.17 2007/01/18 11:17:47 jgrosseo
82 changing spaces to tabs ;-)
84 Revision 1.16 2007/01/18 11:10:35 jgrosseo
85 adding the possibility of defining DCS alias and data points with patterns
86 first pattern introduced: [N..M] to add all names between the two digits, this works also recursively.
88 Revision 1.15 2007/01/15 18:27:11 acolla
89 implementation of sending mail to subdetector expert in case the preprocessor fails.
90 shuttle.schema updated with expert's email entry
92 Revision 1.13 2006/12/07 08:51:26 jgrosseo
94 table, db names in ldap configuration
95 added GRP preprocessor
96 DCS data can also be retrieved by data point
98 Revision 1.12 2006/11/16 16:16:48 jgrosseo
99 introducing strict run ordering flag
100 removed giving preprocessor name to preprocessor, they have to know their name themselves ;-)
102 Revision 1.11 2006/11/06 14:23:04 jgrosseo
103 major update (Alberto)
104 o) reading of run parameters from the logbook
105 o) online offline naming conversion
106 o) standalone DCSclient package
108 Revision 1.10 2006/10/20 15:22:59 jgrosseo
109 o) Adding time out to the execution of the preprocessors: The Shuttle forks and the parent process monitors the child
110 o) Merging Collect, CollectAll, CollectNew function
111 o) Removing implementation of empty copy constructors (declaration still there!)
113 Revision 1.9 2006/10/02 16:38:39 jgrosseo
116 storing of objects that failed to be stored to the grid before
117 interfacing of shuttle status table in daq system
119 Revision 1.8 2006/08/15 10:50:00 jgrosseo
120 effc++ corrections (alberto)
122 Revision 1.7 2006/07/20 09:54:40 jgrosseo
123 introducing status management: The processing per subdetector is divided into several steps,
124 after each step the status is stored on disk. If the system crashes in any of the steps the Shuttle
125 can keep track of the number of failures and skips further processing after a certain threshold is
126 exceeded. These thresholds can be configured in LDAP.
128 Revision 1.6 2006/07/19 10:09:55 jgrosseo
129 new configuration, accesst to DAQ FES (Alberto)
131 Revision 1.5 2006/07/10 13:01:41 jgrosseo
132 enhanced storing of last sucessfully processed run (alberto)
134 Revision 1.4 2006/06/12 09:11:16 jgrosseo
135 coding conventions (Alberto)
137 Revision 1.3 2006/06/06 14:26:40 jgrosseo
138 o) removed files that were moved to STEER
139 o) shuttle updated to follow the new interface (Alberto)
141 Revision 1.7 2006/05/12 09:07:16 colla
143 New configuration complete
145 Revision 1.2 2006/03/07 07:52:34 hristov
146 New version (B.Yordanov)
148 Revision 1.4 2005/11/19 14:20:31 byordano
149 logbook config added to AliShuttleConfig
151 Revision 1.3 2005/11/17 19:24:25 byordano
152 TList changed to TObjArray in AliShuttleConfig
154 Revision 1.2 2005/11/17 14:43:23 byordano
157 Revision 1.1.1.1 2005/10/28 07:33:58 hristov
158 Initial import as subdirectory in AliRoot
160 Revision 1.1.1.1 2005/09/12 22:11:40 byordano
163 Revision 1.3 2005/08/30 09:13:02 byordano
170 // This class keeps the AliShuttle configuration.
171 // It reads the configuration for LDAP server.
172 // For every child entry in basedn which has schema type 'shuttleConfig'
173 // it creates a detector configuration. This configuration includes:
174 // DCS server host and port and the set of aliases for which data from
175 // will be retrieved (used by AliShuttle).
178 #include <Riostream.h>
179 #include "AliShuttleConfig.h"
180 #include "AliShuttleInterface.h"
185 #include <TObjString.h>
186 #include <TLDAPResult.h>
187 #include <TLDAPEntry.h>
188 #include <TLDAPAttribute.h>
192 AliShuttleConfig::AliShuttleDCSConfigHolder::AliShuttleDCSConfigHolder(const TLDAPEntry* entry):
199 fDCSDataPointsComp(0),
202 // constructor of the shuttle DCS configuration holder
204 TLDAPAttribute* anAttribute;
205 fDCSAliases = new TObjArray();
206 fDCSAliases->SetOwner(1);
207 fDCSDataPoints = new TObjArray();
208 fDCSDataPoints->SetOwner(1);
209 fDCSAliasesComp = new TObjArray();
210 fDCSAliasesComp->SetOwner(1);
211 fDCSDataPointsComp = new TObjArray();
212 fDCSDataPointsComp->SetOwner(1);
215 anAttribute = entry->GetAttribute("dcsHost");
218 AliError("Unexpected: no DCS host!");
222 fDCSHost = anAttribute->GetValue();
224 anAttribute = entry->GetAttribute("dcsPort");
227 AliError("Unexpected: no DCS port!");
230 TString portStr = anAttribute->GetValue();
231 fDCSPort = portStr.Atoi();
233 anAttribute = entry->GetAttribute("multiSplit"); // MAY
236 TString multiSplitStr = anAttribute->GetValue();
237 fMultiSplit = multiSplitStr.Atoi();
238 if(fMultiSplit == 0) {
239 AliError("MultiSplit must be a positive integer!");
245 anAttribute = entry->GetAttribute("dcsAlias"); // MAY
249 while ((anAlias = anAttribute->GetValue()))
251 fDCSAliasesComp->AddLast(new TObjString(anAlias));
252 ExpandAndAdd(fDCSAliases, anAlias);
256 anAttribute = entry->GetAttribute("dcsDP"); // MAY
259 const char* aDataPoint;
260 while ((aDataPoint = anAttribute->GetValue()))
262 fDCSDataPointsComp->AddLast(new TObjString(aDataPoint));
263 ExpandAndAdd(fDCSDataPoints, aDataPoint);
270 //______________________________________________________________________________________________
271 AliShuttleConfig::AliShuttleConfig(const AliShuttleConfig & other):
273 fConfigHost(other.fConfigHost),
274 fAlienPath(other.fAlienPath),
275 fDAQlbHost(other.fDAQlbHost),
276 fDAQlbPort(other.fDAQlbPort),
277 fDAQlbUser(other.fDAQlbUser),
278 fDAQlbPass(other.fDAQlbPass),
279 fDAQlbDB(other.fDAQlbDB),
280 fDAQlbTable(other.fDAQlbTable),
281 fShuttlelbTable(other.fShuttlelbTable),
282 fRunTypelbTable(other.fRunTypelbTable),
283 fPasswdFilePath(other.fPasswdFilePath),
284 fMaxRetries(other.fMaxRetries),
285 fPPTimeOut(other.fPPTimeOut),
286 fDCSTimeOut(other.fDCSTimeOut),
287 fDCSRetries(other.fDCSRetries),
288 fPPMaxMem(other.fPPMaxMem),
289 fMonitorHost(other.fMonitorHost),
290 fMonitorTable(other.fMonitorTable),
291 fTriggerWait(other.fTriggerWait),
292 fRunMode(other.fRunMode),
294 fDetectorList(other.fDetectorList),
295 fShuttleInstanceHost(other.fShuttleInstanceHost),
296 fProcessedDetectors(other.fProcessedDetectors),
297 fKeepDCSMap(other.fKeepDCSMap),
298 fKeepTempFolder(other.fKeepTempFolder),
299 fSendMail(other.fSendMail),
300 fProcessAll(other.fProcessAll),
301 fIsValid(other.fIsValid)
306 for (Int_t i = 0; i<3; i++){
307 fFXSHost[i]=other.fFXSHost[i];
308 fFXSPort[i]=other.fFXSPort[i];
309 fFXSUser[i]=other.fFXSUser[i];
310 fFXSPass[i]=other.fFXSPass[i];
311 fFXSBaseFolder[i]=other.fFXSBaseFolder[i];
312 fFXSdbHost[i]=other.fFXSdbHost[i];
313 fFXSdbPort[i]=other.fFXSdbPort[i];
314 fFXSdbUser[i]=other.fFXSdbUser[i];
315 fFXSdbPass[i]=other.fFXSdbPass[i];
316 fFXSdbName[i]=other.fFXSdbName[i];
317 fFXSdbTable[i]=other.fFXSdbTable[i];
319 for (Int_t i = 0; i<5; i++){
320 fAdmin[i] = new TObjArray();
321 fAdmin[i]->AddAt(other.fAdmin[i]->At(i),i);
324 TIter iter((other.fDetectorMap).GetTable());
327 while ((aPair = (TPair*) iter.Next())) {
328 AliShuttleDetConfigHolder *holder =(AliShuttleDetConfigHolder *)aPair->Value();
329 TKey *key = (TKey*)aPair->Key();
330 fDetectorMap.Add(key,holder);
335 //_____________________________________________________________________________________________
336 AliShuttleConfig& AliShuttleConfig::operator=(const AliShuttleConfig &other)
339 //assignment operator
341 this->fConfigHost=other.fConfigHost;
342 this->fDAQlbHost=other.fDAQlbHost;
343 this->fDAQlbPort=other.fDAQlbPort;
344 this->fDAQlbUser=other.fDAQlbUser;
345 this->fDAQlbPass=other.fDAQlbPass;
346 this->fDAQlbDB=other.fDAQlbDB;
347 this->fDAQlbTable=other.fDAQlbTable;
348 this->fShuttlelbTable=other.fShuttlelbTable;
349 this->fRunTypelbTable=other.fRunTypelbTable;
350 this->fPasswdFilePath=other.fPasswdFilePath;
351 this->fMaxRetries=other.fMaxRetries;
352 this->fPPTimeOut=other.fPPTimeOut;
353 this->fDCSTimeOut=other.fDCSTimeOut;
354 this->fDCSRetries=other.fDCSRetries;
355 this->fPPMaxMem=other.fPPMaxMem;
356 this->fMonitorHost=other.fMonitorHost;
357 this->fMonitorTable=other.fMonitorTable;
358 this->fTriggerWait=other.fTriggerWait;
359 this->fRunMode=other.fRunMode;
360 this->fDetectorList=other.fDetectorList;
361 this->fShuttleInstanceHost=other.fShuttleInstanceHost;
362 this->fProcessedDetectors=other.fProcessedDetectors;
363 this->fKeepDCSMap=other.fKeepDCSMap;
364 this->fKeepTempFolder=other.fKeepTempFolder;
365 this->fSendMail=other.fSendMail;
366 this->fProcessAll=other.fProcessAll;
367 this->fIsValid=other.fIsValid;
368 for (Int_t i = 0; i<3; i++){
369 this->fFXSHost[i]=other.fFXSHost[i];
370 this->fFXSPort[i]=other.fFXSPort[i];
371 this->fFXSUser[i]=other.fFXSUser[i];
372 this->fFXSPass[i]=other.fFXSPass[i];
373 this->fFXSBaseFolder[i]=other.fFXSBaseFolder[i];
374 this->fFXSdbHost[i]=other.fFXSdbHost[i];
375 this->fFXSdbPort[i]=other.fFXSdbPort[i];
376 this->fFXSdbUser[i]=other.fFXSdbUser[i];
377 this->fFXSdbPass[i]=other.fFXSdbPass[i];
378 this->fFXSdbName[i]=other.fFXSdbName[i];
379 this->fFXSdbTable[i]=other.fFXSdbTable[i];
381 for (Int_t i = 0; i<5; i++){
382 this->fAdmin[i] = new TObjArray();
383 this->fAdmin[i]->AddAt(other.fAdmin[i]->At(i),i);
386 TIter iter((other.fDetectorMap).GetTable());
389 while ((aPair = (TPair*) iter.Next())) {
390 AliShuttleDetConfigHolder *holder =(AliShuttleDetConfigHolder *)aPair->Value();
391 TKey *key = (TKey*)aPair->Key();
392 this->fDetectorMap.Add(key,holder);
396 //______________________________________________________________________________________________
397 void AliShuttleConfig::AliShuttleDCSConfigHolder::ExpandAndAdd(TObjArray* target, const char* entry)
400 // adds <entry> to <target> applying expanding of the name
401 // [N..M] creates M-N+1 names with the corresponding digits
404 TString entryStr(entry);
406 Int_t begin = entryStr.Index("[");
407 Int_t end = entryStr.Index("]");
408 if (begin != -1 && end != -1 && end > begin)
410 TString before(entryStr(0, begin));
411 TString after(entryStr(end+1, entryStr.Length()));
413 AliDebug(2, Form("Found [] pattern. Splitted input string %s %s", before.Data(), after.Data()));
415 Int_t dotdot = entryStr.Index("..");
417 TString nStr(entryStr(begin+1, dotdot-begin-1));
418 TString mStr(entryStr(dotdot+2, end-dotdot-2));
420 AliDebug(2, Form("Found [N..M] pattern. %s %s", nStr.Data(), mStr.Data()));
422 if (nStr.IsDigit() && mStr.IsDigit())
424 Int_t n = nStr.Atoi();
425 Int_t m = mStr.Atoi();
427 Int_t nDigits = nStr.Length();
429 formatStr.Form("%%s%%0%dd%%s", nDigits);
431 AliDebug(2, Form("Format string is %s", formatStr.Data()));
433 for (Int_t current = n; current<=m; ++current)
436 newEntry.Form(formatStr.Data(), before.Data(), current, after.Data());
438 AliDebug(2, Form("Calling recursive with %s", newEntry.Data()));
441 ExpandAndAdd(target, newEntry);
444 // return here because we processed the entries already recursively.
449 AliDebug(2, Form("Adding name %s", entry));
450 target->AddLast(new TObjString(entry));
453 //______________________________________________________________________________________________
454 AliShuttleConfig::AliShuttleDCSConfigHolder::~AliShuttleDCSConfigHolder()
456 // destructor of the shuttle configuration holder
459 delete fDCSDataPoints;
460 delete fDCSAliasesComp;
461 delete fDCSDataPointsComp;
464 //______________________________________________________________________________________________
465 AliShuttleConfig::AliShuttleDetConfigHolder::AliShuttleDetConfigHolder(const TLDAPEntry* entry):
470 fSkipDCSQuery(kFALSE),
471 fStrictRunOrder(kFALSE)
473 // constructor of the shuttle configuration holder
475 TLDAPAttribute* anAttribute;
477 fResponsibles = new TObjArray();
478 fResponsibles->SetOwner(1);
479 fDCSConfig = new TObjArray();
480 fDCSConfig->SetOwner(1);
482 anAttribute = entry->GetAttribute("det"); // MUST
485 AliError(Form("No \"det\" attribute!"));
488 fDetector = anAttribute->GetValue();
490 anAttribute = entry->GetAttribute("strictRunOrder"); // MAY
493 AliWarning(Form("%s did not set strictRunOrder flag - the default is FALSE",
496 TString strictRunStr = anAttribute->GetValue();
497 if (!(strictRunStr == "0" || strictRunStr == "1"))
499 AliError("strictRunOrder flag must be 0 or 1!");
502 fStrictRunOrder = (Bool_t) strictRunStr.Atoi();
505 anAttribute = entry->GetAttribute("responsible"); // MAY
508 AliDebug(2, "Warning! No \"responsible\" attribute!");
512 const char* aResponsible;
513 while ((aResponsible = anAttribute->GetValue()))
515 fResponsibles->AddLast(new TObjString(aResponsible));
522 //______________________________________________________________________________________________
523 AliShuttleConfig::AliShuttleDetConfigHolder::~AliShuttleDetConfigHolder()
525 // destructor of the shuttle configuration holder
527 delete fResponsibles;
531 //______________________________________________________________________________________________
532 const char* AliShuttleConfig::AliShuttleDetConfigHolder::GetDCSHost(Int_t iServ) const
535 // returns DCS server host
538 if (iServ < 0 || iServ >= GetNServers()) return 0;
540 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
541 (fDCSConfig->At(iServ));
543 return aHolder->GetDCSHost();
546 //______________________________________________________________________________________________
547 Int_t AliShuttleConfig::AliShuttleDetConfigHolder::GetDCSPort(Int_t iServ) const
550 // returns DCS server port
553 if (iServ < 0 || iServ >= GetNServers()) return 0;
555 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
556 (fDCSConfig->At(iServ));
558 return aHolder->GetDCSPort();
561 //______________________________________________________________________________________________
562 Int_t AliShuttleConfig::AliShuttleDetConfigHolder::GetMultiSplit(Int_t iServ) const
565 // returns DCS "multi split" value
568 if (iServ < 0 || iServ >= GetNServers()) return 0;
570 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
571 (fDCSConfig->At(iServ));
573 return aHolder->GetMultiSplit();
576 //______________________________________________________________________________________________
577 const TObjArray* AliShuttleConfig::AliShuttleDetConfigHolder::GetDCSAliases(Int_t iServ) const
580 // returns collection of TObjString which represents the set of aliases
581 // which used for data retrieval for particular detector
584 if (iServ < 0 || iServ >= GetNServers()) return 0;
586 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
587 (fDCSConfig->At(iServ));
589 return aHolder->GetDCSAliases();
592 //______________________________________________________________________________________________
593 const TObjArray* AliShuttleConfig::AliShuttleDetConfigHolder::GetDCSDataPoints(Int_t iServ) const
596 // returns collection of TObjString which represents the set of aliases
597 // which used for data retrieval for particular detector
600 if (iServ < 0 || iServ >= GetNServers()) return 0;
602 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
603 (fDCSConfig->At(iServ));
605 return aHolder->GetDCSDataPoints();
608 //______________________________________________________________________________________________
609 const TObjArray* AliShuttleConfig::AliShuttleDetConfigHolder::GetCompactDCSAliases(Int_t iServ) const
612 // returns collection of TObjString which represents the set of aliases
613 // which used for data retrieval for particular detector (Compact style)
616 if (iServ < 0 || iServ >= GetNServers()) return 0;
618 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
619 (fDCSConfig->At(iServ));
621 return aHolder->GetCompactDCSAliases();
624 //______________________________________________________________________________________________
625 const TObjArray* AliShuttleConfig::AliShuttleDetConfigHolder::GetCompactDCSDataPoints(Int_t iServ) const
628 // returns collection of TObjString which represents the set of aliases
629 // which used for data retrieval for particular detector (Compact style)
632 if (iServ < 0 || iServ >= GetNServers()) return 0;
634 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
635 (fDCSConfig->At(iServ));
637 return aHolder->GetCompactDCSDataPoints();
640 //______________________________________________________________________________________________
641 void AliShuttleConfig::AliShuttleDetConfigHolder::AddDCSConfig(AliShuttleDCSConfigHolder* holder)
644 // adds a DCS configuration set in the array of DCS configurations
648 fDCSConfig->AddLast(holder);
651 ClassImp(AliShuttleConfig)
653 //______________________________________________________________________________________________
654 AliShuttleConfig::AliShuttleConfig(const char* host, Int_t port,
655 const char* binddn, const char* password, const char* basedn):
679 fShuttleInstanceHost(""),
680 fProcessedDetectors(),
682 fKeepTempFolder(kFALSE),
689 // host: ldap server host
690 // port: ldap server port
691 // binddn: binddn used for ldap binding (simple bind is used!).
692 // password: password for binddn
693 // basedn: this is basedn whose childeren entries which have
696 fDetectorMap.SetOwner(1);
697 fDetectorList.SetOwner(0); //fDetectorList and fDetectorMap share the same object!
698 fProcessedDetectors.SetOwner();
700 for (int i=0; i<5; i++)
702 fAdmin[i] = new TObjArray();
703 fAdmin[i]->SetOwner();
706 TLDAPServer aServer(host, port, binddn, password, 3);
708 if (!aServer.IsConnected()) {
709 AliError(Form("Can't connect to ldap server %s:%d",
714 // reads configuration for the shuttle running on this machine
716 TLDAPResult* aResult = 0;
717 TLDAPEntry* anEntry = 0;
724 globalList.SetOwner(1);
728 hostList.SetOwner(1);
730 aResult = aServer.Search(basedn, LDAP_SCOPE_SUBTREE, 0, 0);
734 AliError(Form("Can't find configuration with base DN: %s !", basedn));
738 while ((anEntry = aResult->GetNext()))
740 TString dn = anEntry->GetDn();
742 if (dn.BeginsWith("dcsHost="))
744 dcsList.Add(anEntry);
746 else if (dn.BeginsWith("det="))
748 detList.Add(anEntry);
750 else if (dn.BeginsWith("name=globalConfig"))
752 globalList.Add(anEntry);
754 else if (dn.BeginsWith("system="))
756 sysList.Add(anEntry);
758 else if (dn.BeginsWith("shuttleHost="))
760 hostList.Add(anEntry);
772 result += SetGlobalConfig(&globalList);
773 result += SetSysConfig(&sysList);
774 result += SetPasswords();
775 result += SetDetConfig(&detList,&dcsList);
776 result += SetHostConfig(&hostList);
780 AliError("Configuration is INVALID!");
788 //______________________________________________________________________________________________
789 AliShuttleConfig::~AliShuttleConfig()
793 fDetectorMap.DeleteAll();
794 fDetectorList.Clear();
795 fProcessedDetectors.Delete();
798 //______________________________________________________________________________________________
799 const TObjArray* AliShuttleConfig::GetDetectors() const
802 // returns collection of TObjString which contains the name
803 // of every detector which is in the configuration.
806 return &fDetectorList;
809 //______________________________________________________________________________________________
810 Bool_t AliShuttleConfig::HasDetector(const char* detector) const
813 // checks for paricular detector in the configuration.
815 return fDetectorMap.GetValue(detector) != NULL;
818 //______________________________________________________________________________________________
819 Int_t AliShuttleConfig::GetNServers(const char* detector) const
822 // returns number of DCS servers for detector
825 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
827 AliError(Form("There isn't configuration for detector: %s",
832 return aHolder->GetNServers();
836 //______________________________________________________________________________________________
837 const char* AliShuttleConfig::GetDCSHost(const char* detector, Int_t iServ) const
840 // returns i-th DCS server host used by particular detector
843 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
845 AliError(Form("There isn't configuration for detector: %s",
850 return aHolder->GetDCSHost(iServ);
853 //______________________________________________________________________________________________
854 Int_t AliShuttleConfig::GetDCSPort(const char* detector, Int_t iServ) const
857 // returns i-th DCS server port used by particular detector
861 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
863 AliError(Form("There isn't configuration for detector: %s",
868 return aHolder->GetDCSPort(iServ);
871 //______________________________________________________________________________________________
872 Int_t AliShuttleConfig::GetMultiSplit(const char* detector, Int_t iServ) const
875 // returns i-th DCS "multi split" value
879 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
881 AliError(Form("There isn't configuration for detector: %s",
886 return aHolder->GetMultiSplit(iServ);
889 //______________________________________________________________________________________________
890 const TObjArray* AliShuttleConfig::GetDCSAliases(const char* detector, Int_t iServ) const
893 // returns collection of TObjString which represents the i-th set of aliases
894 // which used for data retrieval for particular detector
897 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
899 AliError(Form("There isn't configuration for detector: %s",
904 return aHolder->GetDCSAliases(iServ);
907 //______________________________________________________________________________________________
908 const TObjArray* AliShuttleConfig::GetDCSDataPoints(const char* detector, Int_t iServ) const
911 // returns collection of TObjString which represents the set of aliases
912 // which used for data retrieval for particular detector
915 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
917 AliError(Form("There isn't configuration for detector: %s",
922 return aHolder->GetDCSDataPoints(iServ);
925 //______________________________________________________________________________________________
926 const TObjArray* AliShuttleConfig::GetCompactDCSAliases(const char* detector, Int_t iServ) const
929 // returns collection of TObjString which represents the i-th set of aliases
930 // which used for data retrieval for particular detector (Compact style)
933 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
935 AliError(Form("There isn't configuration for detector: %s",
940 return aHolder->GetCompactDCSAliases(iServ);
943 //______________________________________________________________________________________________
944 const TObjArray* AliShuttleConfig::GetCompactDCSDataPoints(const char* detector, Int_t iServ) const
947 // returns collection of TObjString which represents the set of aliases
948 // which used for data retrieval for particular detector (Compact style)
951 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
953 AliError(Form("There isn't configuration for detector: %s",
958 return aHolder->GetCompactDCSDataPoints(iServ);
961 //______________________________________________________________________________________________
962 const TObjArray* AliShuttleConfig::GetResponsibles(const char* detector) const
965 // returns collection of TObjString which represents the list of mail addresses
966 // of the detector's responsible(s)
969 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
971 AliError(Form("There isn't configuration for detector: %s",
976 return aHolder->GetResponsibles();
979 //______________________________________________________________________________________________
980 const TObjArray* AliShuttleConfig::GetAdmins(Int_t sys) const
983 // returns collection of TObjString which represents the list of mail addresses
984 // of the system's administrator(s) (DAQ, DCS, HLT, Global, Amanda)
987 if (sys < 0 || sys > 4) return 0;
991 //______________________________________________________________________________________________
992 Bool_t AliShuttleConfig::HostProcessDetector(const char* detector) const
994 // return TRUE if detector is handled by host or if fProcessAll is TRUE
996 if(fProcessAll) return kTRUE;
997 TIter iter(&fProcessedDetectors);
999 while((detName = (TObjString*) iter.Next())){
1000 if(detName->String() == detector) return kTRUE;
1005 //______________________________________________________________________________________________
1006 Bool_t AliShuttleConfig::StrictRunOrder(const char* detector) const
1008 // return TRUE if detector wants strict run ordering of stored data
1010 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
1013 AliError(Form("There isn't configuration for detector: %s",
1018 return aHolder->StrictRunOrder();
1021 //______________________________________________________________________________________________
1022 UInt_t AliShuttleConfig::SetGlobalConfig(TList* list)
1024 // Set the global configuration (DAQ Logbook + preprocessor monitoring settings)
1027 TLDAPEntry* anEntry = 0;
1028 TLDAPAttribute* anAttribute = 0;
1030 if (list->GetEntries() == 0)
1032 AliError("Global configuration not found!");
1035 else if (list->GetEntries() > 1)
1037 AliError("More than one global configuration found!");
1041 anEntry = dynamic_cast<TLDAPEntry*> (list->At(0));
1045 AliError("Unexpected! Global list does not contain a TLDAPEntry");
1050 anAttribute = anEntry->GetAttribute("AlienPath");
1052 AliError("Can't find AlienPath attribute!");
1055 fAlienPath = anAttribute->GetValue();
1057 anAttribute = anEntry->GetAttribute("daqLbHost");
1059 AliError("Can't find daqLbHost attribute!");
1062 fDAQlbHost = anAttribute->GetValue();
1064 anAttribute = anEntry->GetAttribute("daqLbPort"); // MAY
1067 fDAQlbPort = ((TString) anAttribute->GetValue()).Atoi();
1069 fDAQlbPort = 3306; // mysql
1072 anAttribute = anEntry->GetAttribute("daqLbUser");
1074 AliError("Can't find daqLbUser attribute!");
1077 fDAQlbUser = anAttribute->GetValue();
1079 anAttribute = anEntry->GetAttribute("daqLbDB");
1081 AliError("Can't find daqLbDB attribute!");
1084 fDAQlbDB = anAttribute->GetValue();
1086 anAttribute = anEntry->GetAttribute("daqLbTable");
1088 AliError("Can't find daqLbTable attribute!");
1091 fDAQlbTable = anAttribute->GetValue();
1093 anAttribute = anEntry->GetAttribute("shuttleLbTable");
1095 AliError("Can't find shuttleLbTable attribute!");
1098 fShuttlelbTable = anAttribute->GetValue();
1100 anAttribute = anEntry->GetAttribute("runTypeLbTable");
1102 AliError("Can't find runTypeLbTable attribute!");
1105 fRunTypelbTable = anAttribute->GetValue();
1107 anAttribute = anEntry->GetAttribute("ppmaxRetries");
1109 AliError("Can't find ppmaxRetries attribute!");
1112 TString tmpStr = anAttribute->GetValue();
1113 fMaxRetries = tmpStr.Atoi();
1115 anAttribute = anEntry->GetAttribute("ppTimeOut");
1117 AliError("Can't find ppTimeOut attribute!");
1120 tmpStr = anAttribute->GetValue();
1121 fPPTimeOut = tmpStr.Atoi();
1123 anAttribute = anEntry->GetAttribute("dcsTimeOut");
1125 AliError("Can't find dcsTimeOut attribute!");
1128 tmpStr = anAttribute->GetValue();
1129 fDCSTimeOut = tmpStr.Atoi();
1131 anAttribute = anEntry->GetAttribute("nDCSretries");
1133 AliError("Can't find dcsTimeOut attribute!");
1136 tmpStr = anAttribute->GetValue();
1137 fDCSRetries = tmpStr.Atoi();
1139 anAttribute = anEntry->GetAttribute("ppMaxMem");
1141 AliError("Can't find ppMaxMem attribute!");
1144 tmpStr = anAttribute->GetValue();
1145 fPPMaxMem = tmpStr.Atoi();
1147 anAttribute = anEntry->GetAttribute("monitorHost");
1149 AliError("Can't find monitorHost attribute!");
1152 fMonitorHost = anAttribute->GetValue();
1154 anAttribute = anEntry->GetAttribute("monitorTable");
1156 AliError("Can't find monitorTable attribute!");
1159 fMonitorTable = anAttribute->GetValue();
1161 anAttribute = anEntry->GetAttribute("triggerWait"); // MAY
1163 AliWarning(Form("triggerWait not set! default = ", fTriggerWait));
1165 tmpStr = anAttribute->GetValue();
1166 fTriggerWait = tmpStr.Atoi();
1168 anAttribute = anEntry->GetAttribute("mode");
1170 AliWarning("Run mode not set! Running in test mode.");
1172 tmpStr = anAttribute->GetValue();
1173 if (tmpStr == "test")
1176 } else if (tmpStr == "prod") {
1179 AliWarning(Form("Not a valid run mode: %s", tmpStr.Data()));
1180 AliWarning("Valid run modes are \"test\" and \"prod\". Running in test mode.");
1184 anAttribute = anEntry->GetAttribute("keepDCSMap"); // MAY
1187 AliWarning("keepDCSMap flag not set - default is FALSE");
1189 TString keepDCSMapStr = anAttribute->GetValue();
1190 if (!(keepDCSMapStr == "0" || keepDCSMapStr == "1"))
1192 AliError("keepDCSMap flag must be 0 or 1!");
1195 fKeepDCSMap = (Bool_t) keepDCSMapStr.Atoi();
1198 anAttribute = anEntry->GetAttribute("keepTempFolder"); // MAY
1201 AliWarning("keepTempFolder flag not set - default is FALSE");
1203 TString keepTempFolderStr = anAttribute->GetValue();
1204 if (!(keepTempFolderStr == "0" || keepTempFolderStr == "1"))
1206 AliError("keepTempFolder flag must be 0 or 1!");
1209 fKeepTempFolder = (Bool_t) keepTempFolderStr.Atoi();
1213 anAttribute = anEntry->GetAttribute("shuttleAdmin"); // MAY
1216 AliDebug(2, "Warning! No \"shuttleAdmin\" attribute!");
1220 const char* anAdmin;
1221 while ((anAdmin = anAttribute->GetValue()))
1223 fAdmin[kGlobal]->AddLast(new TObjString(anAdmin));
1227 anAttribute = anEntry->GetAttribute("amandaAdmin"); // MAY
1230 AliDebug(2, "Warning! No \"amandaAdmin\" attribute!");
1234 const char* anAdmin;
1235 while ((anAdmin = anAttribute->GetValue()))
1237 fAdmin[kAmanda]->AddLast(new TObjString(anAdmin));
1241 anAttribute = anEntry->GetAttribute("sendMail"); // MAY
1244 AliWarning("sendMail flag not set - default is FALSE");
1246 TString sendMailStr = anAttribute->GetValue();
1247 if (!(sendMailStr == "0" || sendMailStr == "1"))
1249 AliError("sendMail flag must be 0 or 1!");
1252 fSendMail = (Bool_t) sendMailStr.Atoi();
1255 anAttribute = anEntry->GetAttribute("passwdFilePath");
1257 AliError("Can't find Passwords File Path attribute!");
1260 fPasswdFilePath = anAttribute->GetValue();
1265 //______________________________________________________________________________________________
1266 UInt_t AliShuttleConfig::SetSysConfig(TList* list)
1268 // Set the online FXS configuration (DAQ + DCS + HLT)
1271 TLDAPEntry* anEntry = 0;
1272 TLDAPAttribute* anAttribute = 0;
1274 if (list->GetEntries() != 3)
1276 AliError(Form("Wrong number of online systems found: %d !", list->GetEntries()));
1282 SystemCode iSys=kDAQ;
1284 while ((anEntry = dynamic_cast<TLDAPEntry*> (iter.Next())))
1286 anAttribute = anEntry->GetAttribute("system");
1287 TString sysName = anAttribute->GetValue();
1289 if (sysName == "DAQ")
1294 else if (sysName == "DCS")
1299 else if (sysName == "HLT")
1305 anAttribute = anEntry->GetAttribute("dbHost");
1307 AliError(Form ("Can't find dbHost attribute for %s!!",
1308 AliShuttleInterface::GetSystemName(iSys)));
1311 fFXSdbHost[iSys] = anAttribute->GetValue();
1313 anAttribute = anEntry->GetAttribute("dbPort"); // MAY
1316 fFXSdbPort[iSys] = ((TString) anAttribute->GetValue()).Atoi();
1318 fFXSdbPort[iSys] = 3306; // mysql
1321 anAttribute = anEntry->GetAttribute("dbUser");
1323 AliError(Form ("Can't find dbUser attribute for %s!!",
1324 AliShuttleInterface::GetSystemName(iSys)));
1327 fFXSdbUser[iSys] = anAttribute->GetValue();
1329 anAttribute = anEntry->GetAttribute("dbName");
1331 AliError(Form ("Can't find dbName attribute for %s!!",
1332 AliShuttleInterface::GetSystemName(iSys)));
1336 fFXSdbName[iSys] = anAttribute->GetValue();
1337 anAttribute = anEntry->GetAttribute("dbTable");
1339 AliError(Form ("Can't find dbTable attribute for %s!!",
1340 AliShuttleInterface::GetSystemName(iSys)));
1343 fFXSdbTable[iSys] = anAttribute->GetValue();
1345 anAttribute = anEntry->GetAttribute("fxsHost");
1347 AliError(Form ("Can't find fxsHost attribute for %s!!",
1348 AliShuttleInterface::GetSystemName(iSys)));
1351 fFXSHost[iSys] = anAttribute->GetValue();
1353 anAttribute = anEntry->GetAttribute("fxsPort"); // MAY
1356 fFXSPort[iSys] = ((TString) anAttribute->GetValue()).Atoi();
1358 fFXSPort[iSys] = 22; // scp port number
1361 anAttribute = anEntry->GetAttribute("fxsUser");
1363 AliError(Form ("Can't find fxsUser attribute for %s!!",
1364 AliShuttleInterface::GetSystemName(iSys)));
1367 fFXSUser[iSys] = anAttribute->GetValue();
1369 anAttribute = anEntry->GetAttribute("fxsPasswd");
1370 if (anAttribute) fFXSPass[iSys] = anAttribute->GetValue();
1372 anAttribute = anEntry->GetAttribute("fxsBaseFolder");
1373 if (anAttribute) fFXSBaseFolder[iSys] = anAttribute->GetValue();
1375 anAttribute = anEntry->GetAttribute("fxsAdmin"); // MAY
1378 AliDebug(2, "Warning! No \"fxsAdmin\" attribute!");
1382 const char* anAdmin;
1383 while ((anAdmin = anAttribute->GetValue()))
1385 fAdmin[iSys]->AddLast(new TObjString(anAdmin));
1392 AliError(Form("Wrong system configuration! (code = %d)", count));
1399 //______________________________________________________________________________________________
1400 UInt_t AliShuttleConfig::SetPasswords(){
1402 AliInfo("Setting Passwords");
1404 // Retrieving Passwords for DAQ lb, DAQ/DCS/HLT FXS
1406 ifstream *inputfile = new ifstream(fPasswdFilePath.Data());
1408 AliError(Form("Error opening file %s !", fPasswdFilePath.Data()));
1417 while (line.ReadLine(*inputfile)) {
1418 TObjArray *tokens = line.Tokenize(" \t");
1419 TString system = ((TObjString *)tokens->At(0))->String();
1420 TString password = ((TObjString *)tokens->At(1))->String();
1421 if (system.Contains("DAQ_LB")){
1422 fDAQlbPass=password;
1424 AliDebug(3,Form("DAQ_LB: Password %s for %s found", password.Data(), system.Data()));
1426 else if (system.Contains("DAQ_DB")){
1427 fFXSdbPass[0]=password;
1429 AliDebug(3,Form("DAQ_DB: Password %s for %s found", password.Data(), system.Data()));
1431 else if (system.Contains("DCS_DB")){
1432 fFXSdbPass[1]=password;
1434 AliDebug(3,Form("DCS_DB: Password %s for %s found", password.Data(), system.Data()));
1436 else if (system.Contains("HLT_DB")){
1437 fFXSdbPass[2]=password;
1439 AliDebug(3,Form("HLT_DB: Password %s for %s found", password.Data(), system.Data()));
1443 AliDebug(3,Form("%i fake line(s) found in file %s", nPwdFake, fPasswdFilePath.Data()));
1453 AliError(Form("Wrong file for DAQ Logbook password found %s (some passwors missing), please Check!", fPasswdFilePath.Data()));
1460 //______________________________________________________________________________________________
1461 UInt_t AliShuttleConfig::SetDetConfig(TList* detList, TList* dcsList)
1463 // Set the detector configuration (general settings + DCS amanda server and alias/DP lists)
1465 TLDAPEntry* anEntry = 0;
1467 TIter iter(detList);
1468 while ((anEntry = dynamic_cast<TLDAPEntry*> (iter.Next())))
1471 AliShuttleDetConfigHolder* detHolder = new AliShuttleDetConfigHolder(anEntry);
1473 if (!detHolder->IsValid()) {
1474 AliError("Detector configuration error!");
1479 TObjString* detStr = new TObjString(detHolder->GetDetector());
1481 // Look for DCS Configuration
1482 TIter dcsIter(dcsList);
1483 TLDAPEntry *dcsEntry = 0;
1484 while ((dcsEntry = dynamic_cast<TLDAPEntry*> (dcsIter.Next())))
1486 TString dn = dcsEntry->GetDn();
1487 if(dn.Contains(detStr->GetName())) {
1488 AliDebug(2, Form("Found DCS configuration: dn = %s",dn.Data()));
1489 AliShuttleDCSConfigHolder* dcsHolder = new AliShuttleDCSConfigHolder(dcsEntry);
1490 if (!dcsHolder->IsValid()) {
1491 AliError("DCS configuration error!");
1496 detHolder->AddDCSConfig(dcsHolder);
1501 fDetectorMap.Add(detStr, detHolder);
1502 fDetectorList.AddLast(detStr);
1508 //______________________________________________________________________________________________
1509 UInt_t AliShuttleConfig::SetHostConfig(TList* list)
1511 // Set the Shuttle machines configuration (which detectors processes each machine)
1513 TLDAPEntry* anEntry = 0;
1514 TLDAPAttribute* anAttribute = 0;
1516 fShuttleInstanceHost = gSystem->HostName();
1519 while ((anEntry = dynamic_cast<TLDAPEntry*> (iter.Next())))
1522 TString dn(anEntry->GetDn());
1523 if (!dn.Contains(Form("shuttleHost=%s", fShuttleInstanceHost.Data()))) continue;
1527 anAttribute = anEntry->GetAttribute("detectors");
1528 const char *detName;
1529 while((detName = anAttribute->GetValue())){
1530 TObjString *objDet= new TObjString(detName);
1531 fProcessedDetectors.Add(objDet);
1540 //______________________________________________________________________________________________
1541 void AliShuttleConfig::Print(Option_t* option) const
1543 // print configuration
1544 // options : "": print configuration for all detectors, aliases and DPs in compacted format
1545 // "uncompact": print configuration for all detectors, aliases and DPs in uncompacted format
1546 // "DET": print configuration for DET, aliases and DPs in compacted format
1547 // "DET, uncompact": print configuration for DET, aliases and DPs in uncompacted format
1552 TString mode = "test";
1553 if (fRunMode == kProd) mode = "production";
1555 result += "########################################################################\n";
1556 result += Form(" Shuttle configuration from %s - Run Mode: <%s> \n",
1557 fConfigHost.Data(), mode.Data());
1558 result += "########################################################################\n";
1559 result += Form("\nShuttle running on %s \n", fShuttleInstanceHost.Data());
1562 result += Form("All detectors will be processed! \n");
1564 result += "Detectors processed by this host: ";
1565 TIter it(&fProcessedDetectors);
1567 while ((aDet = (TObjString*) it.Next())) {
1568 result += Form("%s ", aDet->String().Data());
1573 result += Form("PP time out = %d - DCS time out = %d - max PP mem size = %d KB - max retries = %d "
1574 "- DIM trigger waiting timeout = %d\n",
1575 fPPTimeOut, fDCSTimeOut, fPPMaxMem, fMaxRetries, fTriggerWait);
1576 result += Form("FLAGS: keepDCSMap = %d - keepTempFolder = %d - SendMail = %d \n",
1577 fKeepDCSMap, fKeepTempFolder, fSendMail);
1578 const TObjArray* shuttleAdmins = GetAdmins(kGlobal);
1579 if (shuttleAdmins->GetEntries() != 0)
1581 result += "SHUTTLE administrator(s): ";
1582 TIter it(shuttleAdmins);
1583 TObjString* anAdmin;
1584 while ((anAdmin = (TObjString*) it.Next()))
1586 result += Form("%s ", anAdmin->String().Data());
1590 const TObjArray* amandaAdmins = GetAdmins(kAmanda);
1591 if (amandaAdmins->GetEntries() != 0)
1593 result += "Amanda server administrator(s): ";
1594 TIter it(amandaAdmins);
1595 TObjString* anAdmin;
1596 while ((anAdmin = (TObjString*) it.Next()))
1598 result += Form("%s ", anAdmin->String().Data());
1602 result += "------------------------------------------------------\n";
1604 result += Form("Logbook Configuration \n\n \tHost: %s:%d; \tUser: %s; ",
1605 fDAQlbHost.Data(), fDAQlbPort, fDAQlbUser.Data());
1607 // result += "Password: ";
1608 // result.Append('*', fDAQlbPass.Length());
1609 result += Form("\tDB: %s; \tTables: %s, %s, %s\n",
1610 fDAQlbDB.Data(), fDAQlbTable.Data(), fShuttlelbTable.Data(), fRunTypelbTable.Data());
1614 result += "------------------------------------------------------\n";
1615 result += "FXS configuration\n\n";
1617 for(int iSys=0;iSys<3;iSys++){
1618 result += Form("*** %s ***\n", AliShuttleInterface::GetSystemName(iSys));
1619 result += Form("\tDB host: %s:%d; \tUser: %s; \tName: %s; \tTable: %s\n",
1620 fFXSdbHost[iSys].Data(), fFXSdbPort[iSys], fFXSdbUser[iSys].Data(),
1621 fFXSdbName[iSys].Data(), fFXSdbTable[iSys].Data());
1622 // result += Form("DB Password:",fFXSdbPass[iSys].Data());
1623 result += Form("\tFXS host: %s:%d; \tUser: %s\n", fFXSHost[iSys].Data(), fFXSPort[iSys],
1624 fFXSUser[iSys].Data());
1625 // result += Form("FXS Password:",fFXSPass[iSys].Data());
1626 const TObjArray* fxsAdmins = GetAdmins(iSys);
1627 if (fxsAdmins->GetEntries() != 0)
1629 result += "\tAdministrator(s): ";
1630 TIter it(fxsAdmins);
1631 TObjString* anAdmin;
1632 while ((anAdmin = (TObjString*) it.Next()))
1634 result += Form("%s ", anAdmin->String().Data());
1640 result += "------------------------------------------------------\n";
1641 result += "MonaLisa configuration\n\n";
1643 result += Form("\tHost: %s; \tTable name: %s",
1644 fMonitorHost.Data(), fMonitorTable.Data());
1648 TString optStr(option);
1650 result += "------------------------------------------------------\n";
1651 result += "Detector-specific configuration\n\n";
1653 TIter iter(fDetectorMap.GetTable());
1656 while ((aPair = (TPair*) iter.Next())) {
1657 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) aPair->Value();
1658 if (optStr != "" && !optStr.Contains(aHolder->GetDetector()) &&
1659 optStr.CompareTo("uncompact",TString::kIgnoreCase) != 0 )
1662 result += Form("*** %s *** \n", aHolder->GetDetector());
1664 const TObjArray* responsibles = aHolder->GetResponsibles();
1665 if (responsibles->GetEntries() != 0)
1667 result += "\tDetector responsible(s): ";
1668 TIter it(responsibles);
1669 TObjString* aResponsible;
1670 while ((aResponsible = (TObjString*) it.Next()))
1672 result += Form("%s ", aResponsible->String().Data());
1677 result += Form("\tStrict run ordering: %s \n\n", aHolder->StrictRunOrder() ? "YES" : "NO");
1679 const TObjArray* dcsConfig = aHolder->GetDCSConfig();
1681 AliShuttleDCSConfigHolder* dcsHolder = 0;
1682 TIter dcsIter(dcsConfig);
1684 while ((dcsHolder = dynamic_cast<AliShuttleDCSConfigHolder*> (dcsIter.Next())))
1686 result += Form("\tAmanda server [%d]: %s:%d - MultiSplit = %d\n", count,
1687 dcsHolder->GetDCSHost(), dcsHolder->GetDCSPort(), dcsHolder->GetMultiSplit());
1689 const TObjArray* aliases = 0;
1690 if (optStr.Contains("uncompact",TString::kIgnoreCase))
1692 aliases = dcsHolder->GetDCSAliases();
1694 aliases = dcsHolder->GetCompactDCSAliases();
1697 if (aliases->GetEntries() != 0)
1699 result += Form("\tDCS Aliases [%d]: ", count);
1701 TObjString* anAlias;
1702 while ((anAlias = (TObjString*) it.Next()))
1704 result += Form("%s ", anAlias->String().Data());
1709 const TObjArray* dataPoints = 0;
1710 if (optStr.Contains("uncompact",TString::kIgnoreCase))
1712 dataPoints = dcsHolder->GetDCSDataPoints();
1714 dataPoints = dcsHolder->GetCompactDCSDataPoints();
1716 if (dataPoints->GetEntries() != 0)
1718 result += Form("\tDCS Data Points [%d]: ", count);
1719 TIter it(dataPoints);
1720 TObjString* aDataPoint;
1721 while ((aDataPoint = (TObjString*) it.Next())) {
1722 result += Form("%s ", aDataPoint->String().Data());
1730 if(!fIsValid) result += "\n\n********** !!!!! Configuration is INVALID !!!!! **********\n";