1#include "GaudiKernel/MsgStream.h"
2#include "GaudiKernel/SmartDataPtr.h"
4#include "EventModel/EventHeader.h"
5#include "EvtRecEvent/EvtRecEvent.h"
6#include "EvtRecEvent/EvtRecPi0.h"
7#include "EvtRecEvent/EvtRecTrack.h"
8#include "VertexFit/KinematicFit.h"
10#include "Pi0EtaToGGRecAlg/Pi0EtaToGGRecAlg.h"
16 : Algorithm( name, pSvcLocator ) {
18 declareProperty(
"Pi0MinMass", m_minmass_cut = 0.07 );
19 declareProperty(
"Pi0MaxMass", m_maxmass_cut = 0.18 );
20 declareProperty(
"Pi0ChisqCut", m_chisq_cut = 20.0 );
23 declareProperty(
"PhotonUseBarrelEmc", m_useBarrel =
true );
24 declareProperty(
"PhotonUseEndcapEmc", m_useEndcap =
true );
25 declareProperty(
"PhotonMinEnergy", m_minEnergy = 0.02 );
26 declareProperty(
"PhotonDeltaAngleCut", m_angled_cut = 20.0 );
27 declareProperty(
"PhotonDeltaThetaCut", m_thed_cut = 20.0 );
28 declareProperty(
"PhotonDeltaPhiCut", m_phid_cut = 20.0 );
34 MsgStream log(
msgSvc(), name() );
35 log << MSG::INFO <<
"in initialize()" << endmsg;
37 return StatusCode::SUCCESS;
43 MsgStream log(
msgSvc(), name() );
44 log << MSG::INFO <<
"in execute()" << endmsg;
47 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(),
"/Event/EventHeader" );
51 bool save2TDS =
false;
64 for (
int i1 = recEvt->totalCharged(); i1 < ( recEvt->totalTracks() - 1 ); i1++ )
67 if ( !validPhoton( g1Trk, recEvt, recTrkCol ) )
continue;
69 HepLorentzVector g1P4 = getP4( g1Shower );
71 for (
int i2 = i1 + 1; i2 < recEvt->totalTracks(); i2++ )
74 if ( !validPhoton( g2Trk, recEvt, recTrkCol ) )
continue;
76 HepLorentzVector g2P4 = getP4( g2Shower );
78 HepLorentzVector p2g = g1P4 + g2P4;
79 if ( p2g.m() < m_minmass_cut )
continue;
80 if ( p2g.m() > m_maxmass_cut )
continue;
88 if ( !kmfit->
Fit( 0 ) )
continue;
91 double pi0_chisq = kmfit->
chisq( 0 );
92 if ( pi0_chisq > m_chisq_cut )
continue;
94 double e1 = ( kmfit->
pfit( 0 ) ).e();
95 double e2 = ( kmfit->
pfit( 1 ) ).e();
96 HepLorentzVector ppi0 = kmfit->
pfit( 0 ) + kmfit->
pfit( 1 );
99 recPi0->setRawMass( p2g.restMass() );
101 recPi0->setFcos( (
e1 -
e2 ) / ppi0.rho() );
103 if ( g1P4.e() >= g2P4.e() )
118 std::cout <<
"p(g1) = " << g1P4 << std::endl;
119 std::cout <<
"p(g2) = " << g2P4 << std::endl;
120 std::cout <<
"chi2(pi0) = " << pi0_chisq << std::endl;
121 std::cout <<
"m(gg) before fill = " << p2g.restMass() << std::endl << std::endl;
123 recPi0Col->push_back( recPi0 );
128 recEvt->setNumberOfPi0( recPi0Col->size() );
133 if ( sc.isFailure() )
135 log << MSG::ERROR <<
"could not register EvtRecPi0Col in TDS" << endmsg;
136 return StatusCode::FAILURE;
140 return StatusCode::SUCCESS;
146 MsgStream log(
msgSvc(), name() );
147 log << MSG::INFO <<
"in finalize()" << endmsg;
149 return StatusCode::SUCCESS;
152HepLorentzVector Pi0EtaToGGRecAlg::getP4(
RecEmcShower* gTrk ) {
154 double eraw = gTrk->
energy();
155 double phi = gTrk->
phi();
156 double the = gTrk->
theta();
158 return HepLorentzVector( eraw *
sin( the ) *
cos( phi ), eraw *
sin( the ) *
sin( phi ),
159 eraw *
cos( the ), eraw );
162bool Pi0EtaToGGRecAlg::validPhoton(
EvtRecTrack* recTrk, SmartDataPtr<EvtRecEvent> recEvt,
163 SmartDataPtr<EvtRecTrackCol> recTrkCol ) {
167 RecEmcShower* emcTrk = recTrk->
emcShower();
170 int flag = ( emcTrk->
cellId() & 0x000F0000 ) >> 16;
171 if ( (
flag == 1 ) && !m_useBarrel )
return (
false );
172 if ( (
flag == 0 ||
flag == 2 ) && !m_useEndcap )
return (
false );
174 if ( emcTrk->
energy() < m_minEnergy )
return (
false );
177 Hep3Vector emcpos( emcTrk->
x(), emcTrk->
y(), emcTrk->
z() );
178 if ( recEvt->totalCharged() > 0 )
183 for (
int j = 0; j < recEvt->totalCharged(); j++ )
186 if ( !( *jtTrk )->isExtTrackValid() )
continue;
187 RecExtTrack* extTrk = ( *jtTrk )->extTrack();
190 double angd1 = extpos.angle( emcpos );
191 double thed = extpos.theta() - emcpos.theta();
192 double phid = extpos.deltaPhi( emcpos );
193 thed = fmod( thed + CLHEP::twopi + CLHEP::twopi + CLHEP::pi, CLHEP::twopi ) - CLHEP::pi;
194 phid = fmod( phid + CLHEP::twopi + CLHEP::twopi + CLHEP::pi, CLHEP::twopi ) - CLHEP::pi;
196 if ( fabs( thed ) < fabs( dthe ) ) dthe = thed;
197 if ( fabs( phid ) < fabs( dphi ) ) dphi = phid;
198 if ( angd1 < dang1 ) dang1 = angd1;
202 dthe = dthe * 180 / ( CLHEP::pi );
203 dphi = dphi * 180 / ( CLHEP::pi );
204 dang1 = dang1 * 180 / ( CLHEP::pi );
205 if ( m_angled_cut > 0 )
207 if ( dang1 < m_angled_cut )
return (
false );
211 if ( ( fabs( dthe ) < m_thed_cut ) && ( fabs( dphi ) < m_phid_cut ) )
return (
false );
ObjectVector< EvtRecPi0 > EvtRecPi0Col
EvtRecTrackCol::iterator EvtRecTrackIterator
double sin(const BesAngle a)
double cos(const BesAngle a)
***************************************************************************************Pseudo Class RRes *****************************************************************************************Parameters and physical constants **Maarten sept ************************************************************************DOUBLE PRECISION xsmu **************************************************************************PARTICLE DATA all others are from PDG *Only resonances with known widths into electron pairs are sept ************************************************************************C Declarations xmb DOUBLE PRECISION xcb DOUBLE PRECISION xmpi0
const Hep3Vector emcPosition() const
const int emcVolumeNumber() const
void setChisq(const double chisq)
void setLoPfit(const HepLorentzVector &loPfit)
void setLoEnGamma(const EvtRecTrack *trk)
void setHiPfit(const HepLorentzVector &hiPfit)
void setHiEnGamma(const EvtRecTrack *trk)
RecEmcShower * emcShower()
static KinematicFit * instance()
void BuildVirtualParticle(int number)
void AddResonance(int number, double mres, std::vector< int > tlis)
void setIterNumber(const int niter=5)
HepLorentzVector pfit(int n) const
Pi0EtaToGGRecAlg(const std::string &name, ISvcLocator *pSvcLocator)
void AddTrack(const int number, const double mass, const RecMdcTrack *trk)
_EXTERN_ std::string EvtRecPi0Col
_EXTERN_ std::string EvtRecEvent
_EXTERN_ std::string EvtRecTrackCol