ROOT logo
/*
  macro to extract the OCDB entries

  input: CalibObjects.root
  ouput: TimeGain and TimeVdrift calibration objects for TPC and TRD

  Example:
  .L $ALICE_ROOT/PWGPP/CalibMacros/CPass1/makeOCDB.C
  makeOCDB("105160");

*/

void printCalibStat(Int_t run, const char * fname,  TTreeSRedirector * pcstream);

void makeOCDB(Int_t runNumber, TString  targetOCDBstorage="", TString sourceOCDBstorage="raw://", Int_t detectorBitsQualityFlag = -1)
{
  //
  // extract OCDB entries for detectors participating in the calibration for the current run
  //

  gROOT->Macro("$ALICE_ROOT/PWGPP/CalibMacros/CPass1/LoadLibraries.C");
  gROOT->LoadMacro("$ALICE_ROOT/PWGPP/CalibMacros/CPass1/ConfigCalibTrain.C");

  // switch off log info
  AliLog::SetClassDebugLevel("AliESDEvent",0);

  // config GRP
  printf("runNumber from runCalibTrain = %d\n",runNumber);
  ConfigCalibTrain(runNumber, sourceOCDBstorage.Data());

  // check the presence of the detectors
  AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/GRP/Data");
  AliGRPObject* grpData = dynamic_cast<AliGRPObject*>(entry->GetObject());
  if (!grpData) {printf("Failed to get GRP data for run",runNumber); return;}
  Int_t activeDetectors = grpData->GetDetectorMask();
  TString detStr = AliDAQ::ListOfTriggeredDetectors(activeDetectors);
  printf("Detectors in the data:\n%s\n",detStr.Data());
  TString LHCperiod = grpData->GetLHCPeriod();
  Bool_t isLHC10 =  LHCperiod.Contains("LHC10");
  printf("LHCperiod:%s\n isLHC10:%d\n",LHCperiod.Data(),(Int_t)isLHC10);

  // Steering Tasks - set output storage
  // DefaultStorage set already before - in ConfigCalibTrain.C

  // Setting the mirror SEs for the default storage
  TString mirrorsStr("ALICE::CERN::OCDB,ALICE::FZK::SE,ALICE::LLNL::SE");
  AliCDBManager::Instance()->SetMirrorSEs(mirrorsStr.Data());
  printf("List of mirror SEs set to: \"%s\"\n",mirrorsStr.Data());

  // activate target OCDB storage
  AliCDBStorage* targetStorage = 0x0;
  if (targetOCDBstorage.Length()==0) {
    targetOCDBstorage+="local://"+gSystem->GetFromPipe("pwd")+"/OCDB";
    targetStorage = AliCDBManager::Instance()->GetStorage(targetOCDBstorage.Data());
  }
  else if (targetOCDBstorage.CompareTo("same",TString::kIgnoreCase) == 0 ){
    targetStorage = AliCDBManager::Instance()->GetDefaultStorage();
  }
  else {
    targetStorage = AliCDBManager::Instance()->GetStorage(targetOCDBstorage.Data());
  }
  printf("** targetOCDBstorage: \"%s\"\n",targetOCDBstorage.Data());

  // specific storage for TPC/Calib/Correction entry
  if (gSystem->AccessPathName("TPC", kFileExists)==0) {  
    AliCDBManager::Instance()->SetSpecificStorage("TPC/Calib/Correction","local://");
  }
  AliMagF* fld = TGeoGlobalMagField::Instance()->GetField();
  Double_t bz = fld->SolenoidField();

  // Magnetic field
  AliMagF* fld = TGeoGlobalMagField::Instance()->GetField();
  Double_t bz = fld->SolenoidField();
  Bool_t isMagFieldON = kTRUE;
  if (TMath::Abs(bz)>0) {
    printf("Mag field is %f --> ON\n", bz);
  }
  else {
    isMagFieldON = kFALSE;
    printf("Mag field is %f --> OFF\n", bz);
  }

  // Quality flags
  Bool_t TPC_qf = kTRUE;
  Bool_t TOF_qf = kTRUE;
  Bool_t TRD_qf = kTRUE;
  Bool_t T0_qf  = kTRUE;
  Bool_t SDD_qf = kTRUE;
  Bool_t SPD_qf = kTRUE;

  if (detectorBitsQualityFlag != -1){
    TPC_qf = ((detectorBitsQualityFlag & AliDAQ::kTPC_QF) == AliDAQ::kTPC_QF)? kTRUE : kFALSE;
    TOF_qf = ((detectorBitsQualityFlag & AliDAQ::kTOF_QF) == AliDAQ::kTOF_QF)? kTRUE : kFALSE;
    TRD_qf = ((detectorBitsQualityFlag & AliDAQ::kTRD_QF) == AliDAQ::kTRD_QF)? kTRUE : kFALSE;
    T0_qf  = ((detectorBitsQualityFlag & AliDAQ::kT0_QF)  == AliDAQ::kT0_QF)?  kTRUE : kFALSE;
    SDD_qf = ((detectorBitsQualityFlag & AliDAQ::kSDD_QF) == AliDAQ::kSDD_QF)? kTRUE : kFALSE;
    SPD_qf = ((detectorBitsQualityFlag & AliDAQ::kSPD_QF) == AliDAQ::kSPD_QF)? kTRUE : kFALSE;
  }    

  Printf("Quality flags: detectorBitsQualityFlag = %d, TPC = %d, TOF = %d, TRD = %d, T0 = %d, SDD = %d, SPD = %d", detectorBitsQualityFlag, (Int_t)TPC_qf, (Int_t)TOF_qf, (Int_t)TRD_qf, (Int_t)T0_qf, (Int_t)SDD_qf, (Int_t)SPD_qf);

  // TPC part
  AliTPCPreprocessorOffline *procesTPC = 0;
  if (detStr.Contains("TPC") && TPC_qf){
    Printf("\n******* Calibrating TPC *******");
    Printf("TPC won't be calibrated at CPass1 for the time being... Doing nothing here");
    //procesTPC = new AliTPCPreprocessorOffline;
    // switch on parameter validation
    //procesTPC->SetTimeGainRange(0.5,4.0);
    //procesTPC->SetMinTracksVdrift(100000);
    //procesTPC->SwitchOnValidation();
    // Make timegain calibration
    //if (isMagFieldON) proces.CalibTimeGain("CalibObjects.root", runNumber,AliCDBRunRange::Infinity(),targetStorage);
    // Make vdrift calibration
    //proces.CalibTimeVdrift("CalibObjects.root",runNumber,AliCDBRunRange::Infinity(),targetStorage);
  }
  else {
    Printf("\n******* NOT Calibrating TPC: detStr = %s, TPC_qf = %d *******", detStr.Data(), (Int_t)TPC_qf);
  }

  // TOF part
  AliTOFAnalysisTaskCalibPass0 *procesTOF=0;
  if (detStr.Contains("TOF") && detStr.Contains("TPC") && TOF_qf){
    procesTOF = new AliTOFAnalysisTaskCalibPass0;
    Printf("\n******* Calibrating TOF *******");
    if (isMagFieldON) procesTOF->ProcessOutput("CalibObjects.root", targetStorage);
    else {
      printf("Not calibrating TOF in case of mag field OFF\n");
    }
  }
  else {
    Printf("\n******* NOT Calibrating TOF: detStr = %s, TOF_qf = %d *******", detStr.Data(), (Int_t)TOF_qf);
  }

  // T0 part
  AliT0PreprocessorOffline *procesT0= 0;
  if (detStr.Contains("T0") && T0_qf) {
    Printf("\n******* Calibrating T0 *******");
    procesT0 = new AliT0PreprocessorOffline;
    // Make  calibration of channels offset
    procesT0->setDArun(100000);
    procesT0->Process("CalibObjects.root",runNumber, runNumber, targetStorage);
  }
  else {
    Printf("\n******* NOT Calibrating T0: detStr = %s, T0_qf = %d *******", detStr.Data(), (Int_t)T0_qf);
  }

  //TRD part
  AliTRDPreprocessorOffline *procesTRD = 0;
  if (detStr.Contains("TRD") && detStr.Contains("TPC") && TRD_qf){
    Printf("\n******* Calibrating TRD *******");
    procesTRD = new  AliTRDPreprocessorOffline;
    if(isLHC10) procesTRD->SetSwitchOnChamberStatus(kFALSE);
    procesTRD->SetLinearFitForVdrift(kTRUE);
    procesTRD->SetMinStatsVdriftT0PH(600*10);
    procesTRD->SetMinStatsVdriftLinear(50);
    procesTRD->SetMinStatsGain(600);
    procesTRD->SetLimitValidateNoData(60);
    procesTRD->SetLimitValidateBadCalib(60);
    procesTRD->SetAlternativeDriftVelocityFit(kTRUE);
    procesTRD->Init("CalibObjects.root");
    Int_t versionVdriftUsed = procesTRD->GetVersionVdriftUsed();
    Int_t subversionVdriftUsed = procesTRD->GetSubVersionVdriftUsed();
    Int_t versionGainUsed = procesTRD->GetVersionGainUsed();
    Int_t subversionGainUsed = procesTRD->GetSubVersionGainUsed();
    Int_t versionExBUsed = procesTRD->GetVersionExBUsed();
    Int_t subversionExBUsed = procesTRD->GetSubVersionExBUsed();
    printf("version and subversion vdrift %d and %d\n",versionVdriftUsed,subversionVdriftUsed);
    printf("version and subversion gain %d and %d\n",versionGainUsed,subversionGainUsed);
    printf("version and subversion exb %d and %d\n",versionExBUsed,subversionExBUsed);
    procesTRD->Process("CalibObjects.root",runNumber,runNumber,targetStorage);
  }
  else {
    Printf("\n******* NOT Calibrating TRD: detStr = %s, TRD_qf = %d *******", detStr.Data(), (Int_t)TRD_qf);
  }
  
  // switched OFF at CPass1 in any case
  /*
  //Mean Vertex
  AliMeanVertexPreprocessorOffline * procesMeanVtx=0;
  if (detStr.Contains("ITSSPD") && SPD_qf) {
    Printf("\n******* Calibrating MeanVertex *******");
    procesMeanVtx = new AliMeanVertexPreprocessorOffline;
    procesMeanVtx->ProcessOutput("CalibObjects.root", targetStorage, runNumber);
  }
  else {
    Printf("\n******* NOT Calibrating MeanVertex: detStr = %s, SPD_qf = %d *******", detStr.Data(), (Int_t)SPD_qf);
  }
  */

  //
  // Print calibration status into the stdout
  //
  Int_t trdStatus = (procesTRD) ?  procesTRD->GetStatus():0;
  Int_t tofStatus = (procesTOF) ?  procesTOF->GetStatus():0;
  Int_t t0Status  = (procesT0)  ?  procesT0->GetStatus():0;
  Int_t tpcStatus = (procesTPC) ?  procesTPC->GetStatus():0;
  //
  printf("\n");
  printf("******* CPass1 calibration status *******\n");
  printf("TRD calibration status=%d\n",trdStatus);
  printf("TOF calibration status=%d\n",tofStatus);
  printf("TPC calibration status=%d\n",tpcStatus);
  printf("T0  calibration status=%d\n",t0Status);
  
  TTreeSRedirector *pcstream = new TTreeSRedirector("cpassStat.root","recreate");
  printCalibStat(runNumber, "CalibObjects.root",pcstream);
  delete pcstream;
  return;
}


// function to print statistics used to calibrate the various detectors

void printCalibStat(Int_t run, const char * fname,  TTreeSRedirector * pcstream){

  //
  // Dump the statistical information about all histograms in the calibration files 
  //    into the statistical tree, print on the screen (log files) as well 
  //
  //
  // 1. Default dump for all histograms
  //    Information to dump:
  //    stat =Entries, Mean, MeanError,  RMS, MaxBin
  //    Branch naming convention:
  //    <detName>_<hisName><statName>
  //
  // 2. Detector statistical information  - to be implemented by expert
  //                                      - First version implemented by MI 
  //  
  // 

  TFile *fin = TFile::Open(fname);
  if (!fin) return;
  const Double_t kMaxHis=10000;
  
  TList * keyList = fin->GetListOfKeys();
  Int_t nkeys=keyList->GetEntries();
  Double_t *hisEntries = new Double_t[kMaxHis];
  Double_t *hisMean = new Double_t[kMaxHis];
  Double_t *hisMeanError = new Double_t[kMaxHis];
  Double_t *hisRMS = new Double_t[kMaxHis];
  Double_t *hisMaxBin = new Double_t[kMaxHis];
  Int_t counter=0;
  
  if (pcstream) (*pcstream)<<"calibStatAll"<<"run="<<run;
  for (Int_t ikey=0; ikey<nkeys; ikey++){
    TObject * object = fin->Get(keyList->At(ikey)->GetName());
    if (!object) continue;
    if (object->InheritsFrom("TCollection")==0) continue;
    TSeqCollection *collection  = (TSeqCollection*)object; 
    Int_t nentries= collection->GetEntries();
    for (Int_t ihis=0; ihis<nentries; ihis++){
      TObject * ohis = collection->At(ihis);
      if (!ohis) continue;
      if (ohis->InheritsFrom("TH1")==0) continue;
      TH1* phis = (TH1*)ohis;
      hisEntries[counter]=phis->GetEntries();	
      Int_t idim=1;
      if (ohis->InheritsFrom("TH2")) idim=2;
      if (ohis->InheritsFrom("TH3")) idim=3;        
      hisMean[counter]=phis->GetMean(idim);	
      hisMeanError[counter]=phis->GetMeanError(idim);	
      hisRMS[counter]=phis->GetRMS(idim);	
      hisMaxBin[counter]=phis->GetBinCenter(phis->GetMaximumBin());	
      if (pcstream) (*pcstream)<<"calibStatAll"<<
		      Form("%s_%sEntries=",keyList->At(ikey)->GetName(), phis->GetName())<<hisEntries[counter]<<	
		      Form("%s_%sMean=",keyList->At(ikey)->GetName(), phis->GetName())<<hisMean[counter]<<	
		      Form("%s_%sMeanError=",keyList->At(ikey)->GetName(), phis->GetName())<<hisMeanError[counter]<<	
		      Form("%s_%sRMS=",keyList->At(ikey)->GetName(), phis->GetName())<<hisRMS[counter]<<	
		      Form("%s_%sMaxBin=",keyList->At(ikey)->GetName(), phis->GetName())<<hisMaxBin[counter];	
      //printf("Histo:\t%s_%s\t%f\t%d\n",keyList->At(ikey)->GetName(), phis->GetName(), hisEntries[counter],idim);
      counter++;
    }
    delete object;
  }    
  
  //
  // Expert dump example (MI first iteration):
  //
  // 0.)  TOF dump
  //

  Int_t tofEvents=0;
  Int_t tofTracks=0;
  TList * TOFCalib = (TList*)fin->Get("TOFHistos");      
  if (TOFCalib) {
    TH1 *histoEvents = (TH1*)TOFCalib->FindObject("hHistoVertexTimestamp");
    TH1 *histoTracks = (TH1*)TOFCalib->FindObject("hHistoDeltatTimestamp");
    if (histoEvents && histoTracks){
      tofEvents = TMath::Nint(histoEvents->GetEntries());
      tofTracks = TMath::Nint(histoTracks->GetEntries());
    }
    delete TOFCalib;
  }
  printf("Monalisa TOFevents\t%d\n",tofEvents);
  if (pcstream) (*pcstream)<<"calibStatAll"<<"TOFevents="<<tofEvents;
  printf("Monalisa TOFtracks\t%d\n",tofTracks);
  if (pcstream) (*pcstream)<<"calibStatAll"<<"TOFtracks="<<tofTracks;

  //
  // 1.)  TPC  dump - usefull events/tracks  for the calibration
  //
  Int_t tpcEvents=0;
  Int_t tpcTracks=0;
  TObject* obj = dynamic_cast<TObject*>(fin->Get("TPCCalib"));
  TObjArray* array = dynamic_cast<TObjArray*>(obj);
  TDirectory* dir = dynamic_cast<TDirectory*>(obj);
  AliTPCcalibTime  * calibTime = NULL;
  if (dir) {
    calibTime = dynamic_cast<AliTPCcalibTime*>(dir->Get("calibTime"));
  }
  else if (array){
    calibTime = (AliTPCcalibTime *)array->FindObject("calibTime");
  }
  if (calibTime) {
      tpcEvents = TMath::Nint(calibTime->GetTPCVertexHisto(0)->GetEntries());
      tpcTracks = TMath::Nint(calibTime->GetResHistoTPCITS(0)->GetEntries());
  }
  printf("Monalisa TPCevents\t%d\n",tpcEvents);
  if (pcstream) (*pcstream)<<"calibStatAll"<<"TPCevents="<<tpcEvents;
  printf("Monalisa TPCtracks\t%d\n",tpcTracks);
  if (pcstream) (*pcstream)<<"calibStatAll"<<"TPCtracks="<<tpcTracks;

  //
  // 2. TRD dump 
  //
  Int_t trdEvents=0;
  Int_t trdTracks=0;
  TList * TRDCalib = (TList*)fin->Get("TRDCalib");      
  if (TRDCalib) {
    TH1  *histoEvents = (TH1*)TRDCalib->FindObject("NEventsInput_AliTRDCalibTask");
    TH1  *histoTracks = (TH1*)TRDCalib->FindObject("AbsoluteGain_AliTRDCalibTask");
    if (histoEvents && histoTracks){
      trdEvents= TMath::Nint(histoEvents->GetEntries());
      trdTracks= TMath::Nint(histoTracks->GetEntries());
    }
    delete TRDCalib;
  }
  printf("Monalisa TRDevents\t%d\n",trdEvents);
  if (pcstream) (*pcstream)<<"calibStatAll"<<"TRDevents="<<trdEvents;
  printf("Monalisa TRDtracks\t%d\n",trdTracks);
  if (pcstream) (*pcstream)<<"calibStatAll"<<"TRDtracks="<<trdTracks;

  //
  // 3. T0 dump 
  //
  Int_t T0Events=0;
  TList * T0Calib = (TList*)fin->Get("T0Calib");      
  if (T0Calib) {
    TH1  *histoEvents = (TH1*) T0Calib->FindObject("fTzeroORAplusORC");
    if (histoEvents){
      T0Events= TMath::Nint(histoEvents->GetEntries());
    }
    delete T0Calib;
  }
  printf("Monalisa T0events\t%d\n",T0Events);
  if (pcstream) (*pcstream)<<"calibStatAll"<<"T0events="<<T0Events;

  //
  // 4. Mean vertex -   dump 
  // Not present in CPass1
  /*
    Int_t meanVertexEvents=0;
  TList * meanVertexCalib = (TList*)fin->Get("MeanVertex");      
  if (meanVertexCalib) {
    TH1  *histoEvents = (TH1*) meanVertexCalib->FindObject("hTRKVertexX");
    if (histoEvents){
      meanVertexEvents = TMath::Nint(histoEvents->GetEntries());
    }
    delete meanVertexCalib;
  }
  printf("Monalisa MeanVertexevents\t%d\n",meanVertexEvents);
  if (pcstream) (*pcstream)<<"calibStatAll"<<"MeanVertexevents="<<meanVertexEvents;
  */

  //
  // 5. SDD dump 
  //
  Int_t sddEvents=0;
  Int_t sddTracks=0;
  TList * SDDCalib = (TList*)fin->Get("clistSDDCalib");      
  if (SDDCalib) {
    TH1  *histoEvents = (TH1*) SDDCalib->FindObject("hNEvents");
    if (histoEvents ){
      sddEvents = TMath::Nint(histoEvents->GetBinContent(4));
      sddTracks = TMath::Nint(histoEvents->GetBinContent(5));
    }
    delete SDDCalib;
  }
  printf("Monalisa SDDevents\t%d\n",sddEvents);
  if (pcstream) (*pcstream)<<"calibStatAll"<<"SDDevents="<<sddEvents;
  printf("Monalisa SDDtracks\t%d\n",sddTracks);
  if (pcstream) (*pcstream)<<"calibStatAll"<<"SDDtracks="<<sddTracks;

  //
  if (pcstream) (*pcstream)<<"calibStatAll"<<"\n";
  delete fin;

}


 makeOCDB.C:1
 makeOCDB.C:2
 makeOCDB.C:3
 makeOCDB.C:4
 makeOCDB.C:5
 makeOCDB.C:6
 makeOCDB.C:7
 makeOCDB.C:8
 makeOCDB.C:9
 makeOCDB.C:10
 makeOCDB.C:11
 makeOCDB.C:12
 makeOCDB.C:13
 makeOCDB.C:14
 makeOCDB.C:15
 makeOCDB.C:16
 makeOCDB.C:17
 makeOCDB.C:18
 makeOCDB.C:19
 makeOCDB.C:20
 makeOCDB.C:21
 makeOCDB.C:22
 makeOCDB.C:23
 makeOCDB.C:24
 makeOCDB.C:25
 makeOCDB.C:26
 makeOCDB.C:27
 makeOCDB.C:28
 makeOCDB.C:29
 makeOCDB.C:30
 makeOCDB.C:31
 makeOCDB.C:32
 makeOCDB.C:33
 makeOCDB.C:34
 makeOCDB.C:35
 makeOCDB.C:36
 makeOCDB.C:37
 makeOCDB.C:38
 makeOCDB.C:39
 makeOCDB.C:40
 makeOCDB.C:41
 makeOCDB.C:42
 makeOCDB.C:43
 makeOCDB.C:44
 makeOCDB.C:45
 makeOCDB.C:46
 makeOCDB.C:47
 makeOCDB.C:48
 makeOCDB.C:49
 makeOCDB.C:50
 makeOCDB.C:51
 makeOCDB.C:52
 makeOCDB.C:53
 makeOCDB.C:54
 makeOCDB.C:55
 makeOCDB.C:56
 makeOCDB.C:57
 makeOCDB.C:58
 makeOCDB.C:59
 makeOCDB.C:60
 makeOCDB.C:61
 makeOCDB.C:62
 makeOCDB.C:63
 makeOCDB.C:64
 makeOCDB.C:65
 makeOCDB.C:66
 makeOCDB.C:67
 makeOCDB.C:68
 makeOCDB.C:69
 makeOCDB.C:70
 makeOCDB.C:71
 makeOCDB.C:72
 makeOCDB.C:73
 makeOCDB.C:74
 makeOCDB.C:75
 makeOCDB.C:76
 makeOCDB.C:77
 makeOCDB.C:78
 makeOCDB.C:79
 makeOCDB.C:80
 makeOCDB.C:81
 makeOCDB.C:82
 makeOCDB.C:83
 makeOCDB.C:84
 makeOCDB.C:85
 makeOCDB.C:86
 makeOCDB.C:87
 makeOCDB.C:88
 makeOCDB.C:89
 makeOCDB.C:90
 makeOCDB.C:91
 makeOCDB.C:92
 makeOCDB.C:93
 makeOCDB.C:94
 makeOCDB.C:95
 makeOCDB.C:96
 makeOCDB.C:97
 makeOCDB.C:98
 makeOCDB.C:99
 makeOCDB.C:100
 makeOCDB.C:101
 makeOCDB.C:102
 makeOCDB.C:103
 makeOCDB.C:104
 makeOCDB.C:105
 makeOCDB.C:106
 makeOCDB.C:107
 makeOCDB.C:108
 makeOCDB.C:109
 makeOCDB.C:110
 makeOCDB.C:111
 makeOCDB.C:112
 makeOCDB.C:113
 makeOCDB.C:114
 makeOCDB.C:115
 makeOCDB.C:116
 makeOCDB.C:117
 makeOCDB.C:118
 makeOCDB.C:119
 makeOCDB.C:120
 makeOCDB.C:121
 makeOCDB.C:122
 makeOCDB.C:123
 makeOCDB.C:124
 makeOCDB.C:125
 makeOCDB.C:126
 makeOCDB.C:127
 makeOCDB.C:128
 makeOCDB.C:129
 makeOCDB.C:130
 makeOCDB.C:131
 makeOCDB.C:132
 makeOCDB.C:133
 makeOCDB.C:134
 makeOCDB.C:135
 makeOCDB.C:136
 makeOCDB.C:137
 makeOCDB.C:138
 makeOCDB.C:139
 makeOCDB.C:140
 makeOCDB.C:141
 makeOCDB.C:142
 makeOCDB.C:143
 makeOCDB.C:144
 makeOCDB.C:145
 makeOCDB.C:146
 makeOCDB.C:147
 makeOCDB.C:148
 makeOCDB.C:149
 makeOCDB.C:150
 makeOCDB.C:151
 makeOCDB.C:152
 makeOCDB.C:153
 makeOCDB.C:154
 makeOCDB.C:155
 makeOCDB.C:156
 makeOCDB.C:157
 makeOCDB.C:158
 makeOCDB.C:159
 makeOCDB.C:160
 makeOCDB.C:161
 makeOCDB.C:162
 makeOCDB.C:163
 makeOCDB.C:164
 makeOCDB.C:165
 makeOCDB.C:166
 makeOCDB.C:167
 makeOCDB.C:168
 makeOCDB.C:169
 makeOCDB.C:170
 makeOCDB.C:171
 makeOCDB.C:172
 makeOCDB.C:173
 makeOCDB.C:174
 makeOCDB.C:175
 makeOCDB.C:176
 makeOCDB.C:177
 makeOCDB.C:178
 makeOCDB.C:179
 makeOCDB.C:180
 makeOCDB.C:181
 makeOCDB.C:182
 makeOCDB.C:183
 makeOCDB.C:184
 makeOCDB.C:185
 makeOCDB.C:186
 makeOCDB.C:187
 makeOCDB.C:188
 makeOCDB.C:189
 makeOCDB.C:190
 makeOCDB.C:191
 makeOCDB.C:192
 makeOCDB.C:193
 makeOCDB.C:194
 makeOCDB.C:195
 makeOCDB.C:196
 makeOCDB.C:197
 makeOCDB.C:198
 makeOCDB.C:199
 makeOCDB.C:200
 makeOCDB.C:201
 makeOCDB.C:202
 makeOCDB.C:203
 makeOCDB.C:204
 makeOCDB.C:205
 makeOCDB.C:206
 makeOCDB.C:207
 makeOCDB.C:208
 makeOCDB.C:209
 makeOCDB.C:210
 makeOCDB.C:211
 makeOCDB.C:212
 makeOCDB.C:213
 makeOCDB.C:214
 makeOCDB.C:215
 makeOCDB.C:216
 makeOCDB.C:217
 makeOCDB.C:218
 makeOCDB.C:219
 makeOCDB.C:220
 makeOCDB.C:221
 makeOCDB.C:222
 makeOCDB.C:223
 makeOCDB.C:224
 makeOCDB.C:225
 makeOCDB.C:226
 makeOCDB.C:227
 makeOCDB.C:228
 makeOCDB.C:229
 makeOCDB.C:230
 makeOCDB.C:231
 makeOCDB.C:232
 makeOCDB.C:233
 makeOCDB.C:234
 makeOCDB.C:235
 makeOCDB.C:236
 makeOCDB.C:237
 makeOCDB.C:238
 makeOCDB.C:239
 makeOCDB.C:240
 makeOCDB.C:241
 makeOCDB.C:242
 makeOCDB.C:243
 makeOCDB.C:244
 makeOCDB.C:245
 makeOCDB.C:246
 makeOCDB.C:247
 makeOCDB.C:248
 makeOCDB.C:249
 makeOCDB.C:250
 makeOCDB.C:251
 makeOCDB.C:252
 makeOCDB.C:253
 makeOCDB.C:254
 makeOCDB.C:255
 makeOCDB.C:256
 makeOCDB.C:257
 makeOCDB.C:258
 makeOCDB.C:259
 makeOCDB.C:260
 makeOCDB.C:261
 makeOCDB.C:262
 makeOCDB.C:263
 makeOCDB.C:264
 makeOCDB.C:265
 makeOCDB.C:266
 makeOCDB.C:267
 makeOCDB.C:268
 makeOCDB.C:269
 makeOCDB.C:270
 makeOCDB.C:271
 makeOCDB.C:272
 makeOCDB.C:273
 makeOCDB.C:274
 makeOCDB.C:275
 makeOCDB.C:276
 makeOCDB.C:277
 makeOCDB.C:278
 makeOCDB.C:279
 makeOCDB.C:280
 makeOCDB.C:281
 makeOCDB.C:282
 makeOCDB.C:283
 makeOCDB.C:284
 makeOCDB.C:285
 makeOCDB.C:286
 makeOCDB.C:287
 makeOCDB.C:288
 makeOCDB.C:289
 makeOCDB.C:290
 makeOCDB.C:291
 makeOCDB.C:292
 makeOCDB.C:293
 makeOCDB.C:294
 makeOCDB.C:295
 makeOCDB.C:296
 makeOCDB.C:297
 makeOCDB.C:298
 makeOCDB.C:299
 makeOCDB.C:300
 makeOCDB.C:301
 makeOCDB.C:302
 makeOCDB.C:303
 makeOCDB.C:304
 makeOCDB.C:305
 makeOCDB.C:306
 makeOCDB.C:307
 makeOCDB.C:308
 makeOCDB.C:309
 makeOCDB.C:310
 makeOCDB.C:311
 makeOCDB.C:312
 makeOCDB.C:313
 makeOCDB.C:314
 makeOCDB.C:315
 makeOCDB.C:316
 makeOCDB.C:317
 makeOCDB.C:318
 makeOCDB.C:319
 makeOCDB.C:320
 makeOCDB.C:321
 makeOCDB.C:322
 makeOCDB.C:323
 makeOCDB.C:324
 makeOCDB.C:325
 makeOCDB.C:326
 makeOCDB.C:327
 makeOCDB.C:328
 makeOCDB.C:329
 makeOCDB.C:330
 makeOCDB.C:331
 makeOCDB.C:332
 makeOCDB.C:333
 makeOCDB.C:334
 makeOCDB.C:335
 makeOCDB.C:336
 makeOCDB.C:337
 makeOCDB.C:338
 makeOCDB.C:339
 makeOCDB.C:340
 makeOCDB.C:341
 makeOCDB.C:342
 makeOCDB.C:343
 makeOCDB.C:344
 makeOCDB.C:345
 makeOCDB.C:346
 makeOCDB.C:347
 makeOCDB.C:348
 makeOCDB.C:349
 makeOCDB.C:350
 makeOCDB.C:351
 makeOCDB.C:352
 makeOCDB.C:353
 makeOCDB.C:354
 makeOCDB.C:355
 makeOCDB.C:356
 makeOCDB.C:357
 makeOCDB.C:358
 makeOCDB.C:359
 makeOCDB.C:360
 makeOCDB.C:361
 makeOCDB.C:362
 makeOCDB.C:363
 makeOCDB.C:364
 makeOCDB.C:365
 makeOCDB.C:366
 makeOCDB.C:367
 makeOCDB.C:368
 makeOCDB.C:369
 makeOCDB.C:370
 makeOCDB.C:371
 makeOCDB.C:372
 makeOCDB.C:373
 makeOCDB.C:374
 makeOCDB.C:375
 makeOCDB.C:376
 makeOCDB.C:377
 makeOCDB.C:378
 makeOCDB.C:379
 makeOCDB.C:380
 makeOCDB.C:381
 makeOCDB.C:382
 makeOCDB.C:383
 makeOCDB.C:384
 makeOCDB.C:385
 makeOCDB.C:386
 makeOCDB.C:387
 makeOCDB.C:388
 makeOCDB.C:389
 makeOCDB.C:390
 makeOCDB.C:391
 makeOCDB.C:392
 makeOCDB.C:393
 makeOCDB.C:394
 makeOCDB.C:395
 makeOCDB.C:396
 makeOCDB.C:397
 makeOCDB.C:398
 makeOCDB.C:399
 makeOCDB.C:400
 makeOCDB.C:401
 makeOCDB.C:402
 makeOCDB.C:403