ROOT logo
#include <fstream>
#include "TString.h"
#include "TDatime.h"
#include "TPRegexp.h"
#include "TArrayD.h"
#include "TMath.h"
#include <TCanvas.h>
#include <TH1F.h>

const int runCapacity = 500;
const int nMods =3;
const int sensorCapacity = 3;

const int nStat = 3;
enum StatTypes {kEntries=0, kMean=1, kRMS=2};

const char* csvTemperatureFileNames[3] = {"m4_matrix_temp_2013-02-19.csv", "m3_matrix_temp_2013-02-19.csv", "m2_matrix_temp_2013-02-19.csv"};
const char* runListFileName = "lhc13b.csv";
const char* periodFromDatime = "2013-01-20 12:00:00";
const char* periodToDatime = "2013-02-10 12:00:00";

TH1* hists[nMods][sensorCapacity] = {{0}};

UInt_t nRuns =0;
UInt_t runIndexes[runCapacity] = {0};
UInt_t fromTimes[runCapacity] = {0};
UInt_t toTimes[runCapacity] = {0};

std::ifstream* csvStreams[nMods] = {0};
TString* sensorNames[nMods][sensorCapacity] = {{0}};


TArrayD* temps[nMods][sensorCapacity][runCapacity] = {{{0}}};


Double_t stats[nMods][sensorCapacity][nStat][runCapacity] = {{{{0.}}}};
Double_t stat_errs[nMods][sensorCapacity][nStat][runCapacity] = {{{{0.}}}};




void ReadRuns(){
  Printf("reading runs");

  std::ifstream ifs(runListFileName);
  char cline[1024] = "";
  ifs.getline(cline, 1024);
  while(ifs.good()) {
    ifs.getline(cline, 1024);
    TString tline(cline);
    int index = tline.Index(",");
    if( index == -1) continue; // last line

    // date format fix:
    //Printf(tline.Data());
    tline[7] = cline[13];
    tline[8] = cline[14];
    tline[9] = cline[15];
    tline[10] = cline[16];
    tline[11] = '-';
    tline[12] = cline[10];
    tline[13] = cline[11];
    tline[14] = '-';
    tline[15] = cline[7];
    tline[16] = cline[8];
    
    tline[27] = cline[33];
    tline[28] = cline[34];
    tline[29] = cline[35];
    tline[30] = cline[36];
    tline[31] = '-';
    tline[32] = cline[30];
    tline[33] = cline[31];
    tline[34] = '-';
    tline[35] = cline[27];
    tline[36] = cline[28];
    
    
    //Printf(tline.Data());

    TStringToken fields(tline.Data(), ",");
    fields.NextToken();
    runIndexes[nRuns] = fields.Atoi();
    fields.NextToken();
    printf("%s ", fields.Data());
    TDatime fromTime(fields);
    fromTimes[nRuns] = fromTime.Convert();
    fields.NextToken();
    Printf(fields.Data());
    TDatime toTime(fields);
    toTimes[nRuns] = toTime.Convert();
    
    //Printf("run #%i, from=%s, to=%s", runIndexes[nRuns], fromTime.AsString(), toTime.AsString());
    ++nRuns;
  }
  
  Printf("done reading runs");
}

void ReadCSVHeaders() {
  // Should be called prior to ReadCSVTemp, opens ifstreams and read the first lines.
  Printf("\nOpening files and reading headers");
  for(int module = 0; module < nMods; ++module) {
    printf("module %i: ", module);
    csvStreams[module] = new std::ifstream(csvTemperatureFileNames[module]);
    std::ifstream* ifs = csvStreams[module];
    
    char cline[1024] = "";
    ifs->getline(cline, 1024); // Fist line is DCS details
    
    ifs->getline(cline, 1024); // Second line is sensor names
    TStringToken fnames(cline, ",", true);
    fnames.NextToken(); // first token will be emtpy
    
    int sensor = -1;
    while(++sensor < sensorCapacity && fnames.NextToken() ) {
      if(1==module && sensor>1 ) continue;
      sensorNames[module][sensor] = new TString(fnames);
      printf("%s, ", sensorNames[module][sensor]->Data());
    }
    printf("\n");
  }
  Printf("done reading CSV headers");
}

void MakePeriodHistograms()
{
  for(int mod = 0; mod < nMods; ++mod)
    for(int sens = 0; sens < sensorCapacity; ++sens)
      if( sensorNames[mod][sens] ) {
	hists[mod][sens] = new TH1I(sensorNames[mod][sens]->Data(), sensorNames[mod][sens]->Data(), 1000, -50, 0 );
      }
}

void ReadCSVTemp() {
  Printf(" reading data ");

  UInt_t fromTime = TDatime(periodFromDatime).Convert();
  UInt_t toTime = TDatime(periodToDatime).Convert();

  // Make Arrays
  for(int mod = 0; mod < nMods; ++mod)
    for(int sens = 0; sens < sensorCapacity; ++sens)
      for(int run = 0; run < nRuns; ++ run)
	temps[mod][sens][run] = new TArrayD(10);
    
  // go through lines
  char cline[1024] = "";
  for(int mod=0; mod<nMods; ++mod){
    Printf("module %i", mod);
    while( csvStreams[mod]->good() ) {
      csvStreams[mod]->getline(cline, 1024);
      TString tline(cline);
      int index = tline.Index(",");
      if( index == -1) continue; // last line
	
      // Date/Time
      TString dtline = tline(0,19);
      dtline.ReplaceAll("/", "-");
      TDatime datime = TDatime( dtline.Data() );
      UInt_t dateTime = datime.Convert();


      for(UInt_t run=0; run<nRuns; ++run){
      	// data
	TStringToken fields(tline, ",",true);
	fields.NextToken(); // first token is date
	int sensor = -1;
	while(++sensor < sensorCapacity && fields.NextToken() && fields.IsFloat() && sensorNames[mod][sensor]) {
	  if(fromTime < dateTime && dateTime < toTime ) {
	    hists[mod][sensor]->Fill(fields.Atof());
	    
	    if(sensorNames[mod][sensor]->EqualTo("Matrix_temperature_module_2_18"))
	      Printf("%s; %f", sensorNames[mod][sensor]->Data(), fields.Atof());
	  }


	  if( fromTimes[run] < dateTime && dateTime < toTimes[run] ) {
	    TArrayD* array = temps[mod][sensor][run];
	    Double_t& entries = stats[mod][sensor][kEntries][run];
	    ++entries;
	    if( entries > array->GetSize() )
	      array->Set(entries *2);
	    array->operator[](entries-1) = fields.Atof();
	  }
	} // sensor
      } // run
    } // line
  } // module
  
  // Extract Stats
  for(int mod = 0; mod < nMods; ++mod)
    for(int sens = 0; sens < sensorCapacity; ++sens)
      for(int run = 0; run < nRuns; ++ run){
	Double_t entries = stats[mod][sens][kEntries][run];
	//if ( entries < 3) continue;
	Double_t* array = temps[mod][sens][run]->GetArray();
	Double_t mean = TMath::Mean(entries, array);
	Double_t rms = TMath::RMS(entries, array);
	stats[mod][sens][kMean][run] = mean;
	stats[mod][sens][kRMS][run] = rms;
	//stat_errs[mod][sens][kMean][run] = rms;
      }
}

void PlotTemps() {

  bool first = true;
  
  for(int mod = 0; mod < nMods; ++mod)
    for(int sens = 0; sens < sensorCapacity; ++sens){
      if( ! sensorNames[mod][sens] ) continue;
      TString name = Form("hEntries_%s", sensorNames[mod][sens]->Data());
      TString title = Form("hEntries_%s", sensorNames[mod][sens]->Data());
      TH1F* hEntries = new TH1F(name.Data(), title.Data(), nRuns, 0, nRuns);
      for(int run = 0; run < nRuns; ++ run){
	hEntries->SetBinContent(run+1, stats[mod][sens][kEntries][run]);
	//hEntries->SetBinError(run+1, stat_errs[mod][sens][kEntries][run]);
	Printf("%f", stats[mod][sens][kEntries][run] );
      }
      //hEntries->GetYaxis()->SetRangeUser(-30, -20);
      if(first)
	hEntries->Draw();
      else
	hEntries->Draw("same");
      first = false;
    }

 return;  
}

void PlotPeriodHistograms()
{
  for(int mod = 0; mod < nMods; ++mod)
    for(int sens = 0; sens < sensorCapacity; ++sens)
      if( sensorNames[mod][sens] ) {
	TCanvas* canv = new TCanvas(sensorNames[mod][sens]->Data(), sensorNames[mod][sens]->Data());
	hists[mod][sens]->Draw();
	canv->Print(Form("imgs/%s.pdf", sensorNames[mod][sens]->Data()));
	canv->Print(Form("imgs/%s.png", sensorNames[mod][sens]->Data()));
      }
}

void temp(){
  ReadRuns();
  ReadCSVHeaders();
  MakePeriodHistograms();
  ReadCSVTemp();
  //PlotTemps();
  PlotPeriodHistograms();
}
 temp.C:1
 temp.C:2
 temp.C:3
 temp.C:4
 temp.C:5
 temp.C:6
 temp.C:7
 temp.C:8
 temp.C:9
 temp.C:10
 temp.C:11
 temp.C:12
 temp.C:13
 temp.C:14
 temp.C:15
 temp.C:16
 temp.C:17
 temp.C:18
 temp.C:19
 temp.C:20
 temp.C:21
 temp.C:22
 temp.C:23
 temp.C:24
 temp.C:25
 temp.C:26
 temp.C:27
 temp.C:28
 temp.C:29
 temp.C:30
 temp.C:31
 temp.C:32
 temp.C:33
 temp.C:34
 temp.C:35
 temp.C:36
 temp.C:37
 temp.C:38
 temp.C:39
 temp.C:40
 temp.C:41
 temp.C:42
 temp.C:43
 temp.C:44
 temp.C:45
 temp.C:46
 temp.C:47
 temp.C:48
 temp.C:49
 temp.C:50
 temp.C:51
 temp.C:52
 temp.C:53
 temp.C:54
 temp.C:55
 temp.C:56
 temp.C:57
 temp.C:58
 temp.C:59
 temp.C:60
 temp.C:61
 temp.C:62
 temp.C:63
 temp.C:64
 temp.C:65
 temp.C:66
 temp.C:67
 temp.C:68
 temp.C:69
 temp.C:70
 temp.C:71
 temp.C:72
 temp.C:73
 temp.C:74
 temp.C:75
 temp.C:76
 temp.C:77
 temp.C:78
 temp.C:79
 temp.C:80
 temp.C:81
 temp.C:82
 temp.C:83
 temp.C:84
 temp.C:85
 temp.C:86
 temp.C:87
 temp.C:88
 temp.C:89
 temp.C:90
 temp.C:91
 temp.C:92
 temp.C:93
 temp.C:94
 temp.C:95
 temp.C:96
 temp.C:97
 temp.C:98
 temp.C:99
 temp.C:100
 temp.C:101
 temp.C:102
 temp.C:103
 temp.C:104
 temp.C:105
 temp.C:106
 temp.C:107
 temp.C:108
 temp.C:109
 temp.C:110
 temp.C:111
 temp.C:112
 temp.C:113
 temp.C:114
 temp.C:115
 temp.C:116
 temp.C:117
 temp.C:118
 temp.C:119
 temp.C:120
 temp.C:121
 temp.C:122
 temp.C:123
 temp.C:124
 temp.C:125
 temp.C:126
 temp.C:127
 temp.C:128
 temp.C:129
 temp.C:130
 temp.C:131
 temp.C:132
 temp.C:133
 temp.C:134
 temp.C:135
 temp.C:136
 temp.C:137
 temp.C:138
 temp.C:139
 temp.C:140
 temp.C:141
 temp.C:142
 temp.C:143
 temp.C:144
 temp.C:145
 temp.C:146
 temp.C:147
 temp.C:148
 temp.C:149
 temp.C:150
 temp.C:151
 temp.C:152
 temp.C:153
 temp.C:154
 temp.C:155
 temp.C:156
 temp.C:157
 temp.C:158
 temp.C:159
 temp.C:160
 temp.C:161
 temp.C:162
 temp.C:163
 temp.C:164
 temp.C:165
 temp.C:166
 temp.C:167
 temp.C:168
 temp.C:169
 temp.C:170
 temp.C:171
 temp.C:172
 temp.C:173
 temp.C:174
 temp.C:175
 temp.C:176
 temp.C:177
 temp.C:178
 temp.C:179
 temp.C:180
 temp.C:181
 temp.C:182
 temp.C:183
 temp.C:184
 temp.C:185
 temp.C:186
 temp.C:187
 temp.C:188
 temp.C:189
 temp.C:190
 temp.C:191
 temp.C:192
 temp.C:193
 temp.C:194
 temp.C:195
 temp.C:196
 temp.C:197
 temp.C:198
 temp.C:199
 temp.C:200
 temp.C:201
 temp.C:202
 temp.C:203
 temp.C:204
 temp.C:205
 temp.C:206
 temp.C:207
 temp.C:208
 temp.C:209
 temp.C:210
 temp.C:211
 temp.C:212
 temp.C:213
 temp.C:214
 temp.C:215
 temp.C:216
 temp.C:217
 temp.C:218
 temp.C:219
 temp.C:220
 temp.C:221
 temp.C:222
 temp.C:223
 temp.C:224
 temp.C:225
 temp.C:226
 temp.C:227
 temp.C:228
 temp.C:229
 temp.C:230
 temp.C:231
 temp.C:232
 temp.C:233
 temp.C:234
 temp.C:235
 temp.C:236
 temp.C:237
 temp.C:238
 temp.C:239
 temp.C:240
 temp.C:241
 temp.C:242
 temp.C:243
 temp.C:244
 temp.C:245
 temp.C:246
 temp.C:247
 temp.C:248
 temp.C:249
 temp.C:250
 temp.C:251
 temp.C:252