BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
MucPID.cxx
Go to the documentation of this file.
1#include <cmath>
2#include <cstdlib>
3#include <fstream>
4
5#include "TFile.h"
6#include "TMLPAnalyzer.h"
7#include "TMultiLayerPerceptron.h"
8#include "TTree.h"
9
10#include "ParticleID/MucPID.h"
11
12#ifndef BEAN
13# include "EvtRecEvent/EvtRecTrack.h"
14# include "MdcRecEvent/RecMdcTrack.h"
15# include "MucRecEvent/RecMucTrack.h"
16#endif
17
18void CALG( double Px, double& e2 ); // see "calg.cxx"
19
20MucPID* MucPID::m_pointer = 0;
21
23
24 if ( !m_pointer ) m_pointer = new MucPID();
25 return m_pointer;
26}
27
28MucPID::MucPID() : ParticleIDBase() {
29 m_trainFile_muc = 0;
30 m_trainTree_muc = 0;
31 m_mlp_muc = 0;
32 m_mlpa_muc = 0;
33 // std::string pi_muc_file = "$PARTICLEIDROOT/share/pion_muc_hist.txt";
34 // std::string pi_muc_file =
35 // "/ihepbatch/bes/huangb/boss610/Analysis/ParticleID/ParticleID-00-02-03/share/pion_muc_hist.txt";
36 std::string pi_muc_file = path + "/share/pion_muc_hist.txt";
37
38 ifstream input1( pi_muc_file.c_str(), std::ios_base::in );
39 if ( !input1 )
40 {
41 cout << " can not open: " << pi_muc_file << endl;
42 exit( 1 );
43 }
44 for ( int i = 0; i < 13; i++ )
45 {
46 for ( int j = 0; j < 300; j++ ) { input1 >> m_p_h[i][j]; }
47 }
48
49 std::string mu_muc_file = path + "/share/muon_muc_hist.txt";
50 // std::string mu_muc_file = "$PARTICLEIDROOT/share/muon_muc_hist.txt";
51 // std::string mu_muc_file =
52 // "/ihepbatch/bes/huangb/boss610/Analysis/ParticleID/ParticleID-00-02-03/share/muon_muc_hist.txt";
53 ifstream input2( mu_muc_file.c_str(), std::ios_base::in );
54 if ( !input2 )
55 {
56 cout << " can not open: " << mu_muc_file << endl;
57 exit( 1 );
58 }
59 for ( int i = 0; i < 13; i++ )
60 {
61 for ( int j = 0; j < 300; j++ ) { input2 >> m_m_h[i][j]; }
62 }
63}
64
66 for ( int i = 0; i < 5; i++ )
67 {
68 m_chi[i] = 99.0;
69 m_prob[i] = -1.0;
70 }
71 m_chimin = 99.;
72 m_ndof = 0;
73 m_hits = -99;
74 m_depth = -999;
75 m_val_muc = -99;
76
77 std::string neural = path + "/share/neural.root";
78 std::string muc = path + "/share/muc.txt";
79 double ptrk, phi, theta, depth, hits, chi2, distance, muc_delta_phi;
80 int type;
81 if ( !m_trainTree_muc )
82 {
83 m_trainTree_muc = new TTree( "m_trainTree_muc", "m_trainTree_muc" );
84 m_trainTree_muc->Branch( "ptrk", &ptrk, "ptrk/D" );
85 m_trainTree_muc->Branch( "phi", &phi, "phi/D" );
86 m_trainTree_muc->Branch( "theta", &theta, "theta/D" );
87 m_trainTree_muc->Branch( "depth", &depth, "depth/D" );
88 m_trainTree_muc->Branch( "hits", &hits, "hits/D" );
89 m_trainTree_muc->Branch( "chi2", &chi2, "chi2/D" );
90 m_trainTree_muc->Branch( "distance", &distance, "distance/D" );
91 m_trainTree_muc->Branch( "muc_delta_phi", &muc_delta_phi, "muc_delta_phi/D" );
92 m_trainTree_muc->Branch( "type", &type, "type/I" );
93 }
94 if ( !m_mlp_muc )
95 {
96 m_mlp_muc = new TMultiLayerPerceptron(
97 "@ptrk,@phi,@theta,@depth,@hits,@chi2,@distance,@muc_delta_phi:16:type",
98 m_trainTree_muc );
99 m_mlp_muc->LoadWeights( muc.c_str() );
100 }
101}
102
104 if ( particleIDCalculation() == 0 ) m_ndof = 1;
105}
106
108 int irc = -1;
109 EvtRecTrack* recTrk = PidTrk();
110 if ( !( recTrk->isMdcTrackValid() ) ) return irc;
111 RecMdcTrack* mdcTrk = recTrk->mdcTrack();
112
113 m_depth = -99;
114 m_hits = -99;
115 m_chi2 = -99;
116 m_distance = -99;
117 m_muc_delta_phi = -99;
118
119 double ptrk = mdcTrk->p();
120 double m_ptrk = ptrk;
121 double m_pt = mdcTrk->pxy();
122 double phi = mdcTrk->phi();
123 double theta = mdcTrk->theta();
124 double cost = cos( mdcTrk->theta() );
125 if ( ptrk < 0.5 ) return irc;
126 if ( fabs( cost ) > 0.83 ) return irc;
127 if ( !( recTrk->isExtTrackValid() ) ) return irc;
128 RecExtTrack* extTrk = recTrk->extTrack();
129 if ( extTrk->mucVolumeNumber() == -1 ) return irc;
130 if ( !( recTrk->isMucTrackValid() ) ) return irc;
131 RecMucTrack* mucTrk = recTrk->mucTrack();
132
133 // if(mucTrk->maxHitsInLayer()< 0) return irc;
134 if ( mucTrk->depth() > 100000 ) return irc;
135
136 m_hits = mucTrk->maxHitsInLayer();
137 m_depth = mucTrk->depth();
138 m_distance = mucTrk->distance();
139 m_chi2 = mucTrk->chi2();
140 /* Hep3Vector phi_muc;
141 phi_muc.set(mucTrk->xPos(),mucTrk->yPos(),0);
142 Hep3Vector phi_mdc;
143 phi_mdc.set(mdcTrk->px(),mdcTrk->py(),0);
144 m_muc_delta_phi = phi_muc.angle(phi_mdc);
145 if(m_muc_delta_phi<0) m_muc_delta_phi = -m_muc_delta_phi; */
146 m_muc_delta_phi = mucTrk->deltaPhi();
147 m_muc_delta_phi = 3.14159 - m_muc_delta_phi;
148 theta = cos( theta );
149 params_muc1[0] = m_ptrk;
150 params_muc1[1] = phi;
151 params_muc1[2] = theta;
152 params_muc1[3] = m_depth;
153 params_muc1[4] = m_hits;
154 params_muc1[5] = m_chi2;
155 params_muc1[6] = m_distance;
156 params_muc1[7] = m_muc_delta_phi;
157
158 m_val_muc = m_mlp_muc->Evaluate( 0, params_muc1 );
159 if ( m_pt < 0 ) m_pt = -m_pt;
160 int pindex = int( ( m_ptrk - 0.5 ) / 0.1 );
161 int bindex = int( ( m_val_muc - 0.5 ) / 0.01 );
162 if ( bindex > 300 || bindex < 0 ) return irc;
163 if ( pindex > 11 ) pindex = 11;
164 if ( pindex < 0 ) pindex = 0;
165 m_prob[0] = m_p_h[pindex][bindex];
166 ;
167 m_prob[1] = m_m_h[pindex][bindex];
168 m_prob[2] = m_p_h[pindex][bindex];
169 m_prob[3] = m_p_h[pindex][bindex];
170 m_prob[4] = m_p_h[pindex][bindex];
171 for ( int i = 0; i < 5; i++ )
172 {
173 if ( m_prob[i] == 0 ) m_prob[i] = 0.001;
174 }
175 float ppp[5];
176 for ( int i = 0; i < 5; i++ ) { ppp[i] = 0.0; }
177
178 for ( int j = 0; j < bindex; j++ )
179 {
180 ppp[1] += m_m_h[pindex][j] * 0.01;
181 ppp[2] += m_p_h[pindex][j] * 0.01;
182 }
183 if ( ppp[1] > 0 && ppp[1] < 1 ) CALG( ppp[1], m_chi[1] );
184 if ( ppp[2] > 0 && ppp[2] < 1 ) CALG( ppp[2], m_chi[2] );
185 if ( ppp[1] <= 0 || ppp[1] >= 1 ) m_chi[1] = -99;
186 if ( ppp[2] <= 0 || ppp[2] >= 1 ) m_chi[2] = -99;
187
188 m_chi[3] = m_chi[2];
189 m_chi[4] = m_chi[2];
190 m_chi[0] = m_chi[2];
191 m_ndof = 1;
192 irc = 0;
193 return irc;
194}
double Px(RecMdcKalTrack *trk)
Double_t e2
NTuple::Item< double > m_pt
void CALG(double Px, double &e2)
Definition calg.cxx:31
void CALG(double Px, double &e2)
Definition calg.cxx:31
void init()
Definition MucPID.cxx:65
int particleIDCalculation()
Definition MucPID.cxx:107
static MucPID * instance()
Definition MucPID.cxx:22
void calculate()
Definition MucPID.cxx:103