00001 #include "GaudiKernel/Bootstrap.h"
00002 #include "GaudiKernel/IJobOptionsSvc.h"
00003 #include "GaudiKernel/ISvcLocator.h"
00004 #include "GaudiKernel/PropertyMgr.h"
00005 #include "GaudiKernel/SmartDataPtr.h"
00006
00007 #include "EventModel/EventModel.h"
00008 #include "EvtRecEvent/EvtRecEvent.h"
00009 #include "EvtRecEvent/EvtRecTrack.h"
00010 #include "DTagAlg/LocalPhotonSelector.h"
00011
00012 LocalPhotonSelector::LocalPhotonSelector()
00013 {
00014 IJobOptionsSvc* jobSvc;
00015 Gaudi::svcLocator()->service("JobOptionsSvc", jobSvc);
00016
00017 PropertyMgr m_propMgr;
00018
00019
00020 m_propMgr.declareProperty("MinEnergy", m_minEnergy = 0.025);
00021
00022 m_propMgr.declareProperty("InBarrelOrEndcap", m_useBarrelEndcap = true);
00023 m_propMgr.declareProperty("MaxCosThetaBarrel", m_maxCosThetaBarrel = 0.8);
00024 m_propMgr.declareProperty("MinCosThetaEndcap", m_minCosThetaEndcap = 0.84);
00025 m_propMgr.declareProperty("MaxCosThetaEndcap", m_maxCosThetaEndcap = 0.92);
00026 m_propMgr.declareProperty("MinEndcapEnergy", m_minEndcapEnergy = 0.050);
00027
00028 m_propMgr.declareProperty("ApplyTimeCut", m_applyTimeCut = true);
00029 m_propMgr.declareProperty("MinTime", m_minTime = 0.);
00030 m_propMgr.declareProperty("MaxTime", m_maxTime = 14.);
00031 m_propMgr.declareProperty("PhotonDeltaTime", m_deltaTime = 10.);
00032
00033 m_propMgr.declareProperty("ApplyDangCut", m_applyDangCut = true);
00034 m_propMgr.declareProperty("MinDang", m_minDang = 20.0);
00035
00036 jobSvc->setMyProperties("LocalPhotonSelector", &m_propMgr);
00037 }
00038
00039 bool LocalPhotonSelector::operator() (CDPhoton& aPhoton) {
00040
00041 aPhoton.setUserTag(1);
00042 SmartDataPtr<EvtRecEvent> recEvt(eventSvc(), EventModel::EvtRec::EvtRecEvent);
00043 SmartDataPtr<EvtRecTrackCol> recTrkCol(eventSvc(), EventModel::EvtRec::EvtRecTrackCol);
00044
00045 EvtRecTrack* recTrk = const_cast<EvtRecTrack*>( aPhoton.photon() );
00046
00047 if ( !recTrk->isEmcShowerValid() ) return false;
00048
00049 RecEmcShower *emcTrk = recTrk->emcShower();
00050 double eraw = emcTrk->energy();
00051 double phi = emcTrk->phi();
00052 double the = emcTrk->theta();
00053 HepLorentzVector shP4( eraw * sin(the) * cos(phi),
00054 eraw * sin(the) * sin(phi),
00055 eraw * cos(the),
00056 eraw );
00057
00058 double cosThetaSh = shP4.vect().cosTheta();
00059
00060
00062 if (shP4.e() <= m_minEnergy) return false;
00063
00064
00066 if ( m_useBarrelEndcap ) {
00067 bool inBarrelEndcap = false;
00068
00069 if(fabs(cosThetaSh) < m_maxCosThetaBarrel) inBarrelEndcap = true;
00070
00071 if((fabs(cosThetaSh) > m_minCosThetaEndcap)
00072 &&(fabs(cosThetaSh) < m_maxCosThetaEndcap)
00073 &&(shP4.e() > m_minEndcapEnergy)) inBarrelEndcap = true;
00074
00075 if ( !inBarrelEndcap ) return false;
00076 }
00077
00079 if ( m_applyTimeCut ) {
00080 double time = emcTrk->time();
00081 if ( recEvt->totalCharged() > 0 ) {
00082 if ( time < m_minTime || time > m_maxTime ) return false;
00083 }
00084 else {
00085 RecEmcShower* firstG = (*(recTrkCol->begin()))->emcShower();
00086 double deltaTime = fabs(time - firstG->time());
00087 if ( deltaTime > 10 ) return false;
00088 }
00089 }
00090
00092 if (m_applyDangCut && recEvt->totalCharged() > 0) {
00093 Hep3Vector emcpos(emcTrk->x(), emcTrk->y(), emcTrk->z());
00094 double dang = 200.;
00095
00096 for (int j = 0; j < recEvt->totalCharged(); j++) {
00097 EvtRecTrackIterator jtTrk = recTrkCol->begin() + j;
00098 if ( !(*jtTrk)->isExtTrackValid() ) continue;
00099 RecExtTrack* extTrk = (*jtTrk)->extTrack();
00100 if ( extTrk->emcVolumeNumber() == -1 ) continue;
00101 Hep3Vector extpos = extTrk->emcPosition();
00102 double angd1 = extpos.angle(emcpos);
00103 if ( angd1 < dang ) dang = angd1;
00104 }
00105
00106 if ( dang < 200 ) {
00107 dang = dang * 180 / (CLHEP::pi);
00108 if (dang <= m_minDang) return( false );
00109 }
00110 }
00111
00112 return true;
00113 }
00114
00115 LocalPhotonSelector photonSelector;