BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
EmcPID.cxx
Go to the documentation of this file.
1#include <cmath>
2#include <cstdlib>
3#include <fstream>
4
5#include "TMultiLayerPerceptron.h"
6#include "TTree.h"
7
8#include "ParticleID/EmcPID.h"
9
10#ifndef BEAN
11# include "EvtRecEvent/EvtRecTrack.h"
12# include "ExtEvent/RecExtTrack.h"
13# include "MdcRecEvent/RecMdcTrack.h"
14#endif
15
16void CALG( double Px, double& e2 ); // see "calg.cxx"
17
18EmcPID* EmcPID::m_pointer = 0;
19TMultiLayerPerceptron* EmcPID::m_mlp_emc = 0;
20TTree* EmcPID::m_trainTree_emconly = 0;
21
23 if ( !m_pointer ) m_pointer = new EmcPID();
24 return m_pointer;
25}
26
27EmcPID::EmcPID() : ParticleIDBase() {
28 m_mlp_emc = 0;
29 std::string e_emc_file = path + "/share/elec_emc_hist.txt";
30 // std::string e_emc_file = "$PARTICLEIDROOT/share/elechist.txt";
31 ifstream input( e_emc_file.c_str(), std::ios_base::in );
32 if ( !input )
33 {
34 cout << " can not open: " << e_emc_file << endl;
35 exit( 1 );
36 }
37 for ( int i = 0; i < 18; i++ )
38 {
39 for ( int j = 0; j < 300; j++ ) { input >> m_e_h[i][j]; }
40 }
41 // std::string pi_emc_file =
42 // "/ihepbatch/bes/huangb/boss610/Analysis/ParticleID/ParticleID-00-02-03/share/pionhist.txt";
43 std::string pi_emc_file = path + "/share/pion_emc_hist.txt";
44 // std::string pi_emc_file = "$PARTICLEIDROOT/share/pionhist.txt";
45 ifstream input1( pi_emc_file.c_str(), std::ios_base::in );
46 if ( !input1 )
47 {
48 cout << " can not open: " << pi_emc_file << endl;
49 exit( 1 );
50 }
51 for ( int i = 0; i < 18; i++ )
52 {
53 for ( int j = 0; j < 300; j++ ) { input1 >> m_p_h[i][j]; }
54 }
55 std::string mu_emc_file = path + "/share/muon_emc_hist.txt";
56 // std::string mu_emc_file =
57 // "/ihepbatch/bes/huangb/boss610/Analysis/ParticleID/ParticleID-00-02-03/share/muonhist.txt";
58 // std::string mu_emc_file = "$PARTICLEIDROOT/share/muonhist.txt";
59 ifstream input2( mu_emc_file.c_str(), std::ios_base::in );
60 if ( !input2 )
61 {
62 cout << " can not open: " << mu_emc_file << endl;
63 exit( 1 );
64 }
65 for ( int i = 0; i < 18; i++ )
66 {
67 for ( int j = 0; j < 300; j++ ) { input2 >> m_m_h[i][j]; }
68 }
69
70 if ( !m_trainTree_emconly )
71 {
72 m_trainTree_emconly = new TTree( "m_trainTree_emconly", "m_trainTree_emconly" );
73 m_trainTree_emconly->Branch( "ptrk", &m_ptrk, "ptrk/D" );
74 m_trainTree_emconly->Branch( "pt", &m_pt, "pt/D" );
75 m_trainTree_emconly->Branch( "type", &m_type, "type/D" );
76 m_trainTree_emconly->Branch( "energy", &m_energy, "energy/D" );
77 m_trainTree_emconly->Branch( "eseed", &m_eseed, "eseed/D" );
78 m_trainTree_emconly->Branch( "e3x3", &m_e3x3, "e3x3/D" );
79 m_trainTree_emconly->Branch( "e5x5", &m_e5x5, "e5x5/D" );
80 m_trainTree_emconly->Branch( "latmoment", &m_latmoment, "latmoment/D" );
81 m_trainTree_emconly->Branch( "a20moment", &m_a20moment, "a20moment/D" );
82 m_trainTree_emconly->Branch( "a42moment", &m_a42moment, "a42moment/D" );
83 m_trainTree_emconly->Branch( "secondmoment", &m_secondmoment, "secondmoment/D" );
84 m_trainTree_emconly->Branch( "delta_phi", &m_delta_phi, "delta_phi/D" );
85 m_trainTree_emconly->Branch( "delta_theta", &m_delta_theta, "delta_theta/D" );
86 }
87 std::string emc = path + "/share/emc.txt";
88 if ( !m_mlp_emc )
89 {
90 // m_mlp_emc = new
91 // TMultiLayerPerceptron("ptrk,pt,energy,eseed,e3x3,e5x5,secondmoment,delta_theta,delta_phi:18:type",m_trainTree_emconly);
92 m_mlp_emc =
93 new TMultiLayerPerceptron( "ptrk,pt,energy,eseed,e3x3,e5x5,secondmoment,latmoment,"
94 "a20moment,a42moment,delta_theta,delta_phi:24:type",
95 m_trainTree_emconly );
96
97 m_mlp_emc->LoadWeights( emc.c_str() );
98 }
99}
101 for ( int i = 0; i < 5; i++ )
102 {
103 m_chi[i] = 99.0;
104 m_prob[i] = -1.0;
105 }
106 m_chimin = 99.;
107 m_ndof = 0;
108 m_energy = -99;
109 m_eseed = -99;
110 m_e3x3 = -99;
111 m_e5x5 = -99;
112 m_delta_theta = -99;
113 m_delta_phi = -99;
114 m_secondmoment = -99;
115 m_val_emc = -99;
116 // std::string emc = path + "/share/emc_epimu.txt";
117 /* if(!m_trainTree_emconly){
118 m_trainTree_emconly = new TTree("m_trainTree_emconly","m_trainTree_emconly");
119 m_trainTree_emconly->Branch("ptrk",&m_ptrk,"ptrk/D");
120 m_trainTree_emconly->Branch("pt",&m_pt,"pt/D");
121 m_trainTree_emconly->Branch("type",&m_type,"type/D");
122 m_trainTree_emconly->Branch("energy",&m_energy,"energy/D");
123 m_trainTree_emconly->Branch("eseed",&m_eseed,"eseed/D");
124 m_trainTree_emconly->Branch("e3x3",&m_e3x3,"e3x3/D");
125 m_trainTree_emconly->Branch("e5x5",&m_e5x5,"e5x5/D");
126 m_trainTree_emconly->Branch("secondmoment",&m_secondmoment,"secondmoment/D");
127 m_trainTree_emconly->Branch("delta_phi",&m_delta_phi,"delta_phi/D");
128 m_trainTree_emconly->Branch("delta_theta",&m_delta_theta,"delta_theta/D");
129 }
130 if(!m_mlp_emc){
131 m_mlp_emc = new
132 TMultiLayerPerceptron("ptrk,pt,energy,eseed,e3x3,e5x5,secondmoment,delta_theta,delta_phi:18:type",m_trainTree_emconly);
133 m_mlp_emc->LoadWeights(emc.c_str());
134 }
135 */
136
137 /*if(!m_trainTree_emconly){
138 m_trainTree_emconly = new TTree("m_trainTree_emconly","m_trainTree_emconly");
139 m_trainTree_emconly->Branch("ptrk",&m_ptrk,"ptrk/D");
140 m_trainTree_emconly->Branch("pt",&m_pt,"pt/D");
141 m_trainTree_emconly->Branch("type",&m_type,"type/D");
142 m_trainTree_emconly->Branch("energy",&m_energy,"energy/D");
143 m_trainTree_emconly->Branch("eseed",&m_eseed,"eseed/D");
144 m_trainTree_emconly->Branch("e3x3",&m_e3x3,"e3x3/D");
145 m_trainTree_emconly->Branch("e5x5",&m_e5x5,"e5x5/D");
146 m_trainTree_emconly->Branch("secondmoment",&m_secondmoment,"secondmoment/D");
147 m_trainTree_emconly->Branch("delta_phi",&m_delta_phi,"delta_phi/D");
148 m_trainTree_emconly->Branch("delta_theta",&m_delta_theta,"delta_theta/D");
149 }
150 if(!m_mlp_emc){
151 m_mlp_emc = new
152 TMultiLayerPerceptron("ptrk,pt,energy,eseed,e3x3,e5x5,secondmoment,delta_theta,delta_phi:18:type",m_trainTree_emconly);
153 m_mlp_emc->LoadWeights(emc.c_str());
154 }
155 */
156}
157
159 if ( particleIDCalculation() == 0 ) m_ndof = 1;
160}
161
163 int irc = -1;
164 EvtRecTrack* recTrk = PidTrk();
165 if ( !( recTrk->isMdcTrackValid() ) ) return irc;
166 RecMdcTrack* mdcTrk = recTrk->mdcTrack();
167 if ( !( recTrk )->isMdcKalTrackValid() ) return irc;
168 RecMdcKalTrack* mdcKalTrk = ( recTrk )->mdcKalTrack();
170 double ptrk = mdcKalTrk->p();
171 // double ptrk = mdcTrk->p();
172 m_ptrk = ptrk;
173
174 m_pt = mdcKalTrk->pxy();
175 m_pt = m_pt * mdcTrk->charge();
176 // double cost = cos(mdcTrk->theta());
177
178 if ( !( recTrk->isExtTrackValid() ) ) return irc;
179 RecExtTrack* extTrk = recTrk->extTrack();
180 if ( extTrk->emcVolumeNumber() == -1 ) return irc;
181 if ( !( recTrk->isEmcShowerValid() ) ) return irc;
182 RecEmcShower* emcTrk = recTrk->emcShower();
183
184 m_energy = emcTrk->energy();
185 m_eseed = emcTrk->eSeed();
186 m_e3x3 = emcTrk->e3x3();
187 m_e5x5 = emcTrk->e5x5();
188
189 double m_emc_theta = emcTrk->theta();
190 double m_emc_phi = emcTrk->phi();
191
192 Hep3Vector mc = extTrk->emcPosition();
193 double m_ext_theta = mc.theta();
194 double m_ext_phi = mc.phi();
195
196 m_delta_theta = m_emc_theta - m_ext_theta;
197 m_delta_phi = m_emc_phi - m_ext_phi;
198 if ( m_delta_phi > 1 ) m_delta_phi = m_delta_phi - 6.283;
199 if ( m_delta_phi < -1 ) m_delta_phi = m_delta_phi + 6.283;
200
201 m_secondmoment = emcTrk->secondMoment() / 1000.;
202 m_a20moment = emcTrk->a20Moment();
203 m_latmoment = emcTrk->latMoment();
204 m_a42moment = emcTrk->a42Moment();
205
206 if ( emcTrk->energy() <= 0 ) return irc;
207 // if(emcTrk->energy() > ptrk) return irc;
208
209 /* params_emc1[0] = m_ptrk;
210 params_emc1[1] = m_pt;
211 params_emc1[2] = m_energy;
212 params_emc1[3] = m_eseed;
213 params_emc1[4] = m_e3x3;
214 params_emc1[5] = m_e5x5;
215 params_emc1[6] = m_secondmoment;
216 params_emc1[7] = m_delta_theta;
217 params_emc1[8] = m_delta_phi;*/
218 params_emc1[0] = m_ptrk;
219 params_emc1[1] = m_pt;
220 params_emc1[2] = m_energy;
221 params_emc1[3] = m_eseed;
222 params_emc1[4] = m_e3x3;
223 params_emc1[5] = m_e5x5;
224 params_emc1[6] = m_secondmoment;
225 params_emc1[7] = m_latmoment;
226 params_emc1[8] = m_a20moment;
227 params_emc1[9] = m_a42moment;
228 params_emc1[10] = m_delta_theta;
229 params_emc1[11] = m_delta_phi;
230
231 m_val_emc = m_mlp_emc->Evaluate( 0, params_emc1 );
232 int pindex = int( ( m_ptrk - 0.2 ) / 0.1 );
233 int bindex = int( ( m_val_emc - 0.5 ) / 0.01 );
234 if ( bindex > 300 || bindex < 0 ) return irc;
235 if ( pindex > 17 ) pindex = 17;
236 if ( pindex < 0 ) pindex = 0;
237 // double bin_pos[3];
238 m_prob[0] = m_e_h[pindex][bindex];
239 m_prob[1] = m_m_h[pindex][bindex];
240 m_prob[2] = m_p_h[pindex][bindex];
241 m_prob[3] = m_p_h[pindex][bindex];
242 m_prob[4] = m_p_h[pindex][bindex];
243 for ( int i = 0; i < 5; i++ )
244 {
245 if ( m_prob[i] == 0 ) m_prob[i] = 0.001;
246 }
247 // calculate the chisq value using GAUSIN
248 float ppp[5];
249 for ( int i = 0; i < 5; i++ ) { ppp[i] = 0; }
250 for ( int j = 0; j <= bindex; j++ )
251 {
252 ppp[0] += m_e_h[pindex][j];
253 ppp[1] += m_m_h[pindex][j];
254 ppp[2] += m_p_h[pindex][j];
255 }
256 for ( int i = 0; i < 3; i++ )
257 {
258 ppp[i] = ppp[i] * 0.01;
259 if ( ppp[i] > 0 && ppp[i] < 1 ) { CALG( ppp[i], m_chi[i] ); }
260 if ( ppp[i] <= 0 || ppp[i] >= 1 ) m_chi[i] = -99;
261 }
262 // if(fabs(m_chi[2])==-99)
263 m_chi[3] = m_chi[2];
264 m_chi[4] = m_chi[2];
265
266 m_ndof = 1;
267 irc = 0;
268 return irc;
269}
double Px(RecMdcKalTrack *trk)
Double_t e2
void CALG(double Px, double &e2)
Definition calg.cxx:31
void CALG(double Px, double &e2)
Definition calg.cxx:31
void calculate()
Definition EmcPID.cxx:158
void init()
Definition EmcPID.cxx:100
int particleIDCalculation()
Definition EmcPID.cxx:162
static EmcPID * instance()
Definition EmcPID.cxx:22