6#include "TMultiLayerPerceptron.h"
8#include "ParticleID/EmcPID.h"
11#include "EvtRecEvent/EvtRecTrack.h"
12#include "MdcRecEvent/RecMdcTrack.h"
13#include "ExtEvent/RecExtTrack.h"
18EmcPID * EmcPID::m_pointer = 0;
19TMultiLayerPerceptron * EmcPID::m_mlp_emc=0;
20TTree * EmcPID::m_trainTree_emconly=0;
24 if(!m_pointer) m_pointer =
new EmcPID();
30 std::string e_emc_file =
path +
"/share/elec_emc_hist.txt";
32 ifstream input(e_emc_file.c_str(),std::ios_base::in);
34 cout <<
" can not open: " << e_emc_file << endl;
37 for(
int i=0; i<18; i++) {
38 for(
int j=0; j<300; j++) {
43 std::string pi_emc_file =
path +
"/share/pion_emc_hist.txt";
45 ifstream input1(pi_emc_file.c_str(),std::ios_base::in);
47 cout <<
" can not open: " << pi_emc_file << endl;
50 for(
int i=0; i<18; i++) {
51 for(
int j=0; j<300; j++) {
55 std::string mu_emc_file =
path +
"/share/muon_emc_hist.txt";
58 ifstream input2(mu_emc_file.c_str(),std::ios_base::in);
60 cout <<
" can not open: " << mu_emc_file << endl;
63 for(
int i=0; i<18; i++) {
64 for(
int j=0; j<300; j++) {
70 if(!m_trainTree_emconly) {
71 m_trainTree_emconly =
new TTree(
"m_trainTree_emconly",
"m_trainTree_emconly");
72 m_trainTree_emconly->Branch(
"ptrk",&m_ptrk,
"ptrk/D");
73 m_trainTree_emconly->Branch(
"pt",&m_pt,
"pt/D");
74 m_trainTree_emconly->Branch(
"type",&m_type,
"type/D");
75 m_trainTree_emconly->Branch(
"energy",&m_energy,
"energy/D");
76 m_trainTree_emconly->Branch(
"eseed",&m_eseed,
"eseed/D");
77 m_trainTree_emconly->Branch(
"e3x3",&m_e3x3,
"e3x3/D");
78 m_trainTree_emconly->Branch(
"e5x5",&m_e5x5,
"e5x5/D");
79 m_trainTree_emconly->Branch(
"latmoment",&m_latmoment,
"latmoment/D");
80 m_trainTree_emconly->Branch(
"a20moment",&m_a20moment,
"a20moment/D");
81 m_trainTree_emconly->Branch(
"a42moment",&m_a42moment,
"a42moment/D");
82 m_trainTree_emconly->Branch(
"secondmoment",&m_secondmoment,
"secondmoment/D");
83 m_trainTree_emconly->Branch(
"delta_phi",&m_delta_phi,
"delta_phi/D");
84 m_trainTree_emconly->Branch(
"delta_theta",&m_delta_theta,
"delta_theta/D");
86 std::string emc =
path +
"/share/emc.txt";
89 m_mlp_emc =
new TMultiLayerPerceptron(
"ptrk,pt,energy,eseed,e3x3,e5x5,secondmoment,latmoment,a20moment,a42moment,delta_theta,delta_phi:24:type",m_trainTree_emconly);
91 m_mlp_emc->LoadWeights(emc.c_str());
96 for(
int i = 0; i < 5; i++) {
108 m_secondmoment = -99;
162 if (!(recTrk)->isMdcKalTrackValid())
return irc;
165 double ptrk=mdcKalTrk->
p();
169 m_pt=mdcKalTrk->
pxy();
170 m_pt = m_pt*mdcTrk->
charge();
179 m_energy = emcTrk->
energy();
180 m_eseed = emcTrk->
eSeed();
181 m_e3x3 = emcTrk->
e3x3();
182 m_e5x5 = emcTrk->
e5x5();
184 double m_emc_theta = emcTrk->
theta();
185 double m_emc_phi = emcTrk->
phi();
188 double m_ext_theta = mc.theta();
189 double m_ext_phi = mc.phi();
192 m_delta_theta = m_emc_theta - m_ext_theta;
193 m_delta_phi = m_emc_phi - m_ext_phi;
194 if(m_delta_phi>1) m_delta_phi=m_delta_phi-6.283;
195 if(m_delta_phi<-1) m_delta_phi=m_delta_phi+6.283;
203 if(emcTrk->
energy() <= 0)
return irc;
215 params_emc1[0] =m_ptrk;
216 params_emc1[1] =m_pt;
217 params_emc1[2] =m_energy;
218 params_emc1[3] =m_eseed;
219 params_emc1[4] =m_e3x3;
220 params_emc1[5] =m_e5x5;
221 params_emc1[6] =m_secondmoment;
222 params_emc1[7] =m_latmoment;
223 params_emc1[8] =m_a20moment;
224 params_emc1[9] =m_a42moment;
225 params_emc1[10] =m_delta_theta;
226 params_emc1[11] =m_delta_phi;
228 m_val_emc = m_mlp_emc->Evaluate(0,params_emc1);
229 int pindex = int((m_ptrk-0.2)/0.1);
230 int bindex = int((m_val_emc-0.5)/0.01);
231 if(bindex>300||bindex<0)
return irc;
232 if(pindex>17) pindex=17;
233 if(pindex<0) pindex=0;
235 m_prob[0] = m_e_h[pindex][bindex];
236 m_prob[1] = m_m_h[pindex][bindex];
237 m_prob[2] = m_p_h[pindex][bindex];
238 m_prob[3] = m_p_h[pindex][bindex];
239 m_prob[4] = m_p_h[pindex][bindex];
240 for(
int i =0; i<5; i++) {
241 if(m_prob[i]==0) m_prob[i] = 0.001;
245 for(
int i=0; i<5; i++) {
248 for(
int j=0; j<=bindex; j++) {
249 ppp[0]+= m_e_h[pindex][j];
250 ppp[1]+= m_m_h[pindex][j];
251 ppp[2]+= m_p_h[pindex][j];
253 for(
int i=0; i<3; i++) {
255 if(ppp[i]>0&&ppp[i]<1) {
256 CALG(ppp[i],m_chi[i]);
258 if(ppp[i]<=0||ppp[i]>=1) m_chi[i]=-99;
double Px(RecMdcKalTrack *trk)
void CALG(double Px, double &e2)
void CALG(double Px, double &e2)
double secondMoment() const
const Hep3Vector emcPosition() const
const int emcVolumeNumber() const
static void setPidType(PidType pidType)
int particleIDCalculation()
static EmcPID * instance()
RecEmcShower * emcShower()
EvtRecTrack * PidTrk() const