ROOT logo
//*-- AUTHOR   : Ilse Koenig
//*-- Created  : 13/08/2004 by Ilse Koenig
//*-- Modified : 13/04/2005 by Ilse Koenig

//_HADES_CLASS_DESCRIPTION 
//////////////////////////////////////////////////////////////////////////////
//
// HOraSlowChannel
//
// Class for a slowcontrol channel
//
//////////////////////////////////////////////////////////////////////////////

#include "horaslowchannel.h"
#include "horaslowchanrunsum.h"
#include "horaslowchanmeta.h"
#include "horaslowchanraw.h"
#include "horaslowpartition.h"
#include "horaslowperiod.h"
#include "horaslowmanager.h"
#include "horaslowreader.h"
#include "TGraphErrors.h"
#include "TGraphAsymmErrors.h"
#include "TDatime.h"
#include "TH1F.h"
#include "TAxis.h"

#include <stdlib.h>

ClassImp(HOraSlowChannel)

HOraSlowChannel::HOraSlowChannel(const Char_t* name) {
  // Constructor with argument channel name
  SetName(name);
  channelType="F";
  channelId=-1;
  pRunSumData=0;
  pMetaData=0;
  pRawData=0;
  runSumDataIter=0;
  rawIter=0;
  pGraph=0;
  pRawGraph=0;
  partition=0;
  maxPrecision=0;
}

HOraSlowChannel::~HOraSlowChannel() {
  // Destructor
  clearRunSumData();
  if (pMetaData) {
    pMetaData->Delete();
    delete pMetaData;
    pMetaData=0;
  }
  clearRawData();
}

void HOraSlowChannel::deleteGraph() {
  // Deletes the graph of the summary data
  if (pGraph) {
    delete pGraph;
    pGraph=0;
  }
}

void HOraSlowChannel::deleteRawGraph() {
  // Deletes the graph of the raw data
  if (pRawGraph) {
    delete pRawGraph;
    pRawGraph=0;
  }
}

void HOraSlowChannel::clearRunSumData() {
// Clears all 
  if (runSumDataIter) {
    delete runSumDataIter;
    runSumDataIter=0;
  }
  if (pRunSumData) {
    pRunSumData->Delete();
    delete pRunSumData;
    pRunSumData=0;
  }  
  deleteGraph();
}

void HOraSlowChannel::clearRawData() {
  // Deletes the raw data and the corresponding graph
  if (rawIter) {
    delete rawIter;
    rawIter=0;
  }
  if (pRawData) {
    pRawData->Delete();
    delete pRawData;
    pRawData=0;
  }
  rawStart="";
  rawEnd="";
  deleteRawGraph();
}

void HOraSlowChannel::setPartition(HOraSlowPartition* p) {
  // Sets the partition pointer and clears all summary data
  clearRunSumData();
  partition=p;
}


void HOraSlowChannel::setRunSumData(TObjArray* p) {
  // Sets the pointer to the array of summary data and creates the iterator
  clearRunSumData();
  pRunSumData=p;
  if (p) runSumDataIter=p->MakeIterator();      
}

void HOraSlowChannel::setRawData(TObjArray* p,const Char_t* t1,const Char_t* t2) {
  // Sets the pointer to the array of raw data in the time interval t1 - t2
  // and creates the iterator
  clearRawData();
  pRawData=p;
  rawStart=t1;
  rawEnd=t2;
  if (p) rawIter=p->MakeIterator();
}
  

void HOraSlowChannel::setMetaData(TObjArray* p){
  // Sets the pointer to the array of meta data
  if (pMetaData) {
    pMetaData->Delete();
    delete pMetaData;
    pMetaData=0;
  }
  pMetaData=p;
}

void HOraSlowChannel::printMetaData() {
  // Prints the meta data to stdout
  if (pMetaData) {
    cout<<"---------------------------------------------------------------------\n";
    cout<<"  Meta data of "<<GetName()<<'\n';
    cout<<"---------------------------------------------------------------------\n";
    for(Int_t i=0;i<pMetaData->GetSize();i++) {
      HOraSlowChanMeta* p=(HOraSlowChanMeta*)(pMetaData->At(i));
      p->print();
    }
    cout<<"---------------------------------------------------------------------\n";
  } else cout<<"No meta data for channel "<<GetName()<<endl;
}

void HOraSlowChannel::writeMetaData(fstream& fout) {
  // Streams the meta data
  if (pMetaData) {
    fout<<"---------------------------------------------------------------------\n";
    fout<<"  Meta data of "<<GetName()<<'\n';
    fout<<"---------------------------------------------------------------------\n";
    for(Int_t i=0;i<pMetaData->GetSize();i++) {
      HOraSlowChanMeta* p=(HOraSlowChanMeta*)(pMetaData->At(i));
      p->write(fout);
    }
    fout<<"---------------------------------------------------------------------\n";
  }
}

void HOraSlowChannel::printRunSumData(Int_t opt) {
  // Prints the summary data to stdout
  // option opt 0 = all periods
  //            1 = only hld-files
  //            2 = apply hld-file filter
  if (pRunSumData&&partition) {
    runSumDataIter->Reset();
    HOraSlowChanRunSum* p=0;
    TObjArray* runs=partition->getRunPeriods();
    Int_t i=0;
    cout<<"---------------------------------------------------------------------\n";
    cout<<"  Run summary of channel "<<GetName()<<'\n';
    cout<<"  Format: array index, mean, sigma, min value, max value,\n";
    cout<<"          number of data, status, monitor channel rate,\n";
    cout<<"          run id, filename\n";
    cout<<"---------------------------------------------------------------------\n";
    while ((p=((HOraSlowChanRunSum*)(runSumDataIter->Next())))!=0) {
      if (opt==0
          ||(opt==1&&strlen(((HOraSlowPeriod*)(runs->At(i)))->getFilename())>4)
          ||(opt==2&&((HOraSlowPeriod*)(runs->At(i)))->getFilterFlag()==1)) {
        cout<<setw(5)<<i;
        p->print(maxPrecision+1);
      }
      i++;
    }
    cout<<"---------------------------------------------------------------------\n";
  } else cout<<"NO DATA"<<endl;
}
  
void HOraSlowChannel::writeRunSumData(fstream& fout,Int_t opt) {
  // Streams the summary data to stdout
  // option opt 0 = all periods
  //            1 = only hld-files
  //            2 = apply hld-file filter
  if (pRunSumData&&partition) {
    runSumDataIter->Reset();
    HOraSlowChanRunSum* p=0;
    TObjArray* runs=partition->getRunPeriods();
    Int_t i=0;
    fout<<"---------------------------------------------------------------------\n";
    fout<<"  Run summary of channel "<<GetName()<<'\n';
    fout<<"  Format: array index, mean, sigma, min value, max value,\n";
    fout<<"          number of data, status, monitor channel rate,\n";
    fout<<"          run id, filename\n";
    fout<<"---------------------------------------------------------------------\n";
    while ((p=((HOraSlowChanRunSum*)(runSumDataIter->Next())))!=0) {
      if (opt==0
          ||(opt==1&&strlen(((HOraSlowPeriod*)(runs->At(i)))->getFilename())>4)
          ||(opt==2&&((HOraSlowPeriod*)(runs->At(i)))->getFilterFlag()==1)) {
        fout<<setw(5)<<i;
        p->write(fout,maxPrecision+1);
      }
      i++;
    }
    fout<<"---------------------------------------------------------------------\n";
  }
}

Bool_t HOraSlowChannel::readRawData(Int_t index) {
  // Reads the raw data of a period specified by the array index
  HOraSlowPeriod* period=0;
  if (gHOraSlowManager==0||partition==0||(period=partition->getPeriod(index))==0) {
    Error("*** readRawData","Period not found!");
    return kFALSE;
  }
  Bool_t rc=partition->openOraInput();
  if (!rc) return rc;
  clearRawData();
  if (pRunSumData) {
    HOraSlowChanRunSum* p=(HOraSlowChanRunSum*)(pRunSumData->At(index));
    if (p) {
      if (p->getNData()==0) {
        Error("readRawData","No raw data found.");
        return kFALSE;
      }
    }
  }
  return partition->getOraReader()->readRawData(
                 this,period->getStartTime(),period->getEndTime());
}

Bool_t HOraSlowChannel::readRawData(const Char_t* t1, const Char_t* t2) {
  // Reads the raw data of a period specified by a time range t1 - t2
  if (gHOraSlowManager==0||partition==0) return kFALSE;
  Bool_t rc=partition->openOraInput();
  if (!rc) return rc;
  Int_t l1=strlen(t1);
  Int_t l2=strlen(t2);
  Bool_t isWrongFormat=kFALSE;
  TString start=t1;
  TString end=t2;
  switch(l1) {
    case 10: {start+=" 00:00:00"; break;}
    case 13: {start+=":00:00";    break;}
    case 16: {start+=":00";       break;}
    case 19: {                    break;}
    default: {isWrongFormat=kTRUE;}
  }
  switch(l2) {
    case 10: {end+=" 00:00:00"; break;}
    case 13: {end+=":00:00";    break;}
    case 16: {end+=":00";       break;}
    case 19: {                  break;}
    default: {isWrongFormat=kTRUE;}
  }
  if (isWrongFormat||t1[4]!='-'||t1[7]!='-'||t2[4]!='-'||t2[7]!='-') {
    Error("readRawData","Dates must be specified in date format yyyy-mm-dd hh:mi:ss");
    return kFALSE;
  }
  clearRawData();
  return partition->getOraReader()->readRawData(this,start.Data(),end.Data());
}

void HOraSlowChannel::printRawData() {
  // Prints the raw data to stdout
  if (pRawData) {
    rawIter->Reset();
    HOraSlowChanRaw* p=0;
    cout<<"---------------------------------------------------------------------\n";
    cout<<"  Raw of channel "<<GetName()<<'\n';
    cout<<"  Time range:  "<<rawStart<<" - "<<rawEnd<<'\n';
    cout<<"  Format:      timestamp, nano seconds, value, status\n";
    cout<<"  Time Format: yyyy-mm-dd hh:mi:ss (TDatime SQL compatible string)\n";
    cout<<"---------------------------------------------------------------------\n";
    while ((p=((HOraSlowChanRaw*)(rawIter->Next())))!=0) {
      p->print(maxPrecision);
    }
    cout<<"---------------------------------------------------------------------\n";
  } else cout<<"NO DATA"<<endl;
}

void HOraSlowChannel::writeRawData(fstream& fout) {
  // Streams the raw data
  if (pRawData) {
    rawIter->Reset();
    HOraSlowChanRaw* p=0;
    fout<<"---------------------------------------------------------------------\n";
    fout<<"  Raw of channel "<<GetName()<<'\n';
    fout<<"  Time range: "<<rawStart<<" - "<<rawEnd<<'\n';
    fout<<"  Format: seconds since start time, nano seconds, value, status\n";
    fout<<"  Time Format: yyyy-mm-dd hh:mi:ss (TDatime SQL compatible string)\n";
    fout<<"---------------------------------------------------------------------\n";
    while ((p=((HOraSlowChanRaw*)(rawIter->Next())))!=0) {
      p->write(fout,maxPrecision);
    }
    fout<<"---------------------------------------------------------------------\n";
  }
}

TGraphErrors* HOraSlowChannel::getRunSumMeanSigmaGraph(Int_t opt,
                               Int_t mStyle,Int_t mColor) {
  // Returns a graph with mean and sigma values
  // Default style: 7, default color 4 (blue)
  // option opt 0 = all periods
  //            1 = only hld-files
  //            2 = apply hld-file filter
  // The x-axis is the index of the periods
  if (pRunSumData==0||partition==0) return 0;
  deleteGraph();
  Int_t len=pRunSumData->GetLast()+1;
  TGraphErrors* graph=new TGraphErrors(len);
  pGraph=graph;
  runSumDataIter->Reset();
  TObjArray* runs=partition->getRunPeriods();
  HOraSlowChanRunSum* p=0;
  Int_t i=0;
  while ((p=((HOraSlowChanRunSum*)(runSumDataIter->Next())))!=0) {
    if (opt==0
        ||(opt==1&&strlen(((HOraSlowPeriod*)(runs->At(i)))->getFilename())>4)
        ||(opt==2&&((HOraSlowPeriod*)(runs->At(i)))->getFilterFlag()==1)) {
      graph->SetPoint(i,i,p->getMean());
      graph->SetPointError(i,0,p->getSigma());
    }
    i++;
  }
  graph->SetTitle(GetName());
  graph->SetMarkerStyle(mStyle);
  graph->SetMarkerColor(mColor);
  return graph;
}

TGraphAsymmErrors* HOraSlowChannel::getRunSumMeanMinMaxGraph(Int_t opt,
                                    Int_t mStyle,Int_t mColor) {
  // Returns a graph with the mean value and the min and max values as error bar
  // Default style: 7, default color 2 (red)
  // option opt 0 = all periods
  //            1 = only hld-files
  //            2 = apply hld-file filter
  // The x-axis is the index of the periods
  if (pRunSumData==0||partition==0) return 0;
  deleteGraph();
  Int_t len=pRunSumData->GetLast()+1;
  TGraphAsymmErrors* graph=new TGraphAsymmErrors(len);
  pGraph=graph;
  runSumDataIter->Reset();
  TObjArray* runs=partition->getRunPeriods();
  HOraSlowChanRunSum* p=0;
  Int_t i=0;
  while ((p=((HOraSlowChanRunSum*)(runSumDataIter->Next())))!=0) {
    if (opt==0
        ||(opt==1&&strlen(((HOraSlowPeriod*)(runs->At(i)))->getFilename())>4)
        ||(opt==2&&((HOraSlowPeriod*)(runs->At(i)))->getFilterFlag()==1)) {
      graph->SetPoint(i,i,p->getMean());
      graph->SetPointError(i,0,0,p->getMean()-p->getMinVal(),p->getMaxVal()-p->getMean());
    }
    i++;
  }
  graph->SetTitle(GetName());
  graph->SetMarkerStyle(mStyle);
  graph->SetMarkerColor(mColor);
  return graph;
}

TGraph* HOraSlowChannel::getRawDataGraph(Int_t mStyle,Int_t mColor) {
  // Returns a graph of the raw data
  // Default style: 7, default color 4 (blue)
  if (pRawData==0) return 0;
  deleteRawGraph();
  Int_t len=pRawData->GetLast()+1;
  TGraph* graph=new TGraph(len);
  pRawGraph=graph;
  rawIter->Reset();
  HOraSlowChanRaw* p=0;
  Int_t i=0;
  while ((p=((HOraSlowChanRaw*)(rawIter->Next())))!=0) {
    graph->SetPoint(i,p->getTimeDiff(rawStart.Data()),p->getValue());
    i++;
  }
  graph->SetTitle(GetName());
  graph->SetMarkerStyle(mStyle);
  graph->SetMarkerColor(mColor);
  TH1F* hist=graph->GetHistogram();
  TAxis* xaxis=hist->GetXaxis();
  TString s("Time (Start at ");
  s+=rawStart;
  s+=")";
  xaxis->SetTitle(s);
  TDatime t1(rawStart.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("%H:%M");
  return graph;
}
 horaslowchannel.cc:1
 horaslowchannel.cc:2
 horaslowchannel.cc:3
 horaslowchannel.cc:4
 horaslowchannel.cc:5
 horaslowchannel.cc:6
 horaslowchannel.cc:7
 horaslowchannel.cc:8
 horaslowchannel.cc:9
 horaslowchannel.cc:10
 horaslowchannel.cc:11
 horaslowchannel.cc:12
 horaslowchannel.cc:13
 horaslowchannel.cc:14
 horaslowchannel.cc:15
 horaslowchannel.cc:16
 horaslowchannel.cc:17
 horaslowchannel.cc:18
 horaslowchannel.cc:19
 horaslowchannel.cc:20
 horaslowchannel.cc:21
 horaslowchannel.cc:22
 horaslowchannel.cc:23
 horaslowchannel.cc:24
 horaslowchannel.cc:25
 horaslowchannel.cc:26
 horaslowchannel.cc:27
 horaslowchannel.cc:28
 horaslowchannel.cc:29
 horaslowchannel.cc:30
 horaslowchannel.cc:31
 horaslowchannel.cc:32
 horaslowchannel.cc:33
 horaslowchannel.cc:34
 horaslowchannel.cc:35
 horaslowchannel.cc:36
 horaslowchannel.cc:37
 horaslowchannel.cc:38
 horaslowchannel.cc:39
 horaslowchannel.cc:40
 horaslowchannel.cc:41
 horaslowchannel.cc:42
 horaslowchannel.cc:43
 horaslowchannel.cc:44
 horaslowchannel.cc:45
 horaslowchannel.cc:46
 horaslowchannel.cc:47
 horaslowchannel.cc:48
 horaslowchannel.cc:49
 horaslowchannel.cc:50
 horaslowchannel.cc:51
 horaslowchannel.cc:52
 horaslowchannel.cc:53
 horaslowchannel.cc:54
 horaslowchannel.cc:55
 horaslowchannel.cc:56
 horaslowchannel.cc:57
 horaslowchannel.cc:58
 horaslowchannel.cc:59
 horaslowchannel.cc:60
 horaslowchannel.cc:61
 horaslowchannel.cc:62
 horaslowchannel.cc:63
 horaslowchannel.cc:64
 horaslowchannel.cc:65
 horaslowchannel.cc:66
 horaslowchannel.cc:67
 horaslowchannel.cc:68
 horaslowchannel.cc:69
 horaslowchannel.cc:70
 horaslowchannel.cc:71
 horaslowchannel.cc:72
 horaslowchannel.cc:73
 horaslowchannel.cc:74
 horaslowchannel.cc:75
 horaslowchannel.cc:76
 horaslowchannel.cc:77
 horaslowchannel.cc:78
 horaslowchannel.cc:79
 horaslowchannel.cc:80
 horaslowchannel.cc:81
 horaslowchannel.cc:82
 horaslowchannel.cc:83
 horaslowchannel.cc:84
 horaslowchannel.cc:85
 horaslowchannel.cc:86
 horaslowchannel.cc:87
 horaslowchannel.cc:88
 horaslowchannel.cc:89
 horaslowchannel.cc:90
 horaslowchannel.cc:91
 horaslowchannel.cc:92
 horaslowchannel.cc:93
 horaslowchannel.cc:94
 horaslowchannel.cc:95
 horaslowchannel.cc:96
 horaslowchannel.cc:97
 horaslowchannel.cc:98
 horaslowchannel.cc:99
 horaslowchannel.cc:100
 horaslowchannel.cc:101
 horaslowchannel.cc:102
 horaslowchannel.cc:103
 horaslowchannel.cc:104
 horaslowchannel.cc:105
 horaslowchannel.cc:106
 horaslowchannel.cc:107
 horaslowchannel.cc:108
 horaslowchannel.cc:109
 horaslowchannel.cc:110
 horaslowchannel.cc:111
 horaslowchannel.cc:112
 horaslowchannel.cc:113
 horaslowchannel.cc:114
 horaslowchannel.cc:115
 horaslowchannel.cc:116
 horaslowchannel.cc:117
 horaslowchannel.cc:118
 horaslowchannel.cc:119
 horaslowchannel.cc:120
 horaslowchannel.cc:121
 horaslowchannel.cc:122
 horaslowchannel.cc:123
 horaslowchannel.cc:124
 horaslowchannel.cc:125
 horaslowchannel.cc:126
 horaslowchannel.cc:127
 horaslowchannel.cc:128
 horaslowchannel.cc:129
 horaslowchannel.cc:130
 horaslowchannel.cc:131
 horaslowchannel.cc:132
 horaslowchannel.cc:133
 horaslowchannel.cc:134
 horaslowchannel.cc:135
 horaslowchannel.cc:136
 horaslowchannel.cc:137
 horaslowchannel.cc:138
 horaslowchannel.cc:139
 horaslowchannel.cc:140
 horaslowchannel.cc:141
 horaslowchannel.cc:142
 horaslowchannel.cc:143
 horaslowchannel.cc:144
 horaslowchannel.cc:145
 horaslowchannel.cc:146
 horaslowchannel.cc:147
 horaslowchannel.cc:148
 horaslowchannel.cc:149
 horaslowchannel.cc:150
 horaslowchannel.cc:151
 horaslowchannel.cc:152
 horaslowchannel.cc:153
 horaslowchannel.cc:154
 horaslowchannel.cc:155
 horaslowchannel.cc:156
 horaslowchannel.cc:157
 horaslowchannel.cc:158
 horaslowchannel.cc:159
 horaslowchannel.cc:160
 horaslowchannel.cc:161
 horaslowchannel.cc:162
 horaslowchannel.cc:163
 horaslowchannel.cc:164
 horaslowchannel.cc:165
 horaslowchannel.cc:166
 horaslowchannel.cc:167
 horaslowchannel.cc:168
 horaslowchannel.cc:169
 horaslowchannel.cc:170
 horaslowchannel.cc:171
 horaslowchannel.cc:172
 horaslowchannel.cc:173
 horaslowchannel.cc:174
 horaslowchannel.cc:175
 horaslowchannel.cc:176
 horaslowchannel.cc:177
 horaslowchannel.cc:178
 horaslowchannel.cc:179
 horaslowchannel.cc:180
 horaslowchannel.cc:181
 horaslowchannel.cc:182
 horaslowchannel.cc:183
 horaslowchannel.cc:184
 horaslowchannel.cc:185
 horaslowchannel.cc:186
 horaslowchannel.cc:187
 horaslowchannel.cc:188
 horaslowchannel.cc:189
 horaslowchannel.cc:190
 horaslowchannel.cc:191
 horaslowchannel.cc:192
 horaslowchannel.cc:193
 horaslowchannel.cc:194
 horaslowchannel.cc:195
 horaslowchannel.cc:196
 horaslowchannel.cc:197
 horaslowchannel.cc:198
 horaslowchannel.cc:199
 horaslowchannel.cc:200
 horaslowchannel.cc:201
 horaslowchannel.cc:202
 horaslowchannel.cc:203
 horaslowchannel.cc:204
 horaslowchannel.cc:205
 horaslowchannel.cc:206
 horaslowchannel.cc:207
 horaslowchannel.cc:208
 horaslowchannel.cc:209
 horaslowchannel.cc:210
 horaslowchannel.cc:211
 horaslowchannel.cc:212
 horaslowchannel.cc:213
 horaslowchannel.cc:214
 horaslowchannel.cc:215
 horaslowchannel.cc:216
 horaslowchannel.cc:217
 horaslowchannel.cc:218
 horaslowchannel.cc:219
 horaslowchannel.cc:220
 horaslowchannel.cc:221
 horaslowchannel.cc:222
 horaslowchannel.cc:223
 horaslowchannel.cc:224
 horaslowchannel.cc:225
 horaslowchannel.cc:226
 horaslowchannel.cc:227
 horaslowchannel.cc:228
 horaslowchannel.cc:229
 horaslowchannel.cc:230
 horaslowchannel.cc:231
 horaslowchannel.cc:232
 horaslowchannel.cc:233
 horaslowchannel.cc:234
 horaslowchannel.cc:235
 horaslowchannel.cc:236
 horaslowchannel.cc:237
 horaslowchannel.cc:238
 horaslowchannel.cc:239
 horaslowchannel.cc:240
 horaslowchannel.cc:241
 horaslowchannel.cc:242
 horaslowchannel.cc:243
 horaslowchannel.cc:244
 horaslowchannel.cc:245
 horaslowchannel.cc:246
 horaslowchannel.cc:247
 horaslowchannel.cc:248
 horaslowchannel.cc:249
 horaslowchannel.cc:250
 horaslowchannel.cc:251
 horaslowchannel.cc:252
 horaslowchannel.cc:253
 horaslowchannel.cc:254
 horaslowchannel.cc:255
 horaslowchannel.cc:256
 horaslowchannel.cc:257
 horaslowchannel.cc:258
 horaslowchannel.cc:259
 horaslowchannel.cc:260
 horaslowchannel.cc:261
 horaslowchannel.cc:262
 horaslowchannel.cc:263
 horaslowchannel.cc:264
 horaslowchannel.cc:265
 horaslowchannel.cc:266
 horaslowchannel.cc:267
 horaslowchannel.cc:268
 horaslowchannel.cc:269
 horaslowchannel.cc:270
 horaslowchannel.cc:271
 horaslowchannel.cc:272
 horaslowchannel.cc:273
 horaslowchannel.cc:274
 horaslowchannel.cc:275
 horaslowchannel.cc:276
 horaslowchannel.cc:277
 horaslowchannel.cc:278
 horaslowchannel.cc:279
 horaslowchannel.cc:280
 horaslowchannel.cc:281
 horaslowchannel.cc:282
 horaslowchannel.cc:283
 horaslowchannel.cc:284
 horaslowchannel.cc:285
 horaslowchannel.cc:286
 horaslowchannel.cc:287
 horaslowchannel.cc:288
 horaslowchannel.cc:289
 horaslowchannel.cc:290
 horaslowchannel.cc:291
 horaslowchannel.cc:292
 horaslowchannel.cc:293
 horaslowchannel.cc:294
 horaslowchannel.cc:295
 horaslowchannel.cc:296
 horaslowchannel.cc:297
 horaslowchannel.cc:298
 horaslowchannel.cc:299
 horaslowchannel.cc:300
 horaslowchannel.cc:301
 horaslowchannel.cc:302
 horaslowchannel.cc:303
 horaslowchannel.cc:304
 horaslowchannel.cc:305
 horaslowchannel.cc:306
 horaslowchannel.cc:307
 horaslowchannel.cc:308
 horaslowchannel.cc:309
 horaslowchannel.cc:310
 horaslowchannel.cc:311
 horaslowchannel.cc:312
 horaslowchannel.cc:313
 horaslowchannel.cc:314
 horaslowchannel.cc:315
 horaslowchannel.cc:316
 horaslowchannel.cc:317
 horaslowchannel.cc:318
 horaslowchannel.cc:319
 horaslowchannel.cc:320
 horaslowchannel.cc:321
 horaslowchannel.cc:322
 horaslowchannel.cc:323
 horaslowchannel.cc:324
 horaslowchannel.cc:325
 horaslowchannel.cc:326
 horaslowchannel.cc:327
 horaslowchannel.cc:328
 horaslowchannel.cc:329
 horaslowchannel.cc:330
 horaslowchannel.cc:331
 horaslowchannel.cc:332
 horaslowchannel.cc:333
 horaslowchannel.cc:334
 horaslowchannel.cc:335
 horaslowchannel.cc:336
 horaslowchannel.cc:337
 horaslowchannel.cc:338
 horaslowchannel.cc:339
 horaslowchannel.cc:340
 horaslowchannel.cc:341
 horaslowchannel.cc:342
 horaslowchannel.cc:343
 horaslowchannel.cc:344
 horaslowchannel.cc:345
 horaslowchannel.cc:346
 horaslowchannel.cc:347
 horaslowchannel.cc:348
 horaslowchannel.cc:349
 horaslowchannel.cc:350
 horaslowchannel.cc:351
 horaslowchannel.cc:352
 horaslowchannel.cc:353
 horaslowchannel.cc:354
 horaslowchannel.cc:355
 horaslowchannel.cc:356
 horaslowchannel.cc:357
 horaslowchannel.cc:358
 horaslowchannel.cc:359
 horaslowchannel.cc:360
 horaslowchannel.cc:361
 horaslowchannel.cc:362
 horaslowchannel.cc:363
 horaslowchannel.cc:364
 horaslowchannel.cc:365
 horaslowchannel.cc:366
 horaslowchannel.cc:367
 horaslowchannel.cc:368
 horaslowchannel.cc:369
 horaslowchannel.cc:370
 horaslowchannel.cc:371
 horaslowchannel.cc:372
 horaslowchannel.cc:373
 horaslowchannel.cc:374
 horaslowchannel.cc:375
 horaslowchannel.cc:376
 horaslowchannel.cc:377
 horaslowchannel.cc:378
 horaslowchannel.cc:379
 horaslowchannel.cc:380
 horaslowchannel.cc:381
 horaslowchannel.cc:382
 horaslowchannel.cc:383
 horaslowchannel.cc:384
 horaslowchannel.cc:385
 horaslowchannel.cc:386
 horaslowchannel.cc:387
 horaslowchannel.cc:388
 horaslowchannel.cc:389
 horaslowchannel.cc:390
 horaslowchannel.cc:391
 horaslowchannel.cc:392
 horaslowchannel.cc:393
 horaslowchannel.cc:394
 horaslowchannel.cc:395
 horaslowchannel.cc:396
 horaslowchannel.cc:397
 horaslowchannel.cc:398
 horaslowchannel.cc:399
 horaslowchannel.cc:400
 horaslowchannel.cc:401
 horaslowchannel.cc:402
 horaslowchannel.cc:403
 horaslowchannel.cc:404
 horaslowchannel.cc:405
 horaslowchannel.cc:406
 horaslowchannel.cc:407
 horaslowchannel.cc:408
 horaslowchannel.cc:409
 horaslowchannel.cc:410
 horaslowchannel.cc:411
 horaslowchannel.cc:412
 horaslowchannel.cc:413
 horaslowchannel.cc:414
 horaslowchannel.cc:415
 horaslowchannel.cc:416
 horaslowchannel.cc:417