// //
// Authors: Stefan Rossegger, Haavard Helstrup //
// //
+// Note: Obvioulsy some changes by Marian, but when ??? //
+// //
///////////////////////////////////////////////////////////////////////////////
#include "AliTPCSensorTempArray.h"
#include "TLinearFitter.h"
#include "TString.h"
#include "TGraph2D.h"
+#include "TTimeStamp.h"
#include "AliTPCTempMap.h"
//_____________________________________________________________________________
AliTPCTempMap::AliTPCTempMap(AliTPCSensorTempArray *sensorDCS):
TNamed(),
- ft(0),
+ fTempArray(0),
fStringFEsimulation(kStringFEsimulation)
{
//
// AliTPCTempMap default constructor
//
- ft = sensorDCS;
+ fTempArray = sensorDCS;
}
//_____________________________________________________________________________
AliTPCTempMap::AliTPCTempMap(const AliTPCTempMap &c):
TNamed(c),
- ft(c.ft),
+ fTempArray(c.fTempArray),
fStringFEsimulation(c.fStringFEsimulation)
{
//
TVectorD param(3);
Int_t i = 0;
- Int_t nsensors = ft->NumSensors();
+ Int_t nsensors = fTempArray->NumSensors();
for (Int_t isensor=0; isensor<nsensors; isensor++) { // loop over all sensors
- AliTPCSensorTemp *entry = (AliTPCSensorTemp*)ft->GetSensorNum(isensor);
+ AliTPCSensorTemp *entry = (AliTPCSensorTemp*)fTempArray->GetSensorNum(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 = ft->GetValue(timeSec,isensor); // get temperature value
- fitter->AddPoint(x,y,1); // add values to LinearFitter
+ Double_t y = fTempArray->GetValue(timeSec,isensor); // get temperature value
+ if (IsOK(y)) fitter->AddPoint(x,y,1); // add values to LinearFitter
i++;
}
}
//_____________________________________________________________________________
+TLinearFitter *AliTPCTempMap::GetLinearFitter(Int_t type, Int_t side, TTimeStamp &stamp)
+{
+ //
+ // absolute time stamp used
+ // see AliTPCTempMap::GetLinearFitter(Int_t type, Int_t side, UInt_t timeSec) for details
+ //
+ Int_t timeSec = stamp.GetSec()-fTempArray->GetStartTime().GetSec();
+ return GetLinearFitter(type,side,timeSec);
+}
+//_____________________________________________________________________________
TLinearFitter *AliTPCTempMap::GetLinearFitter(Int_t type, Int_t side, UInt_t timeSec)
{
//
TLinearFitter *fitter = new TLinearFitter(3);
Double_t *x = new Double_t[3];
Double_t y = 0;
-
+ const Float_t kMaxDelta=0.5;
+
if (type == 1 || type == 2 || type == 4) {
fitter->SetFormula("x0++x1++TMath::Sin(x2)"); // returns Z,Y gradient
} else {
}
Int_t i = 0;
- Int_t nsensors = ft->NumSensors();
+ Int_t nsensors = fTempArray->NumSensors();
+
+ Float_t temps[1000];
+ for (Int_t isensor=0; isensor<nsensors; isensor++) { // loop over all sensors
+ AliTPCSensorTemp *entry = (AliTPCSensorTemp*)fTempArray->GetSensorNum(isensor);
+ if (entry->GetType()==type && entry->GetSide()==side){
+ Float_t temperature= fTempArray->GetValue(timeSec,isensor); // get temperature value
+ if (IsOK(temperature)) {temps[i]=temperature; i++;}
+ }
+ }
+ Float_t medianTemp = TMath::Median(i, temps);
+ if (i<3) return 0;
+ Float_t rmsTemp = TMath::RMS(i, temps);
+
+ i=0;
+
for (Int_t isensor=0; isensor<nsensors; isensor++) { // loop over all sensors
- AliTPCSensorTemp *entry = (AliTPCSensorTemp*)ft->GetSensorNum(isensor);
+ AliTPCSensorTemp *entry = (AliTPCSensorTemp*)fTempArray->GetSensorNum(isensor);
if (type==0 || type==3) { // 'side' information used
if (entry->GetType()==type && entry->GetSide()==side) {
x[0]=1;
x[1]=entry->GetX();
x[2]=entry->GetY();
- y = ft->GetValue(timeSec,isensor); // get temperature value
- fitter->AddPoint(x,y,1); // add values to LinearFitter
+ y = fTempArray->GetValue(timeSec,isensor); // get temperature value
+ if (TMath::Abs(y-medianTemp)>kMaxDelta+4.*rmsTemp) continue;
+ if (IsOK(y)) fitter->AddPoint(x,y,1); // add values to LinearFitter
i++;
}
} else if (type==2) { // in case of IFC also usage of TS values
x[0]=1;
x[1]=entry->GetZ();
x[2]=entry->GetPhi();
- y = ft->GetValue(timeSec,isensor);
- fitter->AddPoint(x,y,1);
+ y = fTempArray->GetValue(timeSec,isensor);
+ if (TMath::Abs(y-medianTemp)>kMaxDelta+4.*rmsTemp) continue;
+ if (IsOK(y)) fitter->AddPoint(x,y,1);
i++;
}
} else if (type==1){
x[0]=1;
x[1]=entry->GetZ();
x[2]=entry->GetPhi();
- y = ft->GetValue(timeSec,isensor);
- fitter->AddPoint(x,y,1);
+ y = fTempArray->GetValue(timeSec,isensor);
+ if (TMath::Abs(y-medianTemp)>kMaxDelta+4.*rmsTemp) continue;
+ if (IsOK(y)) fitter->AddPoint(x,y,1);
i++;
}
} else if (type==4) { // ONLY IFC
x[0]=1;
x[1]=entry->GetZ();
x[2]=entry->GetPhi();
- y = ft->GetValue(timeSec,isensor);
- fitter->AddPoint(x,y,1);
+ y = fTempArray->GetValue(timeSec,isensor);
+ if (TMath::Abs(y-medianTemp)>kMaxDelta+4.*rmsTemp) continue;
+ if (IsOK(y)) fitter->AddPoint(x,y,1);
i++;
}
}
}
- fitter->Eval(); // Evaluates fitter
+ fitter->Eval();
+ //fitter->EvalRobust(0.9); // Evaluates fitter
delete [] x;
Int_t i = 0;
- Int_t nsensors = ft->NumSensors();
+ Int_t nsensors = fTempArray->NumSensors();
for (Int_t isensor=0; isensor<nsensors; isensor++) { // loop over all sensors
- AliTPCSensorTemp *entry = (AliTPCSensorTemp*)ft->GetSensorNum(isensor);
+ AliTPCSensorTemp *entry = (AliTPCSensorTemp*)fTempArray->GetSensorNum(isensor);
Double_t x, y, z, r, phi, tempValue;
x = entry->GetX();
z = entry->GetZ();
r = entry->GetR();
phi = entry->GetPhi();
- tempValue = ft->GetValue(timeSec,isensor);
+ tempValue = fTempArray->GetValue(timeSec,isensor);
// printf("%d type %d: x=%lf y=%lf temp=%lf\n",isensor,entry->GetType(),x,y, tempValue);
if (type==0 || type==3) { // 'side' information used
if (entry->GetType()==type && entry->GetSide()==side) {
TVectorD param(3);
TLinearFitter *fitter = new TLinearFitter(3);
- UInt_t fStartTime = ft->AliTPCSensorTempArray::GetStartTime();
- UInt_t fEndTime = ft->AliTPCSensorTempArray::GetEndTime();
+ UInt_t fStartTime = fTempArray->AliTPCSensorTempArray::GetStartTime();
+ UInt_t fEndTime = fTempArray->AliTPCSensorTempArray::GetEndTime();
UInt_t stepTime = (fEndTime-fStartTime)/nPoints;
return graph;
}
+
+//_____________________________________________________________________________
+Double_t AliTPCTempMap::GetTemperature(Double_t x, Double_t y, Double_t z, TTimeStamp &stamp)
+{
+ //
+ // absolute time stamp used
+ // see also Double_t AliTPCTempMap::GetTemperature(Double_t x, Double_t y, Double_t z, UInt_t timeSec) for details
+ //
+
+ Int_t timeSec = stamp.GetSec()-fTempArray->GetStartTime().GetSec();
+ return GetTemperature(x, y, z, timeSec);
+}
+
//_____________________________________________________________________________
Double_t AliTPCTempMap::GetTemperature(Double_t x, Double_t y, Double_t z, UInt_t timeSec)
{
//
- // Returns estimated Temperature at given position (x,y,z) at given time
+ // Returns estimated Temperature at given position (x,y,z[cm]) at given time
// (timeSec) after starttime
// Method: so far just a linear interpolation between Linar fits of
// the TPC temperature sensors
fitterC->~TLinearFitter();
return tempValue;
+
}
+
+Bool_t AliTPCTempMap::IsOK(Float_t value){
+ //
+ // checks if value is within a certain range
+ //
+ const Float_t kMinT=15;
+ const Float_t kMaxT=25;
+ return (value>kMinT && value<kMaxT);
+}