BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
MdcBbEmcEff.cxx
Go to the documentation of this file.
1#include "MdcBbEmcEff.h"
2#include "CLHEP/Units/PhysicalConstants.h"
3#include "EvTimeEvent/RecEsTime.h"
4#include "EventModel/EventHeader.h"
5#include "EvtRecEvent/EvtRecEvent.h"
6#include "EvtRecEvent/EvtRecTrack.h"
7#include "GaudiKernel/MsgStream.h"
8#include "GaudiKernel/SmartDataPtr.h"
9#include "Identifier/MdcID.h"
10#include "MdcRawEvent/MdcDigi.h"
11#include "RawEvent/RawDataUtil.h"
12
13#ifndef ENABLE_BACKWARDS_COMPATIBILITY
14// backwards compatblty wll be enabled ONLY n CLHEP 1.9
15typedef HepGeom::Point3D<double> HepPoint3D;
16#endif
17
18// MDC reconstructed data
19#include "MdcRecEvent/RecMdcHit.h"
20#include "MdcRecEvent/RecMdcTrack.h"
21
22// Ntuple
23#include "GaudiKernel/INTupleSvc.h"
24#include "GaudiKernel/NTuple.h"
25
26typedef std::vector<HepLorentzVector> Vp4;
27using namespace std;
28using namespace Event;
29
30MdcBbEmcEff::MdcBbEmcEff( const std::string& name, ISvcLocator* pSvcLocator )
31 : Algorithm( name, pSvcLocator ) {
32 declareProperty( "hist", m_hist = false );
33 declareProperty( "debug", m_debug = 0 );
34 // Good Emc shower selection cut
35 declareProperty( "emcEneCutLow", m_emcEneCutLow = 1.44 );
36 declareProperty( "emcEneCutHigh", m_emcEneCutHigh = 1.88 );
37 declareProperty( "emcEneCutTot", m_emcEneCutTot = 3.16 );
38 declareProperty( "emcDangCutLow", m_emcDangCutLow = 2.94 );
39 declareProperty( "emcDangCutHigh", m_emcDangCutHigh = 3.08 );
40 // Mdc track cut
41 declareProperty( "dPhi", m_dPhiCut = 0.2 );
42 declareProperty( "dCosTheta", m_dCosThetaCut = 0.2 );
43 declareProperty( "d0", m_d0Cut = 1. );
44 declareProperty( "z0", m_z0Cut = 5. );
45 // Barrel and Endcap cut
46 declareProperty( "barrelCut", m_barrelCut = 0.8 );
47 declareProperty( "endcapCut", m_endcapCutLow = 0.83 );
48 declareProperty( "endcapCutHigh", m_endcapCutHigh = 0.93 );
49}
50
51// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
52
54 MsgStream log( msgSvc(), name() );
55 StatusCode sc;
56 m_evtIndex = 0;
57
58 m_effAllN1 = 0;
59 m_effAllN2 = 0;
60
61 for ( int i = 0; i < 3; i++ )
62 {
63 m_effN1[i] = 0;
64 m_effN2[i] = 0;
65 }
66
67 if ( m_hist )
68 {
69 if ( bookNTuple() < 0 ) sc = StatusCode::FAILURE;
70 }
71
72 return StatusCode::SUCCESS;
73}
74
75// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
77 MsgStream log( msgSvc(), name() );
78 StatusCode sc = StatusCode::SUCCESS;
79
80 setFilterPassed( false );
81
82 // Get eventNo, t0
83 if ( getEventInfo() < 0 ) return StatusCode::FAILURE;
84
85 // Select Bhabha by Emc shower
86 if ( selectBbByEmcShower() < 0 ) return StatusCode::SUCCESS;
87
88 // Select Good track
89 if ( bbEmcMdcTrackingEff() < 0 ) return StatusCode::SUCCESS;
90
91 return StatusCode::SUCCESS;
92}
93
94// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
96 MsgStream log( msgSvc(), name() );
97 log << MSG::INFO << "in finalize()" << endmsg;
98 if ( ( m_effAllN1 + m_effAllN2 ) > 0 )
99 std::cout << " MdcBbEmcEff efficiency = N2/(N1+N2) = " << m_effAllN2 << "/(" << m_effAllN1
100 << "+" << m_effAllN2
101 << ") = " << ( m_effAllN2 ) / ( (float)( m_effAllN1 + m_effAllN2 ) )
102 << std::endl;
103 for ( int i = 0; i < 3; i++ )
104 {
105 string pos;
106 if ( 0 == i ) pos = "barrel";
107 if ( 1 == i ) pos = "gap";
108 if ( 2 == i ) pos = "endcap";
109 if ( ( m_effN1[i] + m_effN2[i] ) > 0 )
110 {
111 std::cout << " MdcBbEmcEff of " << pos << " N2/(N1+N2) = " << m_effN2[i] << "/("
112 << m_effN1[i] << "+" << m_effN2[i]
113 << ") = " << ( m_effN2[i] ) / ( (float)( m_effN1[i] + m_effN2[i] ) )
114 << std::endl;
115 }
116 }
117 return StatusCode::SUCCESS;
118}
119
120// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
121int MdcBbEmcEff::bookNTuple() {
122 MsgStream log( msgSvc(), name() );
123 StatusCode sc;
124 NTuplePtr nt1( ntupleSvc(), "MdcBbEmcEff/evt" );
125 if ( nt1 ) { m_tuple1 = nt1; }
126 else
127 {
128 m_tuple1 = ntupleSvc()->book( "MdcBbEmcEff/evt", CLID_ColumnWiseTuple, "event" );
129 if ( m_tuple1 )
130 {
131 // event info
132 sc = m_tuple1->addItem( "runNo", m_runNo );
133 sc = m_tuple1->addItem( "evtNo", m_evtNo );
134 sc = m_tuple1->addItem( "t0", m_t0 );
135 sc = m_tuple1->addItem( "t0Stat", m_t0Stat );
136
137 // Emc shower
138 sc = m_tuple1->addItem( "index", m_index, 0, 2 );
139 sc = m_tuple1->addIndexedItem( "emcTheta", m_index, m_emcTheta );
140 sc = m_tuple1->addIndexedItem( "emcPhi", m_index, m_emcPhi );
141 sc = m_tuple1->addIndexedItem( "emcEne", m_index, m_emcEne );
142 sc = m_tuple1->addItem( "emcDang", m_emcDang );
143
144 // Mdc track
145 sc = m_tuple1->addItem( "dCosTheta", m_dCosTheta );
146 sc = m_tuple1->addItem( "dPhi", m_dPhi );
147 sc = m_tuple1->addItem( "nTk", m_nTk, 0, 2 );
148 sc = m_tuple1->addIndexedItem( "phi", m_nTk, m_phi );
149 sc = m_tuple1->addIndexedItem( "cosTheta", m_nTk, m_cosTheta );
150 sc = m_tuple1->addIndexedItem( "d0", m_nTk, m_d0 );
151 sc = m_tuple1->addIndexedItem( "z0", m_nTk, m_z0 );
152 sc = m_tuple1->addIndexedItem( "p", m_nTk, m_p );
153 sc = m_tuple1->addIndexedItem( "pt", m_nTk, m_pt );
154 }
155 else
156 {
157 log << MSG::ERROR << "Cannot book tuple MdcBbEmcEff/evt" << endmsg;
158 return -1;
159 }
160 }
161 return 1;
162}
163
164int MdcBbEmcEff::getEventInfo() {
165 MsgStream log( msgSvc(), name() );
166
167 // Get event header
168 SmartDataPtr<Event::EventHeader> evtHead( eventSvc(), "/Event/EventHeader" );
169 if ( evtHead )
170 {
171 t_runNo = evtHead->runNumber();
172 t_evtNo = evtHead->eventNumber();
173 }
174 else { log << MSG::WARNING << "Could not retreve event header" << endmsg; }
175
176 std::cout << m_evtIndex << "------------evtNo:" << t_evtNo << std::endl; // yzhang debug
177 m_evtIndex++;
178
179 // Get event start tme
180 t_t0 = -1;
181 t_t0Stat = -1;
182 SmartDataPtr<RecEsTimeCol> aevtmeCol( eventSvc(), "/Event/Recon/RecEsTimeCol" );
183 if ( ( !aevtmeCol ) || ( aevtmeCol->size() == 0 ) )
184 { log << MSG::WARNING << "Could not fnd RecEsTimeCol" << endmsg; }
185 else
186 {
187 RecEsTimeCol::iterator iter_evt = aevtmeCol->begin();
188 t_t0 = ( *iter_evt )->getTest();
189 t_t0Stat = ( *iter_evt )->getStat();
190 }
191 return 1;
192}
193
194int MdcBbEmcEff::selectBbByEmcShower() {
195 MsgStream log( msgSvc(), name() );
196
197 SmartDataPtr<EvtRecEvent> evtRecEvent( eventSvc(), "/Event/EvtRec/EvtRecEvent" );
198 log << MSG::DEBUG << "ncharg, nneu, tottks = " << evtRecEvent->totalCharged() << " , "
199 << evtRecEvent->totalNeutral() << " , " << evtRecEvent->totalTracks() << endmsg;
200 SmartDataPtr<EvtRecTrackCol> evtRecTrkCol( eventSvc(), "/Event/EvtRec/EvtRecTrackCol" );
201
202 Vp4 vGood;
203 HepLorentzVector m_lv_ele;
204 for ( int i = 0; i < evtRecEvent->totalTracks(); i++ )
205 {
206 if ( i >= evtRecTrkCol->size() ) return -1;
207
208 EvtRecTrackIterator itTrk = evtRecTrkCol->begin() + i;
209 if ( !( *itTrk )->isEmcShowerValid() )
210 {
211 if ( m_debug > 1 ) std::cout << "EmcShower NOT Valid " << std::endl;
212 continue;
213 }
214 RecEmcShower* emcTrk = ( *itTrk )->emcShower();
215 if ( ( emcTrk->energy() > m_emcEneCutHigh ) || ( emcTrk->energy() < m_emcEneCutLow ) )
216 {
217 if ( m_debug > 1 ) std::cout << "Cut by EmcEnergy: " << emcTrk->energy() << std::endl;
218 continue;
219 }
220 Hep3Vector emcpos( emcTrk->x(), emcTrk->y(), emcTrk->z() );
221 m_lv_ele.setVect( emcpos );
222 m_lv_ele.setE( emcTrk->energy() );
223
224 vGood.push_back( m_lv_ele );
225 }
226
227 if ( m_debug > 1 ) std::cout << "vGood.size = " << vGood.size() << std::endl;
228 if ( vGood.size() != 2 )
229 {
230 if ( m_debug > 0 ) std::cout << "Cut by vGood.size: " << vGood.size() << std::endl;
231 return -2; // num of good showers==2
232 }
233
234 // Barrel or endcap
235 // if one shower in endcap , then this event in endcap
236 for ( int i = 0; i < 2; i++ )
237 {
238 double cosEmcTheta = cos( vGood[i].vect().theta() );
239 if ( fabs( cosEmcTheta ) <= m_barrelCut ) { m_posFlag = BARREL; }
240 else if ( ( cosEmcTheta >= m_endcapCutLow ) && ( cosEmcTheta <= m_endcapCutHigh ) )
241 {
242 m_posFlag = ENDCAP;
243 break;
244 }
245 else if ( ( cosEmcTheta > m_barrelCut ) && ( cosEmcTheta < m_endcapCutLow ) )
246 { m_posFlag = GAP; }
247 else { m_posFlag = OUT; }
248 if ( m_debug > 1 )
249 std::cout << "Emc cos(theta)=" << cosEmcTheta << "Track in " << m_posFlag << std::endl;
250 }
251 if ( m_posFlag == OUT ) return -5;
252
253 double dang = vGood[0].vect().angle( vGood[1].vect() );
254 if ( vGood[0].e() > vGood[1].e() ) swap( vGood[0], vGood[1] );
255 double emcTheta[2], emcEne[2]; // emcPhi[2]
256 for ( int index = 0; index < 2; index++ )
257 {
258 emcTheta[index] = vGood[index].vect().theta();
259 t_emcPhi[index] = vGood[index].vect().phi();
260 emcEne[index] = vGood[index].e();
261 }
262
263 if ( m_hist )
264 {
265 m_index = 2;
266 for ( int index = 0; index < 2; index++ )
267 {
268 m_emcTheta[index] = emcTheta[index];
269 m_emcPhi[index] = t_emcPhi[index];
270 m_emcEne[index] = emcEne[index];
271 }
272 m_emcDang = dang;
273 }
274 if ( m_debug > 1 ) std::cout << " dang " << dang << std::endl;
275 if ( m_debug > 1 ) std::cout << " energy " << emcEne[0] << " " << emcEne[1] << std::endl;
276 // delta(angle) cut
277 if ( dang <= m_emcDangCutLow || dang >= m_emcDangCutHigh )
278 {
279 if ( m_debug > 0 ) std::cout << "Cut by emcDang " << dang << std::endl;
280 return -3;
281 }
282 // cut by shower energy
283 if ( emcEne[0] <= m_emcEneCutLow || emcEne[1] >= m_emcEneCutHigh )
284 {
285 if ( m_debug > 0 )
286 std::cout << "Cut by emc energy low or high " << emcEne[0] << " " << emcEne[1]
287 << std::endl;
288 return -4;
289 }
290 if ( ( emcEne[0] + emcEne[1] ) <= m_emcEneCutTot )
291 {
292 if ( m_debug > 0 )
293 std::cout << "Cut by emc total energy:" << emcEne[0] << " " << emcEne[1]
294 << " tot:" << emcEne[0] + emcEne[1] << std::endl;
295 return 0;
296 }
297
298 return 1;
299}
300
301int MdcBbEmcEff::bbEmcMdcTrackingEff() {
302 MsgStream log( msgSvc(), name() );
303
304 // Get RecMdcTrackCol and RecMdcHitCol
305 SmartDataPtr<RecMdcTrackCol> recMdcTrackCol( eventSvc(), "/Event/Recon/RecMdcTrackCol" );
306 if ( !recMdcTrackCol )
307 {
308 log << MSG::WARNING << " Unable to retrieve recMdcTrackCol" << endmsg;
309 return -1;
310 }
311
312 // 1.Take track number ==1 or ==2
313 t_nTk = recMdcTrackCol->size();
314 if ( ( t_nTk > 2 ) || ( 0 == t_nTk ) )
315 {
316 if ( m_debug > 1 ) std::cout << name() << "Cut by nTk " << t_nTk << std::endl;
317 return -2;
318 }
319
320 // Get RecMdcTrack info
321 double d0[2], z0[2], cosTheta[2], phi[2], p[2], pt[2];
322 RecMdcTrackCol::iterator it = recMdcTrackCol->begin();
323 for ( int iTk = 0; it != recMdcTrackCol->end(); it++, iTk++ )
324 {
325 RecMdcTrack* tk = ( *it );
326 d0[iTk] = tk->helix( 0 );
327 z0[iTk] = tk->helix( 3 );
328 if ( ( fabs( d0[iTk] ) > m_d0Cut ) || ( fabs( z0[iTk] ) > m_z0Cut ) )
329 {
330 if ( m_debug > 0 )
331 std::cout << "Cut by d0 " << d0[iTk] << " z0 " << z0[iTk] << std::endl;
332 return -3;
333 }
334 cosTheta[iTk] = cos( tk->theta() );
335 phi[iTk] = tk->phi();
336 p[iTk] = tk->p();
337 pt[iTk] = tk->pxy();
338 }
339
340 double dCosTheta = cosTheta[0] + cosTheta[1];
341 double dPhi = phi[0] - phi[1] + CLHEP::pi;
342 if ( dPhi > CLHEP::pi ) dPhi -= CLHEP::twopi;
343
344 // hist Mdc track info
345 if ( m_hist )
346 {
347 m_runNo = t_runNo;
348 m_evtNo = t_evtNo;
349 m_t0 = t_t0;
350 m_t0Stat = t_t0Stat;
351
352 for ( int i = 0; i < 2; i++ )
353 {
354 m_cosTheta[i] = cosTheta[i];
355 m_phi[i] = phi[i];
356 m_d0[i] = d0[i];
357 m_z0[i] = z0[i];
358 m_p[i] = p[i];
359 m_pt[i] = pt[i];
360 }
361 m_nTk = t_nTk;
362 m_dCosTheta = dCosTheta;
363 m_dPhi = dPhi;
364
365 m_nTk = t_nTk;
366 m_tuple1->write();
367 }
368
369 // 4.Angle cut of 2 track event: delta(theta)<0.1 and delta(phi)<0.1
370 if ( 2 == t_nTk )
371 {
372 if ( ( fabs( dCosTheta ) > m_dCosThetaCut ) || ( fabs( dPhi ) > m_dPhiCut ) )
373 {
374 if ( m_debug > 0 )
375 {
376 if ( fabs( dCosTheta ) > m_dCosThetaCut )
377 { std::cout << "Cut by dCosTheta " << dCosTheta << std::endl; }
378 else { std::cout << "Cut by dPhi " << dPhi << std::endl; }
379 }
380 return -4;
381 }
382 m_effAllN2++;
383 m_effN2[m_posFlag]++;
384 }
385 else
386 {
387 m_effAllN1++;
388 m_effN1[m_posFlag]++;
389 }
390
391 if ( ( 1 == t_nTk ) && ( m_posFlag == BARREL ) ) setFilterPassed( true );
392 return 1;
393}
HepGeom::Point3D< double > HepPoint3D
EvtRecTrackCol::iterator EvtRecTrackIterator
void swap(DataList< T > lhs, DataList< T > rhs)
std::vector< HepLorentzVector > Vp4
Definition Gam4pikp.cxx:38
NTuple::Tuple * m_tuple1
INTupleSvc * ntupleSvc()
IMessageSvc * msgSvc()
const HepVector helix() const
......
StatusCode finalize()
StatusCode initialize()
StatusCode execute()
MdcBbEmcEff(const std::string &name, ISvcLocator *pSvcLocator)