1 /**************************************************************************
2 * Copyright(c) 1998-1999, 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 /// \class AliTPCSensorTempArray
18 /// \brief TPC calibration class for parameters which saved per pad
20 /// \author Marian Ivanov and Haavard Helstrup
22 #include "AliTPCSensorTempArray.h"
23 #include "TLinearFitter.h"
30 ClassImp(AliTPCSensorTempArray)
34 //_____________________________________________________________________________
35 AliTPCSensorTempArray::AliTPCSensorTempArray():AliDCSSensorArray()
38 // AliTPCSensorTempArray default constructor
42 //_____________________________________________________________________________
43 AliTPCSensorTempArray::AliTPCSensorTempArray(Int_t run) : AliDCSSensorArray()
45 /// Read configuration from OCDB
49 AliCDBManager::Instance()->Get("TPC/Config/Temperature",run);
51 TTree *tree = (TTree*) entry->GetObject();
52 fSensors = AliTPCSensorTemp::ReadTree(tree);
53 fSensors->BypassStreamer(kFALSE);
56 //_____________________________________________________________________________
57 AliTPCSensorTempArray::AliTPCSensorTempArray(UInt_t startTime, UInt_t endTime,
58 TTree* confTree, const TString& amandaString)
61 /// AliTPCSensorTempArray constructor for Shuttle preprocessor
62 /// (confTree read from OCDB)
64 fSensors = AliTPCSensorTemp::ReadTree(confTree,amandaString);
65 fSensors->BypassStreamer(kFALSE);
66 fStartTime = TTimeStamp((time_t)startTime,0);
67 fEndTime = TTimeStamp((time_t)endTime,0);
70 //_____________________________________________________________________________
71 AliTPCSensorTempArray::AliTPCSensorTempArray(const char *fname,
72 const TString& amandaString) :
75 /// AliTPCSensorTempArray constructor
77 fSensors = AliTPCSensorTemp::ReadList(fname,amandaString);
78 fSensors->BypassStreamer(kFALSE);
82 //_____________________________________________________________________________
83 AliTPCSensorTempArray::AliTPCSensorTempArray(const AliTPCSensorTempArray &c):
86 /// AliTPCSensorTempArray copy constructor
90 ///_____________________________________________________________________________
91 AliTPCSensorTempArray::~AliTPCSensorTempArray()
93 /// AliTPCSensorTempArray destructor
97 //_____________________________________________________________________________
98 AliTPCSensorTempArray &AliTPCSensorTempArray::operator=(const AliTPCSensorTempArray &c)
100 /// Assignment operator
104 new (this) AliTPCSensorTempArray(c);
105 fSensors = (TClonesArray*)c.fSensors->Clone();
111 //_____________________________________________________________________________
112 void AliTPCSensorTempArray::ReadSensors(const char *dbEntry)
114 /// Read list of temperature sensors from text file
116 AliCDBEntry *entry = AliCDBManager::Instance()->Get(dbEntry);
118 AliWarning(Form("No OCDB entry %s available\n",dbEntry));
121 TTree *tree = (TTree*) entry->GetObject();
122 if (tree) fSensors = AliTPCSensorTemp::ReadTree(tree);
126 //_____________________________________________________________________________
127 AliTPCSensorTemp* AliTPCSensorTempArray::GetSensor(Int_t type, Int_t side, Int_t sector, Int_t num)
129 /// Return sensor information for sensor specified by type, side, sector and num
131 Int_t nsensors = fSensors->GetEntries();
132 for (Int_t isensor=0; isensor<nsensors; isensor++) {
133 AliTPCSensorTemp *entry = (AliTPCSensorTemp*)fSensors->At(isensor);
134 if (entry->GetSide() == side &&
135 entry->GetType() == type &&
136 entry->GetSector() == sector &&
137 entry->GetNum() == num ) return entry;
141 //_____________________________________________________________________________
143 AliTPCSensorTemp* AliTPCSensorTempArray::GetSensor(Int_t IdDCS){
144 return dynamic_cast<AliTPCSensorTemp*>(AliDCSSensorArray::GetSensor(IdDCS));
146 //_____________________________________________________________________________
148 AliTPCSensorTemp* AliTPCSensorTempArray::GetSensor(Double_t x, Double_t y, Double_t z){
149 return dynamic_cast<AliTPCSensorTemp*>(AliDCSSensorArray::GetSensor(x,y,z));
151 //_____________________________________________________________________________
153 Double_t AliTPCSensorTempArray::GetTempGradientY(UInt_t timeSec, Int_t side){
154 /// Extract Linear Vertical Temperature Gradient [K/cm] within the TPC on
157 /// Values based on TemperatureSensors within the TPC (type: 3(TPC))
159 /// FIXME: Also return residual-distribution, covariance Matrix
160 /// or simply chi2 for validity check?
162 TLinearFitter fitter(3,"x0++x1++x2");
166 Int_t nsensors = fSensors->GetEntries();
167 for (Int_t isensor=0; isensor<nsensors; isensor++) { // loop over all sensors
168 AliTPCSensorTemp *entry = (AliTPCSensorTemp*)fSensors->At(isensor);
170 if (entry->GetType()==3 && entry->GetSide()==side) { // take SensorType:TPC
175 Double_t y = entry->GetValue(timeSec); // get temperature value
176 fitter.AddPoint(x,y,1); // add values to LinearFitter
182 fitter.GetParameters(param);
184 return param[2]; // return vertical (Y) tempGradient