ROOT logo
//*-- AUTHOR : Ilse Koenig
//*-- Created : 16/08/2004 by Ilse Koenig

//_HADES_CLASS_DESCRIPTION 
////////////////////////////////////////////////////////////////////////////////////////
//
// HOraSlowManager
//
// Manager class to access the slowcontrol data in Oracle
// (Singleton with global pointer gHOraSlowManager)
//
// It allows to read and draw the raw and summary data for a list of channels in a
// specified time range.
//
// See documentation and example macros in Wiki, topic OracleEpicsArchiveHydraInterface
//
////////////////////////////////////////////////////////////////////////////////////////

#include "horaslowmanager.h"
#include "horaslowpartition.h"
#include "horaslowchannel.h"
#include "horaslowreader.h"
#include "TObjString.h"

ClassImp(HOraSlowManager)

HOraSlowManager::HOraSlowManager() {
  // Default constructor
  gHOraSlowManager=this;
  partition=0;
  hldfileFilter=0;
  oraUser="HADES_ANA";
  dbName="db-hades";
}

HOraSlowManager::~HOraSlowManager() {
  // Destructor
  channels.Delete();
  clearHldfileFilter();
  if (partition) {
    delete partition;
    partition=0;
  }
  gHOraSlowManager=0;
}

HOraSlowPartition* HOraSlowManager::setPartition(const Char_t* pName,
                   const Char_t* t1,const Char_t* t2) {
  // Sets the data partition and the time range t1 - t2 (typically smaller then the time range of the partition)
  // Dates must be specified in the format yyyy-mm-dd hh:mi:ss.
  // If no time range is specified, the data of the whole partition will be read.
  Int_t t1len=strlen(t1);
  Int_t t2len=strlen(t2);
  Bool_t wrongFormat=kFALSE;
  if (t1len>0) {
    if (t1len<10||t1[4]!='-'||t1[7]!='-') wrongFormat=kTRUE;
  }
  if (wrongFormat==kFALSE&&t2len>0) {
    if (t2len<10||t2[4]!='-'||t2[7]!='-') wrongFormat=kTRUE;
  }
  if (wrongFormat) {
    Error("setPartition","Dates must be specified in date format yyyy-mm-dd hh:mi:ss");
    return 0;
  }
  TString name(pName);
  name.ToLower();
  if (partition&&name!=partition->GetName()) {
    delete partition;
  }
  if (!partition) partition=new HOraSlowPartition(name);
  partition->setTimeRange(t1,t2);
  TIter next(&channels);
  HOraSlowChannel* p=0;
  while((p=(HOraSlowChannel*)next())) {
    p->setPartition(partition);
  }
  return partition;  
}

HOraSlowChannel* HOraSlowManager::addChannel(const Char_t* name) {
  // Adds a channel to the list of channels
  HOraSlowChannel* p=getChannel(name);
  if (p==0) {
    p=new HOraSlowChannel(name);
    p->setPartition(partition);
    channels.Add(p);
  }
  return p;  
}

void HOraSlowManager::removeChannel(const Char_t* name) {
  // Removes a channel from the list of channels
  TObject* p=channels.FindObject(name);
  if (p) {
    channels.Remove(p);
    delete p;
  }
}

void HOraSlowManager::removeAllChannels() {
  // Removes all channels from the list of channels 
  channels.Delete();
}

HOraSlowChannel* HOraSlowManager::getChannel(const Char_t* name) {
  // Returns a pointer to the channel objects specified by name
  return (HOraSlowChannel*)(channels.FindObject(name));
}

void HOraSlowManager::addHldfileFilter(const Char_t* s) {
  // Adds a hld-file to the list of hld-files to be applied as filter for output and drawing
  if (!hldfileFilter) hldfileFilter=new TList();
  hldfileFilter->Add(new TObjString(s));
}

void HOraSlowManager::clearHldfileFilter() {
  // Clears the hld-file filter
  if (hldfileFilter) {
    hldfileFilter->Delete();
    delete hldfileFilter;
    hldfileFilter=0;
  }
}

Bool_t HOraSlowManager::readArchiverRates() {
  // Reads the rates of the channel archiver 
  if (!partition) {
    Error("readArchiverRates","No partition defined!");
    return kFALSE;
  }
  Bool_t rc=partition->openOraInput();
  if (!rc) return rc;
  return partition->getOraReader()->readArchiverRates();
}

Bool_t HOraSlowManager::readSummary() {
  // Reads the summary information for all channels
  if (!partition) {
    Error("readSummary","No partition defined!");
    return kFALSE;
  }
  Bool_t rc=partition->openOraInput();
  HOraSlowReader* pOraReader=partition->getOraReader();
  if (!rc) return rc;
  if (!partition->getRunPeriods()) {
    rc=pOraReader->readRunPeriods();
  }  
  if (!rc) return rc;
  partition->setHldFileFilter(hldfileFilter);
  HOraSlowChannel* ch=0;
  TListIter iter(&channels);
  while((ch=(HOraSlowChannel*)iter.Next())&&rc) {
    rc=pOraReader->readChannelMetaData(ch);
    if (!rc) break;
    rc=pOraReader->readChannelRunSum(ch);
  }
  return rc;
}

void HOraSlowManager::writeSummaryToAscii(const Char_t* filename,Int_t opt) {
  // Writes the periods and the channel summary information to an ASCII file
  // option opt 0 = all periods
  //            1 = only hld-files
  //            2 = apply hld-file filter
  if (strlen(filename)==0||partition==0) return;
  fstream file;
  file.open(filename,ios::out);
  if (file.rdbuf()->is_open()==0) {
    Error("open","Failed to open file %s",filename);
    return;
  }
  partition->write(file,opt);
  HOraSlowChannel* ch=0;
  TListIter iter(&channels);
  while((ch=(HOraSlowChannel*)iter.Next())) {
    ch->writeMetaData(file);
    ch->writeRunSumData(file,opt);
  }
  file.close();
  cout<<"Data of partition "<<partition->GetName()
      <<" written to ASCII file"<<endl;
}

HOraSlowManager* gHOraSlowManager;
 horaslowmanager.cc:1
 horaslowmanager.cc:2
 horaslowmanager.cc:3
 horaslowmanager.cc:4
 horaslowmanager.cc:5
 horaslowmanager.cc:6
 horaslowmanager.cc:7
 horaslowmanager.cc:8
 horaslowmanager.cc:9
 horaslowmanager.cc:10
 horaslowmanager.cc:11
 horaslowmanager.cc:12
 horaslowmanager.cc:13
 horaslowmanager.cc:14
 horaslowmanager.cc:15
 horaslowmanager.cc:16
 horaslowmanager.cc:17
 horaslowmanager.cc:18
 horaslowmanager.cc:19
 horaslowmanager.cc:20
 horaslowmanager.cc:21
 horaslowmanager.cc:22
 horaslowmanager.cc:23
 horaslowmanager.cc:24
 horaslowmanager.cc:25
 horaslowmanager.cc:26
 horaslowmanager.cc:27
 horaslowmanager.cc:28
 horaslowmanager.cc:29
 horaslowmanager.cc:30
 horaslowmanager.cc:31
 horaslowmanager.cc:32
 horaslowmanager.cc:33
 horaslowmanager.cc:34
 horaslowmanager.cc:35
 horaslowmanager.cc:36
 horaslowmanager.cc:37
 horaslowmanager.cc:38
 horaslowmanager.cc:39
 horaslowmanager.cc:40
 horaslowmanager.cc:41
 horaslowmanager.cc:42
 horaslowmanager.cc:43
 horaslowmanager.cc:44
 horaslowmanager.cc:45
 horaslowmanager.cc:46
 horaslowmanager.cc:47
 horaslowmanager.cc:48
 horaslowmanager.cc:49
 horaslowmanager.cc:50
 horaslowmanager.cc:51
 horaslowmanager.cc:52
 horaslowmanager.cc:53
 horaslowmanager.cc:54
 horaslowmanager.cc:55
 horaslowmanager.cc:56
 horaslowmanager.cc:57
 horaslowmanager.cc:58
 horaslowmanager.cc:59
 horaslowmanager.cc:60
 horaslowmanager.cc:61
 horaslowmanager.cc:62
 horaslowmanager.cc:63
 horaslowmanager.cc:64
 horaslowmanager.cc:65
 horaslowmanager.cc:66
 horaslowmanager.cc:67
 horaslowmanager.cc:68
 horaslowmanager.cc:69
 horaslowmanager.cc:70
 horaslowmanager.cc:71
 horaslowmanager.cc:72
 horaslowmanager.cc:73
 horaslowmanager.cc:74
 horaslowmanager.cc:75
 horaslowmanager.cc:76
 horaslowmanager.cc:77
 horaslowmanager.cc:78
 horaslowmanager.cc:79
 horaslowmanager.cc:80
 horaslowmanager.cc:81
 horaslowmanager.cc:82
 horaslowmanager.cc:83
 horaslowmanager.cc:84
 horaslowmanager.cc:85
 horaslowmanager.cc:86
 horaslowmanager.cc:87
 horaslowmanager.cc:88
 horaslowmanager.cc:89
 horaslowmanager.cc:90
 horaslowmanager.cc:91
 horaslowmanager.cc:92
 horaslowmanager.cc:93
 horaslowmanager.cc:94
 horaslowmanager.cc:95
 horaslowmanager.cc:96
 horaslowmanager.cc:97
 horaslowmanager.cc:98
 horaslowmanager.cc:99
 horaslowmanager.cc:100
 horaslowmanager.cc:101
 horaslowmanager.cc:102
 horaslowmanager.cc:103
 horaslowmanager.cc:104
 horaslowmanager.cc:105
 horaslowmanager.cc:106
 horaslowmanager.cc:107
 horaslowmanager.cc:108
 horaslowmanager.cc:109
 horaslowmanager.cc:110
 horaslowmanager.cc:111
 horaslowmanager.cc:112
 horaslowmanager.cc:113
 horaslowmanager.cc:114
 horaslowmanager.cc:115
 horaslowmanager.cc:116
 horaslowmanager.cc:117
 horaslowmanager.cc:118
 horaslowmanager.cc:119
 horaslowmanager.cc:120
 horaslowmanager.cc:121
 horaslowmanager.cc:122
 horaslowmanager.cc:123
 horaslowmanager.cc:124
 horaslowmanager.cc:125
 horaslowmanager.cc:126
 horaslowmanager.cc:127
 horaslowmanager.cc:128
 horaslowmanager.cc:129
 horaslowmanager.cc:130
 horaslowmanager.cc:131
 horaslowmanager.cc:132
 horaslowmanager.cc:133
 horaslowmanager.cc:134
 horaslowmanager.cc:135
 horaslowmanager.cc:136
 horaslowmanager.cc:137
 horaslowmanager.cc:138
 horaslowmanager.cc:139
 horaslowmanager.cc:140
 horaslowmanager.cc:141
 horaslowmanager.cc:142
 horaslowmanager.cc:143
 horaslowmanager.cc:144
 horaslowmanager.cc:145
 horaslowmanager.cc:146
 horaslowmanager.cc:147
 horaslowmanager.cc:148
 horaslowmanager.cc:149
 horaslowmanager.cc:150
 horaslowmanager.cc:151
 horaslowmanager.cc:152
 horaslowmanager.cc:153
 horaslowmanager.cc:154
 horaslowmanager.cc:155
 horaslowmanager.cc:156
 horaslowmanager.cc:157
 horaslowmanager.cc:158
 horaslowmanager.cc:159
 horaslowmanager.cc:160
 horaslowmanager.cc:161
 horaslowmanager.cc:162
 horaslowmanager.cc:163
 horaslowmanager.cc:164
 horaslowmanager.cc:165
 horaslowmanager.cc:166
 horaslowmanager.cc:167
 horaslowmanager.cc:168
 horaslowmanager.cc:169
 horaslowmanager.cc:170
 horaslowmanager.cc:171
 horaslowmanager.cc:172
 horaslowmanager.cc:173
 horaslowmanager.cc:174
 horaslowmanager.cc:175
 horaslowmanager.cc:176
 horaslowmanager.cc:177
 horaslowmanager.cc:178
 horaslowmanager.cc:179
 horaslowmanager.cc:180
 horaslowmanager.cc:181
 horaslowmanager.cc:182
 horaslowmanager.cc:183
 horaslowmanager.cc:184