AliRoot Core  v5-06-15 (45dab64)
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AliMUONPainterEnv.cxx
Go to the documentation of this file.
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 // $Id$
17 
18 #include "AliMUONPainterEnv.h"
19 
20 #include <TEnv.h>
21 #include <TSystem.h>
22 #include "TObjString.h"
23 #include "TObjArray.h"
24 #include "Riostream.h"
25 #include "AliLog.h"
26 #include <cassert>
27 #include <limits>
28 
85 
89 
90 const char* AliMUONPainterEnv::fgkNumberOfDataSourcesKey = "NumberOfDataSources";
91 const char* AliMUONPainterEnv::fgkDataSourceKey = "DataSource.%d";
92 const char* AliMUONPainterEnv::fgkDefaultRangeKey = "defaultRange";
93 const char* AliMUONPainterEnv::fgkDisableAutoPedCanvasKey = "disableAutoPedCanvas";
94 const char* AliMUONPainterEnv::fgkSeparatorWithinRange = "/";
95 const char* AliMUONPainterEnv::fgkSeparatorWithinPart = "|";
96 const char* AliMUONPainterEnv::fgkSeparatorBetweenDescriptorParts=";";
97 
98 //_____________________________________________________________________________
99 AliMUONPainterEnv::AliMUONPainterEnv(const char* resourceFile)
100 : fEnv(new TEnv(resourceFile))
101 {
103 
104  if ( String(fgkDisableAutoPedCanvasKey,"").Length()==0 )
105  {
106  // no default for that one, assume it should be 1
107  Set(fgkDisableAutoPedCanvasKey,1);
108  }
109 
110  if ( String(fgkDefaultRangeKey,"").Length()==0 )
111  {
112  // no default ranges defined at all, let's make some reasonable guesses
113 
114  AliInfo("No default ranges defined in the resource file, generating a few...");
115 
116  SetDefaultRange("PED","Mean",0.0,500.0);
117  SetDefaultRange("PED","Sigma",0.0,5.0);
118  SetDefaultRange("OCC","occ",0.0,0.01);
119  SetDefaultRange("HV","Mean of HV",0,1650);
120 
121  Save();
122  }
123 }
124 
125 //_____________________________________________________________________________
127 {
129 }
130 
131 //_____________________________________________________________________________
132 TString AliMUONPainterEnv::AddDataSource(const char* dataSourceDescriptor)
133 {
136 
137  TString name = Descriptor2Name(dataSourceDescriptor);
138  TString sid = Descriptor2ID(dataSourceDescriptor);
139  TString uri = ID2URI(sid);
140 
141  for ( Int_t i = 0; i < NumberOfDataSources(); ++i )
142  {
143  TString desc = DataSourceDescriptor(i);
144  TString sid = Descriptor2ID(desc);
145  TString urii = ID2URI(sid);
146 
147  if ( name == Descriptor2Name(desc) && uri == urii )
148  {
149  // already there, just replace
150  Set(Form(fgkDataSourceKey,i),dataSourceDescriptor);
151  return dataSourceDescriptor;
152  }
153  }
154 
155  // new source
156 
157  Int_t n = NumberOfDataSources();
158 
160 
161  Set(Form(fgkDataSourceKey,n),dataSourceDescriptor);
162 
164 
165  Save();
166 
167  return DataSourceDescriptor(name);
168 }
169 
170 //_____________________________________________________________________________
171 TString AliMUONPainterEnv::DataSourceDescriptor(Int_t index) const
172 {
173  if ( index >= 0 && index < NumberOfDataSources() )
174  {
175  return String(Form(fgkDataSourceKey,index),"");
176  }
177  return "";
178 }
179 
180 //_____________________________________________________________________________
181 TString AliMUONPainterEnv::DataSourceDescriptor(const char* dataSourceName) const
182 {
183  Int_t index = GetDataSourceIndex(dataSourceName);
184  return DataSourceDescriptor(index);
185 }
186 
187 //_____________________________________________________________________________
188 TString AliMUONPainterEnv::DataSourceID(const char* dataSourceName) const
189 {
190  return Descriptor2ID(DataSourceDescriptor(dataSourceName));
191 }
192 
193 //_____________________________________________________________________________
194 TString AliMUONPainterEnv::DataSourceName(const char* dataSourceName) const
195 {
196  return Descriptor2Name(DataSourceDescriptor(dataSourceName));
197 }
198 
199 //_____________________________________________________________________________
200 TString AliMUONPainterEnv::DataSourceOrigin(const char* dataSourceName) const
201 {
202  return ID2Origin(DataSourceID(dataSourceName));
203 }
204 
205 //_____________________________________________________________________________
206 TString AliMUONPainterEnv::DataSourceRanges(const char* dataSourceName) const
207 {
208  return Descriptor2Ranges(DataSourceDescriptor(dataSourceName));
209 }
210 
211 //_____________________________________________________________________________
212 TString AliMUONPainterEnv::DataSourceType(const char* dataSourceName) const
213 {
214  return ID2Type(DataSourceID(dataSourceName));
215 }
216 
217 //_____________________________________________________________________________
218 TString AliMUONPainterEnv::DataSourceURI(const char* dataSourceName) const
219 {
220  return ID2URI(DataSourceID(dataSourceName));
221 }
222 
223 //_____________________________________________________________________________
224 TString AliMUONPainterEnv::Descriptor2Name(const char* dataSourceDescriptor)
225 {
227 
228  TString rv;
229 
230  TObjArray* a = TString(dataSourceDescriptor).Tokenize(fgkSeparatorBetweenDescriptorParts);
231  if ( a->GetLast() >= 1 )
232  {
233  rv = static_cast<TObjString*>(a->At(1))->String();
234  }
235  delete a;
236  return rv;
237 }
238 
239 //_____________________________________________________________________________
240 TString AliMUONPainterEnv::Descriptor2Ranges(const char* dataSourceDescriptor)
241 {
243 
244  return TupleLast(dataSourceDescriptor,fgkSeparatorBetweenDescriptorParts);
245 }
246 
247 
248 //_____________________________________________________________________________
249 TString AliMUONPainterEnv::Descriptor2ID(const char* dataSourceDescriptor)
250 {
252 
253  return TupleFirst(dataSourceDescriptor,fgkSeparatorBetweenDescriptorParts);
254 }
255 
256 //_____________________________________________________________________________
257 Double_t
258 AliMUONPainterEnv::Double(const char* resourceName, Double_t defaultValue) const
259 {
261 
262  return fEnv->GetValue(resourceName,defaultValue);
263 }
264 
265 //__________________________________________________________________________________________________
266 void AliMUONPainterEnv::ForceDataSourceToDefaultRange(const char* dataSourceName, const char* dimensionName)
267 {
268  TString desc = DataSourceDescriptor(dataSourceName);
269 
270  if ( desc.Length()==0 )
271  {
272  AliError(Form("Could not find data source named : %s",dataSourceName));
273  return;
274  }
275 
276  TString dsname = Descriptor2Name(desc);
277 
278  assert(dsname==dataSourceName);
279 
280  TString dataSourceType = DataSourceType(dataSourceName);
281 
282  TString newDescriptor = Descriptor2ID(desc);
283 
284  newDescriptor += fgkSeparatorBetweenDescriptorParts;
285  newDescriptor += dsname;
286 
287  // at this stage the descriptor is back to "URI NAME"
288  // now we add the existing ranges and replace the one corresponding to dim
289  // (or all if dim="") by the default range(s) (if any is defined)
290 
291  newDescriptor += fgkSeparatorBetweenDescriptorParts;
292 
293  if ( strlen(dimensionName) == 0 )
294  {
295  // use all the default ranges for this data source
296  TString defaultRange = GetDefaultRange(dataSourceType,"");
297  newDescriptor += defaultRange;
298  }
299  else
300  {
301  // replace only the default range for dimensionName
302  TString ranges = DataSourceRanges(dataSourceName);
303 
304  TObjArray* r = ranges.Tokenize(fgkSeparatorWithinPart);
305  TString defaultRange = GetDefaultRange(dataSourceType,dimensionName);
306 
307  for ( Int_t i = 0; i <= r->GetLast(); ++i )
308  {
309  TObjString* sr = static_cast<TObjString*>(r->At(i));
310 
311  TString val = sr->String();
312 
313  if ( TupleFirst(sr->String(),fgkSeparatorWithinRange)==dimensionName )
314  {
315  if ( defaultRange.Length() )
316  {
317  val = defaultRange;
318  }
319  }
320  newDescriptor += fgkSeparatorWithinPart;
321  newDescriptor += val;
322  }
323 
324  delete r;
325  }
326 
327  Int_t index = GetDataSourceIndex(dataSourceName);
328 
329  Set(Form(fgkDataSourceKey,index),newDescriptor.Data());
330 }
331 
332 //_____________________________________________________________________________
333 Int_t AliMUONPainterEnv::GetDataSourceIndex(const char* dataSourceName) const
334 {
335  for ( Int_t i = 0; i < NumberOfDataSources(); ++i )
336  {
337  TString desc = DataSourceDescriptor(i);
338 
339  if ( Descriptor2Name(desc) == dataSourceName )
340  {
341  return i;
342  }
343  }
344  return -1;
345 }
346 
347 //_____________________________________________________________________________
348 TString
349 AliMUONPainterEnv::GetDefaultRange(const char* dataSourceType, const char* dimensionName) const
350 {
353 
354  TString defaultRanges = String(fgkDefaultRangeKey,"");
355 
356  TString rv;
357 
358  TObjArray* r = defaultRanges.Tokenize(fgkSeparatorWithinPart);
359 
360  for ( Int_t ir = 0; ir <= r->GetLast(); ++ir )
361  {
362  TObjString* s = static_cast<TObjString*>(r->At(ir));
363 
364  TObjArray* a = s->String().Tokenize(fgkSeparatorWithinRange);
365  if ( a->GetLast() != 3 )
366  {
367  AliError(Form("Malformed %s string : %s",fgkDefaultRangeKey,s->String().Data()));
368  continue;
369  }
370 
371  TString typeName = static_cast<TObjString*>(a->At(0))->String();
372 
373  if (typeName==dataSourceType)
374  {
375  TString dimName = static_cast<TObjString*>(a->At(1))->String();
376 
377  if ( dimName == dimensionName || strlen(dimensionName) == 0 )
378  {
379  for ( Int_t i = 1; i <= 3; ++i )
380  {
381  rv += static_cast<TObjString*>(a->At(i))->String();
382  if ( i < 3 )
383  {
385  }
386  }
387  if ( ir < r->GetLast() )
388  {
390  }
391  }
392  }
393  delete a;
394  }
395 
396  delete r;
397 
398  return rv;
399 }
400 
401 //_____________________________________________________________________________
402 TString AliMUONPainterEnv::ID2Origin(const char* dataSourceID)
403 {
405  return TupleFirst(dataSourceID,fgkSeparatorWithinPart);
406 }
407 
408 //_____________________________________________________________________________
409 TString AliMUONPainterEnv::ID2URI(const char* dataSourceID)
410 {
412  return TupleMiddle(dataSourceID,fgkSeparatorWithinPart);
413 }
414 
415 //_____________________________________________________________________________
416 TString AliMUONPainterEnv::ID2Type(const char* dataSourceID)
417 {
419  return TupleLast(dataSourceID,fgkSeparatorWithinPart);
420 }
421 
422 //_____________________________________________________________________________
423 Int_t
424 AliMUONPainterEnv::Integer(const char* resourceName, Int_t defaultValue) const
425 {
427 
428  return fEnv->GetValue(resourceName,defaultValue);
429 }
430 
431 //_____________________________________________________________________________
432 Int_t
434 {
436 }
437 
438 //_____________________________________________________________________________
439 void
440 AliMUONPainterEnv::Print(Option_t* opt) const
441 {
442  fEnv->Print(opt);
443 }
444 
445 //_____________________________________________________________________________
447  const char* dimensionName,
448  Double_t& xmin,
449  Double_t& xmax)
450 {
451  xmin = std::numeric_limits<double>::max();
452  xmax = std::numeric_limits<double>::min();
453 
454  TString dims;
455 
456  TObjArray* a = TString(ranges).Tokenize(fgkSeparatorWithinPart);
457 
458  for ( Int_t i = 0; i <= a->GetLast(); ++i )
459  {
460  TString drange = static_cast<TObjString*>(a->At(i))->String();
461  // drange should be of the form dimname/xmin/xmax
462 
463  TString bname = TupleFirst(drange,fgkSeparatorWithinRange);
464 
465  if ( bname == dimensionName )
466  {
467  xmin = TupleMiddle(drange,fgkSeparatorWithinRange).Atof();
468  xmax = TupleLast(drange,fgkSeparatorWithinRange).Atof();
469  break;
470  }
471  }
472 
473  return (xmin<xmax);
474 }
475 
476 //_____________________________________________________________________________
477 void
479 {
481  fEnv->WriteFile(gSystem->ExpandPathName(Form("$HOME/%s",fEnv->GetRcName())));
482 }
483 
484 //_____________________________________________________________________________
485 void
486 AliMUONPainterEnv::Set(const char* resourceName, Int_t value)
487 {
489  fEnv->SetValue(resourceName,Form("%d",value));
490 }
491 
492 //_____________________________________________________________________________
493 void
494 AliMUONPainterEnv::Set(const char* resourceName, const char* value)
495 {
497  fEnv->SetValue(resourceName,value);
498 }
499 
500 //_____________________________________________________________________________
501 void
502 AliMUONPainterEnv::Set(const char* resourceName, Double_t value)
503 {
505 
506  fEnv->SetValue(resourceName,Form("%g",value));
507 }
508 
509 //_____________________________________________________________________________
510 void AliMUONPainterEnv::SetDefaultRange(const char* dataSourceType, const char* dimensionName,
511  Double_t xmin, Double_t xmax)
512 {
514 
515  TString defaultRanges = String(fgkDefaultRangeKey,"");
516 
517  TObjArray* a = defaultRanges.Tokenize(fgkSeparatorWithinPart);
518  TString newRange;
519  TString def = Form("%s%s%s%s%g%s%g",
520  dataSourceType,fgkSeparatorWithinRange,
521  dimensionName,fgkSeparatorWithinRange,
523  xmax);
524  Bool_t replace(kFALSE);
525 
526  for ( Int_t i = 0 ; i<= a->GetLast(); ++i )
527  {
528  TObjString* s = static_cast<TObjString*>(a->At(i));
529 
530  TString dim = TupleSecond(s->String(),fgkSeparatorWithinRange);
531 
532  if ( dim == dimensionName )
533  {
534  replace = kTRUE;
535  newRange += Form("%s%s%s%s%g%s%g",
536  dataSourceType,fgkSeparatorWithinRange,
537  dimensionName,fgkSeparatorWithinRange,
539  xmax);
540  }
541  else
542  {
543  newRange += s->String();
544  }
545 
546  newRange += fgkSeparatorWithinPart;
547  }
548 
549  if (!replace)
550  {
551  newRange += def;
552  }
553 
554  delete a;
555 
556  Set(fgkDefaultRangeKey,newRange.Data());
557 }
558 
559 //_____________________________________________________________________________
560 void AliMUONPainterEnv::SetDimensionRange(const char* dataSourceName, const char* dimensionName, Double_t xmin, Double_t xmax)
561 {
563 
564  TString desc = DataSourceDescriptor(dataSourceName);
565  TString name = Descriptor2Name(desc);
566  TString oldRanges = Descriptor2Ranges(desc);
567 
568  TObjArray* a = oldRanges.Tokenize(fgkSeparatorWithinPart);
569 
570  TString newRanges;
571 
572  for ( Int_t i = 0; i <= a->GetLast(); ++i )
573  {
574  TString drange = static_cast<TObjString*>(a->At(i))->String();
575  // drange should be of the form dimname/xmin/xmax
576 
577  TString bname = TupleFirst(drange,fgkSeparatorWithinRange);
578 
579  if ( bname == dimensionName )
580  {
581  newRanges += Form("%s%s%g%s%g",bname.Data(),fgkSeparatorWithinRange,
582  xmin,fgkSeparatorWithinRange,xmax);
583  }
584  else
585  {
586  newRanges += drange;
587  }
588  if ( i < a->GetLast() )
589  {
590  newRanges += fgkSeparatorWithinPart;
591  }
592  }
593 
594  delete a;
595 
596  AliInfo(Form("oldRanges=%s desc=%s newRanges=%s",oldRanges.Data(),desc.Data(),newRanges.Data()));
597 
598  AddDataSource(Form("%s%s%s%s%s",Descriptor2ID(desc).Data(),
600  name.Data(),
602  newRanges.Data()));
603 }
604 
605 //_____________________________________________________________________________
606 TString
607 AliMUONPainterEnv::String(const char* resourceName, const char* defaultValue) const
608 {
610 
611  return fEnv->GetValue(resourceName,defaultValue);
612 }
613 
614 //_____________________________________________________________________________
615 TString AliMUONPainterEnv::TupleFirst(const TString& tuple, const char* sep)
616 {
618  Ssiz_t index = tuple.First(sep[0]);
619  return tuple(0,index);
620 }
621 
622 //_____________________________________________________________________________
623 TString AliMUONPainterEnv::TupleSecond(const TString& tuple, const char* sep)
624 {
626  return TupleFirst(TupleMiddle(tuple,sep),sep);
627 }
628 
629 //_____________________________________________________________________________
630 TString AliMUONPainterEnv::TupleMiddle(const TString& tuple, const char* sep)
631 {
633  Ssiz_t i1 = tuple.First(sep[0]);
634  Ssiz_t i2 = tuple.Last(sep[0]);
635  return tuple(i1+1,i2-1);
636 }
637 
638 //_____________________________________________________________________________
639 TString AliMUONPainterEnv::TupleLast(const TString& tuple, const char* sep)
640 {
642  Ssiz_t index = tuple.Last(sep[0]);
643  return tuple(index+1,tuple.Length()-index-1);
644 }
645 
Double_t Double(const char *resourceName, Double_t defaultValue=0.0) const
static TString TupleMiddle(const TString &tuple, const char *sep)
Int_t NumberOfDataSources() const
static TString ID2Type(const char *dataSourceID)
#define TObjArray
static const char * fgkSeparatorWithinRange
static const char * fgkDefaultRangeKey
key used to specify the default ranges for data representation
static TString TupleSecond(const TString &tuple, const char *sep)
static const char * fgkSeparatorWithinPart
TString AddDataSource(const char *dataSourceDescriptor)
TString String(const char *resourceName, const char *defaultValue="") const
void SetDefaultRange(const char *dataSourceType, const char *dimensionName, Double_t xmin, Double_t xmax)
TString DataSourceType(const char *dataSourceName) const
Resource file handling.
ClassImp(TPCGenInfo)
Definition: AliTPCCmpNG.C:254
static TString TupleLast(const TString &tuple, const char *sep)
static TString Descriptor2Ranges(const char *dataSourceDescriptor)
static const char * fgkNumberOfDataSourcesKey
key used to store the # of data sources in the resource file
static TString TupleFirst(const TString &tuple, const char *sep)
Int_t Integer(const char *resourceName, Int_t defaultValue=0) const
Int_t GetDataSourceIndex(const char *dataSourceName) const
void SetDimensionRange(const char *dataSourceName, const char *dimensionName, Double_t xmin, Double_t xmax)
static TString ID2Origin(const char *dataSourceID)
TString DataSourceID(const char *dataSourceName) const
TString DataSourceURI(const char *dataSourceName) const
TString DataSourceDescriptor(const char *dataSourceName) const
TString GetDefaultRange(const char *dataSourceType, const char *dimensionName) const
static TString Descriptor2Name(const char *dataSourceDescriptor)
TString DataSourceName(const char *dataSourceName) const
void Print(Option_t *opt="") const
TString DataSourceRanges(const char *dataSourceName) const
TEnv * fEnv
the worker class
static Bool_t Ranges2DimensionRange(const char *ranges, const char *dimensionName, Double_t &xmin, Double_t &xmax)
static TString ID2URI(const char *dataSourceID)
static const char * fgkDataSourceKey
key used to store the data source URIs in the resource file
static const char * fgkSeparatorBetweenDescriptorParts
TString DataSourceOrigin(const char *dataSourceName) const
void Set(const char *resourceName, Int_t value)
static TString Descriptor2ID(const char *dataSourceDescriptor)
void ForceDataSourceToDefaultRange(const char *dataSourceName, const char *dim="")