Classes for fitteing and retrieving Temperature Maps
authormarian <marian@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 25 Jul 2007 09:01:13 +0000 (09:01 +0000)
committermarian <marian@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 25 Jul 2007 09:01:13 +0000 (09:01 +0000)
and V drift map added (Marian)

TPC/AliTPCCalibVdrift.cxx [new file with mode: 0644]
TPC/AliTPCCalibVdrift.h [new file with mode: 0644]
TPC/AliTPCTempMap.cxx [new file with mode: 0644]
TPC/AliTPCTempMap.h [new file with mode: 0644]
TPC/TPCbaseLinkDef.h
TPC/libTPCbase.pkg

diff --git a/TPC/AliTPCCalibVdrift.cxx b/TPC/AliTPCCalibVdrift.cxx
new file mode 100644 (file)
index 0000000..d0bd275
--- /dev/null
@@ -0,0 +1,225 @@
+/**************************************************************************
+ * 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 the Vdrift dependencies on E,T,P and GasComposition      //
+// Authors: Stefan Rossegger, Haavard Helstrup                               //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+
+#include "TSystem.h"
+#include "TObject.h"
+#include "TMath.h"
+#include "AliTPCTempMap.h"
+#include "AliTPCSensorTempArray.h"
+
+#include "AliTPCCalibVdrift.h"
+
+ClassImp(AliTPCCalibVdrift)
+
+  namespace paramDefinitions {
+    
+    // Standard Conditions used as origin in the Magbolz simulations
+    // Dimesions E [kV/cm], T [K], P [TORR], Cco2 [%], Cn2 [%]
+    const Double_t kstdE = 400;
+    const Double_t kstdT = 293;
+    const Double_t kstdP = 744;
+    const Double_t kstdCco2 = 9.52;
+    const Double_t kstdCn2 = 4.76;
+    // Driftvelocity at Standardcontitions [cm/microSec]
+    const Double_t kstdVdrift = 2.57563;
+    
+    // Vdrift dependencies simulated with Magbolz [%(Vdrift)/[unit]]
+    const Double_t kdvdE = 0.24;
+    const Double_t kdvdT = 0.30;
+    const Double_t kdvdP = -0.13;
+    const Double_t kdvdCco2 = -6.60;
+    const Double_t kdvdCn2 = -1.74;
+  
+    Double_t krho = 0.934246; // density of TPC-Gas [kg/m^3]
+                              // method of calculation: weighted average
+    Double_t kg = 9.81;
+}
+
+using namespace paramDefinitions;
+
+AliTPCCalibVdrift::AliTPCCalibVdrift(AliTPCSensorTempArray *SensTemp, TObject *SensPres, TObject *SensGasComp):
+  TNamed(),
+  fSensTemp(0),
+  fSensPres(0),
+  fSensGasComp(0)
+{
+  //
+  //  Standard constructor
+  //
+
+  fSensTemp = SensTemp;
+  fSensPres = SensPres;
+  fSensGasComp = SensGasComp;
+}
+
+AliTPCCalibVdrift::AliTPCCalibVdrift(const AliTPCCalibVdrift& source) :
+  TNamed(source),
+  fSensTemp(source.fSensTemp),
+  fSensPres(source.fSensPres),
+  fSensGasComp(source.fSensGasComp)
+{
+  //
+  //  Copy constructor
+  //
+}
+
+//_____________________________________________________________________________
+
+AliTPCCalibVdrift& AliTPCCalibVdrift::operator=(const AliTPCCalibVdrift& source){
+  //
+  // assignment operator
+  //
+  if (&source == this) return *this;
+  new (this) AliTPCCalibVdrift(source);
+  
+  return *this;  
+}
+
+//_____________________________________________________________________________
+AliTPCCalibVdrift::~AliTPCCalibVdrift()
+{
+  //
+  // AliTPCCalibVdrift destructor
+  //
+}
+
+//_____________________________________________________________________________
+Double_t AliTPCCalibVdrift::VdriftLinearHyperplaneApprox(Double_t dE, Double_t dT, Double_t dP, Double_t dCco2, Double_t dCn2) 
+{
+  //
+  // Returns approximated value for the driftvelocity based on  
+  // linear Hyperplane approximation (~ Taylorapproximation of 1st order)
+  //
+
+  Double_t Vdrift = (dE*kdvdE+dT*kdvdT+dP*kdvdP+dCco2*kdvdCco2+dCn2*kdvdCn2);
+  
+  return Vdrift; 
+
+}
+//_____________________________________________________________________________
+
+Double_t AliTPCCalibVdrift::GetVdriftNominal() 
+{
+  // returns nominal Driftvelocity at StandardConditions
+  return kstdVdrift;
+}
+
+//_____________________________________________________________________________
+
+Double_t AliTPCCalibVdrift::GetVdriftChange(Double_t x, Double_t y, Double_t z, UInt_t timeSec)
+{
+  // 
+  // Calculates Vdrift change in percent of Vdrift_nominal 
+  // (under nominal conditions) at x,y,z,timeSec
+  //
+
+  // Get E-field Value --------------------------
+  Double_t dE = 0; //FIXME: eventually include Field-Inhomogenities
+
+  // Get Temperature Value ----------------------  
+  AliTPCTempMap *tempMap = new AliTPCTempMap(fSensTemp);
+  Double_t tempValue = tempMap->GetTemperature(x, y, z, timeSec);
+  Double_t dT = tempValue+273.15 - kstdT;
+  
+  // Get Main Pressure Value ---------------------
+  // FIXME: READ REAL PRESSURE SENSOR  
+  //        through TObject *fSensPres; 
+  //        e.g. Double_t PO = fSensPres->GetValue(timeSec);  
+  Double_t P0 = 744;
+  // recalculate Pressure according to height in TPC and transform to
+  // TORR (with simplified hydrostatic formula)   
+  Double_t dP = P0 - krho*kg*y/10000 /1000*760 - kstdP;
+   
+  // Get GasComposition
+  // FIXME: include Goofy values for CO2 and N2 conzentration out of DCS? 
+  //   through TObject *fSensGasComp and calculate difference to stdCondit.
+  Double_t dCco2 = 0;
+  Double_t dCn2 = 0;
+
+  // Calculate change in drift velocity in terms of Vdrift_nominal
+  Double_t vdrift = VdriftLinearHyperplaneApprox(dE, dT, dP, dCco2, dCn2); 
+  
+  return vdrift;
+    
+  tempMap->~AliTPCTempMap();
+}
+
+//_____________________________________________________________________________
+
+Double_t AliTPCCalibVdrift::GetMeanZVdriftChange(Double_t x, Double_t y, UInt_t timeSec)
+{
+  // 
+  // Calculates Meanvalue in z direction of Vdrift change in percent 
+  // of Vdrift_nominal (under standard conditions) at position x,y,timeSec
+  // with help of 'nPopints' base points
+  //
+  
+  Int_t nPoints = 5;
+  Double_t VdriftSum = 0;
+
+  for (Int_t i = 0; i<nPoints; i++) {
+    Double_t z = (Double_t)i/(nPoints-1)*500-250;
+    VdriftSum = VdriftSum + GetVdriftChange(x, y, z, timeSec);
+  }
+  
+  Double_t MeanZVdrift = VdriftSum/nPoints;
+
+  return MeanZVdrift;
+
+}
+
+//_____________________________________________________________________________
+
+TGraph *AliTPCCalibVdrift::MakeGraphMeanZVdriftChange(Double_t x, Double_t y, Int_t nPoints)
+{
+  //
+  // Make graph from start time to end time of Mean Drift Velocity in 
+  // Z direction at given x and y position
+  //
+
+  UInt_t StartTime = fSensTemp->GetStartTime();
+  UInt_t EndTime = fSensTemp->GetEndTime();
+  
+  UInt_t stepTime = (EndTime - StartTime)/nPoints;
+
+
+  Double_t *xvec = new Double_t[nPoints];
+  Double_t *yvec = new Double_t[nPoints];
+
+  for (Int_t ip=0; ip<nPoints; ip++) {
+    xvec[ip] = StartTime+ip*stepTime;
+    yvec[ip] = GetMeanZVdriftChange(x, y, ip*stepTime);
+  }
+
+  TGraph *graph = new TGraph(nPoints,xvec,yvec);
+
+  delete [] xvec;
+  delete [] yvec;
+
+  graph->GetXaxis()->SetTimeDisplay(1);
+  graph->GetXaxis()->SetLabelOffset(0.02);
+  graph->GetXaxis()->SetTimeFormat("#splitline{%d/%m}{%H:%M}");
+
+  return graph;
+}
diff --git a/TPC/AliTPCCalibVdrift.h b/TPC/AliTPCCalibVdrift.h
new file mode 100644 (file)
index 0000000..f505bb0
--- /dev/null
@@ -0,0 +1,41 @@
+#ifndef AliTPCCalibVdrift_H
+#define AliTPCCalibVdrift_H
+/* Copyright(c) 2006-07, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+////////////////////////////////////////////////////////////////////////
+//              Class AliTPCCalibVdrift
+////////////////////////////////////////////////////////////////////////
+
+
+class TObject;
+class AliTPCSensorTempArray;
+class TGraph;
+
+class AliTPCCalibVdrift : public TNamed {
+
+public:
+  AliTPCCalibVdrift(AliTPCSensorTempArray *SensTemp, TObject *SensPres, TObject *SensGasComp);
+  AliTPCCalibVdrift(const AliTPCCalibVdrift& source);
+  virtual ~AliTPCCalibVdrift();
+  AliTPCCalibVdrift& operator=(const AliTPCCalibVdrift& source);
+
+  Double_t VdriftLinearHyperplaneApprox(Double_t dE, Double_t dT, Double_t dP, Double_t dCco2, Double_t dCn2);
+  
+  Double_t GetVdriftNominal();
+  Double_t GetVdriftChange(Double_t x, Double_t y, Double_t z, UInt_t timeSec);
+
+  Double_t GetMeanZVdriftChange(Double_t x, Double_t y, UInt_t timeSec);
+
+  TGraph *MakeGraphMeanZVdriftChange(Double_t x, Double_t y, Int_t nPoints);
+
+protected:
+
+  AliTPCSensorTempArray *fSensTemp;   // Temperature sensors 
+  TObject *fSensPres;         // Placeholder for Pressure sensors
+  TObject *fSensGasComp;      // placeholder for GasConzentration infos  
+  
+  ClassDef(AliTPCCalibVdrift,1);
+
+};
+#endif
diff --git a/TPC/AliTPCTempMap.cxx b/TPC/AliTPCTempMap.cxx
new file mode 100644 (file)
index 0000000..29028e8
--- /dev/null
@@ -0,0 +1,393 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, 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.                  *
+ **************************************************************************/
+
+
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+//  TPC calibration class for temperature maps and tendencies                //
+//  (based on TPC Temperature Sensors and FiniteElement Simulation)          //
+//                                                                           //
+//  Authors: Stefan Rossegger, Haavard Helstrup                              //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+
+#include "AliTPCSensorTempArray.h"
+#include "TLinearFitter.h"
+#include "TString.h"
+#include "TGraph2D.h"
+
+#include "AliTPCTempMap.h"
+
+
+ClassImp(AliTPCTempMap)
+  
+  const char kStringFEsimulation[] = "FEsimulation.txt";
+
+//_____________________________________________________________________________
+AliTPCTempMap::AliTPCTempMap(AliTPCSensorTempArray *sensorDCS):
+  TNamed(),
+  ft(0),
+  fStringFEsimulation(kStringFEsimulation)
+{
+  //
+  // AliTPCTempMap default constructor
+  //
+
+  ft = sensorDCS;
+
+}
+
+//_____________________________________________________________________________
+AliTPCTempMap::AliTPCTempMap(const AliTPCTempMap &c):
+  TNamed(c),
+  ft(c.ft),
+  fStringFEsimulation(c.fStringFEsimulation)
+{
+  //
+  // AliTPCTempMap copy constructor
+  //
+
+}
+
+//_____________________________________________________________________________
+AliTPCTempMap::~AliTPCTempMap()
+{
+  //
+  // AliTPCTempMap destructor
+  //
+  
+}
+
+//_____________________________________________________________________________
+AliTPCTempMap &AliTPCTempMap::operator=(const AliTPCTempMap &c)
+{
+  //
+  // Assignment operator
+  //
+
+  if (this != &c) ((AliTPCTempMap &) c).Copy(*this);
+  return *this;
+
+}
+
+//_____________________________________________________________________________
+void AliTPCTempMap::Copy(TObject &c) const
+{
+  //
+  // Copy function
+  //
+  
+  TObject::Copy(c);
+  
+}
+
+//_____________________________________________________________________________
+
+Double_t AliTPCTempMap::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) )
+ //
+ // FIXME: Also return residual-distribution, covariance Matrix
+ //        or simply chi2 for validity check? 
+ //        -> better use GetLinearFitter - function in this case!
+  
+ TLinearFitter fitter(3,"x0++x1++x2");
+ TVectorD param(3);
+ Int_t i = 0;
+
+ Int_t nsensors = ft->NumSensors();
+ for (Int_t isensor=0; isensor<nsensors; isensor++) { // loop over all sensors
+   AliTPCSensorTemp *entry = (AliTPCSensorTemp*)ft->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 = entry->GetValue(timeSec); // get temperature value
+     fitter.AddPoint(x,y,1); // add values to LinearFitter
+     i++;
+   }
+
+ }  
+ fitter.Eval();
+ fitter.GetParameters(param);
+ fitter.~TLinearFitter();
+
+ return param[2]; // return vertical (Y) tempGradient in [K/cm]
+  
+}
+
+//_____________________________________________________________________________
+
+TLinearFitter *AliTPCTempMap::GetLinearFitter(Int_t type, Int_t side, UInt_t timeSec)
+{
+  // 
+  // Creates a TlinearFitter object for the desired region of the TPC 
+  // (via choosen type and side of TPC temperature sensors) at a given 
+  // timeSec (in secounds) after start time
+  // type: 0 ... ReadOutChambers (ROC)
+  //       1 ... OuterContainmentVessel (OFC)
+  //       2 ... InnerContainmentVessel (IFC) + ThermalScreener (TS)
+  //       3 ... Within the TPC (DriftVolume) (TPC)
+  // side: Can be choosen for type 0 and 3 (otherwise it will be ignored in 
+  //       in order to get all temperature sensors of interest)
+  //       0 ... Shaft Side (A)
+  //       1 ... Muon Side (C)
+  // 
+
+  TLinearFitter *fitter = new TLinearFitter(3);
+  Double_t *x = new Double_t[3];
+  Double_t y = 0;
+
+  if (type == 1 || type == 2) {
+    fitter->SetFormula("x0++x1++TMath::Sin(x2)"); // returns Z,Y gradient
+  } else {
+    fitter->SetFormula("x0++x1++x2"); // returns X,Y gradient
+  }
+
+  Int_t i = 0;
+  Int_t nsensors = ft->NumSensors();
+  for (Int_t isensor=0; isensor<nsensors; isensor++) { // loop over all sensors
+    AliTPCSensorTemp *entry = (AliTPCSensorTemp*)ft->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 = entry->GetValue(timeSec); // get temperature value
+       fitter->AddPoint(x,y,1); // add values to LinearFitter
+       i++;
+      }
+    } else if (type==2) { // in case of IFC also usage of TS values
+      if ((entry->GetType()==2) || (entry->GetType()==5)) {
+       x[0]=1;
+       x[1]=entry->GetZ();
+       x[2]=entry->GetPhi();    
+       y = entry->GetValue(timeSec);
+       fitter->AddPoint(x,y,1); 
+       i++;
+      }
+    } else if (type==1){
+      if (entry->GetType()==type) {
+       x[0]=1;
+       x[1]=entry->GetZ();
+       x[2]=entry->GetPhi();    
+       y = entry->GetValue(timeSec);
+       fitter->AddPoint(x,y,1);
+       i++;    
+      }
+    }
+  }  
+  fitter->Eval(); // Evaluates fitter
+  
+  delete [] x;
+
+  return fitter; 
+
+  // returns TLinearFitter object where Chi2, Fitparameters and residuals can 
+  // be extracted via usual memberfunctions
+  // example: fitter.GetParameters(param)
+  // In case of type IFC or OFC, the parameters are the gradients in 
+  // Z and Y direction (see fitformula)
+  // Caution: Parameters are [K/cm] except Y at IFC,OFC ([K/radius]) 
+}
+
+//_____________________________________________________________________________
+
+TGraph2D *AliTPCTempMap::GetTempMapsViaSensors(Int_t type, Int_t side, UInt_t timeSec)
+{
+  // 
+  // Creates a TGraph2D object for the desired region of the TPC 
+  // (via choosen type and side of TPC temperature sensors) at a given 
+  // timeSec (in secounds) after start time
+  // type: 0 ... ReadOutChambers (ROC)
+  //       1 ... OuterContainmentVessel (OFC)
+  //       2 ... InnerContainmentVessel (IFC) + ThermalScreener (TS)
+  //       3 ... Within the TPC (DriftVolume) (TPC)
+  // side: Can be choosen for type 0 and 3 (otherwise it will be ignored in 
+  //       in order to get all temperature sensors of interest)
+  //       0 ... Shaft Side (A)
+  //       1 ... Muon Side (C)
+  // 
+
+  TGraph2D *graph2D = new TGraph2D();
+
+  Int_t i = 0;
+  
+
+  Int_t nsensors = ft->NumSensors();
+
+  for (Int_t isensor=0; isensor<nsensors; isensor++) { // loop over all sensors
+    AliTPCSensorTemp *entry = (AliTPCSensorTemp*)ft->GetSensorNum(isensor);
+
+    Double_t x, y, z, r, phi, tempValue;
+    x = entry->GetX();
+    y = entry->GetY();
+    z = entry->GetZ();
+    r = entry->GetR();
+    phi = entry->GetPhi();
+    tempValue = entry->GetValue(timeSec);
+
+    if (type==0 || type==3) { // 'side' information used
+      if (entry->GetType()==type && entry->GetSide()==side) {
+       graph2D->SetPoint(i,x,y,tempValue);
+       i++;
+      }
+    } else if (type==2) { // in case of IFC also usage of TS values
+      if (entry->GetType()==2 || entry->GetType()==5) {
+       graph2D->SetPoint(i,z,phi,tempValue);
+       i++;
+      }
+    } else if (type==1){
+      if (entry->GetType()==type) {
+       graph2D->SetPoint(i,z,phi,tempValue);
+       i++;
+      }
+    }
+  }  
+  
+  if (type==0 || type==3) {
+    graph2D->GetXaxis()->SetTitle("X[cm]");
+    graph2D->GetYaxis()->SetTitle("Y[cm]");
+    if (type==0 && side==0) {
+      graph2D->SetTitle("ROC A - Endplate Shaft Side");
+    } else if (type==0 && side==1) {
+      graph2D->SetTitle("ROC C - Endplate Muon Side");
+    } else if (type==3 && side==0) {
+      graph2D->SetTitle("TPC A - Inside the TPC Shaft Side");
+    } else if (type==3 && side==1) {
+      graph2D->SetTitle("TPC C - Inside the TPC Muon Side");
+    }
+  } else if (type==1 || type==2) {
+    graph2D->GetXaxis()->SetTitle("Z[cm]");
+    graph2D->GetYaxis()->SetTitle("Phi[RAD]");
+    if (type==1) {
+      graph2D->SetTitle("Outer Containment Vessel");
+    } else if (type==2) {
+      graph2D->SetTitle("InnerContainmentVessel + ThermalScreeners");
+    }
+  }
+
+  if (!graph2D->GetN()) {
+    printf("Returned TGraph2D is empty: check type and side values\n");
+  }
+
+  graph2D->GetXaxis()->SetLabelOffset(0.0);
+  graph2D->GetYaxis()->SetLabelOffset(0.005);
+  graph2D->GetZaxis()->SetLabelOffset(-0.04);
+  
+
+  return graph2D; // returns TGgraph2D object
+  
+}
+
+
+//_____________________________________________________________________________
+
+TGraph *AliTPCTempMap::MakeGraphGradient(Int_t axis, Int_t side, Int_t nPoints)
+{  
+  //
+  // Make graph from start time to end time of TempGradient in axis direction
+  // axis: 0 ... horizontal Temperature Gradient (X)
+  //       1 ... vertical Temperature Gradient (Y)
+  //       2 ... longitudenal Temperature Gradient (Z) (side is ignored) 
+  //             z gradient value based on OFC temperature sensors
+  //             Caution!: better z gradient values through difference between 
+  //             param[0] A- and param[0] C-side !
+  // side for X and Y gradient: 
+  //       0 ... Shaft Side (A)
+  //       1 ... Muon Side (C)
+  //
+  
+  TVectorD param(3);
+  TLinearFitter *fitter = new TLinearFitter(3);
+
+  UInt_t fStartTime = ft->AliTPCSensorTempArray::GetStartTime();
+  UInt_t fEndTime = ft->AliTPCSensorTempArray::GetEndTime();
+  
+  UInt_t stepTime = (fEndTime-fStartTime)/nPoints;
+
+  Double_t *x = new Double_t[nPoints];
+  Double_t *y = new Double_t[nPoints];
+  for (Int_t ip=0; ip<nPoints; ip++) {
+    x[ip] = fStartTime+ip*stepTime;
+    if (axis==2) {// Gradient in Z direction (based on OFC tempSensors)
+      fitter = GetLinearFitter(1, side, ip*stepTime);
+    } else {// Gradient in X or Y direction (based on TPC tempSensors)
+      fitter = GetLinearFitter(3, side, ip*stepTime);
+    }
+    fitter->GetParameters(param);
+    // multiplied by 500 since TempGradient is in [K/cm] 
+    // (TPC diameter and length ~500cm)
+    if (axis==1) { // Y axis
+      y[ip] = param[2]*500;
+    } else { // X axis
+      y[ip] = param[1]*500;
+    }
+  }
+
+  TGraph *graph = new TGraph(nPoints,x,y);
+
+  fitter->~TLinearFitter(); 
+  delete [] x;
+  delete [] y;
+
+  graph->GetXaxis()->SetTimeDisplay(1);
+  graph->GetXaxis()->SetLabelOffset(0.02);
+  graph->GetXaxis()->SetTimeFormat("#splitline{%d/%m}{%H:%M}");
+
+  return graph;
+}
+
+//_____________________________________________________________________________
+
+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 
+  // (timeSec) after starttime
+  // Method: so far just a linear interpolation between Linar fits of 
+  //         the TPC temperature sensors
+  //         FIXME: 'Educated Fit' through FiniteElement Simulation results!
+  // FIXXME: Return 0? if x,y,z out of range
+  //
+  
+  TVectorD paramA(3), paramC(3);
+  TLinearFitter *fitterA = new TLinearFitter(3);
+  TLinearFitter *fitterC = new TLinearFitter(3);
+
+  fitterA = GetLinearFitter(3, 0, timeSec);
+  fitterA->GetParameters(paramA);
+  fitterC = GetLinearFitter(3, 1, timeSec);
+  fitterC->GetParameters(paramC);
+
+  Double_t fvalA = paramA[0]+paramA[1]*x+paramA[2]*y;
+  Double_t fvalC = paramC[0]+paramC[1]*x+paramC[2]*y;
+
+  Double_t k = (fvalA-fvalC)/(2*247);
+  Double_t tempValue = fvalC+(fvalA-fvalC)/2+k*z;
+
+  fitterA->~TLinearFitter();
+  fitterC->~TLinearFitter();
+
+  return tempValue;
+}
+
diff --git a/TPC/AliTPCTempMap.h b/TPC/AliTPCTempMap.h
new file mode 100644 (file)
index 0000000..e30bd4d
--- /dev/null
@@ -0,0 +1,46 @@
+#ifndef AliTPCTempMap_H
+#define AliTPCTempMap_H
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+//  TPC calibration class for temperature maps and tendencies                //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+
+#include "TSystem.h"
+
+class TGraph;
+class TGraph2D;
+class TLinearFitter;
+class TString;
+class AliTPCSensorTempArray;
+
+class AliTPCTempMap : public TNamed  {
+ public:
+  AliTPCTempMap(AliTPCSensorTempArray *SensorsDCS);
+  AliTPCTempMap(const char *fname);
+  AliTPCTempMap(const AliTPCTempMap &c);   
+  virtual ~AliTPCTempMap();
+  AliTPCTempMap &operator=(const AliTPCTempMap &c);
+  virtual void Copy (TObject &c) const;
+
+  Double_t GetTempGradientY(UInt_t timeSec, Int_t side);
+  TLinearFitter *GetLinearFitter(Int_t type, Int_t side, UInt_t timeSec);
+  TGraph2D *GetTempMapsViaSensors(Int_t type, Int_t side, UInt_t timeSec);
+  TGraph *MakeGraphGradient(Int_t axis, Int_t side, Int_t nPoints);
+  Double_t GetTemperature(Double_t x, Double_t y, Double_t z, UInt_t timeSec);
+
+ protected:
+  
+  AliTPCSensorTempArray *ft;   // Array of Sensors (initialized in Constructor)
+  TString fStringFEsimulation; // Placeholder for file of FiniteElement 
+                               // Simulation under ideal conditions - not existing yet
+
+  ClassDef(AliTPCTempMap,1)      //  
+
+};
+
+#endif
index 91d9a3e..488c685 100644 (file)
@@ -52,6 +52,9 @@
 #pragma link C++ class AliTPCCalibViewer+;
 #pragma link C++ class AliTPCCalibViewerGUI+;
 
+#pragma link C++ class AliTPCCalibVdrift+;
+#pragma link C++ class AliTPCTempMap+;
+
 
 #pragma link C++ class AliCorrector+;
 #pragma link C++ class AliTPCExBExact+;
index 139d7d0..b4bbea1 100644 (file)
@@ -13,7 +13,9 @@ SRCS:=  AliSegmentID.cxx  AliSegmentArray.cxx AliDigits.cxx AliH2F.cxx \
         AliTPCPreprocessor.cxx  \
         AliTPCCalibViewer.cxx  AliTPCCalibViewerGUI.cxx \
         AliTPCGenDBTemp.cxx AliTPCGenDBConf.cxx \
-       AliCorrector.cxx  AliTPCExB.cxx  AliTPCExBExact.cxx AliTPCExBFirst.cxx
+       AliCorrector.cxx  AliTPCExB.cxx  AliTPCExBExact.cxx AliTPCExBFirst.cxx \
+        AliTPCTempMap.cxx AliTPCCalibVdrift.cxx
+