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