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("daqLbHost");
1050 AliError("Can't find daqLbHost attribute!");
1053 fDAQlbHost = anAttribute->GetValue();
1055 anAttribute = anEntry->GetAttribute("daqLbPort"); // MAY
1058 fDAQlbPort = ((TString) anAttribute->GetValue()).Atoi();
1060 fDAQlbPort = 3306; // mysql
1063 anAttribute = anEntry->GetAttribute("daqLbUser");
1065 AliError("Can't find daqLbUser attribute!");
1068 fDAQlbUser = anAttribute->GetValue();
1070 anAttribute = anEntry->GetAttribute("daqLbDB");
1072 AliError("Can't find daqLbDB attribute!");
1075 fDAQlbDB = anAttribute->GetValue();
1077 anAttribute = anEntry->GetAttribute("daqLbTable");
1079 AliError("Can't find daqLbTable attribute!");
1082 fDAQlbTable = anAttribute->GetValue();
1084 anAttribute = anEntry->GetAttribute("shuttleLbTable");
1086 AliError("Can't find shuttleLbTable attribute!");
1089 fShuttlelbTable = anAttribute->GetValue();
1091 anAttribute = anEntry->GetAttribute("runTypeLbTable");
1093 AliError("Can't find runTypeLbTable attribute!");
1096 fRunTypelbTable = anAttribute->GetValue();
1098 anAttribute = anEntry->GetAttribute("ppmaxRetries");
1100 AliError("Can't find ppmaxRetries attribute!");
1103 TString tmpStr = anAttribute->GetValue();
1104 fMaxRetries = tmpStr.Atoi();
1106 anAttribute = anEntry->GetAttribute("ppTimeOut");
1108 AliError("Can't find ppTimeOut attribute!");
1111 tmpStr = anAttribute->GetValue();
1112 fPPTimeOut = tmpStr.Atoi();
1114 anAttribute = anEntry->GetAttribute("dcsTimeOut");
1116 AliError("Can't find dcsTimeOut attribute!");
1119 tmpStr = anAttribute->GetValue();
1120 fDCSTimeOut = tmpStr.Atoi();
1122 anAttribute = anEntry->GetAttribute("nDCSretries");
1124 AliError("Can't find dcsTimeOut attribute!");
1127 tmpStr = anAttribute->GetValue();
1128 fDCSRetries = tmpStr.Atoi();
1130 anAttribute = anEntry->GetAttribute("ppMaxMem");
1132 AliError("Can't find ppMaxMem attribute!");
1135 tmpStr = anAttribute->GetValue();
1136 fPPMaxMem = tmpStr.Atoi();
1138 anAttribute = anEntry->GetAttribute("monitorHost");
1140 AliError("Can't find monitorHost attribute!");
1143 fMonitorHost = anAttribute->GetValue();
1145 anAttribute = anEntry->GetAttribute("monitorTable");
1147 AliError("Can't find monitorTable attribute!");
1150 fMonitorTable = anAttribute->GetValue();
1152 anAttribute = anEntry->GetAttribute("triggerWait"); // MAY
1154 AliWarning(Form("triggerWait not set! default = ", fTriggerWait));
1156 tmpStr = anAttribute->GetValue();
1157 fTriggerWait = tmpStr.Atoi();
1159 anAttribute = anEntry->GetAttribute("mode");
1161 AliWarning("Run mode not set! Running in test mode.");
1163 tmpStr = anAttribute->GetValue();
1164 if (tmpStr == "test")
1167 } else if (tmpStr == "prod") {
1170 AliWarning(Form("Not a valid run mode: %s", tmpStr.Data()));
1171 AliWarning("Valid run modes are \"test\" and \"prod\". Running in test mode.");
1175 anAttribute = anEntry->GetAttribute("keepDCSMap"); // MAY
1178 AliWarning("keepDCSMap flag not set - default is FALSE");
1180 TString keepDCSMapStr = anAttribute->GetValue();
1181 if (!(keepDCSMapStr == "0" || keepDCSMapStr == "1"))
1183 AliError("keepDCSMap flag must be 0 or 1!");
1186 fKeepDCSMap = (Bool_t) keepDCSMapStr.Atoi();
1189 anAttribute = anEntry->GetAttribute("keepTempFolder"); // MAY
1192 AliWarning("keepTempFolder flag not set - default is FALSE");
1194 TString keepTempFolderStr = anAttribute->GetValue();
1195 if (!(keepTempFolderStr == "0" || keepTempFolderStr == "1"))
1197 AliError("keepTempFolder flag must be 0 or 1!");
1200 fKeepTempFolder = (Bool_t) keepTempFolderStr.Atoi();
1204 anAttribute = anEntry->GetAttribute("shuttleAdmin"); // MAY
1207 AliDebug(2, "Warning! No \"shuttleAdmin\" attribute!");
1211 const char* anAdmin;
1212 while ((anAdmin = anAttribute->GetValue()))
1214 fAdmin[kGlobal]->AddLast(new TObjString(anAdmin));
1218 anAttribute = anEntry->GetAttribute("amandaAdmin"); // MAY
1221 AliDebug(2, "Warning! No \"amandaAdmin\" attribute!");
1225 const char* anAdmin;
1226 while ((anAdmin = anAttribute->GetValue()))
1228 fAdmin[kAmanda]->AddLast(new TObjString(anAdmin));
1232 anAttribute = anEntry->GetAttribute("sendMail"); // MAY
1235 AliWarning("sendMail flag not set - default is FALSE");
1237 TString sendMailStr = anAttribute->GetValue();
1238 if (!(sendMailStr == "0" || sendMailStr == "1"))
1240 AliError("sendMail flag must be 0 or 1!");
1243 fSendMail = (Bool_t) sendMailStr.Atoi();
1246 anAttribute = anEntry->GetAttribute("passwdFilePath");
1248 AliError("Can't find Passwords File Path attribute!");
1251 fPasswdFilePath = anAttribute->GetValue();
1256 //______________________________________________________________________________________________
1257 UInt_t AliShuttleConfig::SetSysConfig(TList* list)
1259 // Set the online FXS configuration (DAQ + DCS + HLT)
1262 TLDAPEntry* anEntry = 0;
1263 TLDAPAttribute* anAttribute = 0;
1265 if (list->GetEntries() != 3)
1267 AliError(Form("Wrong number of online systems found: %d !", list->GetEntries()));
1273 SystemCode iSys=kDAQ;
1275 while ((anEntry = dynamic_cast<TLDAPEntry*> (iter.Next())))
1277 anAttribute = anEntry->GetAttribute("system");
1278 TString sysName = anAttribute->GetValue();
1280 if (sysName == "DAQ")
1285 else if (sysName == "DCS")
1290 else if (sysName == "HLT")
1296 anAttribute = anEntry->GetAttribute("dbHost");
1298 AliError(Form ("Can't find dbHost attribute for %s!!",
1299 AliShuttleInterface::GetSystemName(iSys)));
1302 fFXSdbHost[iSys] = anAttribute->GetValue();
1304 anAttribute = anEntry->GetAttribute("dbPort"); // MAY
1307 fFXSdbPort[iSys] = ((TString) anAttribute->GetValue()).Atoi();
1309 fFXSdbPort[iSys] = 3306; // mysql
1312 anAttribute = anEntry->GetAttribute("dbUser");
1314 AliError(Form ("Can't find dbUser attribute for %s!!",
1315 AliShuttleInterface::GetSystemName(iSys)));
1318 fFXSdbUser[iSys] = anAttribute->GetValue();
1320 anAttribute = anEntry->GetAttribute("dbName");
1322 AliError(Form ("Can't find dbName attribute for %s!!",
1323 AliShuttleInterface::GetSystemName(iSys)));
1327 fFXSdbName[iSys] = anAttribute->GetValue();
1328 anAttribute = anEntry->GetAttribute("dbTable");
1330 AliError(Form ("Can't find dbTable attribute for %s!!",
1331 AliShuttleInterface::GetSystemName(iSys)));
1334 fFXSdbTable[iSys] = anAttribute->GetValue();
1336 anAttribute = anEntry->GetAttribute("fxsHost");
1338 AliError(Form ("Can't find fxsHost attribute for %s!!",
1339 AliShuttleInterface::GetSystemName(iSys)));
1342 fFXSHost[iSys] = anAttribute->GetValue();
1344 anAttribute = anEntry->GetAttribute("fxsPort"); // MAY
1347 fFXSPort[iSys] = ((TString) anAttribute->GetValue()).Atoi();
1349 fFXSPort[iSys] = 22; // scp port number
1352 anAttribute = anEntry->GetAttribute("fxsUser");
1354 AliError(Form ("Can't find fxsUser attribute for %s!!",
1355 AliShuttleInterface::GetSystemName(iSys)));
1358 fFXSUser[iSys] = anAttribute->GetValue();
1360 anAttribute = anEntry->GetAttribute("fxsPasswd");
1361 if (anAttribute) fFXSPass[iSys] = anAttribute->GetValue();
1363 anAttribute = anEntry->GetAttribute("fxsBaseFolder");
1364 if (anAttribute) fFXSBaseFolder[iSys] = anAttribute->GetValue();
1366 anAttribute = anEntry->GetAttribute("fxsAdmin"); // MAY
1369 AliDebug(2, "Warning! No \"fxsAdmin\" attribute!");
1373 const char* anAdmin;
1374 while ((anAdmin = anAttribute->GetValue()))
1376 fAdmin[iSys]->AddLast(new TObjString(anAdmin));
1383 AliError(Form("Wrong system configuration! (code = %d)", count));
1390 //______________________________________________________________________________________________
1391 UInt_t AliShuttleConfig::SetPasswords(){
1393 AliInfo("Setting Passwords");
1395 // Retrieving Passwords for DAQ lb, DAQ/DCS/HLT FXS
1397 ifstream *inputfile = new ifstream(fPasswdFilePath.Data());
1399 AliError(Form("Error opening file %s !", fPasswdFilePath.Data()));
1408 while (line.ReadLine(*inputfile)) {
1409 TObjArray *tokens = line.Tokenize(" \t");
1410 TString system = ((TObjString *)tokens->At(0))->String();
1411 TString password = ((TObjString *)tokens->At(1))->String();
1412 if (system.Contains("DAQ_LB")){
1413 fDAQlbPass=password;
1415 AliDebug(3,Form("DAQ_LB: Password %s for %s found", password.Data(), system.Data()));
1417 else if (system.Contains("DAQ_DB")){
1418 fFXSdbPass[0]=password;
1420 AliDebug(3,Form("DAQ_DB: Password %s for %s found", password.Data(), system.Data()));
1422 else if (system.Contains("DCS_DB")){
1423 fFXSdbPass[1]=password;
1425 AliDebug(3,Form("DCS_DB: Password %s for %s found", password.Data(), system.Data()));
1427 else if (system.Contains("HLT_DB")){
1428 fFXSdbPass[2]=password;
1430 AliDebug(3,Form("HLT_DB: Password %s for %s found", password.Data(), system.Data()));
1434 AliDebug(3,Form("%i fake line(s) found in file %s", nPwdFake, fPasswdFilePath.Data()));
1444 AliError(Form("Wrong file for DAQ Logbook password found %s (some passwors missing), please Check!", fPasswdFilePath.Data()));
1451 //______________________________________________________________________________________________
1452 UInt_t AliShuttleConfig::SetDetConfig(TList* detList, TList* dcsList)
1454 // Set the detector configuration (general settings + DCS amanda server and alias/DP lists)
1456 TLDAPEntry* anEntry = 0;
1458 TIter iter(detList);
1459 while ((anEntry = dynamic_cast<TLDAPEntry*> (iter.Next())))
1462 AliShuttleDetConfigHolder* detHolder = new AliShuttleDetConfigHolder(anEntry);
1464 if (!detHolder->IsValid()) {
1465 AliError("Detector configuration error!");
1470 TObjString* detStr = new TObjString(detHolder->GetDetector());
1472 // Look for DCS Configuration
1473 TIter dcsIter(dcsList);
1474 TLDAPEntry *dcsEntry = 0;
1475 while ((dcsEntry = dynamic_cast<TLDAPEntry*> (dcsIter.Next())))
1477 TString dn = dcsEntry->GetDn();
1478 if(dn.Contains(detStr->GetName())) {
1479 AliDebug(2, Form("Found DCS configuration: dn = %s",dn.Data()));
1480 AliShuttleDCSConfigHolder* dcsHolder = new AliShuttleDCSConfigHolder(dcsEntry);
1481 if (!dcsHolder->IsValid()) {
1482 AliError("DCS configuration error!");
1487 detHolder->AddDCSConfig(dcsHolder);
1492 fDetectorMap.Add(detStr, detHolder);
1493 fDetectorList.AddLast(detStr);
1499 //______________________________________________________________________________________________
1500 UInt_t AliShuttleConfig::SetHostConfig(TList* list)
1502 // Set the Shuttle machines configuration (which detectors processes each machine)
1504 TLDAPEntry* anEntry = 0;
1505 TLDAPAttribute* anAttribute = 0;
1507 fShuttleInstanceHost = gSystem->HostName();
1510 while ((anEntry = dynamic_cast<TLDAPEntry*> (iter.Next())))
1513 TString dn(anEntry->GetDn());
1514 if (!dn.Contains(Form("shuttleHost=%s", fShuttleInstanceHost.Data()))) continue;
1518 anAttribute = anEntry->GetAttribute("detectors");
1519 const char *detName;
1520 while((detName = anAttribute->GetValue())){
1521 TObjString *objDet= new TObjString(detName);
1522 fProcessedDetectors.Add(objDet);
1531 //______________________________________________________________________________________________
1532 void AliShuttleConfig::Print(Option_t* option) const
1534 // print configuration
1535 // options : "": print configuration for all detectors, aliases and DPs in compacted format
1536 // "uncompact": print configuration for all detectors, aliases and DPs in uncompacted format
1537 // "DET": print configuration for DET, aliases and DPs in compacted format
1538 // "DET, uncompact": print configuration for DET, aliases and DPs in uncompacted format
1543 TString mode = "test";
1544 if (fRunMode == kProd) mode = "production";
1546 result += "########################################################################\n";
1547 result += Form(" Shuttle configuration from %s - Run Mode: <%s> \n",
1548 fConfigHost.Data(), mode.Data());
1549 result += "########################################################################\n";
1550 result += Form("\nShuttle running on %s \n", fShuttleInstanceHost.Data());
1553 result += Form("All detectors will be processed! \n");
1555 result += "Detectors processed by this host: ";
1556 TIter it(&fProcessedDetectors);
1558 while ((aDet = (TObjString*) it.Next())) {
1559 result += Form("%s ", aDet->String().Data());
1564 result += Form("PP time out = %d - DCS time out = %d - max PP mem size = %d KB - max retries = %d "
1565 "- DIM trigger waiting timeout = %d\n",
1566 fPPTimeOut, fDCSTimeOut, fPPMaxMem, fMaxRetries, fTriggerWait);
1567 result += Form("FLAGS: keepDCSMap = %d - keepTempFolder = %d - SendMail = %d \n",
1568 fKeepDCSMap, fKeepTempFolder, fSendMail);
1569 const TObjArray* shuttleAdmins = GetAdmins(kGlobal);
1570 if (shuttleAdmins->GetEntries() != 0)
1572 result += "SHUTTLE administrator(s): ";
1573 TIter it(shuttleAdmins);
1574 TObjString* anAdmin;
1575 while ((anAdmin = (TObjString*) it.Next()))
1577 result += Form("%s ", anAdmin->String().Data());
1581 const TObjArray* amandaAdmins = GetAdmins(kAmanda);
1582 if (amandaAdmins->GetEntries() != 0)
1584 result += "Amanda server administrator(s): ";
1585 TIter it(amandaAdmins);
1586 TObjString* anAdmin;
1587 while ((anAdmin = (TObjString*) it.Next()))
1589 result += Form("%s ", anAdmin->String().Data());
1593 result += "------------------------------------------------------\n";
1595 result += Form("Logbook Configuration \n\n \tHost: %s:%d; \tUser: %s; ",
1596 fDAQlbHost.Data(), fDAQlbPort, fDAQlbUser.Data());
1598 // result += "Password: ";
1599 // result.Append('*', fDAQlbPass.Length());
1600 result += Form("\tDB: %s; \tTables: %s, %s, %s\n",
1601 fDAQlbDB.Data(), fDAQlbTable.Data(), fShuttlelbTable.Data(), fRunTypelbTable.Data());
1605 result += "------------------------------------------------------\n";
1606 result += "FXS configuration\n\n";
1608 for(int iSys=0;iSys<3;iSys++){
1609 result += Form("*** %s ***\n", AliShuttleInterface::GetSystemName(iSys));
1610 result += Form("\tDB host: %s:%d; \tUser: %s; \tName: %s; \tTable: %s\n",
1611 fFXSdbHost[iSys].Data(), fFXSdbPort[iSys], fFXSdbUser[iSys].Data(),
1612 fFXSdbName[iSys].Data(), fFXSdbTable[iSys].Data());
1613 // result += Form("DB Password:",fFXSdbPass[iSys].Data());
1614 result += Form("\tFXS host: %s:%d; \tUser: %s\n", fFXSHost[iSys].Data(), fFXSPort[iSys],
1615 fFXSUser[iSys].Data());
1616 // result += Form("FXS Password:",fFXSPass[iSys].Data());
1617 const TObjArray* fxsAdmins = GetAdmins(iSys);
1618 if (fxsAdmins->GetEntries() != 0)
1620 result += "\tAdministrator(s): ";
1621 TIter it(fxsAdmins);
1622 TObjString* anAdmin;
1623 while ((anAdmin = (TObjString*) it.Next()))
1625 result += Form("%s ", anAdmin->String().Data());
1631 result += "------------------------------------------------------\n";
1632 result += "MonaLisa configuration\n\n";
1634 result += Form("\tHost: %s; \tTable name: %s",
1635 fMonitorHost.Data(), fMonitorTable.Data());
1639 TString optStr(option);
1641 result += "------------------------------------------------------\n";
1642 result += "Detector-specific configuration\n\n";
1644 TIter iter(fDetectorMap.GetTable());
1647 while ((aPair = (TPair*) iter.Next())) {
1648 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) aPair->Value();
1649 if (optStr != "" && !optStr.Contains(aHolder->GetDetector()) &&
1650 optStr.CompareTo("uncompact",TString::kIgnoreCase) != 0 )
1653 result += Form("*** %s *** \n", aHolder->GetDetector());
1655 const TObjArray* responsibles = aHolder->GetResponsibles();
1656 if (responsibles->GetEntries() != 0)
1658 result += "\tDetector responsible(s): ";
1659 TIter it(responsibles);
1660 TObjString* aResponsible;
1661 while ((aResponsible = (TObjString*) it.Next()))
1663 result += Form("%s ", aResponsible->String().Data());
1668 result += Form("\tStrict run ordering: %s \n\n", aHolder->StrictRunOrder() ? "YES" : "NO");
1670 const TObjArray* dcsConfig = aHolder->GetDCSConfig();
1672 AliShuttleDCSConfigHolder* dcsHolder = 0;
1673 TIter dcsIter(dcsConfig);
1675 while ((dcsHolder = dynamic_cast<AliShuttleDCSConfigHolder*> (dcsIter.Next())))
1677 result += Form("\tAmanda server [%d]: %s:%d - MultiSplit = %d\n", count,
1678 dcsHolder->GetDCSHost(), dcsHolder->GetDCSPort(), dcsHolder->GetMultiSplit());
1680 const TObjArray* aliases = 0;
1681 if (optStr.Contains("uncompact",TString::kIgnoreCase))
1683 aliases = dcsHolder->GetDCSAliases();
1685 aliases = dcsHolder->GetCompactDCSAliases();
1688 if (aliases->GetEntries() != 0)
1690 result += Form("\tDCS Aliases [%d]: ", count);
1692 TObjString* anAlias;
1693 while ((anAlias = (TObjString*) it.Next()))
1695 result += Form("%s ", anAlias->String().Data());
1700 const TObjArray* dataPoints = 0;
1701 if (optStr.Contains("uncompact",TString::kIgnoreCase))
1703 dataPoints = dcsHolder->GetDCSDataPoints();
1705 dataPoints = dcsHolder->GetCompactDCSDataPoints();
1707 if (dataPoints->GetEntries() != 0)
1709 result += Form("\tDCS Data Points [%d]: ", count);
1710 TIter it(dataPoints);
1711 TObjString* aDataPoint;
1712 while ((aDataPoint = (TObjString*) it.Next())) {
1713 result += Form("%s ", aDataPoint->String().Data());
1721 if(!fIsValid) result += "\n\n********** !!!!! Configuration is INVALID !!!!! **********\n";