Applying modification so that LUTs are generated from CDB, which also solves LUT...
[u/mrichter/AliRoot.git] / SHUTTLE / AliShuttleConfig.cxx
CommitLineData
73abe331 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16/*
17$Log$
cb03e6c1 18Revision 1.23 2007/09/28 15:27:40 acolla
19
20AliDCSClient "multiSplit" option added in the DCS configuration
21in AliDCSMessage: variable MAX_BODY_SIZE set to 500000
22
542b6cc8 23Revision 1.22 2007/09/27 16:53:13 acolla
24Detectors can have more than one AMANDA server. SHUTTLE queries the servers sequentially,
25merges the dcs aliases/DPs in one TMap and sends it to the preprocessor.
26
1d172743 27Revision 1.21 2007/04/27 07:06:48 jgrosseo
28GetFileSources returns empty list in case of no files, but successful query
29No mails sent in testmode
30
86aa42c3 31Revision 1.20 2007/04/04 10:33:36 jgrosseo
321) 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.
33In case of an error with the Grid, the Shuttle will retry the storing later, the preprocessor does not need to be run again.
34
352) 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.
36
373) New function StoreReferenceFile to _directly_ store a file (without opening it) to the reference storage.
38
394) The memory usage of the preprocessor is monitored. If it exceeds 2 GB it is terminated.
40
415) 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.
42If you always need DCS data (like before), you do not need to implement it.
43
446) The run type has been added to the monitoring page
45
9827400b 46Revision 1.19 2007/02/28 10:41:56 acolla
47Run type field added in SHUTTLE framework. Run type is read from "run type" logbook and retrieved by
48AliPreprocessor::GetRunType() function.
49Added some ldap definition files.
50
441b0e9c 51Revision 1.18 2007/01/23 19:20:03 acolla
52Removed old ldif files, added TOF, MCH ldif files. Added some options in
53AliShuttleConfig::Print. Added in Ali Shuttle: SetShuttleTempDir and
54SetShuttleLogDir
55
36c99a6a 56Revision 1.17 2007/01/18 11:17:47 jgrosseo
57changing spaces to tabs ;-)
58
f59d2f8f 59Revision 1.16 2007/01/18 11:10:35 jgrosseo
60adding the possibility of defining DCS alias and data points with patterns
61first pattern introduced: [N..M] to add all names between the two digits, this works also recursively.
62
40150741 63Revision 1.15 2007/01/15 18:27:11 acolla
64implementation of sending mail to subdetector expert in case the preprocessor fails.
65shuttle.schema updated with expert's email entry
66
fc5a4708 67Revision 1.13 2006/12/07 08:51:26 jgrosseo
68update (alberto):
69table, db names in ldap configuration
70added GRP preprocessor
71DCS data can also be retrieved by data point
72
2c15234c 73Revision 1.12 2006/11/16 16:16:48 jgrosseo
74introducing strict run ordering flag
75removed giving preprocessor name to preprocessor, they have to know their name themselves ;-)
76
be48e3ea 77Revision 1.11 2006/11/06 14:23:04 jgrosseo
78major update (Alberto)
79o) reading of run parameters from the logbook
80o) online offline naming conversion
81o) standalone DCSclient package
82
eba76848 83Revision 1.10 2006/10/20 15:22:59 jgrosseo
84o) Adding time out to the execution of the preprocessors: The Shuttle forks and the parent process monitors the child
85o) Merging Collect, CollectAll, CollectNew function
86o) Removing implementation of empty copy constructors (declaration still there!)
87
cb343cfd 88Revision 1.9 2006/10/02 16:38:39 jgrosseo
89update (alberto):
90fixed memory leaks
91storing of objects that failed to be stored to the grid before
92interfacing of shuttle status table in daq system
93
2bb7b766 94Revision 1.8 2006/08/15 10:50:00 jgrosseo
95effc++ corrections (alberto)
96
4f0ab988 97Revision 1.7 2006/07/20 09:54:40 jgrosseo
98introducing status management: The processing per subdetector is divided into several steps,
99after each step the status is stored on disk. If the system crashes in any of the steps the Shuttle
100can keep track of the number of failures and skips further processing after a certain threshold is
101exceeded. These thresholds can be configured in LDAP.
102
5164a766 103Revision 1.6 2006/07/19 10:09:55 jgrosseo
104new configuration, accesst to DAQ FES (Alberto)
105
57f50b3c 106Revision 1.5 2006/07/10 13:01:41 jgrosseo
107enhanced storing of last sucessfully processed run (alberto)
108
a7160fe9 109Revision 1.4 2006/06/12 09:11:16 jgrosseo
110coding conventions (Alberto)
111
58bc3020 112Revision 1.3 2006/06/06 14:26:40 jgrosseo
113o) removed files that were moved to STEER
114o) shuttle updated to follow the new interface (Alberto)
115
b948db8d 116Revision 1.7 2006/05/12 09:07:16 colla
11712/05/06
118New configuration complete
119
120Revision 1.2 2006/03/07 07:52:34 hristov
121New version (B.Yordanov)
122
d477ad88 123Revision 1.4 2005/11/19 14:20:31 byordano
124logbook config added to AliShuttleConfig
125
126Revision 1.3 2005/11/17 19:24:25 byordano
127TList changed to TObjArray in AliShuttleConfig
128
129Revision 1.2 2005/11/17 14:43:23 byordano
130import to local CVS
131
132Revision 1.1.1.1 2005/10/28 07:33:58 hristov
133Initial import as subdirectory in AliRoot
134
73abe331 135Revision 1.1.1.1 2005/09/12 22:11:40 byordano
136SHUTTLE package
137
138Revision 1.3 2005/08/30 09:13:02 byordano
139some docs added
140
141*/
142
143
144//
145// This class keeps the AliShuttle configuration.
146// It reads the configuration for LDAP server.
147// For every child entry in basedn which has schema type 'shuttleConfig'
148// it creates a detector configuration. This configuration includes:
149// DCS server host and port and the set of aliases for which data from
150// will be retrieved (used by AliShuttle).
151//
152
153
154#include "AliShuttleConfig.h"
57f50b3c 155#include "AliShuttleInterface.h"
73abe331 156
157#include "AliLog.h"
158
b948db8d 159#include <TSystem.h>
73abe331 160#include <TObjString.h>
161#include <TLDAPResult.h>
162#include <TLDAPEntry.h>
163#include <TLDAPAttribute.h>
164
57f50b3c 165
1d172743 166AliShuttleConfig::AliShuttleDCSConfigHolder::AliShuttleDCSConfigHolder(const TLDAPEntry* entry):
57f50b3c 167fDCSHost(""),
168fDCSPort(0),
542b6cc8 169fMultiSplit(100),
fc5a4708 170fDCSAliases(0),
171fDCSDataPoints(0),
36c99a6a 172fDCSAliasesComp(0),
173fDCSDataPointsComp(0),
1d172743 174fIsValid(kFALSE)
73abe331 175{
1d172743 176// constructor of the shuttle DCS configuration holder
58bc3020 177
73abe331 178 TLDAPAttribute* anAttribute;
2bb7b766 179 fDCSAliases = new TObjArray();
180 fDCSAliases->SetOwner(1);
2c15234c 181 fDCSDataPoints = new TObjArray();
182 fDCSDataPoints->SetOwner(1);
36c99a6a 183 fDCSAliasesComp = new TObjArray();
184 fDCSAliasesComp->SetOwner(1);
185 fDCSDataPointsComp = new TObjArray();
186 fDCSDataPointsComp->SetOwner(1);
57f50b3c 187
86aa42c3 188
1d172743 189 anAttribute = entry->GetAttribute("dcsHost");
2c15234c 190 if (!anAttribute)
191 {
1d172743 192 AliError("Unexpected: no DCS host!");
73abe331 193 return;
194 }
57f50b3c 195
b948db8d 196 fDCSHost = anAttribute->GetValue();
73abe331 197
1d172743 198 anAttribute = entry->GetAttribute("dcsPort");
2c15234c 199 if (!anAttribute)
200 {
1d172743 201 AliError("Unexpected: no DCS port!");
73abe331 202 return;
203 }
204 TString portStr = anAttribute->GetValue();
b948db8d 205 fDCSPort = portStr.Atoi();
73abe331 206
542b6cc8 207 anAttribute = entry->GetAttribute("multiSplit"); // MAY
208 if (anAttribute)
209 {
210 TString multiSplitStr = anAttribute->GetValue();
211 fMultiSplit = multiSplitStr.Atoi();
212 if(fMultiSplit == 0) {
213 AliError("MultiSplit must be a positive integer!");
214 return;
215 }
216
217 }
218
1d172743 219 anAttribute = entry->GetAttribute("dcsAlias"); // MAY
2c15234c 220 if (anAttribute)
221 {
222 const char* anAlias;
223 while ((anAlias = anAttribute->GetValue()))
224 {
36c99a6a 225 fDCSAliasesComp->AddLast(new TObjString(anAlias));
40150741 226 ExpandAndAdd(fDCSAliases, anAlias);
2c15234c 227 }
73abe331 228 }
57f50b3c 229
1d172743 230 anAttribute = entry->GetAttribute("dcsDP"); // MAY
2c15234c 231 if (anAttribute)
232 {
233 const char* aDataPoint;
234 while ((aDataPoint = anAttribute->GetValue()))
235 {
36c99a6a 236 fDCSDataPointsComp->AddLast(new TObjString(aDataPoint));
237 ExpandAndAdd(fDCSDataPoints, aDataPoint);
2c15234c 238 }
b948db8d 239 }
240
73abe331 241 fIsValid = kTRUE;
242}
243
a7160fe9 244//______________________________________________________________________________________________
1d172743 245void AliShuttleConfig::AliShuttleDCSConfigHolder::ExpandAndAdd(TObjArray* target, const char* entry)
40150741 246{
f59d2f8f 247 //
248 // adds <entry> to <target> applying expanding of the name
249 // [N..M] creates M-N+1 names with the corresponding digits
250 //
40150741 251
f59d2f8f 252 TString entryStr(entry);
40150741 253
f59d2f8f 254 Int_t begin = entryStr.Index("[");
255 Int_t end = entryStr.Index("]");
256 if (begin != -1 && end != -1 && end > begin)
257 {
258 TString before(entryStr(0, begin));
259 TString after(entryStr(end+1, entryStr.Length()));
40150741 260
f59d2f8f 261 AliDebug(2, Form("Found [] pattern. Splitted input string %s %s", before.Data(), after.Data()));
40150741 262
f59d2f8f 263 Int_t dotdot = entryStr.Index("..");
40150741 264
f59d2f8f 265 TString nStr(entryStr(begin+1, dotdot-begin-1));
266 TString mStr(entryStr(dotdot+2, end-dotdot-2));
40150741 267
f59d2f8f 268 AliDebug(2, Form("Found [N..M] pattern. %s %s", nStr.Data(), mStr.Data()));
40150741 269
f59d2f8f 270 if (nStr.IsDigit() && mStr.IsDigit())
271 {
272 Int_t n = nStr.Atoi();
273 Int_t m = mStr.Atoi();
40150741 274
f59d2f8f 275 Int_t nDigits = nStr.Length();
276 TString formatStr;
277 formatStr.Form("%%s%%0%dd%%s", nDigits);
40150741 278
f59d2f8f 279 AliDebug(2, Form("Format string is %s", formatStr.Data()));
40150741 280
f59d2f8f 281 for (Int_t current = n; current<=m; ++current)
282 {
283 TString newEntry;
284 newEntry.Form(formatStr.Data(), before.Data(), current, after.Data());
40150741 285
f59d2f8f 286 AliDebug(2, Form("Calling recursive with %s", newEntry.Data()));
40150741 287
f59d2f8f 288 // and go recursive
289 ExpandAndAdd(target, newEntry);
290 }
40150741 291
f59d2f8f 292 // return here because we processed the entries already recursively.
293 return;
294 }
295 }
40150741 296
f59d2f8f 297 AliDebug(2, Form("Adding name %s", entry));
298 target->AddLast(new TObjString(entry));
40150741 299}
300
301//______________________________________________________________________________________________
1d172743 302AliShuttleConfig::AliShuttleDCSConfigHolder::~AliShuttleDCSConfigHolder()
58bc3020 303{
304// destructor of the shuttle configuration holder
305
2bb7b766 306 delete fDCSAliases;
2c15234c 307 delete fDCSDataPoints;
1d172743 308 delete fDCSAliasesComp;
309 delete fDCSDataPointsComp;
73abe331 310}
311
a7160fe9 312//______________________________________________________________________________________________
1d172743 313AliShuttleConfig::AliShuttleDetConfigHolder::AliShuttleDetConfigHolder(const TLDAPEntry* entry):
314fDetector(""),
315fDCSConfig(),
316fResponsibles(0),
317fIsValid(kFALSE),
318fSkipDCSQuery(kFALSE),
319fStrictRunOrder(kFALSE)
73abe331 320{
1d172743 321// constructor of the shuttle configuration holder
2bb7b766 322
1d172743 323 TLDAPAttribute* anAttribute;
324
325 fResponsibles = new TObjArray();
326 fResponsibles->SetOwner(1);
327 fDCSConfig = new TObjArray();
328 fDCSConfig->SetOwner(1);
b948db8d 329
1d172743 330 anAttribute = entry->GetAttribute("det"); // MUST
331 if (!anAttribute)
332 {
333 AliError(Form("No \"det\" attribute!"));
73abe331 334 return;
1d172743 335 }
336 fDetector = anAttribute->GetValue();
b948db8d 337
1d172743 338 anAttribute = entry->GetAttribute("strictRunOrder"); // MAY
339 if (!anAttribute)
340 {
341 AliWarning(Form("%s did not set strictRunOrder flag - the default is FALSE",
342 fDetector.Data()));
343 } else {
344 TString strictRunStr = anAttribute->GetValue();
345 if (!(strictRunStr == "0" || strictRunStr == "1"))
346 {
347 AliError("strictRunOrder flag must be 0 or 1!");
348 return;
349 }
350 fStrictRunOrder = (Bool_t) strictRunStr.Atoi();
b948db8d 351 }
57f50b3c 352
1d172743 353 anAttribute = entry->GetAttribute("responsible"); // MAY
354 if (!anAttribute)
355 {
356 AliDebug(2, "Warning! No \"responsible\" attribute!");
357 }
358 else
359 {
360 const char* aResponsible;
361 while ((aResponsible = anAttribute->GetValue()))
362 {
363 fResponsibles->AddLast(new TObjString(aResponsible));
b948db8d 364 }
365 }
366
1d172743 367 fIsValid = kTRUE;
368}
b948db8d 369
1d172743 370//______________________________________________________________________________________________
371AliShuttleConfig::AliShuttleDetConfigHolder::~AliShuttleDetConfigHolder()
372{
373// destructor of the shuttle configuration holder
57f50b3c 374
1d172743 375 delete fResponsibles;
376 delete fDCSConfig;
377}
73abe331 378
1d172743 379//______________________________________________________________________________________________
380const char* AliShuttleConfig::AliShuttleDetConfigHolder::GetDCSHost(Int_t iServ) const
381{
382 //
383 // returns DCS server host
384 //
385
386 if (iServ < 0 || iServ >= GetNServers()) return 0;
387
388 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
389 (fDCSConfig->At(iServ));
390
391 return aHolder->GetDCSHost();
392}
73abe331 393
1d172743 394//______________________________________________________________________________________________
395Int_t AliShuttleConfig::AliShuttleDetConfigHolder::GetDCSPort(Int_t iServ) const
396{
397 //
398 // returns DCS server port
399 //
400
401 if (iServ < 0 || iServ >= GetNServers()) return 0;
402
403 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
404 (fDCSConfig->At(iServ));
405
406 return aHolder->GetDCSPort();
407}
57f50b3c 408
1d172743 409//______________________________________________________________________________________________
542b6cc8 410Int_t AliShuttleConfig::AliShuttleDetConfigHolder::GetMultiSplit(Int_t iServ) const
411{
412 //
413 // returns DCS "multi split" value
414 //
415
416 if (iServ < 0 || iServ >= GetNServers()) return 0;
417
418 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
419 (fDCSConfig->At(iServ));
420
421 return aHolder->GetMultiSplit();
422}
423
424//______________________________________________________________________________________________
1d172743 425const TObjArray* AliShuttleConfig::AliShuttleDetConfigHolder::GetDCSAliases(Int_t iServ) const
426{
427 //
428 // returns collection of TObjString which represents the set of aliases
429 // which used for data retrieval for particular detector
430 //
431
432 if (iServ < 0 || iServ >= GetNServers()) return 0;
433
434 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
435 (fDCSConfig->At(iServ));
436
437 return aHolder->GetDCSAliases();
438}
73abe331 439
1d172743 440//______________________________________________________________________________________________
441const TObjArray* AliShuttleConfig::AliShuttleDetConfigHolder::GetDCSDataPoints(Int_t iServ) const
442{
443 //
444 // returns collection of TObjString which represents the set of aliases
445 // which used for data retrieval for particular detector
446 //
d477ad88 447
1d172743 448 if (iServ < 0 || iServ >= GetNServers()) return 0;
d477ad88 449
1d172743 450 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
451 (fDCSConfig->At(iServ));
452
453 return aHolder->GetDCSDataPoints();
454}
d477ad88 455
1d172743 456//______________________________________________________________________________________________
457const TObjArray* AliShuttleConfig::AliShuttleDetConfigHolder::GetCompactDCSAliases(Int_t iServ) const
458{
459 //
460 // returns collection of TObjString which represents the set of aliases
461 // which used for data retrieval for particular detector (Compact style)
462 //
d477ad88 463
1d172743 464 if (iServ < 0 || iServ >= GetNServers()) return 0;
57f50b3c 465
1d172743 466 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
467 (fDCSConfig->At(iServ));
468
469 return aHolder->GetCompactDCSAliases();
470}
d477ad88 471
1d172743 472//______________________________________________________________________________________________
473const TObjArray* AliShuttleConfig::AliShuttleDetConfigHolder::GetCompactDCSDataPoints(Int_t iServ) const
474{
475 //
476 // returns collection of TObjString which represents the set of aliases
477 // which used for data retrieval for particular detector (Compact style)
478 //
fc5a4708 479
1d172743 480 if (iServ < 0 || iServ >= GetNServers()) return 0;
57f50b3c 481
1d172743 482 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
483 (fDCSConfig->At(iServ));
484
485 return aHolder->GetCompactDCSDataPoints();
486}
d477ad88 487
1d172743 488//______________________________________________________________________________________________
489void AliShuttleConfig::AliShuttleDetConfigHolder::AddDCSConfig(AliShuttleDCSConfigHolder* holder)
490{
491 //
492 // adds a DCS configuration set in the array of DCS configurations
493 //
494
495 if(!holder) return;
496 fDCSConfig->AddLast(holder);
497}
2c15234c 498
1d172743 499ClassImp(AliShuttleConfig)
2c15234c 500
1d172743 501//______________________________________________________________________________________________
502AliShuttleConfig::AliShuttleConfig(const char* host, Int_t port,
503 const char* binddn, const char* password, const char* basedn):
504 fConfigHost(host),
505 fDAQlbHost(""),
506 fDAQlbPort(),
507 fDAQlbUser(""),
508 fDAQlbPass(""),
509 fDAQlbDB(""),
510 fDAQlbTable(""),
511 fShuttlelbTable(""),
512 fRunTypelbTable(""),
513 fMaxRetries(0),
514 fPPTimeOut(0),
515 fPPMaxMem(0),
516 fDetectorMap(),
517 fDetectorList(),
518 fShuttleInstanceHost(""),
519 fProcessedDetectors(),
520 fProcessAll(kFALSE),
521 fIsValid(kFALSE)
522{
523 //
524 // host: ldap server host
525 // port: ldap server port
526 // binddn: binddn used for ldap binding (simple bind is used!).
527 // password: password for binddn
528 // basedn: this is basedn whose childeren entries which have
529 //
441b0e9c 530
1d172743 531 fDetectorMap.SetOwner(1);
532 fDetectorList.SetOwner(0); //fDetectorList and fDetectorMap share the same object!
533 fProcessedDetectors.SetOwner();
2c15234c 534
1d172743 535 TLDAPServer aServer(host, port, binddn, password, 3);
5164a766 536
1d172743 537 if (!aServer.IsConnected()) {
538 AliError(Form("Can't connect to ldap server %s:%d",
539 host, port));
5164a766 540 return;
541 }
5164a766 542
1d172743 543 // reads configuration for the shuttle running on this machine
544
545 TLDAPResult* aResult = 0;
546 TLDAPEntry* anEntry = 0;
547
548 TList dcsList;
549 dcsList.SetOwner(1);
550 TList detList;
551 detList.SetOwner(1);
552 TList globalList;
553 globalList.SetOwner(1);
554 TList sysList;
555 sysList.SetOwner(1);
556 TList hostList;
557 hostList.SetOwner(1);
558
559 aResult = aServer.Search(basedn, LDAP_SCOPE_SUBTREE, 0, 0);
560
561 if (!aResult)
562 {
563 AliError(Form("Can't find configuration with base DN: %s !", basedn));
9827400b 564 return;
565 }
9827400b 566
1d172743 567 while ((anEntry = aResult->GetNext()))
568 {
569 TString dn = anEntry->GetDn();
570
571 if (dn.BeginsWith("dcsHost="))
fc5a4708 572 {
1d172743 573 dcsList.Add(anEntry);
574 }
575 else if (dn.BeginsWith("det="))
576 {
577 detList.Add(anEntry);
2c15234c 578 }
1d172743 579 else if (dn.BeginsWith("name=globalConfig"))
580 {
581 globalList.Add(anEntry);
2c15234c 582 }
1d172743 583 else if (dn.BeginsWith("system="))
584 {
585 sysList.Add(anEntry);
57f50b3c 586 }
1d172743 587 else if (dn.BeginsWith("shuttleHost="))
fc5a4708 588 {
1d172743 589 hostList.Add(anEntry);
fc5a4708 590 }
1d172743 591 else
592 {
593 delete anEntry;
57f50b3c 594 }
1d172743 595
596 }
597 delete aResult;
598
599 Int_t result=0;
600
601 result += SetGlobalConfig(&globalList);
602 result += SetSysConfig(&sysList);
603 result += SetDetConfig(&detList,&dcsList);
604 result += SetHostConfig(&hostList);
605
606 if(result)
607 {
608 AliError("Configuration is INVALID!");
609 }
610 else
611 {
612 fIsValid = kTRUE;
57f50b3c 613 }
73abe331 614}
615
a7160fe9 616//______________________________________________________________________________________________
617AliShuttleConfig::~AliShuttleConfig()
58bc3020 618{
619// destructor
620
73abe331 621 fDetectorMap.DeleteAll();
2bb7b766 622 fDetectorList.Clear();
623 fProcessedDetectors.Delete();
73abe331 624}
625
a7160fe9 626//______________________________________________________________________________________________
627const TObjArray* AliShuttleConfig::GetDetectors() const
58bc3020 628{
73abe331 629 //
630 // returns collection of TObjString which contains the name
631 // of every detector which is in the configuration.
632 //
633
634 return &fDetectorList;
635}
636
a7160fe9 637//______________________________________________________________________________________________
638Bool_t AliShuttleConfig::HasDetector(const char* detector) const
58bc3020 639{
73abe331 640 //
641 // checks for paricular detector in the configuration.
642 //
643 return fDetectorMap.GetValue(detector) != NULL;
644}
645
a7160fe9 646//______________________________________________________________________________________________
1d172743 647Int_t AliShuttleConfig::GetNServers(const char* detector) const
648{
649 //
650 // returns number of DCS servers for detector
651 //
652
653 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
654 if (!aHolder) {
655 AliError(Form("There isn't configuration for detector: %s",
656 detector));
657 return 0;
658 }
659
660 return aHolder->GetNServers();
661}
662
663
664//______________________________________________________________________________________________
665const char* AliShuttleConfig::GetDCSHost(const char* detector, Int_t iServ) const
58bc3020 666{
73abe331 667 //
1d172743 668 // returns i-th DCS server host used by particular detector
73abe331 669 //
670
1d172743 671 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
73abe331 672 if (!aHolder) {
673 AliError(Form("There isn't configuration for detector: %s",
674 detector));
675 return NULL;
676 }
677
1d172743 678 return aHolder->GetDCSHost(iServ);
73abe331 679}
680
a7160fe9 681//______________________________________________________________________________________________
1d172743 682Int_t AliShuttleConfig::GetDCSPort(const char* detector, Int_t iServ) const
58bc3020 683{
73abe331 684 //
1d172743 685 // returns i-th DCS server port used by particular detector
73abe331 686 //
687
688
1d172743 689 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
73abe331 690 if (!aHolder) {
691 AliError(Form("There isn't configuration for detector: %s",
692 detector));
693 return 0;
694 }
695
1d172743 696 return aHolder->GetDCSPort(iServ);
73abe331 697}
698
a7160fe9 699//______________________________________________________________________________________________
542b6cc8 700Int_t AliShuttleConfig::GetMultiSplit(const char* detector, Int_t iServ) const
701{
702 //
703 // returns i-th DCS "multi split" value
704 //
705
706
707 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
708 if (!aHolder) {
709 AliError(Form("There isn't configuration for detector: %s",
710 detector));
711 return 0;
712 }
713
714 return aHolder->GetMultiSplit(iServ);
715}
716
717//______________________________________________________________________________________________
1d172743 718const TObjArray* AliShuttleConfig::GetDCSAliases(const char* detector, Int_t iServ) const
58bc3020 719{
73abe331 720 //
1d172743 721 // returns collection of TObjString which represents the i-th set of aliases
73abe331 722 // which used for data retrieval for particular detector
723 //
724
1d172743 725 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
73abe331 726 if (!aHolder) {
727 AliError(Form("There isn't configuration for detector: %s",
728 detector));
729 return NULL;
730 }
731
1d172743 732 return aHolder->GetDCSAliases(iServ);
b948db8d 733}
734
a7160fe9 735//______________________________________________________________________________________________
1d172743 736const TObjArray* AliShuttleConfig::GetDCSDataPoints(const char* detector, Int_t iServ) const
2c15234c 737{
738 //
739 // returns collection of TObjString which represents the set of aliases
740 // which used for data retrieval for particular detector
741 //
742
1d172743 743 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
2c15234c 744 if (!aHolder) {
745 AliError(Form("There isn't configuration for detector: %s",
746 detector));
747 return NULL;
748 }
749
1d172743 750 return aHolder->GetDCSDataPoints(iServ);
751}
752
753//______________________________________________________________________________________________
754const TObjArray* AliShuttleConfig::GetCompactDCSAliases(const char* detector, Int_t iServ) const
755{
756 //
757 // returns collection of TObjString which represents the i-th set of aliases
758 // which used for data retrieval for particular detector (Compact style)
759 //
760
761 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
762 if (!aHolder) {
763 AliError(Form("There isn't configuration for detector: %s",
764 detector));
765 return NULL;
766 }
767
768 return aHolder->GetCompactDCSAliases(iServ);
769}
770
771//______________________________________________________________________________________________
772const TObjArray* AliShuttleConfig::GetCompactDCSDataPoints(const char* detector, Int_t iServ) const
773{
774 //
775 // returns collection of TObjString which represents the set of aliases
776 // which used for data retrieval for particular detector (Compact style)
777 //
778
779 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
780 if (!aHolder) {
781 AliError(Form("There isn't configuration for detector: %s",
782 detector));
783 return NULL;
784 }
785
786 return aHolder->GetCompactDCSDataPoints(iServ);
2c15234c 787}
788
789//______________________________________________________________________________________________
57c1a579 790const TObjArray* AliShuttleConfig::GetResponsibles(const char* detector) const
791{
792 //
793 // returns collection of TObjString which represents the list of mail addresses
794 // of the detector's responsible(s)
795 //
796
1d172743 797 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
57c1a579 798 if (!aHolder) {
799 AliError(Form("There isn't configuration for detector: %s",
800 detector));
801 return NULL;
802 }
803
804 return aHolder->GetResponsibles();
805}
806
807//______________________________________________________________________________________________
a7160fe9 808Bool_t AliShuttleConfig::HostProcessDetector(const char* detector) const
58bc3020 809{
b948db8d 810 // return TRUE if detector is handled by host or if fProcessAll is TRUE
811
812 if(fProcessAll) return kTRUE;
813 TIter iter(&fProcessedDetectors);
814 TObjString* detName;
815 while((detName = (TObjString*) iter.Next())){
816 if(detName->String() == detector) return kTRUE;
817 }
818 return kFALSE;
73abe331 819}
820
a7160fe9 821//______________________________________________________________________________________________
be48e3ea 822Bool_t AliShuttleConfig::StrictRunOrder(const char* detector) const
823{
824 // return TRUE if detector wants strict run ordering of stored data
825
1d172743 826 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
be48e3ea 827 if (!aHolder)
828 {
829 AliError(Form("There isn't configuration for detector: %s",
830 detector));
831 return kTRUE;
832 }
833
834 return aHolder->StrictRunOrder();
835}
836
837//______________________________________________________________________________________________
1d172743 838UInt_t AliShuttleConfig::SetGlobalConfig(TList* list)
839{
840 // Set the global configuration (DAQ Logbook + preprocessor monitoring settings)
841
842 TLDAPEntry* anEntry = 0;
843 TLDAPAttribute* anAttribute = 0;
844
845 if (list->GetEntries() == 0)
846 {
847 AliError("Global configuration not found!");
848 return 1;
849 }
850 else if (list->GetEntries() > 1)
851 {
852 AliError("More than one global configuration found!");
853 return 2;
854 }
855
856 anEntry = dynamic_cast<TLDAPEntry*> (list->At(0));
857
858 if (!anEntry)
859 {
860 AliError("Unexpected! Global list does not contain a TLDAPEntry");
861 return 3;
862 }
863
864
865 anAttribute = anEntry->GetAttribute("daqLbHost");
866 if (!anAttribute) {
867 AliError("Can't find daqLbHost attribute!");
868 return 4;
869 }
870 fDAQlbHost = anAttribute->GetValue();
871
872 anAttribute = anEntry->GetAttribute("daqLbPort"); // MAY
873 if (anAttribute)
874 {
875 fDAQlbPort = ((TString) anAttribute->GetValue()).Atoi();
876 } else {
877 fDAQlbPort = 3306; // mysql
878 }
879
880 anAttribute = anEntry->GetAttribute("daqLbUser");
881 if (!anAttribute) {
882 AliError("Can't find daqLbUser attribute!");
883 return 4;
884 }
885 fDAQlbUser = anAttribute->GetValue();
886
887 anAttribute = anEntry->GetAttribute("daqLbPasswd");
888 if (!anAttribute) {
889 AliError("Can't find daqLbPasswd attribute!");
890 return 4;
891 }
892 fDAQlbPass = anAttribute->GetValue();
893
894 anAttribute = anEntry->GetAttribute("daqLbDB");
895 if (!anAttribute) {
896 AliError("Can't find daqLbDB attribute!");
897 return 4;
898 }
899 fDAQlbDB = anAttribute->GetValue();
900
901 anAttribute = anEntry->GetAttribute("daqLbTable");
902 if (!anAttribute) {
903 AliError("Can't find daqLbTable attribute!");
904 return 4;
905 }
906 fDAQlbTable = anAttribute->GetValue();
907
908 anAttribute = anEntry->GetAttribute("shuttleLbTable");
909 if (!anAttribute) {
910 AliError("Can't find shuttleLbTable attribute!");
911 return 4;
912 }
913 fShuttlelbTable = anAttribute->GetValue();
914
915 anAttribute = anEntry->GetAttribute("runTypeLbTable");
916 if (!anAttribute) {
917 AliError("Can't find runTypeLbTable attribute!");
918 return 4;
919 }
920 fRunTypelbTable = anAttribute->GetValue();
921
922 anAttribute = anEntry->GetAttribute("ppmaxRetries");
923 if (!anAttribute) {
924 AliError("Can't find ppmaxRetries attribute!");
925 return 4;
926 }
927 TString tmpStr = anAttribute->GetValue();
928 fMaxRetries = tmpStr.Atoi();
929
930 anAttribute = anEntry->GetAttribute("ppTimeOut");
931 if (!anAttribute) {
932 AliError("Can't find ppTimeOut attribute!");
933 return 4;
934 }
935 tmpStr = anAttribute->GetValue();
936 fPPTimeOut = tmpStr.Atoi();
937
938 anAttribute = anEntry->GetAttribute("ppMaxMem");
939 if (!anAttribute) {
940 AliError("Can't find ppMaxMem attribute!");
941 return 4;
942 }
943 tmpStr = anAttribute->GetValue();
944 fPPMaxMem = tmpStr.Atoi();
945
946 return 0;
947
948
949}
950
951//______________________________________________________________________________________________
952UInt_t AliShuttleConfig::SetSysConfig(TList* list)
953{
954 // Set the online FXS configuration (DAQ + DCS + HLT)
955
956 TLDAPEntry* anEntry = 0;
957 TLDAPAttribute* anAttribute = 0;
958
959 if (list->GetEntries() != 3)
960 {
961 AliError(Form("Wrong number of online systems found: %d !", list->GetEntries()));
962 return 1;
963 }
964
965 TIter iter(list);
966 Int_t iSys=0, count = 0;
967 while ((anEntry = dynamic_cast<TLDAPEntry*> (iter.Next())))
968 {
969 anAttribute = anEntry->GetAttribute("system");
970 TString sysName = anAttribute->GetValue();
971
972 if (sysName == "DAQ")
973 {
974 iSys = 0;
975 count += 1;
976 }
977 else if (sysName == "DCS")
978 {
979 iSys = 1;
980 count += 10;
981 }
982 else if (sysName == "HLT")
983 {
984 iSys = 2;
985 count += 100;
986 }
987
988 anAttribute = anEntry->GetAttribute("dbHost");
989 if (!anAttribute) {
990 AliError(Form ("Can't find dbHost attribute for %s!!",
991 AliShuttleInterface::GetSystemName(iSys)));
992 return 5;
993 }
994 fFXSdbHost[iSys] = anAttribute->GetValue();
995
996 anAttribute = anEntry->GetAttribute("dbPort"); // MAY
997 if (anAttribute)
998 {
999 fFXSdbPort[iSys] = ((TString) anAttribute->GetValue()).Atoi();
1000 } else {
1001 fFXSdbPort[iSys] = 3306; // mysql
1002 }
1003
1004 anAttribute = anEntry->GetAttribute("dbUser");
1005 if (!anAttribute) {
1006 AliError(Form ("Can't find dbUser attribute for %s!!",
1007 AliShuttleInterface::GetSystemName(iSys)));
1008 return 5;
1009 }
1010 fFXSdbUser[iSys] = anAttribute->GetValue();
1011
1012 anAttribute = anEntry->GetAttribute("dbPasswd");
1013 if (!anAttribute) {
1014 AliError(Form ("Can't find dbPasswd attribute for %s!!",
1015 AliShuttleInterface::GetSystemName(iSys)));
1016 return 5;
1017 }
1018 fFXSdbPass[iSys] = anAttribute->GetValue();
1019
1020 anAttribute = anEntry->GetAttribute("dbName");
1021 if (!anAttribute) {
1022 AliError(Form ("Can't find dbName attribute for %s!!",
1023 AliShuttleInterface::GetSystemName(iSys)));
1024 return 5;
1025 }
1026
1027 fFXSdbName[iSys] = anAttribute->GetValue();
1028 anAttribute = anEntry->GetAttribute("dbTable");
1029 if (!anAttribute) {
1030 AliError(Form ("Can't find dbTable attribute for %s!!",
1031 AliShuttleInterface::GetSystemName(iSys)));
1032 return 5;
1033 }
1034 fFXSdbTable[iSys] = anAttribute->GetValue();
1035
1036 anAttribute = anEntry->GetAttribute("fxsHost");
1037 if (!anAttribute) {
1038 AliError(Form ("Can't find fxsHost attribute for %s!!",
1039 AliShuttleInterface::GetSystemName(iSys)));
1040 return 5;
1041 }
1042 fFXSHost[iSys] = anAttribute->GetValue();
1043
1044 anAttribute = anEntry->GetAttribute("fxsPort"); // MAY
1045 if (anAttribute)
1046 {
1047 fFXSPort[iSys] = ((TString) anAttribute->GetValue()).Atoi();
1048 } else {
1049 fFXSPort[iSys] = 22; // scp port number
1050 }
1051
1052 anAttribute = anEntry->GetAttribute("fxsUser");
1053 if (!anAttribute) {
1054 AliError(Form ("Can't find fxsUser attribute for %s!!",
1055 AliShuttleInterface::GetSystemName(iSys)));
1056 return 5;
1057 }
1058 fFXSUser[iSys] = anAttribute->GetValue();
1059
1060 anAttribute = anEntry->GetAttribute("fxsPasswd");
1061 if (anAttribute) fFXSPass[iSys] = anAttribute->GetValue();
1062 }
1063
1064 if(count != 111) {
1065 AliError(Form("Wrong system configuration! (code = %d)", count));
1066 return 6;
1067 }
1068
1069 return 0;
1070}
1071
1072//______________________________________________________________________________________________
1073UInt_t AliShuttleConfig::SetDetConfig(TList* detList, TList* dcsList)
1074{
1075 // Set the detector configuration (general settings + DCS amanda server and alias/DP lists)
1076
1077 TLDAPEntry* anEntry = 0;
1078
1079 TIter iter(detList);
1080 while ((anEntry = dynamic_cast<TLDAPEntry*> (iter.Next())))
1081 {
1082
1083 AliShuttleDetConfigHolder* detHolder = new AliShuttleDetConfigHolder(anEntry);
1084
1085 if (!detHolder->IsValid()) {
1086 AliError("Detector configuration error!");
1087 delete detHolder;
1088 return 7;
1089 }
1090
1091 TObjString* detStr = new TObjString(detHolder->GetDetector());
1092
1093 // Look for DCS Configuration
1094 TIter dcsIter(dcsList);
1095 TLDAPEntry *dcsEntry = 0;
1096 while ((dcsEntry = dynamic_cast<TLDAPEntry*> (dcsIter.Next())))
1097 {
1098 TString dn = dcsEntry->GetDn();
1099 if(dn.Contains(detStr->GetName())) {
1100 AliDebug(2, Form("Found DCS configuration: dn = %s",dn.Data()));
1101 AliShuttleDCSConfigHolder* dcsHolder = new AliShuttleDCSConfigHolder(dcsEntry);
1102 if (!dcsHolder->IsValid()) {
1103 AliError("DCS configuration error!");
1104 delete detHolder;
1105 delete dcsHolder;
1106 return 7;
1107 }
1108 detHolder->AddDCSConfig(dcsHolder);
1109 }
1110 }
1111
1112
1113 fDetectorMap.Add(detStr, detHolder);
1114 fDetectorList.AddLast(detStr);
1115 }
1116
1117 return 0;
1118}
1119
1120//______________________________________________________________________________________________
1121UInt_t AliShuttleConfig::SetHostConfig(TList* list)
1122{
1123 // Set the Shuttle machines configuration (which detectors processes each machine)
1124
1125 TLDAPEntry* anEntry = 0;
1126 TLDAPAttribute* anAttribute = 0;
1127
1128 fShuttleInstanceHost = gSystem->HostName();
1129
1130 TIter iter(list);
1131 while ((anEntry = dynamic_cast<TLDAPEntry*> (iter.Next())))
1132 {
1133
1134 TString dn(anEntry->GetDn());
1135 if (!dn.Contains(Form("shuttleHost=%s", fShuttleInstanceHost.Data()))) continue;
1136
1137 if (!fProcessAll)
1138 {
1139 anAttribute = anEntry->GetAttribute("detectors");
1140 const char *detName;
1141 while((detName = anAttribute->GetValue())){
1142 TObjString *objDet= new TObjString(detName);
1143 fProcessedDetectors.Add(objDet);
1144 }
1145 }
1146 }
1147
1148 return 0;
1149}
1150
1151
1152//______________________________________________________________________________________________
36c99a6a 1153void AliShuttleConfig::Print(Option_t* option) const
58bc3020 1154{
1155// print configuration
36c99a6a 1156// options : "": print configuration for all detectors, aliases and DPs in compacted format
1157// "uncompact": print configuration for all detectors, aliases and DPs in uncompacted format
1158// "DET": print configuration for DET, aliases and DPs in compacted format
1159// "DET, uncompact": print configuration for DET, aliases and DPs in uncompacted format
1160
73abe331 1161 TString result;
1162 result += '\n';
d477ad88 1163
57c1a579 1164 result += "####################################################\n";
1165 result += Form(" Shuttle configuration from %s \n", fConfigHost.Data());
1166 result += "####################################################\n";
1167 result += Form("\nShuttle running on %s \n", fShuttleInstanceHost.Data());
57f50b3c 1168
1169 if(fProcessAll) {
57c1a579 1170 result += Form("All detectors will be processed! \n");
57f50b3c 1171 } else {
1172 result += "Detectors processed by this host: ";
1173 TIter it(&fProcessedDetectors);
1174 TObjString* aDet;
1175 while ((aDet = (TObjString*) it.Next())) {
1176 result += Form("%s ", aDet->String().Data());
1177 }
57c1a579 1178 result += "\n";
b948db8d 1179 }
b948db8d 1180
1d172743 1181 result += Form("PP time out = %d - max PP mem size = %d KB - max retries = %d\n\n",
1182 fPPTimeOut, fPPMaxMem, fMaxRetries);
57c1a579 1183 result += "------------------------------------------------------\n";
2bb7b766 1184
57c1a579 1185 result += Form("Logbook Configuration \n\n \tHost: %s:%d; \tUser: %s; ",
fc5a4708 1186 fDAQlbHost.Data(), fDAQlbPort, fDAQlbUser.Data());
b948db8d 1187
2c15234c 1188// result += "Password: ";
1189// result.Append('*', fDAQlbPass.Length());
441b0e9c 1190 result += Form("\tDB: %s; \tTables: %s, %s, %s",
1191 fDAQlbDB.Data(), fDAQlbTable.Data(), fShuttlelbTable.Data(), fRunTypelbTable.Data());
2c15234c 1192
57f50b3c 1193 result += "\n\n";
1194
57c1a579 1195 result += "------------------------------------------------------\n";
1196 result += "FXS configuration\n\n";
1197
57f50b3c 1198 for(int iSys=0;iSys<3;iSys++){
57c1a579 1199 result += Form("*** %s ***\n", AliShuttleInterface::GetSystemName(iSys));
fc5a4708 1200 result += Form("\tDB host: %s:%d; \tUser: %s; \tName: %s; \tTable: %s\n",
1201 fFXSdbHost[iSys].Data(), fFXSdbPort[iSys], fFXSdbUser[iSys].Data(),
2c15234c 1202 fFXSdbName[iSys].Data(), fFXSdbTable[iSys].Data());
1203 // result += Form("DB Password:",fFXSdbPass[iSys].Data());
fc5a4708 1204 result += Form("\tFXS host: %s:%d; \tUser: %s\n\n", fFXSHost[iSys].Data(), fFXSPort[iSys],
1205 fFXSUser[iSys].Data());
2c15234c 1206 // result += Form("FXS Password:",fFXSPass[iSys].Data());
57f50b3c 1207 }
b948db8d 1208
36c99a6a 1209 TString optStr(option);
1210
57c1a579 1211 result += "------------------------------------------------------\n";
1212 result += "Detector-specific configuration\n\n";
1d172743 1213
73abe331 1214 TIter iter(fDetectorMap.GetTable());
1d172743 1215 TPair* aPair = 0;
1216
73abe331 1217 while ((aPair = (TPair*) iter.Next())) {
1d172743 1218 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) aPair->Value();
1219 if (optStr != "" && !optStr.Contains(aHolder->GetDetector()) &&
1220 optStr.CompareTo("uncompact",TString::kIgnoreCase) != 0 )
36c99a6a 1221 continue;
1d172743 1222
57c1a579 1223 result += Form("*** %s *** \n", aHolder->GetDetector());
1224
1225 const TObjArray* responsibles = aHolder->GetResponsibles();
1226 if (responsibles->GetEntries() != 0)
1227 {
1228 result += "\tDetector responsible(s): ";
1229 TIter it(responsibles);
1230 TObjString* aResponsible;
1231 while ((aResponsible = (TObjString*) it.Next()))
1232 {
1233 result += Form("%s ", aResponsible->String().Data());
1234 }
1235 result += "\n";
1236 }
1237
1d172743 1238 result += Form("\tStrict run ordering: %s \n\n", aHolder->StrictRunOrder() ? "YES" : "NO");
1239
1240 const TObjArray* dcsConfig = aHolder->GetDCSConfig();
1241
1242 AliShuttleDCSConfigHolder* dcsHolder = 0;
1243 TIter dcsIter(dcsConfig);
1244 Int_t count=0;
1245 while ((dcsHolder = dynamic_cast<AliShuttleDCSConfigHolder*> (dcsIter.Next())))
be48e3ea 1246 {
542b6cc8 1247 result += Form("\tAmanda server [%d]: %s:%d - MultiSplit = %d\n", count,
1248 dcsHolder->GetDCSHost(), dcsHolder->GetDCSPort(), dcsHolder->GetMultiSplit());
57f50b3c 1249
1d172743 1250 const TObjArray* aliases = 0;
1251 if (optStr.Contains("uncompact",TString::kIgnoreCase))
1252 {
1253 aliases = dcsHolder->GetDCSAliases();
1254 } else {
1255 aliases = dcsHolder->GetCompactDCSAliases();
1256 }
36c99a6a 1257
1d172743 1258 if (aliases->GetEntries() != 0)
2c15234c 1259 {
1d172743 1260 result += Form("\tDCS Aliases [%d]: ", count);
1261 TIter it(aliases);
1262 TObjString* anAlias;
1263 while ((anAlias = (TObjString*) it.Next()))
1264 {
1265 result += Form("%s ", anAlias->String().Data());
1266 }
1267 result += "\n";
2c15234c 1268 }
57f50b3c 1269
1d172743 1270 const TObjArray* dataPoints = 0;
1271 if (optStr.Contains("uncompact",TString::kIgnoreCase))
1272 {
1273 dataPoints = dcsHolder->GetDCSDataPoints();
1274 } else {
1275 dataPoints = dcsHolder->GetCompactDCSDataPoints();
2c15234c 1276 }
1d172743 1277 if (dataPoints->GetEntries() != 0)
1278 {
1279 result += Form("\tDCS Data Points [%d]: ", count);
1280 TIter it(dataPoints);
1281 TObjString* aDataPoint;
1282 while ((aDataPoint = (TObjString*) it.Next())) {
1283 result += Form("%s ", aDataPoint->String().Data());
1284 }
2c15234c 1285 result += "\n";
1d172743 1286 }
1287 count++;
1288 result += "\n";
2c15234c 1289 }
73abe331 1290 }
57f50b3c 1291 if(!fIsValid) result += "\n\n********** !!!!! Configuration is INVALID !!!!! **********\n";
1292
73abe331 1293 AliInfo(result);
1294}