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

//_HADES_CLASS_DESCRIPTION 
//////////////////////////////////////////////////////////////////////////////
//
// HOraSlowPartition
//
// Class for a slowcontrol data partition
//
//////////////////////////////////////////////////////////////////////////////

#include "horaslowpartition.h"
#include "horaslowreaderonline.h"
#include "horaslowreader2010.h"
#include "horaslowreader2016.h"
#include "horaslowperiod.h"
#include "horaslowarchrateobj.h"
#include "TGraph.h"
#include "TDatime.h"
#include "TH1F.h"
#include "TList.h"
#include <stdlib.h>

ClassImp(HOraSlowPartition)

HOraSlowPartition::HOraSlowPartition(const Char_t* name) {
  // Constructor with argument name = name for the data partition
  SetName(name);
  pRunPeriods=0;
  periodIter=0;
  pRates=0;
  ratesIter=0;
  pGraph=0;
  pOraReader=0;
  if (strcmp(name,"online")==0) {
    pOraReader = new HOraSlowReaderOnline();
  } else {
    //Int_t year = ((Int_t)name(3)-'0')*10 + (Int_t)name(4)-'0');
    TString bt(name,5);
    bt.Remove(0,3);
    Int_t year = bt.Atoi();
    if (year > 0) {
      if (year >= 16) pOraReader=new HOraSlowReader2016();
      else            pOraReader=new HOraSlowReader2010();
    } else {
      Error("HOraSlowPartition(const Char_t* name)","Invalid partition name");
    }
  }
  if (pOraReader) pOraReader->setPartition(this);
}

HOraSlowPartition::~HOraSlowPartition() {
  // Destructor
  clearRunPeriods();
  clearRates();
  if (pOraReader) {
    delete pOraReader;
    pOraReader=0;
  }
}

void HOraSlowPartition::clearRunPeriods() {
  // Deletes the array of periods
  if (periodIter) {
    delete periodIter;
    periodIter=0;
  }
  if (pRunPeriods) {
    pRunPeriods->Delete();
    delete pRunPeriods;
    pRunPeriods=0;
  }
}

void HOraSlowPartition::clearRates() {
  // Deletes the array of archiver rates
  deleteGraph();
  if (ratesIter) {
    delete ratesIter;
    ratesIter=0;
  }
  if (pRates) {
    pRates->Delete();
    delete pRates;
    pRates=0;
  }
}

void HOraSlowPartition::deleteGraph() {
  // Deletes the graph of the archiver rates
  if (pGraph) {
    delete pGraph;
    pGraph=0;
  }
}

Bool_t HOraSlowPartition::openOraInput() {
  // Connnects to Oracle (is done automatically when needed)
  if (pOraReader) return pOraReader->open();
  else return kFALSE;
}

void HOraSlowPartition::closeOraInput() {
  // Closes the Oracle connection
  if (pOraReader) pOraReader->close();
}

void HOraSlowPartition::setTimeRange(const Char_t* t1,const Char_t* t2) {
  // Compares the time ranges and if different clears the list of run periods
  if (startTime.CompareTo(t1) != 0 || endTime.CompareTo(t2) != 0 ){
    clearRunPeriods();
    startTime = t1;
    endTime   = t2;
  }
}

TObjArray* HOraSlowPartition::setNumPeriods(Int_t n) {
  // Creates an array of size n for the periods 
  clearRunPeriods();
  if (n>0) {
    pRunPeriods=new TObjArray(n);
    periodIter=pRunPeriods->MakeIterator();
  }
  return pRunPeriods;
}

void HOraSlowPartition::setRates(TObjArray* p) {
  // Sets the array of archiver rates
  clearRates();
  pRates=p;
  if (pRates) ratesIter=pRates->MakeIterator();
}

HOraSlowPeriod* HOraSlowPartition::getPeriod(Int_t i) {
  // Returns the pointer to the period at index i in the array
  if (pRunPeriods) return (HOraSlowPeriod*)(pRunPeriods->At(i));
  else return 0;
}

HOraSlowPeriod* HOraSlowPartition::getRun(Int_t runId) {
  // Returns the pointer to the period corresponding to the run with id runId
  HOraSlowPeriod* p=0;
  if (periodIter) {
    periodIter->Reset();
    while ((p=((HOraSlowPeriod*)(periodIter->Next())))!=0) {
      if (p->getRunId()==runId) break;
    }
  }
  return p;
}

HOraSlowPeriod* HOraSlowPartition::getRun(const Char_t* fname) {
  // Returns the pointer to the period corresponding to the run with hld-filename fname 
  HOraSlowPeriod* p=0;
  if (periodIter) {
    periodIter->Reset();
    while ((p=((HOraSlowPeriod*)(periodIter->Next())))!=0) {
      if (strcmp(p->getFilename(),fname)==0) break;
    }
  }
  return p;
}

void HOraSlowPartition::print(Int_t opt) {
  // Prints the data of all periods to stdout
  // option opt 0 = all periods
  //            1 = only hld-files
  //            2 = apply hld-file filter
  if (periodIter) {
    periodIter->Reset();
    HOraSlowPeriod* p=0;
    Int_t i=0;
    cout<<"---------------------------------------------------------------------\n";
    cout<<"  Run periods of partition "<<GetName()<<'\n';
    cout<<"  Format: array index, startime, endtime, run id, filename\n";
    cout<<"---------------------------------------------------------------------\n";
    while ((p=((HOraSlowPeriod*)(periodIter->Next())))!=0) {
      if (opt==0
          ||(opt==1&&strlen(p->getFilename())>4)
          ||(opt==2&&p->getFilterFlag()==1)) {
        cout<<setw(5)<<i<<"  ";
        p->print();
      }
      i++;
    }
    cout<<"---------------------------------------------------------------------\n";
  } else cout<<"  NO DATA\n";
}
  
void HOraSlowPartition::write(fstream& fout,Int_t opt) {
  // Streams the data of all periods
  // option opt 0 = all periods
  //            1 = only hld-files
  //            2 = apply hld-file filter
  if (periodIter) {
    periodIter->Reset();
    HOraSlowPeriod* p=0;
    Int_t i=0;
    fout<<"---------------------------------------------------------------------\n";
    fout<<"  Run periods of partition "<<GetName()<<'\n';
    fout<<"  Format: array index, startime, endtime, run id, filename\n";
    fout<<"---------------------------------------------------------------------\n";
    while ((p=((HOraSlowPeriod*)(periodIter->Next())))!=0) {
      if (opt==0
          ||(opt==1&&strlen(p->getFilename())>4)
          ||(opt==2&&p->getFilterFlag()==1)) {
        fout<<setw(5)<<i<<"  ";
        p->write(fout);
      }
      i++;
    }
    fout<<"---------------------------------------------------------------------\n";
  }
}

void HOraSlowPartition::setHldFileFilter(TList* l) {
  // Takes a list of hld-filenames, loops over all periods and sets a flag in the corresponding periods
  // Depending on the option, this filter is used to show the data or to skip the periods not in the list 
  if (periodIter) {
    periodIter->Reset();
    HOraSlowPeriod* p=0;
    while ((p=((HOraSlowPeriod*)(periodIter->Next())))!=0) {
      Int_t f=1;
      if (l) {
        const Char_t* s=p->getFilename();   
        if (strlen(s)==0||l->FindObject(s)==0) f=0;
      }
      p->setFilterFlag(f);
    }
  }
} 


void HOraSlowPartition::printRates() {
  // Prints the archiver rates to stdout
  if (ratesIter) {
    ratesIter->Reset();
    HOraSlowArchRateObj* p=0;
    Int_t i=0;
    cout<<"---------------------------------------------------------------------\n";
    cout<<"  Archiver rates of partition "<<GetName()<<'\n';
    cout<<"  Format: startime, entries/minute \n";
    cout<<"---------------------------------------------------------------------\n";
    while ((p=((HOraSlowArchRateObj*)(ratesIter->Next())))!=0) {
      p->print();
      i++;
    }
    cout<<"---------------------------------------------------------------------\n";
  } else cout<<"  NO DATA\n";
}  
 
void HOraSlowPartition::writeRates(fstream& fout) {
  // Streams the archiver rates
  if (ratesIter) {
    ratesIter->Reset();
    HOraSlowArchRateObj* p=0;
    Int_t i=0;
    fout<<"---------------------------------------------------------------------\n";
    fout<<"  Archiver rates of partition "<<GetName()<<'\n';
    fout<<"  Format: startime, entries/minute \n";
    fout<<"---------------------------------------------------------------------\n";
    while ((p=((HOraSlowArchRateObj*)(ratesIter->Next())))!=0) {
      p->write(fout);
      i++;
    }
    fout<<"---------------------------------------------------------------------\n";
  } else fout<<"  NO DATA\n";
}  

TGraph* HOraSlowPartition::getRatesGraph(Int_t mStyle,Int_t mColor) {
  // Returns a graph of the archiver rates
  // Default style: 7, default color 4 (blue)
  if (pRates==0) return 0;
  deleteGraph();
  Int_t len=pRates->GetLast()+1;
  pGraph=new TGraph(len);
  ratesIter->Reset();
  HOraSlowArchRateObj* p=0;
  Int_t i=0;
  TString startTime;
  while ((p=((HOraSlowArchRateObj*)(ratesIter->Next())))!=0) {
    if (i==0) {
      startTime=p->getStartTime();
      pGraph->SetPoint(i,0,p->getRate());      
    } else {
      pGraph->SetPoint(i,p->getTimeDiff(startTime.Data()),p->getRate());
    }
    i++;
  }
  pGraph->SetTitle(GetName());
  pGraph->SetMarkerStyle(mStyle);
  pGraph->SetMarkerColor(mColor);
  TH1F* hist=pGraph->GetHistogram();
  TAxis* xaxis=hist->GetXaxis();
  TString s("Time (Start at ");
  s+=startTime;
  s+=")";
  xaxis->SetTitle(s);
  TDatime t1(startTime.Data());
  // Fix for daylight (ROOT is one hour off!) 
  UInt_t utc=t1.Convert();
  time_t timeoff=(time_t)((Long_t)(utc));
  struct tm* loctis=localtime(&timeoff);
  Char_t tmp[20];
  strftime(tmp,256,"%z",loctis);
  if (strcmp(tmp,"+0200")==0) utc+=3600;
  xaxis->SetTimeDisplay(1);
  xaxis->SetTimeOffset(utc);
  xaxis->SetTimeFormat("%d/%m:%H");
  TAxis* yaxis=hist->GetYaxis();
  yaxis->SetTitle("Entries per minute");
  return pGraph;
}

 horaslowpartition.cc:1
 horaslowpartition.cc:2
 horaslowpartition.cc:3
 horaslowpartition.cc:4
 horaslowpartition.cc:5
 horaslowpartition.cc:6
 horaslowpartition.cc:7
 horaslowpartition.cc:8
 horaslowpartition.cc:9
 horaslowpartition.cc:10
 horaslowpartition.cc:11
 horaslowpartition.cc:12
 horaslowpartition.cc:13
 horaslowpartition.cc:14
 horaslowpartition.cc:15
 horaslowpartition.cc:16
 horaslowpartition.cc:17
 horaslowpartition.cc:18
 horaslowpartition.cc:19
 horaslowpartition.cc:20
 horaslowpartition.cc:21
 horaslowpartition.cc:22
 horaslowpartition.cc:23
 horaslowpartition.cc:24
 horaslowpartition.cc:25
 horaslowpartition.cc:26
 horaslowpartition.cc:27
 horaslowpartition.cc:28
 horaslowpartition.cc:29
 horaslowpartition.cc:30
 horaslowpartition.cc:31
 horaslowpartition.cc:32
 horaslowpartition.cc:33
 horaslowpartition.cc:34
 horaslowpartition.cc:35
 horaslowpartition.cc:36
 horaslowpartition.cc:37
 horaslowpartition.cc:38
 horaslowpartition.cc:39
 horaslowpartition.cc:40
 horaslowpartition.cc:41
 horaslowpartition.cc:42
 horaslowpartition.cc:43
 horaslowpartition.cc:44
 horaslowpartition.cc:45
 horaslowpartition.cc:46
 horaslowpartition.cc:47
 horaslowpartition.cc:48
 horaslowpartition.cc:49
 horaslowpartition.cc:50
 horaslowpartition.cc:51
 horaslowpartition.cc:52
 horaslowpartition.cc:53
 horaslowpartition.cc:54
 horaslowpartition.cc:55
 horaslowpartition.cc:56
 horaslowpartition.cc:57
 horaslowpartition.cc:58
 horaslowpartition.cc:59
 horaslowpartition.cc:60
 horaslowpartition.cc:61
 horaslowpartition.cc:62
 horaslowpartition.cc:63
 horaslowpartition.cc:64
 horaslowpartition.cc:65
 horaslowpartition.cc:66
 horaslowpartition.cc:67
 horaslowpartition.cc:68
 horaslowpartition.cc:69
 horaslowpartition.cc:70
 horaslowpartition.cc:71
 horaslowpartition.cc:72
 horaslowpartition.cc:73
 horaslowpartition.cc:74
 horaslowpartition.cc:75
 horaslowpartition.cc:76
 horaslowpartition.cc:77
 horaslowpartition.cc:78
 horaslowpartition.cc:79
 horaslowpartition.cc:80
 horaslowpartition.cc:81
 horaslowpartition.cc:82
 horaslowpartition.cc:83
 horaslowpartition.cc:84
 horaslowpartition.cc:85
 horaslowpartition.cc:86
 horaslowpartition.cc:87
 horaslowpartition.cc:88
 horaslowpartition.cc:89
 horaslowpartition.cc:90
 horaslowpartition.cc:91
 horaslowpartition.cc:92
 horaslowpartition.cc:93
 horaslowpartition.cc:94
 horaslowpartition.cc:95
 horaslowpartition.cc:96
 horaslowpartition.cc:97
 horaslowpartition.cc:98
 horaslowpartition.cc:99
 horaslowpartition.cc:100
 horaslowpartition.cc:101
 horaslowpartition.cc:102
 horaslowpartition.cc:103
 horaslowpartition.cc:104
 horaslowpartition.cc:105
 horaslowpartition.cc:106
 horaslowpartition.cc:107
 horaslowpartition.cc:108
 horaslowpartition.cc:109
 horaslowpartition.cc:110
 horaslowpartition.cc:111
 horaslowpartition.cc:112
 horaslowpartition.cc:113
 horaslowpartition.cc:114
 horaslowpartition.cc:115
 horaslowpartition.cc:116
 horaslowpartition.cc:117
 horaslowpartition.cc:118
 horaslowpartition.cc:119
 horaslowpartition.cc:120
 horaslowpartition.cc:121
 horaslowpartition.cc:122
 horaslowpartition.cc:123
 horaslowpartition.cc:124
 horaslowpartition.cc:125
 horaslowpartition.cc:126
 horaslowpartition.cc:127
 horaslowpartition.cc:128
 horaslowpartition.cc:129
 horaslowpartition.cc:130
 horaslowpartition.cc:131
 horaslowpartition.cc:132
 horaslowpartition.cc:133
 horaslowpartition.cc:134
 horaslowpartition.cc:135
 horaslowpartition.cc:136
 horaslowpartition.cc:137
 horaslowpartition.cc:138
 horaslowpartition.cc:139
 horaslowpartition.cc:140
 horaslowpartition.cc:141
 horaslowpartition.cc:142
 horaslowpartition.cc:143
 horaslowpartition.cc:144
 horaslowpartition.cc:145
 horaslowpartition.cc:146
 horaslowpartition.cc:147
 horaslowpartition.cc:148
 horaslowpartition.cc:149
 horaslowpartition.cc:150
 horaslowpartition.cc:151
 horaslowpartition.cc:152
 horaslowpartition.cc:153
 horaslowpartition.cc:154
 horaslowpartition.cc:155
 horaslowpartition.cc:156
 horaslowpartition.cc:157
 horaslowpartition.cc:158
 horaslowpartition.cc:159
 horaslowpartition.cc:160
 horaslowpartition.cc:161
 horaslowpartition.cc:162
 horaslowpartition.cc:163
 horaslowpartition.cc:164
 horaslowpartition.cc:165
 horaslowpartition.cc:166
 horaslowpartition.cc:167
 horaslowpartition.cc:168
 horaslowpartition.cc:169
 horaslowpartition.cc:170
 horaslowpartition.cc:171
 horaslowpartition.cc:172
 horaslowpartition.cc:173
 horaslowpartition.cc:174
 horaslowpartition.cc:175
 horaslowpartition.cc:176
 horaslowpartition.cc:177
 horaslowpartition.cc:178
 horaslowpartition.cc:179
 horaslowpartition.cc:180
 horaslowpartition.cc:181
 horaslowpartition.cc:182
 horaslowpartition.cc:183
 horaslowpartition.cc:184
 horaslowpartition.cc:185
 horaslowpartition.cc:186
 horaslowpartition.cc:187
 horaslowpartition.cc:188
 horaslowpartition.cc:189
 horaslowpartition.cc:190
 horaslowpartition.cc:191
 horaslowpartition.cc:192
 horaslowpartition.cc:193
 horaslowpartition.cc:194
 horaslowpartition.cc:195
 horaslowpartition.cc:196
 horaslowpartition.cc:197
 horaslowpartition.cc:198
 horaslowpartition.cc:199
 horaslowpartition.cc:200
 horaslowpartition.cc:201
 horaslowpartition.cc:202
 horaslowpartition.cc:203
 horaslowpartition.cc:204
 horaslowpartition.cc:205
 horaslowpartition.cc:206
 horaslowpartition.cc:207
 horaslowpartition.cc:208
 horaslowpartition.cc:209
 horaslowpartition.cc:210
 horaslowpartition.cc:211
 horaslowpartition.cc:212
 horaslowpartition.cc:213
 horaslowpartition.cc:214
 horaslowpartition.cc:215
 horaslowpartition.cc:216
 horaslowpartition.cc:217
 horaslowpartition.cc:218
 horaslowpartition.cc:219
 horaslowpartition.cc:220
 horaslowpartition.cc:221
 horaslowpartition.cc:222
 horaslowpartition.cc:223
 horaslowpartition.cc:224
 horaslowpartition.cc:225
 horaslowpartition.cc:226
 horaslowpartition.cc:227
 horaslowpartition.cc:228
 horaslowpartition.cc:229
 horaslowpartition.cc:230
 horaslowpartition.cc:231
 horaslowpartition.cc:232
 horaslowpartition.cc:233
 horaslowpartition.cc:234
 horaslowpartition.cc:235
 horaslowpartition.cc:236
 horaslowpartition.cc:237
 horaslowpartition.cc:238
 horaslowpartition.cc:239
 horaslowpartition.cc:240
 horaslowpartition.cc:241
 horaslowpartition.cc:242
 horaslowpartition.cc:243
 horaslowpartition.cc:244
 horaslowpartition.cc:245
 horaslowpartition.cc:246
 horaslowpartition.cc:247
 horaslowpartition.cc:248
 horaslowpartition.cc:249
 horaslowpartition.cc:250
 horaslowpartition.cc:251
 horaslowpartition.cc:252
 horaslowpartition.cc:253
 horaslowpartition.cc:254
 horaslowpartition.cc:255
 horaslowpartition.cc:256
 horaslowpartition.cc:257
 horaslowpartition.cc:258
 horaslowpartition.cc:259
 horaslowpartition.cc:260
 horaslowpartition.cc:261
 horaslowpartition.cc:262
 horaslowpartition.cc:263
 horaslowpartition.cc:264
 horaslowpartition.cc:265
 horaslowpartition.cc:266
 horaslowpartition.cc:267
 horaslowpartition.cc:268
 horaslowpartition.cc:269
 horaslowpartition.cc:270
 horaslowpartition.cc:271
 horaslowpartition.cc:272
 horaslowpartition.cc:273
 horaslowpartition.cc:274
 horaslowpartition.cc:275
 horaslowpartition.cc:276
 horaslowpartition.cc:277
 horaslowpartition.cc:278
 horaslowpartition.cc:279
 horaslowpartition.cc:280
 horaslowpartition.cc:281
 horaslowpartition.cc:282
 horaslowpartition.cc:283
 horaslowpartition.cc:284
 horaslowpartition.cc:285
 horaslowpartition.cc:286
 horaslowpartition.cc:287
 horaslowpartition.cc:288
 horaslowpartition.cc:289
 horaslowpartition.cc:290
 horaslowpartition.cc:291
 horaslowpartition.cc:292
 horaslowpartition.cc:293
 horaslowpartition.cc:294
 horaslowpartition.cc:295
 horaslowpartition.cc:296
 horaslowpartition.cc:297
 horaslowpartition.cc:298
 horaslowpartition.cc:299
 horaslowpartition.cc:300
 horaslowpartition.cc:301
 horaslowpartition.cc:302
 horaslowpartition.cc:303
 horaslowpartition.cc:304
 horaslowpartition.cc:305
 horaslowpartition.cc:306
 horaslowpartition.cc:307
 horaslowpartition.cc:308
 horaslowpartition.cc:309
 horaslowpartition.cc:310
 horaslowpartition.cc:311
 horaslowpartition.cc:312
 horaslowpartition.cc:313
 horaslowpartition.cc:314
 horaslowpartition.cc:315