00001 #include "GaudiKernel/MsgStream.h"
00002 #include "GaudiKernel/SmartDataPtr.h"
00003
00004 #include "EventModel/EventHeader.h"
00005 #include "EvtRecEvent/EvtRecEvent.h"
00006 #include "EvtRecEvent/EvtRecTrack.h"
00007 #include "EvtRecEvent/EvtRecPi0.h"
00008 #include "VertexFit/KinematicFit.h"
00009
00010 #include "Pi0EtaToGGRecAlg/Pi0EtaToGGRecAlg.h"
00011
00012 const double xmpi0 = 0.13497;
00013
00014
00015 Pi0EtaToGGRecAlg::Pi0EtaToGGRecAlg(const std::string& name, ISvcLocator* pSvcLocator) :
00016 Algorithm(name, pSvcLocator)
00017 {
00018
00019 declareProperty("Pi0MinMass", m_minmass_cut = 0.07);
00020 declareProperty("Pi0MaxMass", m_maxmass_cut = 0.18);
00021 declareProperty("Pi0ChisqCut", m_chisq_cut = 20.0);
00022
00024 declareProperty("PhotonUseBarrelEmc", m_useBarrel = true);
00025 declareProperty("PhotonUseEndcapEmc", m_useEndcap = true);
00026 declareProperty("PhotonMinEnergy", m_minEnergy = 0.02);
00027 declareProperty("PhotonDeltaAngleCut", m_angled_cut = 20.0);
00028 declareProperty("PhotonDeltaThetaCut", m_thed_cut = 20.0);
00029 declareProperty("PhotonDeltaPhiCut", m_phid_cut = 20.0);
00030
00031 }
00032
00033
00034 StatusCode Pi0EtaToGGRecAlg::initialize() {
00035
00036 MsgStream log(msgSvc(), name());
00037 log << MSG::INFO << "in initialize()" <<endreq;
00038
00039 return StatusCode::SUCCESS;
00040 }
00041
00042
00043
00044 StatusCode Pi0EtaToGGRecAlg::execute() {
00045
00046 MsgStream log(msgSvc(), name());
00047 log << MSG::INFO << "in execute()" <<endreq;
00048
00049
00050 SmartDataPtr<Event::EventHeader> eventHeader(eventSvc(),"/Event/EventHeader");
00051 SmartDataPtr<EvtRecEvent> recEvt(eventSvc(), EventModel::EvtRec::EvtRecEvent);
00052 SmartDataPtr<EvtRecTrackCol> recTrkCol(eventSvc(), EventModel::EvtRec::EvtRecTrackCol);
00053
00054 bool save2TDS = false;
00055 SmartDataPtr<EvtRecPi0Col> recPi0Col(eventSvc(), EventModel::EvtRec::EvtRecPi0Col);
00056 if ( !recPi0Col ) {
00057 recPi0Col = new EvtRecPi0Col;
00058 save2TDS = true;
00059 }
00060
00061 KinematicFit * kmfit = KinematicFit::instance();
00062
00063
00064
00065
00066 for(int i1 = recEvt->totalCharged(); i1 < (recEvt->totalTracks()-1); i1++) {
00067 EvtRecTrack* g1Trk = *(recTrkCol->begin() + i1);
00068 if ( !validPhoton(g1Trk,recEvt,recTrkCol) ) continue;
00069 RecEmcShower* g1Shower = g1Trk->emcShower();
00070 HepLorentzVector g1P4 = getP4(g1Shower);
00071
00072 for(int i2 = i1+1; i2 < recEvt->totalTracks(); i2++) {
00073 EvtRecTrack* g2Trk = *(recTrkCol->begin() + i2);
00074 if ( !validPhoton(g2Trk,recEvt,recTrkCol) ) continue;
00075 RecEmcShower* g2Shower = g2Trk->emcShower();
00076 HepLorentzVector g2P4 = getP4(g2Shower);
00077
00078 HepLorentzVector p2g = g1P4 + g2P4;
00079 if ( p2g.m() < m_minmass_cut ) continue;
00080 if ( p2g.m() > m_maxmass_cut ) continue;
00081
00083 kmfit->init();
00084 kmfit->setIterNumber(1);
00085 kmfit->AddTrack(0, 0.0, g1Shower);
00086 kmfit->AddTrack(1, 0.0, g2Shower);
00087 kmfit->AddResonance(0, xmpi0, 0, 1);
00088 if ( !kmfit->Fit(0) ) continue;
00089 kmfit->BuildVirtualParticle(0);
00090
00091 double pi0_chisq = kmfit->chisq(0);
00092 if ( pi0_chisq > m_chisq_cut ) continue;
00093
00094 double e1 = (kmfit->pfit(0)).e();
00095 double e2 = (kmfit->pfit(1)).e();
00096 HepLorentzVector ppi0 = kmfit->pfit(0) + kmfit->pfit(1);
00097
00098 EvtRecPi0* recPi0 = new EvtRecPi0();
00099 recPi0->setRawMass(p2g.restMass());
00100 recPi0->setChisq(pi0_chisq);
00101 recPi0->setFcos((e1-e2)/ppi0.rho());
00102
00103 if ( g1P4.e() >= g2P4.e() ) {
00104 recPi0->setHiPfit(kmfit->pfit(0));
00105 recPi0->setLoPfit(kmfit->pfit(1));
00106 recPi0->setHiEnGamma(g1Trk);
00107 recPi0->setLoEnGamma(g2Trk);
00108 }
00109 else {
00110 recPi0->setHiPfit(kmfit->pfit(1));
00111 recPi0->setLoPfit(kmfit->pfit(0));
00112 recPi0->setHiEnGamma(g2Trk);
00113 recPi0->setLoEnGamma(g1Trk);
00114 }
00115
00116 std::cout << "p(g1) = " << g1P4 << std::endl;
00117 std::cout << "p(g2) = " << g2P4 << std::endl;
00118 std::cout << "chi2(pi0) = " << pi0_chisq << std::endl;
00119 std::cout << "m(gg) before fill = " << p2g.restMass() << std::endl << std::endl;
00120
00121 recPi0Col->push_back(recPi0);
00122 }
00123 }
00124
00126 recEvt->setNumberOfPi0(recPi0Col->size());
00127
00128 if ( save2TDS ) {
00129 StatusCode sc = eventSvc()->registerObject(EventModel::EvtRec::EvtRecPi0Col, recPi0Col);
00130 if ( sc.isFailure() ) {
00131 log << MSG::ERROR << "could not register EvtRecPi0Col in TDS" <<endreq;
00132 return StatusCode::FAILURE;
00133 }
00134 }
00135
00136 return StatusCode::SUCCESS;
00137 }
00138
00139
00140
00141 StatusCode Pi0EtaToGGRecAlg::finalize() {
00142
00143 MsgStream log(msgSvc(), name());
00144 log << MSG::INFO << "in finalize()" << endreq;
00145
00146 return StatusCode::SUCCESS;
00147 }
00148
00149 HepLorentzVector Pi0EtaToGGRecAlg::getP4(RecEmcShower* gTrk){
00150
00151 double eraw = gTrk->energy();
00152 double phi = gTrk->phi();
00153 double the = gTrk->theta();
00154
00155 return HepLorentzVector( eraw * sin(the) * cos(phi),
00156 eraw * sin(the) * sin(phi),
00157 eraw * cos(the),
00158 eraw );
00159 }
00160
00161
00162 bool Pi0EtaToGGRecAlg::validPhoton(EvtRecTrack* recTrk,
00163 SmartDataPtr<EvtRecEvent> recEvt,
00164 SmartDataPtr<EvtRecTrackCol> recTrkCol)
00165 {
00166
00167 if ( !recTrk->isEmcShowerValid() ) return( false );
00168
00169 RecEmcShower *emcTrk = recTrk->emcShower();
00170
00171
00172
00173 int flag =(emcTrk->cellId() & 0x000F0000) >> 16;
00174 if ((flag == 1) && !m_useBarrel) return( false );
00175 if ((flag == 0 || flag == 2) && !m_useEndcap) return( false );
00176
00177 if ( emcTrk->energy() < m_minEnergy ) return( false );
00178
00180 Hep3Vector emcpos(emcTrk->x(), emcTrk->y(), emcTrk->z());
00181 if (recEvt->totalCharged() > 0)
00182 {
00183 double dthe = 200.;
00184 double dphi = 200.;
00185 double dang1 = 200.;
00186 for (int j = 0; j < recEvt->totalCharged(); j++) {
00187 EvtRecTrackIterator jtTrk = recTrkCol->begin() + j;
00188 if ( !(*jtTrk)->isExtTrackValid() ) continue;
00189 RecExtTrack* extTrk = (*jtTrk)->extTrack();
00190 if ( extTrk->emcVolumeNumber() == -1 ) continue;
00191 Hep3Vector extpos = extTrk->emcPosition();
00192 double angd1 = extpos.angle(emcpos);
00193 double thed = extpos.theta() - emcpos.theta();
00194 double phid = extpos.deltaPhi(emcpos);
00195 thed = fmod(thed+CLHEP::twopi+CLHEP::twopi+CLHEP::pi, CLHEP::twopi) - CLHEP::pi;
00196 phid = fmod(phid+CLHEP::twopi+CLHEP::twopi+CLHEP::pi, CLHEP::twopi) - CLHEP::pi;
00197
00198 if ( fabs(thed) < fabs(dthe) ) dthe = thed;
00199 if ( fabs(phid) < fabs(dphi) ) dphi = phid;
00200 if ( angd1 < dang1 ) dang1 = angd1;
00201 }
00202 if ( dang1 < 200 ) {
00203 dthe = dthe * 180 / (CLHEP::pi);
00204 dphi = dphi * 180 / (CLHEP::pi);
00205 dang1 = dang1 * 180 / (CLHEP::pi);
00206 if ( m_angled_cut > 0 ) {
00207 if ( dang1 < m_angled_cut ) return( false );
00208 } else {
00209 if ( (fabs(dthe) < m_thed_cut) && (fabs(dphi)<m_phid_cut) ) return( false );
00210 }
00211 }
00212
00213 }
00214
00215 return true;
00216 }