ROOT logo
/*
g++ makeTRDdEdxOADB.C  -g -O3 -Wall -Werror -I$ROOTSYS/include -I$ALICE_BUILD/include -I$ALICE_ROOT/TRD -I$ALICE_ROOT/TRD/Cal  -L$ROOTSYS/lib -lCore -lCint -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lTree -lRint -lPostscript -lMatrix -lPhysics -lMathCore -lThread -pthread -lm -ldl -rdynamic -lMinuit -lEG -lGeom -lVMC -lProof -lProofPlayer -lXMLParser -lXMLIO -lSpectrum -lTreePlayer -lMLP -lGui -L$ALICE_BUILD/lib/tgt_linuxx8664gcc -lCDB -lSTEER -lRAWDatarec -lESD -lSTEERBase -lANALYSIS -lRAWDatabase  -lANALYSISalice -lAOD -lTPCrec -lTPCbase -lTRDbase -lTRDrec -lSTAT   -o makeTRDdEdxOADB

#generate OADB
makeTRDdEdxOADB 1

#read and print OADB content
makeTRDdEdxOADB 0
 */

#include <math.h>
#include <stdio.h>
#include <fstream>
#include <string>
#include <iostream>
using namespace std;

#include "Math/Functor.h"
#include "Math/Factory.h"
#include "Math/Minimizer.h"

#include "TASImage.h"
#include "TAxis.h"
#include "TColor.h"
#include "TCut.h"
#include "TCanvas.h"
#include "TChain.h"
#include "TDatabasePDG.h"
#include "TDecompLU.h"
#include "TDecompSVD.h"
#include "TDirectory.h"
#include "TEventList.h"
#include "TF1.h"
#include "TF2.h"
#include "TFile.h"
#include "TGaxis.h"
#include "TGeoManager.h"
#include "TGeoGlobalMagField.h"
#include "TRandom3.h"
#include "TGraph.h"
#include "TGraphAsymmErrors.h"
#include "TGraphErrors.h"
#include "TGraphPolar.h"
#include "TGrid.h"
#include "TH1F.h"
#include "TH2F.h"
#include "TH1D.h"
#include "TH2D.h"
#include "TH3D.h"
#include "THnSparse.h"
#include "TLatex.h"
#include "TLegend.h"
#include "TLegendEntry.h"
#include "TLinearFitter.h"
#include "TMarker.h"
#include "TMath.h"
#include "TMatrixD.h"
#include "TMinuit.h"
#include "TPaletteAxis.h"
#include "TPaveText.h"
#include "TPolyMarker.h"
#include "TProfile.h"
#include "TROOT.h"
#include "TStopwatch.h"
#include "TString.h"
#include "TStyle.h"
#include "TSystem.h"
#include "TSystemDirectory.h"
#include "TTree.h"
#include "TTimeStamp.h"
#include "TUUID.h"
#include "TVector3.h"
#include "TVectorD.h"

#include "AliAnalysisManager.h"
#include "AliAnalysisTask.h"
#include "AliAODInputHandler.h"
#include "AliCDBEntry.h"
#include "AliCDBManager.h"
#include "AliCentralitySelectionTask.h"
#include "AliCTPRawStream.h"
#include "AliESDEvent.h"
#include "AliESDfriend.h"
#include "AliESDHeader.h"
#include "AliESDInputHandler.h"
#include "AliESDtrackCuts.h"
#include "AliESDtrack.h"
#include "AliESDVertex.h"
#include "AliExternalTrackParam.h"
#include "AliGeomManager.h"
#include "AliGRPManager.h"
#include "AliGRPObject.h"
#include "AliLog.h"
#include "AliMagF.h"
#include "AliMathBase.h"
#include "AliMCEventHandler.h"
#include "AliPhysicsSelectionTask.h"
#include "AliPID.h"
#include "AliRawReaderRoot.h"
#include "AliReconstruction.h"
//#include "AliTPCcalibDB.h"
#include "AliTPCclusterMI.h"
//#include "AliTPCParam.h"
//#include "AliTPCRecoParam.h"
//#include "AliTPCseed.h"
//#include "AliTPCTransform.h"
#include "AliTrackerBase.h"
#include "AliTracker.h"
#include "AliTrackPointArray.h"
#include "AliTRDdEdxBaseUtils.h"
#include "AliTRDdigitsManager.h"
#include "AliTRDrawStream.h"
#include "AliTRDseedV1.h"
#include "AliTriggerAnalysis.h"
#include "AliSysInfo.h"


#include "AliTRDdEdxParams.h"
#include "AliOADBContainer.h"
#include "AliLog.h"

AliTRDdEdxParams * getDefault()
{
  //
  //version 31/07/2014 by Xianguo Lu based on pPb small sample only for nch=6 ncls/nch>=18, no binning in eta, no binning on multiplicity
  //

  AliTRDdEdxParams *defobj=new AliTRDdEdxParams("default","default");

  const Float_t meanpars[]={1.521e+00 , 7.294e-01 , 8.066e+00 , 2.146e-02 , 3.137e+01 , 7.160e-15 , 2.838e+00 , 1.100e+01};
  const Float_t respars[]={-4.122e-01 , 1.019e+00 , -1.319e-01};

  for(Int_t ipar=0; ipar< 10; ipar++){
    for(Int_t ich = 0; ich < 2; ich++){
      for(Int_t icls = 0; icls < 2; icls++){

        TVectorF tmp;
        //!!! has to be consistent with
        //Int_t GetIter(const Int_t itype, const Int_t nch, const Int_t ncls) const
        //in AliTRDdEdxParams
        const Int_t nch = ich==0? 6 : 1;
        const Int_t ncls = icls==0? 180 : 1;
        

        if(ich==0 && icls==0){
          if(ipar == AliPID::kProton){
            const Float_t tmpproton[]={2.026e+00 , -1.462e-04 , 1.202e+00 , 1.162e-01 , 2.092e+00 , -3.018e-02 , 3.665e+00 , 3.487e-07}; 
            defobj->SetMeanParameter(ipar, nch, ncls, sizeof(tmpproton)/sizeof(Float_t), tmpproton);
          }
          else if(ipar == AliPID::kPion || ipar ==AliPID::kElectron){       
            const Float_t tmppe[]={1.508e+00 , 7.356e-01 , 8.002e+00 , 1.932e-02 , 3.058e+01 , 5.114e-18 , 3.561e+00 , 1.408e+01};  
            defobj->SetMeanParameter(ipar, nch, ncls, sizeof(tmppe)/sizeof(Float_t), tmppe);
          }
          else{
            defobj->SetMeanParameter(ipar, nch, ncls, sizeof(meanpars)/sizeof(Float_t), meanpars);
          }
        
          defobj->SetSigmaParameter(ipar,  nch, ncls, sizeof(respars)/sizeof(Float_t), respars);
        }
        else{
          //bad nch and ncls, 0-size array
          defobj->SetMeanParameter( ipar, nch, ncls, 0, meanpars);
          defobj->SetSigmaParameter(ipar,  nch, ncls, 0, respars);
        }

      }
    }
  }

  defobj->Print();

  return defobj;
}

void makeTRDdEdxOADB(const Bool_t kMC=0)
{
  //
  //make OADB object
  //currently only default
  //non-default has to be tested after finer inspection on dependence on eta, multiplicity, etc. 
  //

  AliTRDdEdxParams * defobj = getDefault();

  TString containerName = "TRDdEdxParamsContainer";
  AliOADBContainer* cont = new AliOADBContainer(containerName.Data());

  //current convention as other detetor is only to provide for data
  //no MC is seen in current (31/07/2014)  AliROOT except for HMPID

  const TString filePathNamePackage=Form("$ALICE_ROOT/OADB/COMMON/PID/%s/TRDdEdxParams.root", kMC?"MC":"data");
  Int_t statusCont = cont->InitFromFile(filePathNamePackage.Data(), cont->GetName());
  if (statusCont) {
    printf("No OADBContainer for the current settings found - creating a new one...\n");
  }

  //non-default params
  /*
  const Double_t runLow = 1;
  const Double_t runUp =  10;
  const Int_t index = cont->GetIndexForRun((runUp + runLow) / 2.0);
  if (index < 0) {
    printf("Creating new object for run range %d - %d...\n", runLow, runUp);
    cont->AppendObject(hh, runLow, runUp);
  }
  else {
    printf("Updating existing object for run range %d - %d...\n", runLow, runUp);
    cont->UpdateObject(index, hh, runLow, runUp);
  }
  */

  //default params
  cont->CleanDefaultList(); // Remove old default objects at first
  cont->AddDefaultObject(defobj);


  TFile* f = new TFile(filePathNamePackage.Data(), "update");
  f->Delete(cont->GetName());
  cont->Write(0, TObject::kOverwrite);
  f->Purge();
  f->Close();

  printf("makeTRDdEdxOADB done\n");
}

void readTRDdEdxOADB(const Bool_t kMC=0)
{
  //
  //only read in default
  //non-default has to be uncommented if needed
  //

  const TString containerName = "TRDdEdxParamsContainer";
  AliOADBContainer cont(containerName.Data()); 
  
  const TString filePathNamePackage=Form("$ALICE_ROOT/OADB/COMMON/PID/%s/TRDdEdxParams.root", kMC?"MC":"data");

  const Int_t statusCont = cont.InitFromFile(filePathNamePackage.Data(), cont.GetName());
  if (statusCont){
    printf("Failed initializing settings from OADB\n"); exit(1);
  }

  /*
  Int_t fRun = 5;
  AliTRDdEdxParams *jj=(AliTRDdEdxParams*)(cont.GetObject(fRun, defaultObj.Data()));
  jj->Print();
  */

  TString defaultObj = "default";
  AliTRDdEdxParams *jj=(AliTRDdEdxParams*)(cont.GetObject(1000, defaultObj.Data()));
  jj->Print();

}

int main(int argc, char * argv[])
{
  for(Int_t ii=0; ii<argc; ii++){
    printf("%d: %s\n", ii, argv[ii]);
  }

  if(argc!=2){
    printf("argc!=2\n");
    return 1; 
  }

  if(atoi(argv[1])){
    makeTRDdEdxOADB();
  }
  else{
    readTRDdEdxOADB();
  }

  return 0;
}
 makeTRDdEdxOADB.C:1
 makeTRDdEdxOADB.C:2
 makeTRDdEdxOADB.C:3
 makeTRDdEdxOADB.C:4
 makeTRDdEdxOADB.C:5
 makeTRDdEdxOADB.C:6
 makeTRDdEdxOADB.C:7
 makeTRDdEdxOADB.C:8
 makeTRDdEdxOADB.C:9
 makeTRDdEdxOADB.C:10
 makeTRDdEdxOADB.C:11
 makeTRDdEdxOADB.C:12
 makeTRDdEdxOADB.C:13
 makeTRDdEdxOADB.C:14
 makeTRDdEdxOADB.C:15
 makeTRDdEdxOADB.C:16
 makeTRDdEdxOADB.C:17
 makeTRDdEdxOADB.C:18
 makeTRDdEdxOADB.C:19
 makeTRDdEdxOADB.C:20
 makeTRDdEdxOADB.C:21
 makeTRDdEdxOADB.C:22
 makeTRDdEdxOADB.C:23
 makeTRDdEdxOADB.C:24
 makeTRDdEdxOADB.C:25
 makeTRDdEdxOADB.C:26
 makeTRDdEdxOADB.C:27
 makeTRDdEdxOADB.C:28
 makeTRDdEdxOADB.C:29
 makeTRDdEdxOADB.C:30
 makeTRDdEdxOADB.C:31
 makeTRDdEdxOADB.C:32
 makeTRDdEdxOADB.C:33
 makeTRDdEdxOADB.C:34
 makeTRDdEdxOADB.C:35
 makeTRDdEdxOADB.C:36
 makeTRDdEdxOADB.C:37
 makeTRDdEdxOADB.C:38
 makeTRDdEdxOADB.C:39
 makeTRDdEdxOADB.C:40
 makeTRDdEdxOADB.C:41
 makeTRDdEdxOADB.C:42
 makeTRDdEdxOADB.C:43
 makeTRDdEdxOADB.C:44
 makeTRDdEdxOADB.C:45
 makeTRDdEdxOADB.C:46
 makeTRDdEdxOADB.C:47
 makeTRDdEdxOADB.C:48
 makeTRDdEdxOADB.C:49
 makeTRDdEdxOADB.C:50
 makeTRDdEdxOADB.C:51
 makeTRDdEdxOADB.C:52
 makeTRDdEdxOADB.C:53
 makeTRDdEdxOADB.C:54
 makeTRDdEdxOADB.C:55
 makeTRDdEdxOADB.C:56
 makeTRDdEdxOADB.C:57
 makeTRDdEdxOADB.C:58
 makeTRDdEdxOADB.C:59
 makeTRDdEdxOADB.C:60
 makeTRDdEdxOADB.C:61
 makeTRDdEdxOADB.C:62
 makeTRDdEdxOADB.C:63
 makeTRDdEdxOADB.C:64
 makeTRDdEdxOADB.C:65
 makeTRDdEdxOADB.C:66
 makeTRDdEdxOADB.C:67
 makeTRDdEdxOADB.C:68
 makeTRDdEdxOADB.C:69
 makeTRDdEdxOADB.C:70
 makeTRDdEdxOADB.C:71
 makeTRDdEdxOADB.C:72
 makeTRDdEdxOADB.C:73
 makeTRDdEdxOADB.C:74
 makeTRDdEdxOADB.C:75
 makeTRDdEdxOADB.C:76
 makeTRDdEdxOADB.C:77
 makeTRDdEdxOADB.C:78
 makeTRDdEdxOADB.C:79
 makeTRDdEdxOADB.C:80
 makeTRDdEdxOADB.C:81
 makeTRDdEdxOADB.C:82
 makeTRDdEdxOADB.C:83
 makeTRDdEdxOADB.C:84
 makeTRDdEdxOADB.C:85
 makeTRDdEdxOADB.C:86
 makeTRDdEdxOADB.C:87
 makeTRDdEdxOADB.C:88
 makeTRDdEdxOADB.C:89
 makeTRDdEdxOADB.C:90
 makeTRDdEdxOADB.C:91
 makeTRDdEdxOADB.C:92
 makeTRDdEdxOADB.C:93
 makeTRDdEdxOADB.C:94
 makeTRDdEdxOADB.C:95
 makeTRDdEdxOADB.C:96
 makeTRDdEdxOADB.C:97
 makeTRDdEdxOADB.C:98
 makeTRDdEdxOADB.C:99
 makeTRDdEdxOADB.C:100
 makeTRDdEdxOADB.C:101
 makeTRDdEdxOADB.C:102
 makeTRDdEdxOADB.C:103
 makeTRDdEdxOADB.C:104
 makeTRDdEdxOADB.C:105
 makeTRDdEdxOADB.C:106
 makeTRDdEdxOADB.C:107
 makeTRDdEdxOADB.C:108
 makeTRDdEdxOADB.C:109
 makeTRDdEdxOADB.C:110
 makeTRDdEdxOADB.C:111
 makeTRDdEdxOADB.C:112
 makeTRDdEdxOADB.C:113
 makeTRDdEdxOADB.C:114
 makeTRDdEdxOADB.C:115
 makeTRDdEdxOADB.C:116
 makeTRDdEdxOADB.C:117
 makeTRDdEdxOADB.C:118
 makeTRDdEdxOADB.C:119
 makeTRDdEdxOADB.C:120
 makeTRDdEdxOADB.C:121
 makeTRDdEdxOADB.C:122
 makeTRDdEdxOADB.C:123
 makeTRDdEdxOADB.C:124
 makeTRDdEdxOADB.C:125
 makeTRDdEdxOADB.C:126
 makeTRDdEdxOADB.C:127
 makeTRDdEdxOADB.C:128
 makeTRDdEdxOADB.C:129
 makeTRDdEdxOADB.C:130
 makeTRDdEdxOADB.C:131
 makeTRDdEdxOADB.C:132
 makeTRDdEdxOADB.C:133
 makeTRDdEdxOADB.C:134
 makeTRDdEdxOADB.C:135
 makeTRDdEdxOADB.C:136
 makeTRDdEdxOADB.C:137
 makeTRDdEdxOADB.C:138
 makeTRDdEdxOADB.C:139
 makeTRDdEdxOADB.C:140
 makeTRDdEdxOADB.C:141
 makeTRDdEdxOADB.C:142
 makeTRDdEdxOADB.C:143
 makeTRDdEdxOADB.C:144
 makeTRDdEdxOADB.C:145
 makeTRDdEdxOADB.C:146
 makeTRDdEdxOADB.C:147
 makeTRDdEdxOADB.C:148
 makeTRDdEdxOADB.C:149
 makeTRDdEdxOADB.C:150
 makeTRDdEdxOADB.C:151
 makeTRDdEdxOADB.C:152
 makeTRDdEdxOADB.C:153
 makeTRDdEdxOADB.C:154
 makeTRDdEdxOADB.C:155
 makeTRDdEdxOADB.C:156
 makeTRDdEdxOADB.C:157
 makeTRDdEdxOADB.C:158
 makeTRDdEdxOADB.C:159
 makeTRDdEdxOADB.C:160
 makeTRDdEdxOADB.C:161
 makeTRDdEdxOADB.C:162
 makeTRDdEdxOADB.C:163
 makeTRDdEdxOADB.C:164
 makeTRDdEdxOADB.C:165
 makeTRDdEdxOADB.C:166
 makeTRDdEdxOADB.C:167
 makeTRDdEdxOADB.C:168
 makeTRDdEdxOADB.C:169
 makeTRDdEdxOADB.C:170
 makeTRDdEdxOADB.C:171
 makeTRDdEdxOADB.C:172
 makeTRDdEdxOADB.C:173
 makeTRDdEdxOADB.C:174
 makeTRDdEdxOADB.C:175
 makeTRDdEdxOADB.C:176
 makeTRDdEdxOADB.C:177
 makeTRDdEdxOADB.C:178
 makeTRDdEdxOADB.C:179
 makeTRDdEdxOADB.C:180
 makeTRDdEdxOADB.C:181
 makeTRDdEdxOADB.C:182
 makeTRDdEdxOADB.C:183
 makeTRDdEdxOADB.C:184
 makeTRDdEdxOADB.C:185
 makeTRDdEdxOADB.C:186
 makeTRDdEdxOADB.C:187
 makeTRDdEdxOADB.C:188
 makeTRDdEdxOADB.C:189
 makeTRDdEdxOADB.C:190
 makeTRDdEdxOADB.C:191
 makeTRDdEdxOADB.C:192
 makeTRDdEdxOADB.C:193
 makeTRDdEdxOADB.C:194
 makeTRDdEdxOADB.C:195
 makeTRDdEdxOADB.C:196
 makeTRDdEdxOADB.C:197
 makeTRDdEdxOADB.C:198
 makeTRDdEdxOADB.C:199
 makeTRDdEdxOADB.C:200
 makeTRDdEdxOADB.C:201
 makeTRDdEdxOADB.C:202
 makeTRDdEdxOADB.C:203
 makeTRDdEdxOADB.C:204
 makeTRDdEdxOADB.C:205
 makeTRDdEdxOADB.C:206
 makeTRDdEdxOADB.C:207
 makeTRDdEdxOADB.C:208
 makeTRDdEdxOADB.C:209
 makeTRDdEdxOADB.C:210
 makeTRDdEdxOADB.C:211
 makeTRDdEdxOADB.C:212
 makeTRDdEdxOADB.C:213
 makeTRDdEdxOADB.C:214
 makeTRDdEdxOADB.C:215
 makeTRDdEdxOADB.C:216
 makeTRDdEdxOADB.C:217
 makeTRDdEdxOADB.C:218
 makeTRDdEdxOADB.C:219
 makeTRDdEdxOADB.C:220
 makeTRDdEdxOADB.C:221
 makeTRDdEdxOADB.C:222
 makeTRDdEdxOADB.C:223
 makeTRDdEdxOADB.C:224
 makeTRDdEdxOADB.C:225
 makeTRDdEdxOADB.C:226
 makeTRDdEdxOADB.C:227
 makeTRDdEdxOADB.C:228
 makeTRDdEdxOADB.C:229
 makeTRDdEdxOADB.C:230
 makeTRDdEdxOADB.C:231
 makeTRDdEdxOADB.C:232
 makeTRDdEdxOADB.C:233
 makeTRDdEdxOADB.C:234
 makeTRDdEdxOADB.C:235
 makeTRDdEdxOADB.C:236
 makeTRDdEdxOADB.C:237
 makeTRDdEdxOADB.C:238
 makeTRDdEdxOADB.C:239
 makeTRDdEdxOADB.C:240
 makeTRDdEdxOADB.C:241
 makeTRDdEdxOADB.C:242
 makeTRDdEdxOADB.C:243
 makeTRDdEdxOADB.C:244
 makeTRDdEdxOADB.C:245
 makeTRDdEdxOADB.C:246
 makeTRDdEdxOADB.C:247
 makeTRDdEdxOADB.C:248
 makeTRDdEdxOADB.C:249
 makeTRDdEdxOADB.C:250
 makeTRDdEdxOADB.C:251
 makeTRDdEdxOADB.C:252
 makeTRDdEdxOADB.C:253
 makeTRDdEdxOADB.C:254
 makeTRDdEdxOADB.C:255
 makeTRDdEdxOADB.C:256
 makeTRDdEdxOADB.C:257
 makeTRDdEdxOADB.C:258
 makeTRDdEdxOADB.C:259
 makeTRDdEdxOADB.C:260
 makeTRDdEdxOADB.C:261
 makeTRDdEdxOADB.C:262
 makeTRDdEdxOADB.C:263
 makeTRDdEdxOADB.C:264
 makeTRDdEdxOADB.C:265
 makeTRDdEdxOADB.C:266
 makeTRDdEdxOADB.C:267
 makeTRDdEdxOADB.C:268
 makeTRDdEdxOADB.C:269
 makeTRDdEdxOADB.C:270
 makeTRDdEdxOADB.C:271
 makeTRDdEdxOADB.C:272
 makeTRDdEdxOADB.C:273
 makeTRDdEdxOADB.C:274
 makeTRDdEdxOADB.C:275