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"
13#ifndef ENABLE_BACKWARDS_COMPATIBILITY
19#include "MdcRecEvent/RecMdcHit.h"
20#include "MdcRecEvent/RecMdcTrack.h"
23#include "GaudiKernel/INTupleSvc.h"
24#include "GaudiKernel/NTuple.h"
26typedef std::vector<HepLorentzVector>
Vp4;
31 : Algorithm( name, pSvcLocator ) {
32 declareProperty(
"hist", m_hist =
false );
33 declareProperty(
"debug", m_debug = 0 );
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 );
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. );
46 declareProperty(
"barrelCut", m_barrelCut = 0.8 );
47 declareProperty(
"endcapCut", m_endcapCutLow = 0.83 );
48 declareProperty(
"endcapCutHigh", m_endcapCutHigh = 0.93 );
54 MsgStream log(
msgSvc(), name() );
61 for (
int i = 0; i < 3; i++ )
69 if ( bookNTuple() < 0 ) sc = StatusCode::FAILURE;
72 return StatusCode::SUCCESS;
77 MsgStream log(
msgSvc(), name() );
78 StatusCode sc = StatusCode::SUCCESS;
80 setFilterPassed(
false );
83 if ( getEventInfo() < 0 )
return StatusCode::FAILURE;
86 if ( selectBbByEmcShower() < 0 )
return StatusCode::SUCCESS;
89 if ( bbEmcMdcTrackingEff() < 0 )
return StatusCode::SUCCESS;
91 return StatusCode::SUCCESS;
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
101 <<
") = " << ( m_effAllN2 ) / ( (
float)( m_effAllN1 + m_effAllN2 ) )
103 for (
int i = 0; i < 3; i++ )
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 )
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] ) )
117 return StatusCode::SUCCESS;
121int MdcBbEmcEff::bookNTuple() {
122 MsgStream log(
msgSvc(), name() );
124 NTuplePtr nt1(
ntupleSvc(),
"MdcBbEmcEff/evt" );
128 m_tuple1 =
ntupleSvc()->book(
"MdcBbEmcEff/evt", CLID_ColumnWiseTuple,
"event" );
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 );
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 );
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 );
157 log << MSG::ERROR <<
"Cannot book tuple MdcBbEmcEff/evt" << endmsg;
164int MdcBbEmcEff::getEventInfo() {
165 MsgStream log(
msgSvc(), name() );
168 SmartDataPtr<Event::EventHeader> evtHead( eventSvc(),
"/Event/EventHeader" );
171 t_runNo = evtHead->runNumber();
172 t_evtNo = evtHead->eventNumber();
174 else { log << MSG::WARNING <<
"Could not retreve event header" << endmsg; }
176 std::cout << m_evtIndex <<
"------------evtNo:" << t_evtNo << std::endl;
182 SmartDataPtr<RecEsTimeCol> aevtmeCol( eventSvc(),
"/Event/Recon/RecEsTimeCol" );
183 if ( ( !aevtmeCol ) || ( aevtmeCol->size() == 0 ) )
184 { log << MSG::WARNING <<
"Could not fnd RecEsTimeCol" << endmsg; }
187 RecEsTimeCol::iterator iter_evt = aevtmeCol->begin();
188 t_t0 = ( *iter_evt )->getTest();
189 t_t0Stat = ( *iter_evt )->getStat();
194int MdcBbEmcEff::selectBbByEmcShower() {
195 MsgStream log(
msgSvc(), name() );
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" );
203 HepLorentzVector m_lv_ele;
204 for (
int i = 0; i < evtRecEvent->totalTracks(); i++ )
206 if ( i >= evtRecTrkCol->size() )
return -1;
209 if ( !( *itTrk )->isEmcShowerValid() )
211 if ( m_debug > 1 ) std::cout <<
"EmcShower NOT Valid " << std::endl;
214 RecEmcShower* emcTrk = ( *itTrk )->emcShower();
215 if ( ( emcTrk->
energy() > m_emcEneCutHigh ) || ( emcTrk->
energy() < m_emcEneCutLow ) )
217 if ( m_debug > 1 ) std::cout <<
"Cut by EmcEnergy: " << emcTrk->
energy() << std::endl;
220 Hep3Vector emcpos( emcTrk->
x(), emcTrk->
y(), emcTrk->
z() );
221 m_lv_ele.setVect( emcpos );
222 m_lv_ele.setE( emcTrk->
energy() );
224 vGood.push_back( m_lv_ele );
227 if ( m_debug > 1 ) std::cout <<
"vGood.size = " << vGood.size() << std::endl;
228 if ( vGood.size() != 2 )
230 if ( m_debug > 0 ) std::cout <<
"Cut by vGood.size: " << vGood.size() << std::endl;
236 for (
int i = 0; i < 2; i++ )
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 ) )
245 else if ( ( cosEmcTheta > m_barrelCut ) && ( cosEmcTheta < m_endcapCutLow ) )
247 else { m_posFlag = OUT; }
249 std::cout <<
"Emc cos(theta)=" << cosEmcTheta <<
"Track in " << m_posFlag << std::endl;
251 if ( m_posFlag == OUT )
return -5;
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];
256 for (
int index = 0; index < 2; index++ )
258 emcTheta[index] = vGood[index].vect().theta();
259 t_emcPhi[index] = vGood[index].vect().phi();
260 emcEne[index] = vGood[index].e();
266 for (
int index = 0; index < 2; index++ )
268 m_emcTheta[index] = emcTheta[index];
269 m_emcPhi[index] = t_emcPhi[index];
270 m_emcEne[index] = emcEne[index];
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;
277 if ( dang <= m_emcDangCutLow || dang >= m_emcDangCutHigh )
279 if ( m_debug > 0 ) std::cout <<
"Cut by emcDang " << dang << std::endl;
283 if ( emcEne[0] <= m_emcEneCutLow || emcEne[1] >= m_emcEneCutHigh )
286 std::cout <<
"Cut by emc energy low or high " << emcEne[0] <<
" " << emcEne[1]
290 if ( ( emcEne[0] + emcEne[1] ) <= m_emcEneCutTot )
293 std::cout <<
"Cut by emc total energy:" << emcEne[0] <<
" " << emcEne[1]
294 <<
" tot:" << emcEne[0] + emcEne[1] << std::endl;
301int MdcBbEmcEff::bbEmcMdcTrackingEff() {
302 MsgStream log(
msgSvc(), name() );
305 SmartDataPtr<RecMdcTrackCol> recMdcTrackCol( eventSvc(),
"/Event/Recon/RecMdcTrackCol" );
306 if ( !recMdcTrackCol )
308 log << MSG::WARNING <<
" Unable to retrieve recMdcTrackCol" << endmsg;
313 t_nTk = recMdcTrackCol->size();
314 if ( ( t_nTk > 2 ) || ( 0 == t_nTk ) )
316 if ( m_debug > 1 ) std::cout << name() <<
"Cut by nTk " << t_nTk << std::endl;
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++ )
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 ) )
331 std::cout <<
"Cut by d0 " << d0[iTk] <<
" z0 " << z0[iTk] << std::endl;
335 phi[iTk] = tk->
phi();
340 double dCosTheta = cosTheta[0] + cosTheta[1];
341 double dPhi = phi[0] - phi[1] + CLHEP::pi;
342 if ( dPhi > CLHEP::pi ) dPhi -= CLHEP::twopi;
352 for (
int i = 0; i < 2; i++ )
354 m_cosTheta[i] = cosTheta[i];
362 m_dCosTheta = dCosTheta;
372 if ( ( fabs( dCosTheta ) > m_dCosThetaCut ) || ( fabs( dPhi ) > m_dPhiCut ) )
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; }
383 m_effN2[m_posFlag]++;
388 m_effN1[m_posFlag]++;
391 if ( ( 1 == t_nTk ) && ( m_posFlag == BARREL ) ) setFilterPassed(
true );
HepGeom::Point3D< double > HepPoint3D
EvtRecTrackCol::iterator EvtRecTrackIterator
void swap(DataList< T > lhs, DataList< T > rhs)
std::vector< HepLorentzVector > Vp4
double cos(const BesAngle a)
const double theta() const
const HepVector helix() const
......
MdcBbEmcEff(const std::string &name, ISvcLocator *pSvcLocator)