1 /**************************************************************************
2 * Copyright(c) 2006-07, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
17 ////////////////////////////////////////////////////////////////////////////////
19 // Class describing TPC temperature sensors (including pointers to graphs/fits//
20 // Authors: Marian Ivanov, Haavard Helstrup and Martin Siska //
22 ////////////////////////////////////////////////////////////////////////////////
25 #include "AliDCSSensor.h"
27 ClassImp(AliDCSSensor)
29 const Double_t kSecInHour = 3600.; // seconds in one hour
33 AliDCSSensor::AliDCSSensor():
46 // Standard constructor
50 AliDCSSensor::AliDCSSensor(const AliDCSSensor& source) :
53 fIdDCS(source.fIdDCS),
54 fStringID(source.fStringID),
55 fStartTime(source.fStartTime),
56 fEndTime(source.fEndTime),
66 if (source.fGraph) fGraph = (TGraph*)source.fGraph->Clone();
67 if (source.fFit) fFit = (AliSplineFit*)source.fFit->Clone();
70 AliDCSSensor& AliDCSSensor::operator=(const AliDCSSensor& source){
72 // assignment operator
74 if (&source == this) return *this;
75 new (this) AliDCSSensor(source);
80 //_____________________________________________________________________________
81 Double_t AliDCSSensor::GetValue(UInt_t timeSec)
84 // Get temperature value for actual sensor
85 // timeSec given as offset from start-of-map measured in seconds
86 // *NOTE* In the current TPC setup, start-of-map is defined as the
87 // first measured point for each sensor. This will be different
88 // for each sensor in the array. If you want to get a value at the
89 // same absolute time, use AliDCSSensor::GetValue(TTimeStamp time)
90 // or AliDCSSensorArray::GetValue (UInt_t timeSec, Int_t sensor)
91 // which measure offsets with respect to the (global) start-of-run
94 return Eval(TTimeStamp((time_t)(fStartTime+timeSec),0),inside);
96 //_____________________________________________________________________________
97 Double_t AliDCSSensor::GetValue(TTimeStamp time)
99 // Get temperature value for actual sensor
100 // time given as absolute TTimeStamp
103 return Eval(time, inside);
106 //_____________________________________________________________________________
108 Double_t AliDCSSensor::Eval(const TTimeStamp& time, Bool_t inside) const
111 // Return temperature at given time
112 // If time < start of map return value at start of map, inside = false
113 // If time > end of map return value at end of map, inside = false
115 UInt_t timeSec = time.GetSec();
116 UInt_t diff = timeSec-fStartTime;
119 if ( timeSec < fStartTime ) {
123 if ( timeSec > fEndTime ) {
125 diff = fEndTime-fStartTime;
128 Double_t timeHour = diff/kSecInHour;
130 return fFit->Eval(timeHour);
133 return EvalGraph(timeHour);
139 //_____________________________________________________________________________
140 Double_t AliDCSSensor::EvalGraph(const Double_t& timeHour) const
143 // Extract last value in graph observed before time given by timeHour
146 // return -99 if point specified is before beginning of graph
147 Double_t x=0; Double_t y=0;
148 fGraph->GetPoint(0,x,y);
149 if ( timeHour < x ) return -99;
151 // return previous point when first time > timeHour is observed
153 Int_t npoints = fGraph->GetN();
154 for (Int_t i=1; i<npoints; i++) {
155 fGraph->GetPoint(i,x,y);
156 if ( timeHour < x ) {
157 fGraph->GetPoint(i-1,x,y);
162 // return last point if all times are < timeHour
167 //_____________________________________________________________________________
168 TGraph* AliDCSSensor::MakeGraph(Int_t nPoints, Bool_t debug) const
171 // Make graph from start time to end time of DCS values
176 UInt_t stepTime = (fEndTime-fStartTime)/nPoints;
179 printf ("Start time %d, End time %d, step time %d\n",
180 fStartTime,fEndTime,stepTime);
181 TTimeStamp t((time_t)fStartTime,0); t.Print();
182 TTimeStamp t2((time_t)fEndTime,0); t2.Print();
185 if ( !fFit ) return 0;
187 Double_t *x = new Double_t[nPoints+1];
188 Double_t *y = new Double_t[nPoints+1];
189 for (Int_t ip=0; ip<nPoints; ip++) {
190 x[ip] = (time_t)(fStartTime+ip*stepTime);
191 y[ip] = fFit->Eval(ip*stepTime/kSecInHour);
193 TTimeStamp t3((time_t)x[ip],0);
194 printf ("x=%f, y=%f ",x[ip],y[ip]);
199 TGraph *graph = new TGraph(nPoints,x,y);
203 graph->GetXaxis()->SetTimeDisplay(1);
204 graph->GetXaxis()->SetLabelOffset(0.02);
205 graph->GetXaxis()->SetTimeFormat("#splitline{%d/%m}{%H:%M}");
210 //_____________________________________________________________________________
212 TClonesArray * AliDCSSensor::ReadTree(TTree* tree) {
214 // read values from ascii file
217 Int_t nentries = tree->GetEntries();
226 tree->SetBranchAddress("StringID",&stringId);
227 tree->SetBranchAddress("IdDCS",&idDCS);
228 tree->SetBranchAddress("Num",&num);
229 tree->SetBranchAddress("X",&x);
230 tree->SetBranchAddress("Y",&y);
231 tree->SetBranchAddress("Z",&z);
233 // firstSensor = (Int_t)tree->GetMinimum("ECha");
234 // lastSensor = (Int_t)tree->GetMaximum("ECha");
236 TClonesArray * array = new TClonesArray("AliDCSSensor",nentries);
237 printf ("nentries = %d\n",nentries);
239 for (Int_t isensor=0; isensor<nentries; isensor++){
240 AliDCSSensor * sens = new ((*array)[isensor])AliDCSSensor;
241 tree->GetEntry(isensor);
242 sens->SetId(isensor);
243 sens->SetIdDCS(idDCS);
244 sens->SetStringID(TString(stringId));