]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TPC/AliTPCcalibDB.cxx
M AliTPCTransform.cxx - Eff C++ warning
[u/mrichter/AliRoot.git] / TPC / AliTPCcalibDB.cxx
index f16d0cfef465b537fedda40601bb8ef793235594..bf348407fa506bdc436bbd092d087d25754b5555 100644 (file)
@@ -87,6 +87,7 @@
 #include <AliSplineFit.h>
 
 #include "AliTPCcalibDB.h"
+#include "AliTPCcalibDButil.h"
 #include "AliTPCAltroMapping.h"
 #include "AliTPCExB.h"
 
@@ -103,10 +104,12 @@ class AliTPCCalDet;
 
 #include "TFile.h"
 #include "TKey.h"
+#include "TGraphErrors.h"
 
 #include "TObjArray.h"
 #include "TObjString.h"
 #include "TString.h"
+#include "TDirectory.h"
 #include "AliTPCCalPad.h"
 #include "AliTPCCalibPulser.h"
 #include "AliTPCCalibPedestal.h"
@@ -114,6 +117,8 @@ class AliTPCCalDet;
 #include "AliTPCExBFirst.h"
 #include "AliTPCTempMap.h"
 #include "AliTPCCalibVdrift.h"
+#include "AliTPCCalibRaw.h"
+#include "AliTPCParam.h"
 
 #include "AliTPCPreprocessorOnline.h"
 
@@ -170,6 +175,7 @@ AliTPCcalibDB::AliTPCcalibDB():
   fPadTime0(0),
   fPadNoise(0),
   fPedestals(0),
+  fCalibRaw(0),
   fALTROConfigData(0),
   fPulserData(0),
   fCEData(0),
@@ -206,6 +212,7 @@ AliTPCcalibDB::AliTPCcalibDB(const AliTPCcalibDB& ):
   fPadTime0(0),
   fPadNoise(0),
   fPedestals(0),
+  fCalibRaw(0),
   fALTROConfigData(0),
   fPulserData(0),
   fCEData(0),
@@ -290,8 +297,7 @@ void AliTPCcalibDB::SetRun(Long64_t run)
 
 void AliTPCcalibDB::Update(){
        //
-       AliCDBEntry * entry=0;
-  
+  AliCDBEntry * entry=0;
   Bool_t cdbCache = AliCDBManager::Instance()->GetCacheFlag(); // save cache status
   AliCDBManager::Instance()->SetCacheFlag(kTRUE); // activate CDB cache
   
@@ -378,6 +384,13 @@ void AliTPCcalibDB::Update(){
     entry->SetOwner(kTRUE);
     fCEData=(TObjArray*)(entry->GetObject());
   }
+  //RAW calibration data
+  entry          = GetCDBEntry("TPC/Calib/Raw");
+  if (entry){
+    entry->SetOwner(kTRUE);
+    TObjArray *arr=(TObjArray*)(entry->GetObject());
+    if (arr) fCalibRaw=(AliTPCCalibRaw*)arr->At(0);
+  }
   
   entry          = GetCDBEntry("TPC/Calib/Mapping");
   if (entry){
@@ -400,9 +413,9 @@ void AliTPCcalibDB::Update(){
   //  fExB=dynamic_cast<AliTPCExB*>(entry->GetObject()->Clone());
   //}
   //
-  // ExB  - calculate during initialization 
-  //      - 
-  fExB =  GetExB(-5,kTRUE);
+  // ExB  - calculate during initialization - in simulation /reconstruction
+  //      - not invoked here anymore
+  //fExB =  GetExB(-5,kTRUE);
      //
   if (!fTransform) {
     fTransform=new AliTPCTransform(); 
@@ -411,7 +424,6 @@ void AliTPCcalibDB::Update(){
 
   //
   AliCDBManager::Instance()->SetCacheFlag(cdbCache); // reset original CDB cache
-  
 }
 
 
@@ -726,9 +738,11 @@ void AliTPCcalibDB::RegisterExB(Int_t index, Float_t bz, Bool_t bdelete){
   // index - registration index - used for visualization
   // bz    - bz field in kGaus
 
-  Float_t factor =  bz/(-5.);  // default b filed in Cheb with minus sign
+  //  Float_t factor =  bz/(-5.);  // default b filed in Cheb with minus sign
+  Float_t factor =  bz/(5.);  // default b filed in Cheb with minus sign
+                              // was chenged in the Revision ???? (Ruben can you add here number)
   
-  AliMagF*   bmap = new AliMagF("MapsExB","MapsExB", 2,factor,1., 10.,AliMagF::k5kG,"$(ALICE_ROOT)/data/maps/mfchebKGI_sym.root");
+  AliMagF*   bmap = new AliMagF("MapsExB","MapsExB", factor,TMath::Sign(1.f,factor),AliMagF::k5kG);
   
   AliTPCExBFirst *exb  = new  AliTPCExBFirst(bmap,0.88*2.6400e+04,50,50,50);
   AliTPCExB::SetInstance(exb);
@@ -763,6 +777,15 @@ void  AliTPCcalibDB::SetExBField(Float_t bz){
   fExB = GetExB(bz,kFALSE);
 }
 
+void  AliTPCcalibDB::SetExBField(const AliMagF*   bmap){
+  //
+  // Set magnetic field for ExB correction
+  //
+  AliTPCExBFirst *exb  = new  AliTPCExBFirst(bmap,0.88*2.6400e+04,50,50,50);
+  AliTPCExB::SetInstance(exb);
+  fExB=exb;
+}
+
 
 
 
@@ -843,6 +866,30 @@ Float_t AliTPCcalibDB::GetGain(Int_t sector, Int_t row, Int_t pad){
   return calPad->GetCalROC(sector)->GetValue(row,pad);
 }
 
+AliSplineFit* AliTPCcalibDB::GetVdriftSplineFit(const char* name, Int_t run){
+  //
+  //
+  //
+  TObjArray *arr=GetTimeVdriftSplineRun(run);
+  if (!arr) return 0;
+  return dynamic_cast<AliSplineFit*>(arr->FindObject(name));
+}
+
+AliSplineFit* AliTPCcalibDB::CreateVdriftSplineFit(const char* graphName, Int_t run){
+  //
+  // create spline fit from the drift time graph in TimeDrift
+  //
+  TObjArray *arr=GetTimeVdriftSplineRun(run);
+  if (!arr) return 0;
+  TGraph *graph=dynamic_cast<TGraph*>(arr->FindObject(graphName));
+  if (!graph) return 0;
+  AliSplineFit *fit = new AliSplineFit();
+  fit->SetGraph(graph);
+  fit->SetMinPoints(graph->GetN()+1);
+  fit->InitKnots(graph,2,0,0.001);
+  fit->SplineFit(0);
+  return fit;
+}
 
 AliGRPObject *AliTPCcalibDB::GetGRP(Int_t run){
   //
@@ -929,6 +976,18 @@ TObjArray * AliTPCcalibDB::GetTimeGainSplinesRun(Int_t run){
   return gainSplines;
 }
 
+TObjArray * AliTPCcalibDB::GetTimeVdriftSplineRun(Int_t run){
+  //
+  // Get drift spline array
+  //
+  TObjArray * driftSplines = (TObjArray *)fDriftCorrectionArray.At(run);
+  if (!driftSplines) {
+    UpdateRunInformations(run);
+    driftSplines = (TObjArray *)fDriftCorrectionArray.At(run);
+  }
+  return driftSplines;
+}
+
 AliDCSSensorArray * AliTPCcalibDB::GetVoltageSensors(Int_t run){
   //
   // Get temperature sensor array
@@ -1038,7 +1097,7 @@ Float_t AliTPCcalibDB::GetDCSSensorValue(AliDCSSensorArray *arr, Int_t timeStamp
     for (Int_t ipoint=0;ipoint<gr->GetN();++ipoint){
       Double_t x,y;
       gr->GetPoint(ipoint,x,y);
-      Int_t time=sensor->GetStartTime()+x*3600; //time in graph is hours
+      Int_t time=TMath::Nint(sensor->GetStartTime()+x*3600); //time in graph is hours
       if (time<timeStamp) continue;
       val=y;
       break;
@@ -1051,14 +1110,14 @@ Float_t AliTPCcalibDB::GetDCSSensorValue(AliDCSSensorArray *arr, Int_t timeStamp
     if (val==0 ){
       Double_t x,y;
       gr->GetPoint(0,x,y);
-      Int_t time=sensor->GetStartTime()+x*3600; //time in graph is hours
+      Int_t time=TMath::Nint(sensor->GetStartTime()+x*3600); //time in graph is hours
       if ((time-timeStamp)<5*60) val=y;
     }
     //last point
     if (val==0 ){
       Double_t x,y;
       gr->GetPoint(gr->GetN()-1,x,y);
-      Int_t time=sensor->GetStartTime()+x*3600; //time in graph is hours
+      Int_t time=TMath::Nint(sensor->GetStartTime()+x*3600); //time in graph is hours
       if ((timeStamp-time)<5*60) val=y;
     }
   } else {
@@ -1302,14 +1361,21 @@ Char_t  AliTPCcalibDB::GetL3Polarity(Int_t run) {
   //
   // get l3 polarity from GRP
   //
-  return AliTPCcalibDB::GetGRP(run)->GetL3Polarity();
+  Char_t pol=-100;
+  AliGRPObject *grp=AliTPCcalibDB::GetGRP(run);
+  if (grp) pol=grp->GetL3Polarity();
+  return pol;
 }
 
 TString AliTPCcalibDB::GetRunType(Int_t run){
   //
   // return run type from grp
   //
-  return AliTPCcalibDB::GetGRP(run)->GetRunType();
+
+//   TString type("UNKNOWN");
+  AliGRPObject *grp=AliTPCcalibDB::GetGRP(run);
+  if (grp) return grp->GetRunType();
+  return "UNKNOWN";
 }
 
 Float_t AliTPCcalibDB::GetValueGoofie(Int_t timeStamp, Int_t run, Int_t type){
@@ -1446,3 +1512,126 @@ Bool_t AliTPCcalibDB::CreateGUITree(Int_t run, const char* filename)
   return kTRUE;
 }
 
+Bool_t AliTPCcalibDB::CreateRefFile(Int_t run, const char* filename)
+{
+  //
+  // Create a gui tree for run number 'run'
+  //
+  
+  if (!AliCDBManager::Instance()->GetDefaultStorage()){
+    AliLog::Message(AliLog::kError, "Default Storage not set. Cannot create Calibration Tree!",
+                    MODULENAME(), "AliTPCcalibDB", FUNCTIONNAME(), __FILE__, __LINE__);
+    return kFALSE;
+  }
+  TString file(filename);
+  if (file.IsNull()) file=Form("RefCalPads_%d.root",run);
+  TDirectory *currDir=gDirectory;
+  //db instance
+  AliTPCcalibDB *db=AliTPCcalibDB::Instance();
+  // retrieve cal pad objects
+  db->SetRun(run);
+  //open file
+  TFile f(file.Data(),"recreate");
+  //noise and pedestals
+  db->GetPedestals()->Write("Pedestals");
+  db->GetPadNoise()->Write("PadNoise");
+  //pulser data
+  db->GetPulserTmean()->Write("PulserTmean");
+  db->GetPulserTrms()->Write("PulserTrms");
+  db->GetPulserQmean()->Write("PulserQmean");
+  //CE data
+  db->GetCETmean()->Write("CETmean");
+  db->GetCETrms()->Write("CETrms");
+  db->GetCEQmean()->Write("CEQmean");
+  //Altro data
+  db->GetALTROAcqStart() ->Write("ALTROAcqStart");
+  db->GetALTROZsThr()    ->Write("ALTROZsThr");
+  db->GetALTROFPED()     ->Write("ALTROFPED");
+  db->GetALTROAcqStop()  ->Write("ALTROAcqStop");
+  db->GetALTROMasked()   ->Write("ALTROMasked");
+  //
+  f.Close();
+  currDir->cd();
+  return kTRUE;
+}
+
+
+
+Double_t AliTPCcalibDB::GetVDriftCorrectionTime(Int_t timeStamp, Int_t run, Int_t /*side*/, Int_t mode){
+  //
+  // Get time dependent drift velocity correction
+  // multiplication factor        vd = vdnom *(1+vdriftcorr)
+  // Arguments:
+  // mode determines the algorith how to combine the Laser Track, LaserCE and physics tracks
+  // timestamp - timestamp
+  // run       - run number
+  // side      - the drift velocity per side (possible for laser and CE)
+  //
+  // Notice - Extrapolation outside of calibration range  - using constant function
+  //
+  Double_t result;
+  // mode TPC crossing and laser 
+  if (mode==1) {
+    result=AliTPCcalibDButil::GetVDriftTPC(run,timeStamp);
+    
+  }
+
+  return result;
+}
+
+Double_t AliTPCcalibDB::GetTime0CorrectionTime(Int_t timeStamp, Int_t run, Int_t /*side*/, Int_t mode){
+  //
+  // Get time dependent time 0 (trigger delay in cm) correction
+  // additive correction        time0 = time0+ GetTime0CorrectionTime
+  // Value etracted combining the vdrift correction using laser tracks and CE and the physics track matchin
+  // Arguments:
+  // mode determines the algorith how to combine the Laser Track and physics tracks
+  // timestamp - timestamp
+  // run       - run number
+  // side      - the drift velocity per side (possible for laser and CE)
+  //
+  // Notice - Extrapolation outside of calibration range  - using constant function
+  //
+  Double_t result=0;
+  if (mode==1) result=AliTPCcalibDButil::GetTriggerOffsetTPC(run,timeStamp);    
+  result  *=fParam->GetZLength();
+
+  return result;
+
+}
+
+
+
+
+Double_t AliTPCcalibDB::GetVDriftCorrectionGy(Int_t timeStamp, Int_t run, Int_t side, Int_t /*mode*/){
+  //
+  // Get global y correction drift velocity correction factor
+  // additive factor        vd = vdnom*(1+GetVDriftCorrectionGy *gy)
+  // Value etracted combining the vdrift correction using laser tracks and CE
+  // Arguments:
+  // mode determines the algorith how to combine the Laser Track, LaserCE
+  // timestamp - timestamp
+  // run       - run number
+  // side      - the drift velocity gy correction per side (CE and Laser tracks)
+  //
+  // Notice - Extrapolation outside of calibration range  - using constant function
+  // 
+  if (run<=0 && fTransform) run = fTransform->GetCurrentRunNumber();
+  UpdateRunInformations(run,kFALSE);
+  TObjArray *array =AliTPCcalibDB::Instance()->GetTimeVdriftSplineRun(run);
+  if (!array) return 0;
+  TGraphErrors *laserA= (TGraphErrors*)array->FindObject("GRAPH_MEAN_GLOBALYGRADIENT_LASER_ALL_A");
+  TGraphErrors *laserC= (TGraphErrors*)array->FindObject("GRAPH_MEAN_GLOBALYGRADIENT_LASER_ALL_C");
+  
+  Double_t result=0;
+  if (laserA && laserC){
+   result= (laserA->Eval(timeStamp)+laserC->Eval(timeStamp))*0.5;
+  }
+  if (laserA && side==0){
+    result = (laserA->Eval(timeStamp));
+  }
+  if (laserC &&side==1){
+    result = (laserC->Eval(timeStamp));
+  }
+  return -result/250.; //normalized before
+}