ROOT logo
// This macro splits the file created by the AliTRDpidRefMaker to smaller training 
// samples according to the momentum of the track in order to increase the training 
// speed for the TMultiLayerPerceptrons.
// The procedure is the following:
// 1. Create a directory where the training should take place
// 2. Copy the TRD.TaskPidRefMakerNN.root and the TRD.TaskPidRefMakerLQ.root in this directory.
// 3. Run makeTrainingDataNN(). This creates new directories: 0.6GeV, 0.8GeV, ..., 10.0GeV and 
//    create a subset of the training data according to the momentum.
// 4. Run makeDataLQ(). Does the same as make TraiingDataNN for the LQ data without the creation
//    of the directories.
// 5. Run CreateDummy() to create a TRD.TaskPidRefMaker.root file. This is necessary for the 
//    monitoring of the training progress.
// 6. Go to the subdirectories and run the training.

#ifndef __CINT__
#include "TROOT.h"
#include "TSystem.h"
#include "TFile.h"
#include "TTree.h"
#include "TBranch.h"
#include "TObjArray.h"
#include "TGraphErrors.h"

#include "AliPID.h"
#include "AliTRDpidUtil.h"
#include "Cal/AliTRDCalPID.h"
#include "qaRec/AliTRDpidRefMasker.h"
#endif

Int_t makeTrainingDataNN(){

  Int_t fLayer;
  Float_t fMom, fv0pid[AliPID::kSPECIES], fdEdx[AliTRDpidUtil::kNNslices];

  AliTRDpidUtil Util;
  TFile *fIn = new TFile("../TRD.TaskPidRefMakerNN.root","READ");
  TTree *tIn = (TTree*) fIn -> Get("NN");

  tIn -> SetBranchAddress("fLayer", &fLayer);
  tIn -> SetBranchAddress("fMom", &fMom);
  tIn -> SetBranchAddress("fv0pid", fv0pid);
  tIn -> SetBranchAddress("fdEdx", fdEdx);

  for(Int_t iMomBin = 0; iMomBin < AliTRDCalPID::kNMom; iMomBin++){

    gSystem->Exec(Form("mkdir -v ./%3.1fGeV",AliTRDCalPID::GetMomentum(iMomBin)));

    printf("Extracting training set for momentum bin %3.1f GeV/c\n", AliTRDCalPID::GetMomentum(iMomBin));
    TFile *fOut = new TFile(Form("./%3.1fGeV/TRD.TaskPidRefMakerNN.root",AliTRDCalPID::GetMomentum(iMomBin)),"RECREATE");
    TTree *tOut = new TTree("NN", "Reference data for NN"); 
    tOut -> Branch("fLayer", &fLayer, "fLayer/I");
    tOut -> Branch("fMom", &fMom, "fMom/F");
    tOut -> Branch("fv0pid", fv0pid, Form("fv0pid[%d]/F",AliPID::kSPECIES));
    tOut -> Branch("fdEdx", fdEdx, Form("fdEdx[%d]/F", AliTRDpidUtil::kNNslices));
    
    for(Int_t iEv = 0; iEv < (tIn -> GetEntries()); iEv++){
      fLayer = 0;
      fMom = 0.0;
      for(Int_t i = 0; i < AliPID::kSPECIES; i++) fv0pid[i] = 0.0;
      for(Int_t i = 0; i < AliTRDpidUtil::kNNslices; i++) fdEdx[i] = 0.0;
      tIn -> GetEntry(iEv);
      if(Util.GetMomentumBin(fMom) == iMomBin){
	tOut -> Fill();
      }
    }
    
    tOut -> Write();
    tOut -> Delete();
    fOut -> Close();

  }
  
  printf("Extraction completed!");
  return 1;

}


Int_t makeDataLQ(){

  Int_t fLayer;
  Float_t fMom, fv0pid[AliPID::kSPECIES], fdEdx[AliTRDpidUtil::kLQslices];

  AliTRDpidUtil Util;
  TFile *fIn = new TFile("../TRD.TaskPidRefMakerLQ.root","READ");
  TTree *tIn = (TTree*) fIn -> Get("LQ");

  tIn -> SetBranchAddress("fLayer", &fLayer);
  tIn -> SetBranchAddress("fMom", &fMom);
  tIn -> SetBranchAddress("fv0pid", fv0pid);
  tIn -> SetBranchAddress("fdEdx", fdEdx);

  for(Int_t iMomBin = 0; iMomBin < AliTRDCalPID::kNMom; iMomBin++){
    printf("Extracting training set for momentum bin %3.1f GeV/c\n", AliTRDCalPID::GetMomentum(iMomBin));
    TFile *fOut = new TFile(Form("./%3.1fGeV/TRD.TaskPidRefMakerLQ.root",AliTRDCalPID::GetMomentum(iMomBin)),"RECREATE");
    TTree *tOut = new TTree("LQ", "Reference data for LQ"); 
    tOut -> Branch("fLayer", &fLayer, "fLayer/I");
    tOut -> Branch("fMom", &fMom, "fMom/F");
    tOut -> Branch("fv0pid", fv0pid, Form("fv0pid[%d]/F",AliPID::kSPECIES));
    tOut -> Branch("fdEdx", fdEdx, Form("fdEdx[%d]/F", AliTRDpidUtil::kLQslices));
    
    for(Int_t iEv = 0; iEv < (tIn -> GetEntries()); iEv++){
      fLayer = 0;
      fMom = 0.0;
      for(Int_t i = 0; i < AliPID::kSPECIES; i++) fv0pid[i] = 0.0;
      for(Int_t i = 0; i < AliTRDpidUtil::kLQslices; i++) fdEdx[i] = 0.0;
      tIn -> GetEntry(iEv);
      if(Util.GetMomentumBin(fMom) == iMomBin){
	tOut -> Fill();
      }
    }
    
    tOut -> Write();
    tOut -> Delete();
    fOut -> Close();

  }
  
  printf("Extraction completed!");
  return 1;

}


Int_t CreateDummy(){

  for(Int_t iMomBin = 0; iMomBin < AliTRDCalPID::kNMom; iMomBin++){
    printf("Creating dummy for momentum bin %3.1f GeV/c\n", AliTRDCalPID::GetMomentum(iMomBin));
    TFile *fOut = new TFile(Form("./%3.1fGeV/TRD.TaskPidRefMaker.root",AliTRDCalPID::GetMomentum(iMomBin)),"RECREATE");
    TObjArray *fContainer = new TObjArray();

    TGraphErrors *gEffisTrain = new TGraphErrors(50);
//     TGraphErrors *gEffisTrain = new TGraphErrors(AliTRDpidRefMaker::kMoniTrain);
    gEffisTrain -> SetLineColor(4);
    gEffisTrain -> SetMarkerColor(4);
    gEffisTrain -> SetMarkerStyle(29);
    gEffisTrain -> SetMarkerSize(1);

    TGraphErrors *gEffisTest = new TGraphErrors(50);
//     TGraphErrors *gEffisTest = new TGraphErrors(AliTRDpidRefMaker::kMoniTrain);
    gEffisTest -> SetLineColor(2);
    gEffisTest -> SetMarkerColor(2);
    gEffisTest -> SetMarkerStyle(29);
    gEffisTest -> SetMarkerSize(1);
    
    fContainer -> AddAt(gEffisTrain,0);
    fContainer -> AddAt(gEffisTest,1);
//     fContainer -> AddAt(gEffisTrain,AliTRDpidRefMaker::kGraphTrain);
//     fContainer -> AddAt(gEffisTest,AliTRDpidRefMaker::kGraphTest);
  
  }

}
 makeTrainingData.C:1
 makeTrainingData.C:2
 makeTrainingData.C:3
 makeTrainingData.C:4
 makeTrainingData.C:5
 makeTrainingData.C:6
 makeTrainingData.C:7
 makeTrainingData.C:8
 makeTrainingData.C:9
 makeTrainingData.C:10
 makeTrainingData.C:11
 makeTrainingData.C:12
 makeTrainingData.C:13
 makeTrainingData.C:14
 makeTrainingData.C:15
 makeTrainingData.C:16
 makeTrainingData.C:17
 makeTrainingData.C:18
 makeTrainingData.C:19
 makeTrainingData.C:20
 makeTrainingData.C:21
 makeTrainingData.C:22
 makeTrainingData.C:23
 makeTrainingData.C:24
 makeTrainingData.C:25
 makeTrainingData.C:26
 makeTrainingData.C:27
 makeTrainingData.C:28
 makeTrainingData.C:29
 makeTrainingData.C:30
 makeTrainingData.C:31
 makeTrainingData.C:32
 makeTrainingData.C:33
 makeTrainingData.C:34
 makeTrainingData.C:35
 makeTrainingData.C:36
 makeTrainingData.C:37
 makeTrainingData.C:38
 makeTrainingData.C:39
 makeTrainingData.C:40
 makeTrainingData.C:41
 makeTrainingData.C:42
 makeTrainingData.C:43
 makeTrainingData.C:44
 makeTrainingData.C:45
 makeTrainingData.C:46
 makeTrainingData.C:47
 makeTrainingData.C:48
 makeTrainingData.C:49
 makeTrainingData.C:50
 makeTrainingData.C:51
 makeTrainingData.C:52
 makeTrainingData.C:53
 makeTrainingData.C:54
 makeTrainingData.C:55
 makeTrainingData.C:56
 makeTrainingData.C:57
 makeTrainingData.C:58
 makeTrainingData.C:59
 makeTrainingData.C:60
 makeTrainingData.C:61
 makeTrainingData.C:62
 makeTrainingData.C:63
 makeTrainingData.C:64
 makeTrainingData.C:65
 makeTrainingData.C:66
 makeTrainingData.C:67
 makeTrainingData.C:68
 makeTrainingData.C:69
 makeTrainingData.C:70
 makeTrainingData.C:71
 makeTrainingData.C:72
 makeTrainingData.C:73
 makeTrainingData.C:74
 makeTrainingData.C:75
 makeTrainingData.C:76
 makeTrainingData.C:77
 makeTrainingData.C:78
 makeTrainingData.C:79
 makeTrainingData.C:80
 makeTrainingData.C:81
 makeTrainingData.C:82
 makeTrainingData.C:83
 makeTrainingData.C:84
 makeTrainingData.C:85
 makeTrainingData.C:86
 makeTrainingData.C:87
 makeTrainingData.C:88
 makeTrainingData.C:89
 makeTrainingData.C:90
 makeTrainingData.C:91
 makeTrainingData.C:92
 makeTrainingData.C:93
 makeTrainingData.C:94
 makeTrainingData.C:95
 makeTrainingData.C:96
 makeTrainingData.C:97
 makeTrainingData.C:98
 makeTrainingData.C:99
 makeTrainingData.C:100
 makeTrainingData.C:101
 makeTrainingData.C:102
 makeTrainingData.C:103
 makeTrainingData.C:104
 makeTrainingData.C:105
 makeTrainingData.C:106
 makeTrainingData.C:107
 makeTrainingData.C:108
 makeTrainingData.C:109
 makeTrainingData.C:110
 makeTrainingData.C:111
 makeTrainingData.C:112
 makeTrainingData.C:113
 makeTrainingData.C:114
 makeTrainingData.C:115
 makeTrainingData.C:116
 makeTrainingData.C:117
 makeTrainingData.C:118
 makeTrainingData.C:119
 makeTrainingData.C:120
 makeTrainingData.C:121
 makeTrainingData.C:122
 makeTrainingData.C:123
 makeTrainingData.C:124
 makeTrainingData.C:125
 makeTrainingData.C:126
 makeTrainingData.C:127
 makeTrainingData.C:128
 makeTrainingData.C:129
 makeTrainingData.C:130
 makeTrainingData.C:131
 makeTrainingData.C:132
 makeTrainingData.C:133
 makeTrainingData.C:134
 makeTrainingData.C:135
 makeTrainingData.C:136
 makeTrainingData.C:137
 makeTrainingData.C:138
 makeTrainingData.C:139
 makeTrainingData.C:140
 makeTrainingData.C:141
 makeTrainingData.C:142
 makeTrainingData.C:143
 makeTrainingData.C:144
 makeTrainingData.C:145
 makeTrainingData.C:146
 makeTrainingData.C:147
 makeTrainingData.C:148
 makeTrainingData.C:149
 makeTrainingData.C:150
 makeTrainingData.C:151
 makeTrainingData.C:152
 makeTrainingData.C:153
 makeTrainingData.C:154