ROOT logo
/**************************************************************************
 * Copyright(c) 2006-07, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/


////////////////////////////////////////////////////////////////////////////////
//                                                                            //
// Class describing time dependent values read from DCS sensors               //  
// (including pointers to graphs/fits)                                        //
// Authors: Marian Ivanov, Haavard Helstrup and Martin Siska                  //
//                                                                            //
////////////////////////////////////////////////////////////////////////////////


#include "AliDCSSensor.h"
#include "TDatime.h"
#include "TCanvas.h"
ClassImp(AliDCSSensor)

const Double_t kSecInHour = 3600.; // seconds in one hour



AliDCSSensor::AliDCSSensor():
  fId(),
  fIdDCS(0),
  fStringID(),
  fStartTime(0),
  fEndTime(0),
  fGraph(0),
  fFit(0),
  fX(0),
  fY(0),
  fZ(0)
{
  //
  //  Standard constructor
  //
}

AliDCSSensor::AliDCSSensor(const AliDCSSensor& source) :
   TNamed(source),
   fId(source.fId),
   fIdDCS(source.fIdDCS),
   fStringID(source.fStringID),
   fStartTime(source.fStartTime),
   fEndTime(source.fEndTime),
   fGraph(0),
   fFit(0),
   fX(source.fX),
   fY(source.fY),
   fZ(source.fZ)
//
//  Copy constructor
//
{ 
   if (source.fGraph) fGraph = (TGraph*)source.fGraph->Clone();
   if (source.fFit) fFit = (AliSplineFit*)source.fFit->Clone();
}

AliDCSSensor& AliDCSSensor::operator=(const AliDCSSensor& source){
//
// assignment operator
//
  if (&source == this) return *this;
  new (this) AliDCSSensor(source);

  return *this;
}


void AliDCSSensor::Print(const Option_t* option) const{
  //
  // print function
  //  
  TString opt = option; opt.ToLower();
  printf("%s:%s\n",GetTitle(), GetName());
  printf("%s\n",fStringID.Data());

}

void AliDCSSensor::Draw(Option_t* option) {
  //
  // draw function - to viusalize sensor
  // Unfortuantelly - it  make a memory leak as function Draw does not return the object pointer
  //
  TCanvas * canvas = new TCanvas((fStringID+option).Data(), (fStringID+option).Data()); 
  if (fGraph){
    // transform points to time in s
    Int_t npoints = fGraph->GetN();
    for (Int_t i=0; i<npoints; i++){
      fGraph->GetX()[i]=fGraph->GetX()[i]*3600+fStartTime;
    }
    fGraph->Draw("alp");
    return;
  }
  canvas->cd();
  TGraph * graph = MakeGraph(100);  // memory leak - we can not modify the content - const method
  graph->Draw(option);              // 
  //
}



//_____________________________________________________________________________
Double_t AliDCSSensor::GetValue(UInt_t timeSec)
{
 // 
 // Get DCS value for actual sensor
 //  timeSec given as offset from start-of-map measured in seconds
 //  *NOTE* In the current TPC setup, start-of-map is defined as the 
 //         first measured point for each sensor. This will be different
 //         for each sensor in the array. If you want to get a value at the 
 //         same absolute time, use AliDCSSensor::GetValue(TTimeStamp time)
 //         or AliDCSSensorArray::GetValue (UInt_t timeSec, Int_t sensor)
 //         which measure offsets with respect to the (global) start-of-run
 //
 Bool_t inside=kTRUE;
 return Eval(TTimeStamp((time_t)(fStartTime+timeSec),0),inside);
}
//_____________________________________________________________________________
Double_t AliDCSSensor::GetValue(TTimeStamp time) 
{
 // Get DCS value for actual sensor
 //  time given as absolute TTimeStamp
 //
 Bool_t inside=kTRUE;
 return Eval(time, inside);
}

//_____________________________________________________________________________

Double_t AliDCSSensor::Eval(const TTimeStamp& time, Bool_t& inside) const
{
  // 
  // Return DCS value at given time
  //  The value is calculated from the AliSplineFit, if a fit is not available 
  //    the most recent reading from the Graph of DCS points is returned (if 
  //    the graph is present)
  //  If time < start of map  return value at start of map, inside = false
  //  If time > end of map    return value at end of map, inside = false
  
  UInt_t timeSec = time.GetSec();
  UInt_t diff = timeSec-fStartTime;
  inside = true;
  
  if ( timeSec < fStartTime ) { 
     inside=false;
     diff=0;
  }
  if ( timeSec > fEndTime ) {
     inside=false;
     diff = fEndTime-fStartTime;
  }
 
  Double_t timeHour = diff/kSecInHour;
  if ( fFit ) {
     return fFit->Eval(timeHour); 
  } else {
     if ( fGraph ) {
       return EvalGraph(timeHour);
     } else {  
       return -99;
     }
  }
}
//_____________________________________________________________________________

Double_t AliDCSSensor::EvalGraph(const TTimeStamp& time, Bool_t& inside) const
{
  // 
  // Return DCS value from graph of DCS points (i.e return last reading before
  //  the time specified by TTimeStamp
  //  If time < start of map  return value at start of map, inside = false
  //  If time > end of map    return value at end of map, inside = false
  
  UInt_t timeSec = time.GetSec();
  UInt_t diff = timeSec-fStartTime;
  inside = true;
  
  if ( timeSec < fStartTime ) { 
     inside=false;
     diff=0;
  }
  if ( timeSec > fEndTime ) {
     inside=false;
     diff = fEndTime-fStartTime;
  }
 
  Double_t timeHour = diff/kSecInHour;
  if ( fGraph ) {
     return EvalGraph(timeHour);
  } else {  
     return -99;
  }  
}
//_____________________________________________________________________________
Double_t AliDCSSensor::EvalGraph(const Double_t& timeHour) const 
{
  //
  // Extract last value in graph observed before time given by timeHour
  //

  // return -99 if point specified is before beginning of graph
  Double_t x=0; Double_t y=0;
  fGraph->GetPoint(0,x,y);
  if ( timeHour < x ) return -99;
  
  // return previous point when first time > timeHour is observed
  
  Int_t npoints = fGraph->GetN();
  for (Int_t i=1; i<npoints; i++) {
     fGraph->GetPoint(i,x,y);
     if ( timeHour < x ) {
       fGraph->GetPoint(i-1,x,y);
       return y;
     }
  }
  
  // return last point if all times are < timeHour
  return y;
} 
	

//_____________________________________________________________________________
TGraph* AliDCSSensor::MakeGraph(Int_t nPoints, Bool_t debug) const
{
  //
  // Make graph from start time to end time of DCS values 
  //

 

  UInt_t stepTime = (fEndTime-fStartTime)/nPoints;
  
  if (debug==kTRUE) {
     printf ("Start time %d, End time %d, step time %d\n",
     fStartTime,fEndTime,stepTime);
     TTimeStamp t((time_t)fStartTime,0); t.Print();
     TTimeStamp t2((time_t)fEndTime,0); t2.Print();
  }     
  
  if ( !fFit ) return 0;

  Double_t *x = new Double_t[nPoints+1];
  Double_t *y = new Double_t[nPoints+1];
  for (Int_t ip=0; ip<nPoints; ip++) {
    x[ip] = (time_t)(fStartTime+ip*stepTime);
    y[ip] = fFit->Eval(ip*stepTime/kSecInHour);
    if (debug==kTRUE) {
     TTimeStamp t3((time_t)x[ip],0); 
     printf ("x=%f, y=%f  ",x[ip],y[ip]);
     t3.Print();
    }
  }
  
  TGraph *graph = new TGraph(nPoints,x,y);
  delete [] x;
  delete [] y;
  
  graph->GetXaxis()->SetTimeDisplay(1);
  graph->GetXaxis()->SetLabelOffset(0.02);
  graph->GetXaxis()->SetTimeFormat("#splitline{%d/%m}{%H:%M}");

  return graph;
}

//_____________________________________________________________________________

TClonesArray * AliDCSSensor::ReadTree(TTree* tree) {
  //
  // read values from ascii file
  //

  Int_t nentries = tree->GetEntries();

  char stringId[100];
  Int_t num=0;
  Int_t idDCS=0;
  Double_t x=0;
  Double_t y=0;
  Double_t z=0;

  tree->SetBranchAddress("StringID",&stringId);
  tree->SetBranchAddress("IdDCS",&idDCS);
  tree->SetBranchAddress("Num",&num);
  tree->SetBranchAddress("X",&x);
  tree->SetBranchAddress("Y",&y);
  tree->SetBranchAddress("Z",&z);

  // firstSensor = (Int_t)tree->GetMinimum("ECha");
  // lastSensor = (Int_t)tree->GetMaximum("ECha");

  TClonesArray * array = new TClonesArray("AliDCSSensor",nentries);
   printf ("nentries = %d\n",nentries);

  for (Int_t isensor=0; isensor<nentries; isensor++){
    AliDCSSensor * sens = new ((*array)[isensor])AliDCSSensor;
    tree->GetEntry(isensor);
    sens->SetId(isensor);
    sens->SetIdDCS(idDCS);
    sens->SetStringID(TString(stringId));
    sens->SetX(x);
    sens->SetY(y);
    sens->SetZ(z);

  }
  return array;
}

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