///////////////////////////////////////////////////////////////////////////////
#include "AliTPCSensorTempArray.h"
+#include "TLinearFitter.h"
+#include "TVectorD.h"
+#include "AliLog.h"
+
+
ClassImp(AliTPCSensorTempArray)
-const char kFname[] = "TempSensor.txt";
-const Int_t kMinGraph = 10; // minimum #points of graph to be fitted
-const Int_t kMinPoints = 10; // minimum number of points per knot in fit
-const Int_t kIter = 10; // number of iterations for spline fit
-const Double_t kMaxDelta = 0.00; // precision parameter for spline fit
-const Int_t kFitReq = 2; // fit requirement, 2 = continuous 2nd derivative
//_____________________________________________________________________________
AliTPCSensorTempArray::AliTPCSensorTempArray():AliDCSSensorArray()
//
// AliTPCSensorTempArray default constructor
//
- fSensors = 0;
- fFirstSensor = 0;
- fLastSensor = 0;
- TTimeStamp defTime(2000,1,1,0,0,0);
- fStartTime = defTime;
- fEndTime = defTime;
-
+
}
//_____________________________________________________________________________
-AliTPCSensorTempArray::AliTPCSensorTempArray(Int_t prevRun) :
- AliDCSSensorArray(prevRun,"TPC/Calib/Temperature")
+AliTPCSensorTempArray::AliTPCSensorTempArray(Int_t run) : AliDCSSensorArray()
{
+ //
+ // Read configuration from OCDB
+ //
+
+
+ AliCDBEntry *entry =
+ AliCDBManager::Instance()->Get("TPC/Config/Temperature",run);
+ TTree *tree = (TTree*) entry->GetObject();
+ fSensors = AliTPCSensorTemp::ReadTree(tree);
+ fSensors->BypassStreamer(kFALSE);
+
}
//_____________________________________________________________________________
-AliTPCSensorTempArray::AliTPCSensorTempArray(UInt_t startTime, UInt_t endTime)
+AliTPCSensorTempArray::AliTPCSensorTempArray(UInt_t startTime, UInt_t endTime,
+ TTree* confTree, const TString& amandaString)
:AliDCSSensorArray()
{
//
- // AliTPCSensorTempArray default constructor
+ // AliTPCSensorTempArray constructor for Shuttle preprocessor
+ // (confTree read from OCDB)
//
- fSensors = AliTPCSensorTemp::ReadListInd(kFname,fFirstSensor,fLastSensor);
- fStartTime = TTimeStamp(startTime);
- fEndTime = TTimeStamp(endTime);
-
+ fSensors = AliTPCSensorTemp::ReadTree(confTree,amandaString);
+ fSensors->BypassStreamer(kFALSE);
+ fStartTime = TTimeStamp((time_t)startTime,0);
+ fEndTime = TTimeStamp((time_t)endTime,0);
}
//_____________________________________________________________________________
-AliTPCSensorTempArray::AliTPCSensorTempArray(const char *fname) :
+AliTPCSensorTempArray::AliTPCSensorTempArray(const char *fname,
+ const TString& amandaString) :
AliDCSSensorArray()
{
//
// AliTPCSensorTempArray constructor
//
- fSensors = AliTPCSensorTemp::ReadListInd(fname,fFirstSensor,fLastSensor);
+ fSensors = AliTPCSensorTemp::ReadList(fname,amandaString);
fSensors->BypassStreamer(kFALSE);
- TTimeStamp defTime(2000,1,1,0,0,0);
- fStartTime = defTime;
- fEndTime = defTime;
-
}
//
// AliTPCSensorTempArray destructor
//
- fSensors->Delete();
- delete fSensors;
-
}
//_____________________________________________________________________________
//
// Assignment operator
//
-
- if (this != &c) ((AliTPCSensorTempArray &) c).Copy(*this);
+ if (this != &c) {
+ fSensors->Delete();
+ new (this) AliTPCSensorTempArray(c);
+ fSensors = (TClonesArray*)c.fSensors->Clone();
+ }
return *this;
-
}
-//_____________________________________________________________________________
-void AliTPCSensorTempArray::Copy(TObject &c) const
-{
- //
- // Copy function
- //
- TObject::Copy(c);
-}
//_____________________________________________________________________________
-void AliTPCSensorTempArray::ReadSensors(const char *fname)
+void AliTPCSensorTempArray::ReadSensors(const char *dbEntry)
{
//
// Read list of temperature sensors from text file
//
- fSensors = AliTPCSensorTemp::ReadListInd(fname,fFirstSensor,fLastSensor);
+ AliCDBEntry *entry = AliCDBManager::Instance()->Get(dbEntry);
+ TTree *tree = (TTree*) entry->GetObject();
+ fSensors = AliTPCSensorTemp::ReadTree(tree);
+
}
+
//_____________________________________________________________________________
-void AliTPCSensorTempArray::SetGraph(TMap *map)
+AliTPCSensorTemp* AliTPCSensorTempArray::GetSensor(Int_t type, Int_t side, Int_t sector, Int_t num)
{
- //
- // Read graphs from DCS maps
- //
- AliDCSSensorArray::SetGraph(map,"tpc_temp:PT_%d.Temperature");
-}
+ //
+ // Return sensor information for sensor specified by type, side, sector and num
+ //
+ Int_t nsensors = fSensors->GetEntries();
+ for (Int_t isensor=0; isensor<nsensors; isensor++) {
+ AliTPCSensorTemp *entry = (AliTPCSensorTemp*)fSensors->At(isensor);
+ if (entry->GetSide() == side &&
+ entry->GetType() == type &&
+ entry->GetSector() == sector &&
+ entry->GetNum() == num ) return entry;
+ }
+ return 0;
+}
//_____________________________________________________________________________
-void AliTPCSensorTempArray::MakeSplineFit(TMap *map)
-{
- //
- // Make spline fits from DCS maps
- //
- AliDCSSensorArray::MakeSplineFit(map,"tpc_temp:PT_%d.Temperature");
-}
+AliTPCSensorTemp* AliTPCSensorTempArray::GetSensor(Int_t IdDCS){
+ return dynamic_cast<AliTPCSensorTemp*>(AliDCSSensorArray::GetSensor(IdDCS));
+}
+//_____________________________________________________________________________
+AliTPCSensorTemp* AliTPCSensorTempArray::GetSensor(Double_t x, Double_t y, Double_t z){
+ return dynamic_cast<AliTPCSensorTemp*>(AliDCSSensorArray::GetSensor(x,y,z));
+}
//_____________________________________________________________________________
-TMap* AliTPCSensorTempArray::ExtractDCS(TMap *dcsMap)
-{
+
+Double_t AliTPCSensorTempArray::GetTempGradientY(UInt_t timeSec, Int_t side){
+ //
+ // Extract Linear Vertical Temperature Gradient [K/cm] within the TPC on
+ // Shaft Side(A): 0
+ // Muon Side(C): 1
+ // Values based on TemperatureSensors within the TPC (type: 3(TPC))
//
- // Extract temperature graphs from DCS maps
+ // FIXME: Also return residual-distribution, covariance Matrix
+ // or simply chi2 for validity check?
//
- TMap *values = AliDCSSensorArray::ExtractDCS(dcsMap,"tpc_temp:PT_%d.Temperature");
- return values;
-}
+ TLinearFitter fitter(3,"x0++x1++x2");
+ TVectorD param(3);
+ Int_t i = 0;
+
+ Int_t nsensors = fSensors->GetEntries();
+ for (Int_t isensor=0; isensor<nsensors; isensor++) { // loop over all sensors
+ AliTPCSensorTemp *entry = (AliTPCSensorTemp*)fSensors->At(isensor);
+
+ if (entry->GetType()==3 && entry->GetSide()==side) { // take SensorType:TPC
+ Double_t x[3];
+ x[0]=1;
+ x[1]=entry->GetX();
+ x[2]=entry->GetY();
+ Double_t y = entry->GetValue(timeSec); // get temperature value
+ fitter.AddPoint(x,y,1); // add values to LinearFitter
+ i++;
+ }
+
+ }
+ fitter.Eval();
+ fitter.GetParameters(param);
+
+ return param[2]; // return vertical (Y) tempGradient
+ }