BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
TagParser4.cxx
Go to the documentation of this file.
1#include "GaudiKernel/IAppMgrUI.h"
2#include "GaudiKernel/IDataProviderSvc.h"
3#include "GaudiKernel/IInterface.h"
4#include "GaudiKernel/IProperty.h"
5#include "GaudiKernel/ISvcLocator.h"
6#include "GaudiKernel/MsgStream.h"
7#include "GaudiKernel/PropertyMgr.h"
8#include "GaudiKernel/SmartDataPtr.h"
9#include "GaudiKernel/SmartIF.h"
10#include "GaudiKernel/StatusCode.h"
11
12#include "GaudiKernel/Bootstrap.h"
13#include "GaudiKernel/IIncidentListener.h"
14#include "GaudiKernel/IIncidentSvc.h"
15#include "GaudiKernel/ISvcLocator.h"
16#include "GaudiKernel/Incident.h"
17
18#include "TFile.h"
19#include "TFormula.h"
20#include "TTree.h"
21#include "TagParser4.h"
22#include <fstream>
23#include <iostream>
24#include <map>
25
27
29
30StatusCode TagParser4::getVEntry( std::vector<int>& ventry ) {
31
32 std::map<int, unsigned int> Lc_modeTag, Ds_modeTag, D0_modeTag, Dp_modeTag;
33
34 Lc_modeTag[1000] = 0;
35 Lc_modeTag[1001] = 1;
36 Lc_modeTag[1002] = 2;
37 Lc_modeTag[1003] = 3;
38 Lc_modeTag[1004] = 4;
39 Lc_modeTag[1005] = 5;
40 Lc_modeTag[1030] = 6;
41 Lc_modeTag[1031] = 7;
42 Lc_modeTag[1032] = 8;
43 Lc_modeTag[1033] = 9;
44 Lc_modeTag[1034] = 10;
45 Lc_modeTag[1060] = 11;
46 Lc_modeTag[1061] = 12;
47 Lc_modeTag[1062] = 13;
48 Lc_modeTag[1063] = 14;
49 Lc_modeTag[1064] = 15;
50 Lc_modeTag[1065] = 16;
51
52 Ds_modeTag[400] = 1;
53 Ds_modeTag[401] = 0;
54 Ds_modeTag[402] = 2;
55 Ds_modeTag[403] = 13;
56 Ds_modeTag[404] = 3;
57 Ds_modeTag[405] = 4;
58 Ds_modeTag[406] = 5;
59 Ds_modeTag[407] = 14;
60 Ds_modeTag[420] = 28;
61 Ds_modeTag[421] = 6;
62 Ds_modeTag[422] = 24;
63 Ds_modeTag[423] = 25;
64 Ds_modeTag[424] = 26;
65 Ds_modeTag[425] = 27;
66 Ds_modeTag[440] = 7;
67 Ds_modeTag[441] = 8;
68 Ds_modeTag[442] = 20;
69 Ds_modeTag[450] = 21;
70 Ds_modeTag[451] = 22;
71 Ds_modeTag[452] = 23;
72 Ds_modeTag[460] = 9;
73 Ds_modeTag[461] = 15;
74 Ds_modeTag[470] = 16;
75 Ds_modeTag[471] = 17;
76 Ds_modeTag[480] = 10;
77 Ds_modeTag[481] = 11;
78 Ds_modeTag[500] = 29;
79 Ds_modeTag[501] = 18;
80 Ds_modeTag[502] = 12;
81 Ds_modeTag[503] = 19;
82 Ds_modeTag[504] = 30;
83
84 D0_modeTag[0] = 0;
85 D0_modeTag[1] = 1;
86 D0_modeTag[2] = 2;
87 D0_modeTag[3] = 3;
88 D0_modeTag[4] = 4;
89 D0_modeTag[5] = 5;
90 D0_modeTag[6] = 6;
91 D0_modeTag[7] = 7;
92 D0_modeTag[8] = 8;
93 D0_modeTag[9] = 8;
94 D0_modeTag[10] = 9;
95 D0_modeTag[50] = 10;
96 D0_modeTag[51] = 11;
97 D0_modeTag[100] = 12;
98 D0_modeTag[101] = 13;
99 D0_modeTag[102] = 14;
100 D0_modeTag[103] = 15;
101 D0_modeTag[104] = 16;
102 D0_modeTag[105] = 16;
103 D0_modeTag[106] = 17;
104 D0_modeTag[107] = 16;
105 D0_modeTag[108] = 16;
106 D0_modeTag[109] = 18;
107 D0_modeTag[110] = 19;
108 D0_modeTag[111] = 20;
109 D0_modeTag[112] = 16;
110 D0_modeTag[113] = 21;
111 D0_modeTag[114] = 22;
112 D0_modeTag[115] = 23;
113 D0_modeTag[116] = 24;
114 D0_modeTag[117] = 25;
115 D0_modeTag[118] = 26;
116 D0_modeTag[119] = 27;
117 D0_modeTag[120] = 28;
118 D0_modeTag[121] = 29;
119 D0_modeTag[122] = 30;
120 D0_modeTag[123] = 30;
121 D0_modeTag[124] = 30;
122 D0_modeTag[125] = 30;
123 D0_modeTag[126] = 30;
124 D0_modeTag[127] = 30;
125 D0_modeTag[128] = 30;
126 D0_modeTag[129] = 30;
127 D0_modeTag[130] = 30;
128 D0_modeTag[131] = 30;
129 D0_modeTag[132] = 30;
130 D0_modeTag[133] = 30;
131 D0_modeTag[134] = 30;
132 D0_modeTag[135] = 30;
133
134 Dp_modeTag[200] = 0;
135 Dp_modeTag[201] = 1;
136 Dp_modeTag[202] = 2;
137 Dp_modeTag[203] = 3;
138 Dp_modeTag[204] = 4;
139 Dp_modeTag[205] = 5;
140 Dp_modeTag[206] = 6;
141 Dp_modeTag[207] = 7;
142 Dp_modeTag[208] = 8;
143 Dp_modeTag[209] = 9;
144 Dp_modeTag[210] = 10;
145 Dp_modeTag[211] = 11;
146 Dp_modeTag[212] = 12;
147 Dp_modeTag[213] = 13;
148 Dp_modeTag[214] = 14;
149 Dp_modeTag[215] = 15;
150 Dp_modeTag[216] = 16;
151 Dp_modeTag[217] = 17;
152 Dp_modeTag[218] = 18;
153 Dp_modeTag[219] = 19;
154 Dp_modeTag[220] = 20;
155 Dp_modeTag[221] = 21;
156 Dp_modeTag[222] = 22;
157 Dp_modeTag[223] = 23;
158 Dp_modeTag[224] = 24;
159 Dp_modeTag[225] = 24;
160 Dp_modeTag[226] = 25;
161 Dp_modeTag[227] = 25;
162 Dp_modeTag[228] = 26;
163 Dp_modeTag[229] = 27;
164 Dp_modeTag[230] = 28;
165 Dp_modeTag[231] = 29;
166 Dp_modeTag[232] = 29;
167 Dp_modeTag[233] = 29;
168 Dp_modeTag[234] = 29;
169 Dp_modeTag[235] = 29;
170 Dp_modeTag[236] = 29;
171 Dp_modeTag[237] = 29;
172 Dp_modeTag[238] = 29;
173 Dp_modeTag[239] = 29;
174 Dp_modeTag[240] = 29;
175 Dp_modeTag[241] = 29;
176 Dp_modeTag[242] = 29;
177 Dp_modeTag[290] = 30;
178 Dp_modeTag[291] = 30;
179 Dp_modeTag[292] = 30;
180 Dp_modeTag[293] = 30;
181 Dp_modeTag[294] = 30;
182
183 int NumCriteria = m_criteria.size();
184 if ( NumCriteria > 27 )
185 {
186 std::cout << "the number of criterias too much !" << std::endl;
187 return StatusCode::SUCCESS;
188 }
189
190 vector<string> name_cut;
191 vector<int> CutLc, CutDs, CutD0, CutD;
192 CutLc.clear();
193 CutDs.clear();
194 CutD0.clear();
195 CutD.clear();
196 name_cut.clear();
197 bool allLc = false, allDs = false, allD0 = false, allD = false, typeLc = true, typeDs = true,
198 typeD0 = true, typeD = true;
199
200 string name;
201 int nPos_1, nPos_2, nPos_3;
202 string pat = ",";
203 map<string, int> Cut1, Cut2;
204 for ( int i = 0; i < NumCriteria; i++ )
205 {
206 std::cout << "TagFilterSvc::criteria " << i << " : " << m_criteria[i] << endl;
207 nPos_1 = m_criteria[i].find_first_of( "<" );
208 nPos_2 = m_criteria[i].find_last_of( "<" );
209 nPos_3 = m_criteria[i].find_first_of( "=" );
210 if ( nPos_3 != -1 )
211 {
212 name = m_criteria[i].substr( 0, nPos_3 );
213 name_cut.push_back( name );
214 if ( name == "tagLc" )
215 { CutLc = split( m_criteria[i].substr( nPos_3 + 1 ), pat, allLc, typeLc ); }
216 else if ( name == "tagDs" )
217 { CutDs = split( m_criteria[i].substr( nPos_3 + 1 ), pat, allDs, typeDs ); }
218 else if ( name == "tagD0" )
219 { CutD0 = split( m_criteria[i].substr( nPos_3 + 1 ), pat, allD0, typeD0 ); }
220 else if ( name == "tagD" )
221 { CutD = split( m_criteria[i].substr( nPos_3 + 1 ), pat, allD, typeD ); }
222 else
223 {
224 std::cout << "pls check your tag criterias" << std::endl;
225 return StatusCode::SUCCESS;
226 }
227 }
228 else if ( nPos_1 == -1 || nPos_2 == -1 || nPos_1 == nPos_2 )
229 {
230 std::cout << "pls check your criterias" << std::endl;
231 return StatusCode::SUCCESS;
232 }
233 else
234 {
235 name = m_criteria[i].substr( nPos_1 + 1, nPos_2 - nPos_1 - 1 );
236 name_cut.push_back( name );
237 Cut1[name] = atoi( m_criteria[i].substr( 0 ).c_str() );
238 Cut2[name] = atoi( m_criteria[i].substr( nPos_2 + 1 ).c_str() );
239 }
240 }
241
242 TFile* file = TFile::Open( m_fileName.c_str() );
243 TTree* t3 = (TTree*)file->Get( "Entries" );
244 UInt_t tagData0, tagData1, tagData2, tagData3, tagData4;
245 UInt_t tagData5, tagData6, tagData7, tagData8;
246 t3->SetBranchAddress( "tagData0", &tagData0 );
247 t3->SetBranchAddress( "tagData1", &tagData1 );
248 t3->SetBranchAddress( "tagData2", &tagData2 );
249 t3->SetBranchAddress( "tagData3", &tagData3 );
250 t3->SetBranchAddress( "tagData4", &tagData4 );
251 t3->SetBranchAddress( "tagData5", &tagData5 );
252 t3->SetBranchAddress( "tagData6", &tagData6 );
253 t3->SetBranchAddress( "tagData7", &tagData7 );
254 t3->SetBranchAddress( "tagData8", &tagData8 );
255
256 Int_t npip, npim, nkp, nkm, nlambda, nalambda;
257 Int_t npp, npm, nep, nem, nmup, nmum, neta, npi0, ngamma, nks;
258 Int_t nGoodCharged, nCharged, nGoodChargedp, nGoodChargedm, totCharged, nNeutrk, nTottrk;
259
260 for ( int i = 0; i < t3->GetEntries(); i++ )
261 {
262 t3->GetEntry( i );
263 nGoodCharged = tagData0;
264 Tag1ToInt( tagData1, nNeutrk, nTottrk, ngamma, npi0 );
265 Tag2ToInt( tagData2, npip, npim, nkp, nkm, npp, npm );
266 Tag2ToInt( tagData3, nlambda, nalambda, nep, nem, nmup, nmum );
267 Tag2ToInt( tagData4, nks, neta, nCharged, nGoodChargedp, nGoodChargedm, totCharged );
268
269 unsigned int flag = 0;
270 bool isTag = false;
271 int tagvalue = -1;
272 for ( unsigned int j = 0; j < name_cut.size(); j++ )
273 {
274 if ( name_cut[j] == "tagLc" )
275 {
276 if ( tagData5 > 0 )
277 {
278 if ( !( tagData5 & ( 1 << 31 ) ) && typeLc ) break;
279 if ( !allLc )
280 {
281 isTag = false;
282 for ( unsigned int k = 0; k < CutLc.size(); k++ )
283 {
284 if ( tagData5 & ( 1 << Lc_modeTag[CutLc[k]] ) )
285 {
286 isTag = true;
287 break;
288 }
289 }
290 if ( !isTag ) break;
291 }
292 }
293 else { break; }
294 }
295 else if ( name_cut[j] == "tagDs" )
296 {
297 if ( tagData6 > 0 )
298 {
299 if ( !( tagData6 & ( 1 << 31 ) ) && typeDs ) break;
300 if ( !allDs )
301 {
302 isTag = false;
303 for ( unsigned int k = 0; k < CutDs.size(); k++ )
304 {
305 if ( tagData6 & ( 1 << Ds_modeTag[CutDs[k]] ) )
306 {
307 isTag = true;
308 break;
309 }
310 }
311 if ( !isTag ) break;
312 }
313 }
314 else { break; }
315 }
316 else if ( name_cut[j] == "tagD0" )
317 {
318 if ( tagData7 > 0 )
319 {
320 if ( !( tagData7 & ( 1 << 31 ) ) && typeD0 ) break;
321 if ( !allD0 )
322 {
323 isTag = false;
324 for ( unsigned int k = 0; k < CutD0.size(); k++ )
325 {
326 if ( tagData7 & ( 1 << D0_modeTag[CutD0[k]] ) )
327 {
328 isTag = true;
329 break;
330 }
331 }
332 if ( !isTag ) break;
333 }
334 }
335 else { break; }
336 }
337 else if ( name_cut[j] == "tagD" )
338 {
339 if ( tagData8 > 0 )
340 {
341 if ( !( tagData8 & ( 1 << 31 ) ) && typeD ) break;
342 if ( !allD )
343 {
344 isTag = false;
345 for ( unsigned int k = 0; k < CutD.size(); k++ )
346 {
347 if ( tagData8 & ( 1 << Dp_modeTag[CutD[k]] ) )
348 {
349 isTag = true;
350 break;
351 }
352 }
353 if ( !isTag ) break;
354 }
355 }
356 else { break; }
357 }
358 else
359 {
360 if ( name_cut[j] == "NumOfGoodCh" ) { tagvalue = nGoodCharged; }
361 else if ( name_cut[j] == "NumOfNeutrk" ) { tagvalue = nNeutrk; }
362 else if ( name_cut[j] == "NumOfTottrk" ) { tagvalue = nTottrk; }
363 else if ( name_cut[j] == "NumOfGamma" ) { tagvalue = ngamma; }
364 else if ( name_cut[j] == "NumOfPion0" ) { tagvalue = npi0; }
365 else if ( name_cut[j] == "NumOfPionp" ) { tagvalue = npip; }
366 else if ( name_cut[j] == "NumOfPionm" ) { tagvalue = npim; }
367 else if ( name_cut[j] == "NumOfKaonp" ) { tagvalue = nkp; }
368 else if ( name_cut[j] == "NumOfKaonm" ) { tagvalue = nkm; }
369 else if ( name_cut[j] == "NumOfProtonp" ) { tagvalue = npp; }
370 else if ( name_cut[j] == "NumOfProtonm" ) { tagvalue = npm; }
371 else if ( name_cut[j] == "NumOfLambda" ) { tagvalue = nlambda; }
372 else if ( name_cut[j] == "NumOfALambda" ) { tagvalue = nalambda; }
373 else if ( name_cut[j] == "NumOfElectronp" ) { tagvalue = nep; }
374 else if ( name_cut[j] == "NumOfElectronm" ) { tagvalue = nem; }
375 else if ( name_cut[j] == "NumOfMuonp" ) { tagvalue = nmup; }
376 else if ( name_cut[j] == "NumOfMuonm" ) { tagvalue = nmum; }
377 else if ( name_cut[j] == "NumOfKs" ) { tagvalue = nks; }
378 else if ( name_cut[j] == "NumOfEta" ) { tagvalue = neta; }
379 else if ( name_cut[j] == "NumOfCharged" ) { tagvalue = nCharged; }
380 else if ( name_cut[j] == "NumOfGoodChp" ) { tagvalue = nGoodChargedp; }
381 else if ( name_cut[j] == "NumOfGoodChm" ) { tagvalue = nGoodChargedm; }
382 else if ( name_cut[j] == "TotCharged" ) { tagvalue = totCharged; }
383 else
384 {
385 cout << "pls check the name of your criteria !" << endl;
386 break;
387 }
388 if ( tagvalue >= Cut2[name_cut[j]] || tagvalue <= Cut1[name_cut[j]] ) break;
389 }
390 flag++;
391 }
392 if ( flag == name_cut.size() ) { ventry.push_back( i ); }
393 }
394 CutLc.clear();
395 CutDs.clear();
396 CutD0.clear();
397 CutD.clear();
398 name_cut.clear();
399 delete file;
400 return StatusCode::SUCCESS;
401}
402void TagParser4::Tag1ToInt( unsigned int res, int& val1, int& val2, int& val3, int& val4 ) {
403 val1 = ( res >> 24 ) & 0xFF;
404 val2 = ( res >> 16 ) & 0xFF;
405 val3 = ( res >> 8 ) & 0xFF;
406 val4 = res & 0xFF;
407 return;
408}
409void TagParser4::Tag2ToInt( unsigned int res, int& val1, int& val2, int& val3, int& val4,
410 int& val5, int& val6 ) {
411 val1 = ( res >> 26 ) & 0x3F;
412 val2 = ( res >> 20 ) & 0x3F;
413 val3 = ( res >> 15 ) & 0x1F;
414 val4 = ( res >> 10 ) & 0x1F;
415 val5 = ( res >> 5 ) & 0x1F;
416 val6 = res & 0x1F;
417 return;
418}
419vector<int> TagParser4::split( string str, string pattern, bool& all, bool& type ) {
420 vector<int> result;
421 unsigned int pos;
422 type = true;
423 all = false;
424 str += pattern;
425
426 for ( unsigned int i = 0; i < str.size(); i++ )
427 {
428 pos = str.find( pattern, i );
429 if ( pos < str.size() )
430 {
431 string val = str.substr( i, pos - i );
432 if ( val == "all" ) { all = true; }
433 else if ( val == "type0" ) { type = false; }
434 else { result.push_back( atoi( val.c_str() ) ); }
435 i = pos + pattern.size() - 1;
436 }
437 }
438 return result;
439}
char * file
Definition DQA_TO_DB.cxx:16
void Tag2ToInt(unsigned int res, int &val1, int &val2, int &val3, int &val4, int &val5, int &val6)
StatusCode getVEntry(vector< int > &)
vector< int > split(string str, string pattern, bool &all, bool &type)
void Tag1ToInt(unsigned int res, int &val1, int &val2, int &val3, int &val4)