/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Reconstruction/Pi0EtaToGGRecAlg/Pi0EtaToGGRecAlg-00-00-11/src/misc/Pi0EtaToGGRecAlg.cxx

Go to the documentation of this file.
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    //Declare the properties
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    // get event header, eventlist and tracklist from TDS
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    //  Set up the pi0's list
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   // flag = 1: Barrel = 0,2 : Endcap
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     }  // End of "dang1 < 200" IF 
00212 
00213   }  // End of "recEvt->totalCharged() > 0" IF
00214 
00215   return true;
00216 }

Generated on Tue Nov 29 23:13:46 2016 for BOSS_7.0.2 by  doxygen 1.4.7