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 fDAQlbHost(other.fDAQlbHost),
275 fDAQlbPort(other.fDAQlbPort),
276 fDAQlbUser(other.fDAQlbUser),
277 fDAQlbPass(other.fDAQlbPass),
278 fDAQlbDB(other.fDAQlbDB),
279 fDAQlbTable(other.fDAQlbTable),
280 fShuttlelbTable(other.fShuttlelbTable),
281 fRunTypelbTable(other.fRunTypelbTable),
282 fPasswdFilePath(other.fPasswdFilePath),
283 fMaxRetries(other.fMaxRetries),
284 fPPTimeOut(other.fPPTimeOut),
285 fDCSTimeOut(other.fDCSTimeOut),
286 fDCSRetries(other.fDCSRetries),
287 fPPMaxMem(other.fPPMaxMem),
288 fMonitorHost(other.fMonitorHost),
289 fMonitorTable(other.fMonitorTable),
290 fTriggerWait(other.fTriggerWait),
291 fRunMode(other.fRunMode),
293 fDetectorList(other.fDetectorList),
294 fShuttleInstanceHost(other.fShuttleInstanceHost),
295 fProcessedDetectors(other.fProcessedDetectors),
296 fKeepDCSMap(other.fKeepDCSMap),
297 fKeepTempFolder(other.fKeepTempFolder),
298 fSendMail(other.fSendMail),
299 fProcessAll(other.fProcessAll),
300 fIsValid(other.fIsValid)
305 for (Int_t i = 0; i<3; i++){
306 fFXSHost[i]=other.fFXSHost[i];
307 fFXSPort[i]=other.fFXSPort[i];
308 fFXSUser[i]=other.fFXSUser[i];
309 fFXSPass[i]=other.fFXSPass[i];
310 fFXSBaseFolder[i]=other.fFXSBaseFolder[i];
311 fFXSdbHost[i]=other.fFXSdbHost[i];
312 fFXSdbPort[i]=other.fFXSdbPort[i];
313 fFXSdbUser[i]=other.fFXSdbUser[i];
314 fFXSdbPass[i]=other.fFXSdbPass[i];
315 fFXSdbName[i]=other.fFXSdbName[i];
316 fFXSdbTable[i]=other.fFXSdbTable[i];
318 for (Int_t i = 0; i<5; i++){
319 fAdmin[i] = new TObjArray();
320 fAdmin[i]->AddAt(other.fAdmin[i]->At(i),i);
323 TIter iter((other.fDetectorMap).GetTable());
326 while ((aPair = (TPair*) iter.Next())) {
327 AliShuttleDetConfigHolder *holder =(AliShuttleDetConfigHolder *)aPair->Value();
328 TKey *key = (TKey*)aPair->Key();
329 fDetectorMap.Add(key,holder);
334 //_____________________________________________________________________________________________
335 AliShuttleConfig& AliShuttleConfig::operator=(const AliShuttleConfig &other)
338 //assignment operator
340 this->fConfigHost=other.fConfigHost;
341 this->fDAQlbHost=other.fDAQlbHost;
342 this->fDAQlbPort=other.fDAQlbPort;
343 this->fDAQlbUser=other.fDAQlbUser;
344 this->fDAQlbPass=other.fDAQlbPass;
345 this->fDAQlbDB=other.fDAQlbDB;
346 this->fDAQlbTable=other.fDAQlbTable;
347 this->fShuttlelbTable=other.fShuttlelbTable;
348 this->fRunTypelbTable=other.fRunTypelbTable;
349 this->fPasswdFilePath=other.fPasswdFilePath;
350 this->fMaxRetries=other.fMaxRetries;
351 this->fPPTimeOut=other.fPPTimeOut;
352 this->fDCSTimeOut=other.fDCSTimeOut;
353 this->fDCSRetries=other.fDCSRetries;
354 this->fPPMaxMem=other.fPPMaxMem;
355 this->fMonitorHost=other.fMonitorHost;
356 this->fMonitorTable=other.fMonitorTable;
357 this->fTriggerWait=other.fTriggerWait;
358 this->fRunMode=other.fRunMode;
359 this->fDetectorList=other.fDetectorList;
360 this->fShuttleInstanceHost=other.fShuttleInstanceHost;
361 this->fProcessedDetectors=other.fProcessedDetectors;
362 this->fKeepDCSMap=other.fKeepDCSMap;
363 this->fKeepTempFolder=other.fKeepTempFolder;
364 this->fSendMail=other.fSendMail;
365 this->fProcessAll=other.fProcessAll;
366 this->fIsValid=other.fIsValid;
367 for (Int_t i = 0; i<3; i++){
368 this->fFXSHost[i]=other.fFXSHost[i];
369 this->fFXSPort[i]=other.fFXSPort[i];
370 this->fFXSUser[i]=other.fFXSUser[i];
371 this->fFXSPass[i]=other.fFXSPass[i];
372 this->fFXSBaseFolder[i]=other.fFXSBaseFolder[i];
373 this->fFXSdbHost[i]=other.fFXSdbHost[i];
374 this->fFXSdbPort[i]=other.fFXSdbPort[i];
375 this->fFXSdbUser[i]=other.fFXSdbUser[i];
376 this->fFXSdbPass[i]=other.fFXSdbPass[i];
377 this->fFXSdbName[i]=other.fFXSdbName[i];
378 this->fFXSdbTable[i]=other.fFXSdbTable[i];
380 for (Int_t i = 0; i<5; i++){
381 this->fAdmin[i] = new TObjArray();
382 this->fAdmin[i]->AddAt(other.fAdmin[i]->At(i),i);
385 TIter iter((other.fDetectorMap).GetTable());
388 while ((aPair = (TPair*) iter.Next())) {
389 AliShuttleDetConfigHolder *holder =(AliShuttleDetConfigHolder *)aPair->Value();
390 TKey *key = (TKey*)aPair->Key();
391 this->fDetectorMap.Add(key,holder);
395 //______________________________________________________________________________________________
396 void AliShuttleConfig::AliShuttleDCSConfigHolder::ExpandAndAdd(TObjArray* target, const char* entry)
399 // adds <entry> to <target> applying expanding of the name
400 // [N..M] creates M-N+1 names with the corresponding digits
403 TString entryStr(entry);
405 Int_t begin = entryStr.Index("[");
406 Int_t end = entryStr.Index("]");
407 if (begin != -1 && end != -1 && end > begin)
409 TString before(entryStr(0, begin));
410 TString after(entryStr(end+1, entryStr.Length()));
412 AliDebug(2, Form("Found [] pattern. Splitted input string %s %s", before.Data(), after.Data()));
414 Int_t dotdot = entryStr.Index("..");
416 TString nStr(entryStr(begin+1, dotdot-begin-1));
417 TString mStr(entryStr(dotdot+2, end-dotdot-2));
419 AliDebug(2, Form("Found [N..M] pattern. %s %s", nStr.Data(), mStr.Data()));
421 if (nStr.IsDigit() && mStr.IsDigit())
423 Int_t n = nStr.Atoi();
424 Int_t m = mStr.Atoi();
426 Int_t nDigits = nStr.Length();
428 formatStr.Form("%%s%%0%dd%%s", nDigits);
430 AliDebug(2, Form("Format string is %s", formatStr.Data()));
432 for (Int_t current = n; current<=m; ++current)
435 newEntry.Form(formatStr.Data(), before.Data(), current, after.Data());
437 AliDebug(2, Form("Calling recursive with %s", newEntry.Data()));
440 ExpandAndAdd(target, newEntry);
443 // return here because we processed the entries already recursively.
448 AliDebug(2, Form("Adding name %s", entry));
449 target->AddLast(new TObjString(entry));
452 //______________________________________________________________________________________________
453 AliShuttleConfig::AliShuttleDCSConfigHolder::~AliShuttleDCSConfigHolder()
455 // destructor of the shuttle configuration holder
458 delete fDCSDataPoints;
459 delete fDCSAliasesComp;
460 delete fDCSDataPointsComp;
463 //______________________________________________________________________________________________
464 AliShuttleConfig::AliShuttleDetConfigHolder::AliShuttleDetConfigHolder(const TLDAPEntry* entry):
469 fSkipDCSQuery(kFALSE),
470 fStrictRunOrder(kFALSE)
472 // constructor of the shuttle configuration holder
474 TLDAPAttribute* anAttribute;
476 fResponsibles = new TObjArray();
477 fResponsibles->SetOwner(1);
478 fDCSConfig = new TObjArray();
479 fDCSConfig->SetOwner(1);
481 anAttribute = entry->GetAttribute("det"); // MUST
484 AliError(Form("No \"det\" attribute!"));
487 fDetector = anAttribute->GetValue();
489 anAttribute = entry->GetAttribute("strictRunOrder"); // MAY
492 AliWarning(Form("%s did not set strictRunOrder flag - the default is FALSE",
495 TString strictRunStr = anAttribute->GetValue();
496 if (!(strictRunStr == "0" || strictRunStr == "1"))
498 AliError("strictRunOrder flag must be 0 or 1!");
501 fStrictRunOrder = (Bool_t) strictRunStr.Atoi();
504 anAttribute = entry->GetAttribute("responsible"); // MAY
507 AliDebug(2, "Warning! No \"responsible\" attribute!");
511 const char* aResponsible;
512 while ((aResponsible = anAttribute->GetValue()))
514 fResponsibles->AddLast(new TObjString(aResponsible));
521 //______________________________________________________________________________________________
522 AliShuttleConfig::AliShuttleDetConfigHolder::~AliShuttleDetConfigHolder()
524 // destructor of the shuttle configuration holder
526 delete fResponsibles;
530 //______________________________________________________________________________________________
531 const char* AliShuttleConfig::AliShuttleDetConfigHolder::GetDCSHost(Int_t iServ) const
534 // returns DCS server host
537 if (iServ < 0 || iServ >= GetNServers()) return 0;
539 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
540 (fDCSConfig->At(iServ));
542 return aHolder->GetDCSHost();
545 //______________________________________________________________________________________________
546 Int_t AliShuttleConfig::AliShuttleDetConfigHolder::GetDCSPort(Int_t iServ) const
549 // returns DCS server port
552 if (iServ < 0 || iServ >= GetNServers()) return 0;
554 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
555 (fDCSConfig->At(iServ));
557 return aHolder->GetDCSPort();
560 //______________________________________________________________________________________________
561 Int_t AliShuttleConfig::AliShuttleDetConfigHolder::GetMultiSplit(Int_t iServ) const
564 // returns DCS "multi split" value
567 if (iServ < 0 || iServ >= GetNServers()) return 0;
569 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
570 (fDCSConfig->At(iServ));
572 return aHolder->GetMultiSplit();
575 //______________________________________________________________________________________________
576 const TObjArray* AliShuttleConfig::AliShuttleDetConfigHolder::GetDCSAliases(Int_t iServ) const
579 // returns collection of TObjString which represents the set of aliases
580 // which used for data retrieval for particular detector
583 if (iServ < 0 || iServ >= GetNServers()) return 0;
585 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
586 (fDCSConfig->At(iServ));
588 return aHolder->GetDCSAliases();
591 //______________________________________________________________________________________________
592 const TObjArray* AliShuttleConfig::AliShuttleDetConfigHolder::GetDCSDataPoints(Int_t iServ) const
595 // returns collection of TObjString which represents the set of aliases
596 // which used for data retrieval for particular detector
599 if (iServ < 0 || iServ >= GetNServers()) return 0;
601 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
602 (fDCSConfig->At(iServ));
604 return aHolder->GetDCSDataPoints();
607 //______________________________________________________________________________________________
608 const TObjArray* AliShuttleConfig::AliShuttleDetConfigHolder::GetCompactDCSAliases(Int_t iServ) const
611 // returns collection of TObjString which represents the set of aliases
612 // which used for data retrieval for particular detector (Compact style)
615 if (iServ < 0 || iServ >= GetNServers()) return 0;
617 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
618 (fDCSConfig->At(iServ));
620 return aHolder->GetCompactDCSAliases();
623 //______________________________________________________________________________________________
624 const TObjArray* AliShuttleConfig::AliShuttleDetConfigHolder::GetCompactDCSDataPoints(Int_t iServ) const
627 // returns collection of TObjString which represents the set of aliases
628 // which used for data retrieval for particular detector (Compact style)
631 if (iServ < 0 || iServ >= GetNServers()) return 0;
633 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
634 (fDCSConfig->At(iServ));
636 return aHolder->GetCompactDCSDataPoints();
639 //______________________________________________________________________________________________
640 void AliShuttleConfig::AliShuttleDetConfigHolder::AddDCSConfig(AliShuttleDCSConfigHolder* holder)
643 // adds a DCS configuration set in the array of DCS configurations
647 fDCSConfig->AddLast(holder);
650 ClassImp(AliShuttleConfig)
652 //______________________________________________________________________________________________
653 AliShuttleConfig::AliShuttleConfig(const char* host, Int_t port,
654 const char* binddn, const char* password, const char* basedn):
677 fShuttleInstanceHost(""),
678 fProcessedDetectors(),
680 fKeepTempFolder(kFALSE),
687 // host: ldap server host
688 // port: ldap server port
689 // binddn: binddn used for ldap binding (simple bind is used!).
690 // password: password for binddn
691 // basedn: this is basedn whose childeren entries which have
694 fDetectorMap.SetOwner(1);
695 fDetectorList.SetOwner(0); //fDetectorList and fDetectorMap share the same object!
696 fProcessedDetectors.SetOwner();
698 for (int i=0; i<5; i++)
700 fAdmin[i] = new TObjArray();
701 fAdmin[i]->SetOwner();
704 TLDAPServer aServer(host, port, binddn, password, 3);
706 if (!aServer.IsConnected()) {
707 AliError(Form("Can't connect to ldap server %s:%d",
712 // reads configuration for the shuttle running on this machine
714 TLDAPResult* aResult = 0;
715 TLDAPEntry* anEntry = 0;
722 globalList.SetOwner(1);
726 hostList.SetOwner(1);
728 aResult = aServer.Search(basedn, LDAP_SCOPE_SUBTREE, 0, 0);
732 AliError(Form("Can't find configuration with base DN: %s !", basedn));
736 while ((anEntry = aResult->GetNext()))
738 TString dn = anEntry->GetDn();
740 if (dn.BeginsWith("dcsHost="))
742 dcsList.Add(anEntry);
744 else if (dn.BeginsWith("det="))
746 detList.Add(anEntry);
748 else if (dn.BeginsWith("name=globalConfig"))
750 globalList.Add(anEntry);
752 else if (dn.BeginsWith("system="))
754 sysList.Add(anEntry);
756 else if (dn.BeginsWith("shuttleHost="))
758 hostList.Add(anEntry);
770 result += SetGlobalConfig(&globalList);
771 result += SetSysConfig(&sysList);
772 result += SetPasswords();
773 result += SetDetConfig(&detList,&dcsList);
774 result += SetHostConfig(&hostList);
778 AliError("Configuration is INVALID!");
786 //______________________________________________________________________________________________
787 AliShuttleConfig::~AliShuttleConfig()
791 fDetectorMap.DeleteAll();
792 fDetectorList.Clear();
793 fProcessedDetectors.Delete();
796 //______________________________________________________________________________________________
797 const TObjArray* AliShuttleConfig::GetDetectors() const
800 // returns collection of TObjString which contains the name
801 // of every detector which is in the configuration.
804 return &fDetectorList;
807 //______________________________________________________________________________________________
808 Bool_t AliShuttleConfig::HasDetector(const char* detector) const
811 // checks for paricular detector in the configuration.
813 return fDetectorMap.GetValue(detector) != NULL;
816 //______________________________________________________________________________________________
817 Int_t AliShuttleConfig::GetNServers(const char* detector) const
820 // returns number of DCS servers for detector
823 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
825 AliError(Form("There isn't configuration for detector: %s",
830 return aHolder->GetNServers();
834 //______________________________________________________________________________________________
835 const char* AliShuttleConfig::GetDCSHost(const char* detector, Int_t iServ) const
838 // returns i-th DCS server host used by particular detector
841 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
843 AliError(Form("There isn't configuration for detector: %s",
848 return aHolder->GetDCSHost(iServ);
851 //______________________________________________________________________________________________
852 Int_t AliShuttleConfig::GetDCSPort(const char* detector, Int_t iServ) const
855 // returns i-th DCS server port used by particular detector
859 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
861 AliError(Form("There isn't configuration for detector: %s",
866 return aHolder->GetDCSPort(iServ);
869 //______________________________________________________________________________________________
870 Int_t AliShuttleConfig::GetMultiSplit(const char* detector, Int_t iServ) const
873 // returns i-th DCS "multi split" value
877 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
879 AliError(Form("There isn't configuration for detector: %s",
884 return aHolder->GetMultiSplit(iServ);
887 //______________________________________________________________________________________________
888 const TObjArray* AliShuttleConfig::GetDCSAliases(const char* detector, Int_t iServ) const
891 // returns collection of TObjString which represents the i-th set of aliases
892 // which used for data retrieval for particular detector
895 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
897 AliError(Form("There isn't configuration for detector: %s",
902 return aHolder->GetDCSAliases(iServ);
905 //______________________________________________________________________________________________
906 const TObjArray* AliShuttleConfig::GetDCSDataPoints(const char* detector, Int_t iServ) const
909 // returns collection of TObjString which represents the set of aliases
910 // which used for data retrieval for particular detector
913 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
915 AliError(Form("There isn't configuration for detector: %s",
920 return aHolder->GetDCSDataPoints(iServ);
923 //______________________________________________________________________________________________
924 const TObjArray* AliShuttleConfig::GetCompactDCSAliases(const char* detector, Int_t iServ) const
927 // returns collection of TObjString which represents the i-th set of aliases
928 // which used for data retrieval for particular detector (Compact style)
931 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
933 AliError(Form("There isn't configuration for detector: %s",
938 return aHolder->GetCompactDCSAliases(iServ);
941 //______________________________________________________________________________________________
942 const TObjArray* AliShuttleConfig::GetCompactDCSDataPoints(const char* detector, Int_t iServ) const
945 // returns collection of TObjString which represents the set of aliases
946 // which used for data retrieval for particular detector (Compact style)
949 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
951 AliError(Form("There isn't configuration for detector: %s",
956 return aHolder->GetCompactDCSDataPoints(iServ);
959 //______________________________________________________________________________________________
960 const TObjArray* AliShuttleConfig::GetResponsibles(const char* detector) const
963 // returns collection of TObjString which represents the list of mail addresses
964 // of the detector's responsible(s)
967 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
969 AliError(Form("There isn't configuration for detector: %s",
974 return aHolder->GetResponsibles();
977 //______________________________________________________________________________________________
978 const TObjArray* AliShuttleConfig::GetAdmins(Int_t sys) const
981 // returns collection of TObjString which represents the list of mail addresses
982 // of the system's administrator(s) (DAQ, DCS, HLT, Global, Amanda)
985 if (sys < 0 || sys > 4) return 0;
989 //______________________________________________________________________________________________
990 Bool_t AliShuttleConfig::HostProcessDetector(const char* detector) const
992 // return TRUE if detector is handled by host or if fProcessAll is TRUE
994 if(fProcessAll) return kTRUE;
995 TIter iter(&fProcessedDetectors);
997 while((detName = (TObjString*) iter.Next())){
998 if(detName->String() == detector) return kTRUE;
1003 //______________________________________________________________________________________________
1004 Bool_t AliShuttleConfig::StrictRunOrder(const char* detector) const
1006 // return TRUE if detector wants strict run ordering of stored data
1008 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
1011 AliError(Form("There isn't configuration for detector: %s",
1016 return aHolder->StrictRunOrder();
1019 //______________________________________________________________________________________________
1020 UInt_t AliShuttleConfig::SetGlobalConfig(TList* list)
1022 // Set the global configuration (DAQ Logbook + preprocessor monitoring settings)
1025 TLDAPEntry* anEntry = 0;
1026 TLDAPAttribute* anAttribute = 0;
1028 if (list->GetEntries() == 0)
1030 AliError("Global configuration not found!");
1033 else if (list->GetEntries() > 1)
1035 AliError("More than one global configuration found!");
1039 anEntry = dynamic_cast<TLDAPEntry*> (list->At(0));
1043 AliError("Unexpected! Global list does not contain a TLDAPEntry");
1048 anAttribute = anEntry->GetAttribute("AlienPath");
1050 AliError("Can't find AlienPath attribute!");
1053 fAlienPath = anAttribute->GetValue();
1055 anAttribute = anEntry->GetAttribute("daqLbHost");
1057 AliError("Can't find daqLbHost attribute!");
1060 fDAQlbHost = anAttribute->GetValue();
1062 anAttribute = anEntry->GetAttribute("daqLbPort"); // MAY
1065 fDAQlbPort = ((TString) anAttribute->GetValue()).Atoi();
1067 fDAQlbPort = 3306; // mysql
1070 anAttribute = anEntry->GetAttribute("daqLbUser");
1072 AliError("Can't find daqLbUser attribute!");
1075 fDAQlbUser = anAttribute->GetValue();
1077 anAttribute = anEntry->GetAttribute("daqLbDB");
1079 AliError("Can't find daqLbDB attribute!");
1082 fDAQlbDB = anAttribute->GetValue();
1084 anAttribute = anEntry->GetAttribute("daqLbTable");
1086 AliError("Can't find daqLbTable attribute!");
1089 fDAQlbTable = anAttribute->GetValue();
1091 anAttribute = anEntry->GetAttribute("shuttleLbTable");
1093 AliError("Can't find shuttleLbTable attribute!");
1096 fShuttlelbTable = anAttribute->GetValue();
1098 anAttribute = anEntry->GetAttribute("runTypeLbTable");
1100 AliError("Can't find runTypeLbTable attribute!");
1103 fRunTypelbTable = anAttribute->GetValue();
1105 anAttribute = anEntry->GetAttribute("ppmaxRetries");
1107 AliError("Can't find ppmaxRetries attribute!");
1110 TString tmpStr = anAttribute->GetValue();
1111 fMaxRetries = tmpStr.Atoi();
1113 anAttribute = anEntry->GetAttribute("ppTimeOut");
1115 AliError("Can't find ppTimeOut attribute!");
1118 tmpStr = anAttribute->GetValue();
1119 fPPTimeOut = tmpStr.Atoi();
1121 anAttribute = anEntry->GetAttribute("dcsTimeOut");
1123 AliError("Can't find dcsTimeOut attribute!");
1126 tmpStr = anAttribute->GetValue();
1127 fDCSTimeOut = tmpStr.Atoi();
1129 anAttribute = anEntry->GetAttribute("nDCSretries");
1131 AliError("Can't find dcsTimeOut attribute!");
1134 tmpStr = anAttribute->GetValue();
1135 fDCSRetries = tmpStr.Atoi();
1137 anAttribute = anEntry->GetAttribute("ppMaxMem");
1139 AliError("Can't find ppMaxMem attribute!");
1142 tmpStr = anAttribute->GetValue();
1143 fPPMaxMem = tmpStr.Atoi();
1145 anAttribute = anEntry->GetAttribute("monitorHost");
1147 AliError("Can't find monitorHost attribute!");
1150 fMonitorHost = anAttribute->GetValue();
1152 anAttribute = anEntry->GetAttribute("monitorTable");
1154 AliError("Can't find monitorTable attribute!");
1157 fMonitorTable = anAttribute->GetValue();
1159 anAttribute = anEntry->GetAttribute("triggerWait"); // MAY
1161 AliWarning(Form("triggerWait not set! default = ", fTriggerWait));
1163 tmpStr = anAttribute->GetValue();
1164 fTriggerWait = tmpStr.Atoi();
1166 anAttribute = anEntry->GetAttribute("mode");
1168 AliWarning("Run mode not set! Running in test mode.");
1170 tmpStr = anAttribute->GetValue();
1171 if (tmpStr == "test")
1174 } else if (tmpStr == "prod") {
1177 AliWarning(Form("Not a valid run mode: %s", tmpStr.Data()));
1178 AliWarning("Valid run modes are \"test\" and \"prod\". Running in test mode.");
1182 anAttribute = anEntry->GetAttribute("keepDCSMap"); // MAY
1185 AliWarning("keepDCSMap flag not set - default is FALSE");
1187 TString keepDCSMapStr = anAttribute->GetValue();
1188 if (!(keepDCSMapStr == "0" || keepDCSMapStr == "1"))
1190 AliError("keepDCSMap flag must be 0 or 1!");
1193 fKeepDCSMap = (Bool_t) keepDCSMapStr.Atoi();
1196 anAttribute = anEntry->GetAttribute("keepTempFolder"); // MAY
1199 AliWarning("keepTempFolder flag not set - default is FALSE");
1201 TString keepTempFolderStr = anAttribute->GetValue();
1202 if (!(keepTempFolderStr == "0" || keepTempFolderStr == "1"))
1204 AliError("keepTempFolder flag must be 0 or 1!");
1207 fKeepTempFolder = (Bool_t) keepTempFolderStr.Atoi();
1211 anAttribute = anEntry->GetAttribute("shuttleAdmin"); // MAY
1214 AliDebug(2, "Warning! No \"shuttleAdmin\" attribute!");
1218 const char* anAdmin;
1219 while ((anAdmin = anAttribute->GetValue()))
1221 fAdmin[kGlobal]->AddLast(new TObjString(anAdmin));
1225 anAttribute = anEntry->GetAttribute("amandaAdmin"); // MAY
1228 AliDebug(2, "Warning! No \"amandaAdmin\" attribute!");
1232 const char* anAdmin;
1233 while ((anAdmin = anAttribute->GetValue()))
1235 fAdmin[kAmanda]->AddLast(new TObjString(anAdmin));
1239 anAttribute = anEntry->GetAttribute("sendMail"); // MAY
1242 AliWarning("sendMail flag not set - default is FALSE");
1244 TString sendMailStr = anAttribute->GetValue();
1245 if (!(sendMailStr == "0" || sendMailStr == "1"))
1247 AliError("sendMail flag must be 0 or 1!");
1250 fSendMail = (Bool_t) sendMailStr.Atoi();
1253 anAttribute = anEntry->GetAttribute("passwdFilePath");
1255 AliError("Can't find Passwords File Path attribute!");
1258 fPasswdFilePath = anAttribute->GetValue();
1263 //______________________________________________________________________________________________
1264 UInt_t AliShuttleConfig::SetSysConfig(TList* list)
1266 // Set the online FXS configuration (DAQ + DCS + HLT)
1269 TLDAPEntry* anEntry = 0;
1270 TLDAPAttribute* anAttribute = 0;
1272 if (list->GetEntries() != 3)
1274 AliError(Form("Wrong number of online systems found: %d !", list->GetEntries()));
1280 SystemCode iSys=kDAQ;
1282 while ((anEntry = dynamic_cast<TLDAPEntry*> (iter.Next())))
1284 anAttribute = anEntry->GetAttribute("system");
1285 TString sysName = anAttribute->GetValue();
1287 if (sysName == "DAQ")
1292 else if (sysName == "DCS")
1297 else if (sysName == "HLT")
1303 anAttribute = anEntry->GetAttribute("dbHost");
1305 AliError(Form ("Can't find dbHost attribute for %s!!",
1306 AliShuttleInterface::GetSystemName(iSys)));
1309 fFXSdbHost[iSys] = anAttribute->GetValue();
1311 anAttribute = anEntry->GetAttribute("dbPort"); // MAY
1314 fFXSdbPort[iSys] = ((TString) anAttribute->GetValue()).Atoi();
1316 fFXSdbPort[iSys] = 3306; // mysql
1319 anAttribute = anEntry->GetAttribute("dbUser");
1321 AliError(Form ("Can't find dbUser attribute for %s!!",
1322 AliShuttleInterface::GetSystemName(iSys)));
1325 fFXSdbUser[iSys] = anAttribute->GetValue();
1327 anAttribute = anEntry->GetAttribute("dbName");
1329 AliError(Form ("Can't find dbName attribute for %s!!",
1330 AliShuttleInterface::GetSystemName(iSys)));
1334 fFXSdbName[iSys] = anAttribute->GetValue();
1335 anAttribute = anEntry->GetAttribute("dbTable");
1337 AliError(Form ("Can't find dbTable attribute for %s!!",
1338 AliShuttleInterface::GetSystemName(iSys)));
1341 fFXSdbTable[iSys] = anAttribute->GetValue();
1343 anAttribute = anEntry->GetAttribute("fxsHost");
1345 AliError(Form ("Can't find fxsHost attribute for %s!!",
1346 AliShuttleInterface::GetSystemName(iSys)));
1349 fFXSHost[iSys] = anAttribute->GetValue();
1351 anAttribute = anEntry->GetAttribute("fxsPort"); // MAY
1354 fFXSPort[iSys] = ((TString) anAttribute->GetValue()).Atoi();
1356 fFXSPort[iSys] = 22; // scp port number
1359 anAttribute = anEntry->GetAttribute("fxsUser");
1361 AliError(Form ("Can't find fxsUser attribute for %s!!",
1362 AliShuttleInterface::GetSystemName(iSys)));
1365 fFXSUser[iSys] = anAttribute->GetValue();
1367 anAttribute = anEntry->GetAttribute("fxsPasswd");
1368 if (anAttribute) fFXSPass[iSys] = anAttribute->GetValue();
1370 anAttribute = anEntry->GetAttribute("fxsBaseFolder");
1371 if (anAttribute) fFXSBaseFolder[iSys] = anAttribute->GetValue();
1373 anAttribute = anEntry->GetAttribute("fxsAdmin"); // MAY
1376 AliDebug(2, "Warning! No \"fxsAdmin\" attribute!");
1380 const char* anAdmin;
1381 while ((anAdmin = anAttribute->GetValue()))
1383 fAdmin[iSys]->AddLast(new TObjString(anAdmin));
1390 AliError(Form("Wrong system configuration! (code = %d)", count));
1397 //______________________________________________________________________________________________
1398 UInt_t AliShuttleConfig::SetPasswords(){
1400 AliInfo("Setting Passwords");
1402 // Retrieving Passwords for DAQ lb, DAQ/DCS/HLT FXS
1404 ifstream *inputfile = new ifstream(fPasswdFilePath.Data());
1406 AliError(Form("Error opening file %s !", fPasswdFilePath.Data()));
1415 while (line.ReadLine(*inputfile)) {
1416 TObjArray *tokens = line.Tokenize(" \t");
1417 TString system = ((TObjString *)tokens->At(0))->String();
1418 TString password = ((TObjString *)tokens->At(1))->String();
1419 if (system.Contains("DAQ_LB")){
1420 fDAQlbPass=password;
1422 AliDebug(3,Form("DAQ_LB: Password %s for %s found", password.Data(), system.Data()));
1424 else if (system.Contains("DAQ_DB")){
1425 fFXSdbPass[0]=password;
1427 AliDebug(3,Form("DAQ_DB: Password %s for %s found", password.Data(), system.Data()));
1429 else if (system.Contains("DCS_DB")){
1430 fFXSdbPass[1]=password;
1432 AliDebug(3,Form("DCS_DB: Password %s for %s found", password.Data(), system.Data()));
1434 else if (system.Contains("HLT_DB")){
1435 fFXSdbPass[2]=password;
1437 AliDebug(3,Form("HLT_DB: Password %s for %s found", password.Data(), system.Data()));
1441 AliDebug(3,Form("%i fake line(s) found in file %s", nPwdFake, fPasswdFilePath.Data()));
1451 AliError(Form("Wrong file for DAQ Logbook password found %s (some passwors missing), please Check!", fPasswdFilePath.Data()));
1458 //______________________________________________________________________________________________
1459 UInt_t AliShuttleConfig::SetDetConfig(TList* detList, TList* dcsList)
1461 // Set the detector configuration (general settings + DCS amanda server and alias/DP lists)
1463 TLDAPEntry* anEntry = 0;
1465 TIter iter(detList);
1466 while ((anEntry = dynamic_cast<TLDAPEntry*> (iter.Next())))
1469 AliShuttleDetConfigHolder* detHolder = new AliShuttleDetConfigHolder(anEntry);
1471 if (!detHolder->IsValid()) {
1472 AliError("Detector configuration error!");
1477 TObjString* detStr = new TObjString(detHolder->GetDetector());
1479 // Look for DCS Configuration
1480 TIter dcsIter(dcsList);
1481 TLDAPEntry *dcsEntry = 0;
1482 while ((dcsEntry = dynamic_cast<TLDAPEntry*> (dcsIter.Next())))
1484 TString dn = dcsEntry->GetDn();
1485 if(dn.Contains(detStr->GetName())) {
1486 AliDebug(2, Form("Found DCS configuration: dn = %s",dn.Data()));
1487 AliShuttleDCSConfigHolder* dcsHolder = new AliShuttleDCSConfigHolder(dcsEntry);
1488 if (!dcsHolder->IsValid()) {
1489 AliError("DCS configuration error!");
1494 detHolder->AddDCSConfig(dcsHolder);
1499 fDetectorMap.Add(detStr, detHolder);
1500 fDetectorList.AddLast(detStr);
1506 //______________________________________________________________________________________________
1507 UInt_t AliShuttleConfig::SetHostConfig(TList* list)
1509 // Set the Shuttle machines configuration (which detectors processes each machine)
1511 TLDAPEntry* anEntry = 0;
1512 TLDAPAttribute* anAttribute = 0;
1514 fShuttleInstanceHost = gSystem->HostName();
1517 while ((anEntry = dynamic_cast<TLDAPEntry*> (iter.Next())))
1520 TString dn(anEntry->GetDn());
1521 if (!dn.Contains(Form("shuttleHost=%s", fShuttleInstanceHost.Data()))) continue;
1525 anAttribute = anEntry->GetAttribute("detectors");
1526 const char *detName;
1527 while((detName = anAttribute->GetValue())){
1528 TObjString *objDet= new TObjString(detName);
1529 fProcessedDetectors.Add(objDet);
1538 //______________________________________________________________________________________________
1539 void AliShuttleConfig::Print(Option_t* option) const
1541 // print configuration
1542 // options : "": print configuration for all detectors, aliases and DPs in compacted format
1543 // "uncompact": print configuration for all detectors, aliases and DPs in uncompacted format
1544 // "DET": print configuration for DET, aliases and DPs in compacted format
1545 // "DET, uncompact": print configuration for DET, aliases and DPs in uncompacted format
1550 TString mode = "test";
1551 if (fRunMode == kProd) mode = "production";
1553 result += "########################################################################\n";
1554 result += Form(" Shuttle configuration from %s - Run Mode: <%s> \n",
1555 fConfigHost.Data(), mode.Data());
1556 result += "########################################################################\n";
1557 result += Form("\nShuttle running on %s \n", fShuttleInstanceHost.Data());
1560 result += Form("All detectors will be processed! \n");
1562 result += "Detectors processed by this host: ";
1563 TIter it(&fProcessedDetectors);
1565 while ((aDet = (TObjString*) it.Next())) {
1566 result += Form("%s ", aDet->String().Data());
1571 result += Form("PP time out = %d - DCS time out = %d - max PP mem size = %d KB - max retries = %d "
1572 "- DIM trigger waiting timeout = %d\n",
1573 fPPTimeOut, fDCSTimeOut, fPPMaxMem, fMaxRetries, fTriggerWait);
1574 result += Form("FLAGS: keepDCSMap = %d - keepTempFolder = %d - SendMail = %d \n",
1575 fKeepDCSMap, fKeepTempFolder, fSendMail);
1576 const TObjArray* shuttleAdmins = GetAdmins(kGlobal);
1577 if (shuttleAdmins->GetEntries() != 0)
1579 result += "SHUTTLE administrator(s): ";
1580 TIter it(shuttleAdmins);
1581 TObjString* anAdmin;
1582 while ((anAdmin = (TObjString*) it.Next()))
1584 result += Form("%s ", anAdmin->String().Data());
1588 const TObjArray* amandaAdmins = GetAdmins(kAmanda);
1589 if (amandaAdmins->GetEntries() != 0)
1591 result += "Amanda server administrator(s): ";
1592 TIter it(amandaAdmins);
1593 TObjString* anAdmin;
1594 while ((anAdmin = (TObjString*) it.Next()))
1596 result += Form("%s ", anAdmin->String().Data());
1600 result += "------------------------------------------------------\n";
1602 result += Form("Logbook Configuration \n\n \tHost: %s:%d; \tUser: %s; ",
1603 fDAQlbHost.Data(), fDAQlbPort, fDAQlbUser.Data());
1605 // result += "Password: ";
1606 // result.Append('*', fDAQlbPass.Length());
1607 result += Form("\tDB: %s; \tTables: %s, %s, %s\n",
1608 fDAQlbDB.Data(), fDAQlbTable.Data(), fShuttlelbTable.Data(), fRunTypelbTable.Data());
1612 result += "------------------------------------------------------\n";
1613 result += "FXS configuration\n\n";
1615 for(int iSys=0;iSys<3;iSys++){
1616 result += Form("*** %s ***\n", AliShuttleInterface::GetSystemName(iSys));
1617 result += Form("\tDB host: %s:%d; \tUser: %s; \tName: %s; \tTable: %s\n",
1618 fFXSdbHost[iSys].Data(), fFXSdbPort[iSys], fFXSdbUser[iSys].Data(),
1619 fFXSdbName[iSys].Data(), fFXSdbTable[iSys].Data());
1620 // result += Form("DB Password:",fFXSdbPass[iSys].Data());
1621 result += Form("\tFXS host: %s:%d; \tUser: %s\n", fFXSHost[iSys].Data(), fFXSPort[iSys],
1622 fFXSUser[iSys].Data());
1623 // result += Form("FXS Password:",fFXSPass[iSys].Data());
1624 const TObjArray* fxsAdmins = GetAdmins(iSys);
1625 if (fxsAdmins->GetEntries() != 0)
1627 result += "\tAdministrator(s): ";
1628 TIter it(fxsAdmins);
1629 TObjString* anAdmin;
1630 while ((anAdmin = (TObjString*) it.Next()))
1632 result += Form("%s ", anAdmin->String().Data());
1638 result += "------------------------------------------------------\n";
1639 result += "MonaLisa configuration\n\n";
1641 result += Form("\tHost: %s; \tTable name: %s",
1642 fMonitorHost.Data(), fMonitorTable.Data());
1646 TString optStr(option);
1648 result += "------------------------------------------------------\n";
1649 result += "Detector-specific configuration\n\n";
1651 TIter iter(fDetectorMap.GetTable());
1654 while ((aPair = (TPair*) iter.Next())) {
1655 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) aPair->Value();
1656 if (optStr != "" && !optStr.Contains(aHolder->GetDetector()) &&
1657 optStr.CompareTo("uncompact",TString::kIgnoreCase) != 0 )
1660 result += Form("*** %s *** \n", aHolder->GetDetector());
1662 const TObjArray* responsibles = aHolder->GetResponsibles();
1663 if (responsibles->GetEntries() != 0)
1665 result += "\tDetector responsible(s): ";
1666 TIter it(responsibles);
1667 TObjString* aResponsible;
1668 while ((aResponsible = (TObjString*) it.Next()))
1670 result += Form("%s ", aResponsible->String().Data());
1675 result += Form("\tStrict run ordering: %s \n\n", aHolder->StrictRunOrder() ? "YES" : "NO");
1677 const TObjArray* dcsConfig = aHolder->GetDCSConfig();
1679 AliShuttleDCSConfigHolder* dcsHolder = 0;
1680 TIter dcsIter(dcsConfig);
1682 while ((dcsHolder = dynamic_cast<AliShuttleDCSConfigHolder*> (dcsIter.Next())))
1684 result += Form("\tAmanda server [%d]: %s:%d - MultiSplit = %d\n", count,
1685 dcsHolder->GetDCSHost(), dcsHolder->GetDCSPort(), dcsHolder->GetMultiSplit());
1687 const TObjArray* aliases = 0;
1688 if (optStr.Contains("uncompact",TString::kIgnoreCase))
1690 aliases = dcsHolder->GetDCSAliases();
1692 aliases = dcsHolder->GetCompactDCSAliases();
1695 if (aliases->GetEntries() != 0)
1697 result += Form("\tDCS Aliases [%d]: ", count);
1699 TObjString* anAlias;
1700 while ((anAlias = (TObjString*) it.Next()))
1702 result += Form("%s ", anAlias->String().Data());
1707 const TObjArray* dataPoints = 0;
1708 if (optStr.Contains("uncompact",TString::kIgnoreCase))
1710 dataPoints = dcsHolder->GetDCSDataPoints();
1712 dataPoints = dcsHolder->GetCompactDCSDataPoints();
1714 if (dataPoints->GetEntries() != 0)
1716 result += Form("\tDCS Data Points [%d]: ", count);
1717 TIter it(dataPoints);
1718 TObjString* aDataPoint;
1719 while ((aDataPoint = (TObjString*) it.Next())) {
1720 result += Form("%s ", aDataPoint->String().Data());
1728 if(!fIsValid) result += "\n\n********** !!!!! Configuration is INVALID !!!!! **********\n";