Changes for task:
authormivanov <mivanov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 17 Sep 2013 18:17:53 +0000 (18:17 +0000)
committermivanov <mivanov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 17 Sep 2013 18:17:53 +0000 (18:17 +0000)
https://trello.com/c/y2PApfkL/1-code-high-voltage-and-p-t-correction-of-gain

M       Base/AliTPCParam.cxx      - Gain correction as function of HV and P/T
M       Base/AliTPCParam.h
M       Base/AliTPCcalibDB.cxx    - Gain correction as function of HV and P/T + deltaZ per run
M       Base/AliTPCcalibDB.h      - Gain correction as function of HV and P/T

TPC/Base/AliTPCParam.cxx
TPC/Base/AliTPCParam.h
TPC/Base/AliTPCcalibDB.cxx
TPC/Base/AliTPCcalibDB.h

index 37a82d8..c081350 100644 (file)
@@ -36,6 +36,7 @@
 #include "AliAlignObj.h"
 #include "AliAlignObjParams.h"
 #include "AliLog.h"
+#include "TGraphErrors.h"
 
 ClassImp(AliTPCParam)
 
@@ -103,6 +104,8 @@ AliTPCParam::AliTPCParam()
             fOmegaTau(0.),
             fAttCoef(0.),
             fOxyCont(0.),
+            fGainSlopesHV(0),   // graph with the gain slope as function of HV - per chamber
+            fGainSlopesPT(0),   // graph with the gain slope as function of P/T - per chamber
             fPadCoupling(0.),
             fZeroSup(0),
             fNoise(0.),
@@ -851,3 +854,21 @@ Float_t AliTPCParam::GetChamberCenter(Int_t isec, Float_t * center) const
   }
 }
 
+void AliTPCParam::SetNominalGainSlopes(){
+  //
+  // Setting the nominal TPC gain slopes 
+  // Nominal values were obtained as a mena values foe 2010,2011, and 2012 data
+  // Differntial values can be provided per year
+  //
+  Float_t sector[72]={0};
+  Float_t gainHV[72]={0};
+  Float_t gainPT[72]={0};
+  //
+  for (Int_t isec=0; isec<72; isec++){
+    sector[isec]=isec;
+    gainHV[isec]=0.0115;  // change of the Gain dG/G  per 1 Volt  of voltage change(1/V) - it is roughly the same for IROC and OROC
+    gainPT[isec]=2.2;     // change of the Gains dG/G per P/T change ()
+  }
+  fGainSlopesHV = new TGraphErrors(72,sector,gainHV,0,0);
+  fGainSlopesPT = new TGraphErrors(72,sector,gainPT,0,0);
+}
index 4984b5e..3652418 100644 (file)
@@ -15,6 +15,7 @@
 #include <TGeoMatrix.h>
 
 class TString;
+class TGraphErrors;
 
 class AliTPCParam : public AliDetectorParam {
   //////////////////////////////////////////////////////
@@ -181,6 +182,9 @@ public:
   void  SetOmegaTau(Float_t OmegaTau){  fOmegaTau=OmegaTau;}
   void  SetAttCoef(Float_t AttCoef){  fAttCoef=AttCoef;}
   void  SetOxyCont(Float_t OxyCont){  fOxyCont=OxyCont;}
+  void  SetGainSlopesHV(TGraphErrors * gainSlopesHV){ fGainSlopesHV=gainSlopesHV;}
+  void  SetGainSlopesPT(TGraphErrors * gainSlopesPT){ fGainSlopesPT=gainSlopesPT;}
+  void  SetNominalGainSlopes();
   //
   //set electronivc parameters  
   //
@@ -307,7 +311,10 @@ public:
   Float_t  GetDriftV() const {return fDriftV;}
   Float_t  GetOmegaTau() const {return fOmegaTau;}
   Float_t  GetAttCoef() const {return fAttCoef;}
-  Float_t  GetOxyCont() const {return fOxyCont;}
+  Float_t  GetOxyCont() const {return fOxyCont;} 
+  TGraphErrors * GetGainSlopesHV() const { return fGainSlopesHV;}
+  TGraphErrors * GetGainSlopesPT() const { return fGainSlopesPT;}
+
   //
   //get Electronic parameters
   //
@@ -440,6 +447,8 @@ protected :
   Float_t  fOmegaTau;       //omega tau ExB coeficient
   Float_t  fAttCoef;        //attachment coefitients
   Float_t  fOxyCont;        //oxygen content
+  TGraphErrors * fGainSlopesHV;   // graph with the gain slope as function of HV - per chamber
+  TGraphErrors * fGainSlopesPT;   // graph with the gain slope as function of P/T - per chamber
   //---------------------------------------------------------------------
   //   ALICE TPC  Electronics Parameters
   //--------------------------------------------------------------------
@@ -489,7 +498,7 @@ private:
 
   void CleanGeoMatrices();
 
-  ClassDef(AliTPCParam,5)  //parameter  object for set:TPC
+  ClassDef(AliTPCParam,6)  //parameter  object for set:TPC
 };
 
  
index f54cf30..8aed5e3 100644 (file)
@@ -2264,6 +2264,35 @@ Double_t AliTPCcalibDB::GetVDriftCorrectionGy(Int_t timeStamp, Int_t run, Int_t
   return -result/250.; //normalized before
 }
 
+
+Double_t AliTPCcalibDB::GetVDriftCorrectionDeltaZ(Int_t /*timeStamp*/, Int_t run, Int_t /*side*/, Int_t /*mode*/){
+  //
+  // Get deltaZ run/by/run  correction - as fitted together with drift velocity
+  // Value extracted  form the TPC-ITS, mean value is used
+  
+  // Arguments:
+  // mode determines the algorith how to combine the Laser Track, LaserCE or TPC-ITS
+  // timestamp - timestamp
+  // run       - run number
+  // side      - the drift velocity gy correction per side (CE and Laser tracks)
+  //
+  if (run<=0 && fTransform) run = fTransform->GetCurrentRunNumber();
+  UpdateRunInformations(run,kFALSE);
+  TObjArray *array =AliTPCcalibDB::Instance()->GetTimeVdriftSplineRun(run);
+  if (!array) return 0;
+  Double_t result=0;
+
+  // use TPC-ITS if present
+  TGraphErrors *gr= (TGraphErrors*)array->FindObject("ALIGN_ITSB_TPC_DELTAZ");
+  if(gr) { 
+    result = TMath::Mean(gr->GetN(), gr->GetY());
+  }
+  return result;
+}
+
+
+
+
 AliTPCCalPad* AliTPCcalibDB::MakeDeadMap(Double_t notInMap, const char* nameMappingFile) {
 //
 //   Read list of active DDLs from OCDB entry
@@ -2382,3 +2411,36 @@ AliTPCCorrection * AliTPCcalibDB::GetTPCComposedCorrectionDelta() const{
   return (AliTPCCorrection *)fComposedCorrectionArray->At(4);  //
 }
 
+Double_t AliTPCcalibDB::GetGainCorrectionHVandPT(Int_t timeStamp, Int_t run, Int_t sector, Int_t deltaCache){
+  //
+  // Correction for  changes of gain caused by change of the HV and by relative change of the gas density
+  // Function is slow some kind of caching needed
+  // Cache implemented using the static TVectorD
+  //
+  // Input paremeters:
+  //  deltaCache - maximal time differnce above which the cache is recaclulated
+  // 
+  static TVectorD gGainCorrection(72);
+  static Int_t gTimeStamp=0;
+  if ( TMath::Abs(timeStamp-gTimeStamp)> deltaCache){    
+    //
+    TGraphErrors * graphGHV = 0;
+    TGraphErrors * graphGPT = 0;
+    TObjArray *timeGainSplines = GetTimeGainSplinesRun(run);
+    graphGHV  = (TGraphErrors*) timeGainSplines->FindObject("GainSlopesHV");
+    graphGPT  = (TGraphErrors*) timeGainSplines->FindObject("GainSlopesPT");
+    if (!graphGHV) graphGHV = fParam->GetGainSlopesHV();
+    if (!graphGPT) graphGPT = fParam->GetGainSlopesPT();
+    //
+    for (Int_t isec=0; isec<72; isec++){
+      Double_t deltaHV= GetChamberHighVoltage(run,isec, timeStamp) - fParam->GetNominalVoltage(isec);
+      Double_t deltaGHV=0;
+      Double_t deltaGPT=0;
+      if (graphGHV) deltaGHV = graphGHV->GetY()[isec]*deltaHV;
+      if (graphGPT) deltaGPT = graphGPT->GetY()[isec]*GetPTRelative(timeStamp,run,0);
+      gGainCorrection[isec]=deltaGHV+deltaGPT;
+    }    
+    gTimeStamp=timeStamp;
+  }
+  return gGainCorrection[sector];
+}
index bd4901d..cd95a26 100644 (file)
@@ -147,6 +147,7 @@ class AliTPCcalibDB : public TObject
   Float_t GetChamberCurrentNominalHighVoltage(UInt_t roc) const { return (roc<72)?fCurrentNominalVoltage[roc]:0.; }
   Float_t GetChamberGoodHighVoltageFraction(UInt_t roc)   const { return (roc<72)?fChamberHVgoodFraction[roc]:0.; }
   AliDCSSensor* GetChamberHVSensor(UInt_t roc)            const { return (roc<72)?fHVsensors[roc]:0x0;            }
+  Double_t GetGainCorrectionHVandPT(Int_t timeStamp, Int_t run, Int_t sector, Int_t deltaCache);
   Bool_t  IsDataTakingActive(time_t timeStamp);
   //
   //Goofie Values
@@ -171,6 +172,7 @@ class AliTPCcalibDB : public TObject
   Double_t      GetVDriftCorrectionTime(Int_t timeStamp, Int_t run, Int_t side, Int_t mode);
   Double_t      GetTime0CorrectionTime(Int_t timeStamp, Int_t run, Int_t side, Int_t mode);
   Double_t      GetVDriftCorrectionGy(Int_t timeStamp, Int_t run, Int_t side, Int_t mode);
+  Double_t      GetVDriftCorrectionDeltaZ(Int_t timeStamp, Int_t run, Int_t side, Int_t mode);
   //
   AliSplineFit* GetVdriftSplineFit(const char* name, Int_t run);
   AliSplineFit* CreateVdriftSplineFit(const char* graphName, Int_t run);