CbmRoot
Loading...
Searching...
No Matches
CbmTrdSetTracksPidANN.cxx
Go to the documentation of this file.
1/* Copyright (C) 2007-2021 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Semen Lebedev, Andrey Lebedev, Florian Uhlig [committer] */
4
5// -------------------------------------------------------------------------
6// ----- CbmTrdSetTracksPidANN source file -----
7// ----- Created 06/03/07 by Simeon Lebedev -----
8// -------------------------------------------------------------------------
10
11#include "CbmTrdHit.h"
12#include "CbmTrdTrack.h"
13#include "FairRootManager.h"
14#include "TClonesArray.h"
15#include "TMath.h"
16#include "TMultiLayerPerceptron.h"
17#include "TString.h"
18#include "TSystem.h"
19#include "TTree.h"
20
21#include <fstream>
22#include <iostream>
23#include <sstream>
24#include <vector>
25using namespace std;
26
28
30 : FairTask(name)
31 , fTrackArray(NULL)
32 , fTrdHitArray(NULL)
33 , fNofTracks(0)
34 , fANNPar1(-1.)
35 , fANNPar2(-1.)
36 , fNN()
37 , fTRDGeometryType("h++")
38{
39}
40
41
43
45
47{
48 string fileName = string(gSystem->Getenv("VMCWORKDIR"));
49 vector<string> weightsFilesANN;
50
51 if (fTRDGeometryType != "h++") {
52 cout << "-E- CbmTrdSetTracksPidANN::Init: " << fTRDGeometryType << " is wrong geometry type." << endl;
53 return kFALSE;
54 }
55 fileName += "/parameters/trd/elid/ann/" + string(fTRDGeometryType.Data()) + "/";
56
57 for (int i = 0; i < 10; i++) {
58 stringstream ss;
59 ss << fileName << "ann_weights_" << (i + 1) << ".txt";
60 weightsFilesANN.push_back(ss.str());
61 }
62
63 if (fTRDGeometryType == "h++") {
64 fANNPar1 = 1.06;
65 fANNPar2 = 0.57;
66 }
67
68 for (UInt_t i = 0; i < weightsFilesANN.size(); i++) {
69 ifstream myfile(weightsFilesANN[i].c_str());
70 if (!myfile.is_open()) {
71 cout << "-E- CbmTrdSetTracksPidANN::Init: "
72 << "Could not open input file:" << weightsFilesANN[i] << endl;
73 weightsFilesANN[i] = "";
74 //return kFALSE;
75 }
76 myfile.close();
77 }
78
79 Float_t inVector[10];
80 Int_t xOut; //output value
81
82 //init TTree as input data to neural net
83 TTree* simu = new TTree("MonteCarlo", "MontecarloData");
84 simu->Branch("x1", &inVector[0], "x1/F");
85 simu->Branch("x2", &inVector[1], "x2/F");
86 simu->Branch("x3", &inVector[2], "x3/F");
87 simu->Branch("x4", &inVector[3], "x4/F");
88 simu->Branch("x5", &inVector[4], "x5/F");
89 simu->Branch("x6", &inVector[5], "x6/F");
90 simu->Branch("x7", &inVector[6], "x7/F");
91 simu->Branch("x8", &inVector[7], "x8/F");
92 simu->Branch("x9", &inVector[8], "x9/F");
93 simu->Branch("x10", &inVector[9], "x10/F");
94 simu->Branch("xOut", &xOut, "xOut/I");
95
96 fNN.clear();
97
98 for (int iH = 0; iH < 10; iH++) {
99 if (weightsFilesANN[iH] == "") {
100 fNN.push_back(NULL);
101 continue;
102 }
103 stringstream ss;
104 for (int iL = 0; iL <= iH; iL++) {
105 if (iL != iH) ss << "x" << (iL + 1) << ",";
106 int nofHidden = 2 * (iH + 1);
107 if (iL == iH) ss << "x" << (iL + 1) << ":" << nofHidden << ":xOut";
108 }
109 TMultiLayerPerceptron* ann = new TMultiLayerPerceptron(ss.str().c_str(), simu);
110 ann->LoadWeights(weightsFilesANN[iH].c_str());
111 fNN.push_back(ann);
112 }
113
114 return kTRUE;
115}
116
118{
119 if (!ReadData()) {
120 LOG(fatal) << GetName() << "::Init: ReadData failed";
121 }
122
123 FairRootManager* ioman = FairRootManager::Instance();
124 if (NULL == ioman) {
125 LOG(fatal) << GetName() << "::Init: RootManager not instantised";
126 }
127
128 fTrackArray = (TClonesArray*) ioman->GetObject("TrdTrack");
129 if (NULL == fTrackArray) {
130 LOG(fatal) << GetName() << "::Init: No TrdTrack array";
131 }
132
133 fTrdHitArray = (TClonesArray*) ioman->GetObject("TrdHit");
134 if (NULL == fTrdHitArray) {
135 LOG(fatal) << GetName() << "::Init: No TrdHit array";
136 }
137
138 return kSUCCESS;
139}
140
142{
143 Int_t nTracks = fTrackArray->GetEntriesFast();
144 std::vector<Double_t> eLossVector;
145
146 for (Int_t iTrack = 0; iTrack < nTracks; iTrack++) {
147 eLossVector.clear();
148 CbmTrdTrack* pTrack = (CbmTrdTrack*) fTrackArray->At(iTrack);
149 Int_t nofHits = pTrack->GetNofHits();
150 for (Int_t iTRD = 0; iTRD < nofHits; iTRD++) {
151 Int_t index = pTrack->GetHitIndex(iTRD);
152 CbmTrdHit* trdHit = (CbmTrdHit*) fTrdHitArray->At(index);
153 eLossVector.push_back(trdHit->GetELoss());
154 }
155
156 //------------------transform Data BEGIN--------------------------
157 for (UInt_t j = 0; j < eLossVector.size(); j++) {
158 eLossVector[j] = eLossVector[j] * 1.e6;
159 eLossVector[j] = (eLossVector[j] - fANNPar1) / fANNPar2 - 0.225;
160 }
161 sort(eLossVector.begin(), eLossVector.end());
162 for (UInt_t j = 0; j < eLossVector.size(); j++) {
163 eLossVector[j] = TMath::LandauI(eLossVector[j]);
164 }
165 //------------------transform Data END----------------------------
166
167 Int_t iANN = nofHits - 1;
168 Double_t nnEval;
169 if (iANN < 0 || iANN >= 12 || fNN[iANN] == NULL) {
170 nnEval = -2.;
171 }
172 else {
173 nnEval = fNN[iANN]->Evaluate(0, &eLossVector[0]);
174 if (TMath::IsNaN(nnEval) == 1) {
175 cout << " -W- CbmTrdSetTracksPidANN: nnEval nan " << endl;
176 nnEval = -2;
177 }
178 }
179 pTrack->SetPidANN(nnEval);
180 }
181}
182
184
ClassImp(CbmConverterManager)
Class for hits in TRD detector.
virtual int32_t GetNofHits() const
Definition CbmTrack.h:58
int32_t GetHitIndex(int32_t iHit) const
Definition CbmTrack.h:59
data class for a reconstructed Energy-4D measurement in the TRD
Definition CbmTrdHit.h:40
double GetELoss() const
Definition CbmTrdHit.h:79
virtual void Exec(Option_t *opt)
std::vector< TMultiLayerPerceptron * > fNN
void SetPidANN(double pid)
Definition CbmTrdTrack.h:51
Hash for CbmL1LinkKey.