DsReconstruction Class Reference

#include <DsReconstruction.h>

List of all members.

Public Member Functions

 DsReconstruction (const std::string &name, ISvcLocator *pSvcLocator)
StatusCode initialize ()
StatusCode execute ()
StatusCode finalize ()
void saveDsInfo (CDDecayList::iterator, double, int, EvtRecDTag *)
void savetrack (vector< int >, vector< int >, EvtRecTrackIterator, EvtRecTrackIterator, EvtRecTrackIterator, EvtRecTrackIterator, EvtRecDTag *)
vector< stringgetlist (string &filename)
void pidtag (vector< int >, vector< int >, CDChargedKaonList &, CDChargedPionList &, EvtRecDTag *)

Private Member Functions

StatusCode registerEvtRecDTagCol (EvtRecDTagCol *dtagCol, MsgStream &log)

Private Attributes

bool m_debug
int m_irun
int m_ievt
int m_nChrg
int m_nNeu
int m_nPion
int m_nKaon
int m_nPi0
int m_nKs
string m_decaylist
vector< stringchanlist
double m_beamE
Hep3Vector m_beta
bool m_ReadBeamEFromDB
bool m_usecalibBeamE
bool m_usevertexfit
ReadBeamInfFromDb m_readDb
IMeasuredEcmsSvcecmsSvc
bool m_RdMeasuredEcms


Detailed Description

Definition at line 21 of file DsReconstruction.h.


Constructor & Destructor Documentation

DsReconstruction::DsReconstruction ( const std::string name,
ISvcLocator *  pSvcLocator 
)

Definition at line 56 of file DsReconstruction.cxx.

References m_beamE, m_debug, m_decaylist, m_RdMeasuredEcms, m_ReadBeamEFromDB, m_usecalibBeamE, and m_usevertexfit.

00056                                                                                  :
00057   Algorithm(name, pSvcLocator)  {
00058   //Declare the properties
00059   declareProperty( "debug",  m_debug = false );
00060   declareProperty( "ReadBeamEFromDB", m_ReadBeamEFromDB = false );
00061   declareProperty( "UseCalibBeamE",   m_usecalibBeamE = false );
00062   declareProperty( "UseVertexfit",    m_usevertexfit = false );
00063   declareProperty( "BeamE",  m_beamE=2.015 );
00064   declareProperty( "DsList",  m_decaylist = "test.txt" );
00065         declareProperty("ReadMeasuredEcms", m_RdMeasuredEcms = false);// Read ecms from database (Wu Lianjin)
00066 }


Member Function Documentation

StatusCode DsReconstruction::execute (  ) 

Definition at line 113 of file DsReconstruction.cxx.

References chanlist, EvtRecVeeVertex::daughter(), dc_fill(), Bes_Common::DEBUG, CDCandidate::decay(), dsSelector, ebeam, ecmsSvc, eptoPiPiEta3PiSelector, eptoPiPiEtaSelector, eptoRhoGamSelector, etatoGGSelector, etatoPiPiPi0Selector, EventModel::EvtRec::EvtRecDTagCol, EventModel::EvtRec::EvtRecEvent, EventModel::EvtRec::EvtRecTrackCol, Bes_Common::FATAL, ReadBeamInfFromDb::getbeamE(), ReadBeamInfFromDb::getbeta(), IMeasuredEcmsSvc::getInfo(), IMeasuredEcmsSvc::getPx(), IMeasuredEcmsSvc::getPy(), IMeasuredEcmsSvc::getPz(), EvtRecPi0::hiEnGamma(), EvtRecEtaToGG::hiEnGamma(), genRecEmupikp::i, Bes_Common::INFO, IMeasuredEcmsSvc::isReadDBValid(), IMeasuredEcmsSvc::isRunNoValid(), IVertexDbSvc::isVertexValid(), kaonSelector, EvtRecDTag::kDstoKKK, EvtRecDTag::kDstoKKPi, EvtRecDTag::kDstoKKPiPi0, EvtRecDTag::kDstoKKPiPiPi, EvtRecDTag::kDstoKPiPi, EvtRecDTag::kDstoKPiPiPi0, EvtRecDTag::kDstoKsK, EvtRecDTag::kDstoKsKminusPiPi, EvtRecDTag::kDstoKsKPi0, EvtRecDTag::kDstoKsKplusPiPi, EvtRecDTag::kDstoKsKsPi, EvtRecDTag::kDstoKsPi, EvtRecDTag::kDstoKsPiPi0, EvtRecDTag::kDstoPiEPPiPiEta, EvtRecDTag::kDstoPiEPPiPiEtaPiPiPi0, EvtRecDTag::kDstoPiEPRhoGam, EvtRecDTag::kDstoPiEta, EvtRecDTag::kDstoPiEtaPiPiPi0, EvtRecDTag::kDstoPiPi0, EvtRecDTag::kDstoPiPi0EPPiPiEta, EvtRecDTag::kDstoPiPi0EPPiPiEtaPiPiPi0, EvtRecDTag::kDstoPiPi0EPRhoGam, EvtRecDTag::kDstoPiPi0Eta, EvtRecDTag::kDstoPiPi0EtaPiPiPi0, EvtRecDTag::kDstoPiPiPi, EvtRecDTag::kDstoPiPiPiEta, EvtRecDTag::kDstoPiPiPiEtaPiPiPi0, EvtRecDTag::kDstoPiPiPiPi0, EvtRecDTag::kDstoPiPiPiPi0Pi0, EvtRecDTag::kDstoPiPiPiPiPi, EvtRecDTag::kDstoPiPiPiPiPiPi0, ksSelector, EvtRecPi0::loEnGamma(), EvtRecEtaToGG::loEnGamma(), m_beamE, m_beta, m_ievt, m_irun, m_nChrg, m_nKaon, m_nKs, m_nNeu, m_nPi0, m_nPion, m_RdMeasuredEcms, m_ReadBeamEFromDB, m_readDb, m_usecalibBeamE, m_usevertexfit, EvtRecVeeVertex::mass(), dchain::ChargedVisibleList< Charged, CandidateClass >::minus(), msgSvc(), CDCandidate::navEta(), CDCandidate::navPi0(), dchain::DecayList< DecayClass, CandidateClass >::particle_begin(), dchain::DecayList< DecayClass, CandidateClass >::particle_end(), CDCandidate::photon(), photonSelector, pi0Selector, pidtag(), pionSelector, dchain::ChargedVisibleList< Charged, CandidateClass >::plus(), IVertexDbSvc::PrimaryVertex(), rhotoPiPiSelector, saveDsInfo(), savetrack(), utility::SecondaryVFit(), DsSelector::setbeta(), ReadBeamInfFromDb::setcalib(), DsSelector::setebeam(), LocalKaonSelector::setpidtype(), LocalPionSelector::setpidtype(), dchain::CandidateList< CandidateClass >::size(), deljobs::string, CDCandidate::track(), EvtRecTrack::trackId(), and utility::vfit().

00113                                      {
00114   MsgStream log(msgSvc(), name());
00115   log << MSG::INFO << "in execute()" << endreq;
00116 
00117   StatusCode sc;
00118 
00120   // Read REC data
00122   SmartDataPtr<Event::EventHeader> eventHeader(eventSvc(),"/Event/EventHeader");
00123   int event= eventHeader->eventNumber();
00124   // if ( m_debug || ( (event & 0x3FF) == 0 ) )
00125   //std::cout << "event: " << event << std::endl;
00126 
00127   SmartDataPtr<EvtRecEvent> recEvent(eventSvc(), EventModel::EvtRec::EvtRecEvent);
00128   SmartDataPtr<EvtRecTrackCol> recTrackCol(eventSvc(), EventModel::EvtRec::EvtRecTrackCol);
00129   log << MSG::DEBUG << "run and event = " << eventHeader->runNumber()
00130       << " " << eventHeader->eventNumber() << endreq;
00131   log << MSG::DEBUG <<"ncharg, nneu, tottks = "
00132       << recEvent->totalCharged() << " , "
00133       << recEvent->totalNeutral() << " , "
00134       << recEvent->totalTracks() <<endreq;
00135   
00136   EvtRecTrackIterator charged_begin = recTrackCol->begin();
00137   EvtRecTrackIterator charged_end = charged_begin + recEvent->totalCharged();
00138 
00139   EvtRecTrackIterator neutral_begin = recTrackCol->begin()+recEvent->totalCharged();
00140   EvtRecTrackIterator neutral_end = recTrackCol->begin()+recEvent->totalTracks();
00141 
00142   
00143   SmartDataPtr<EvtRecPi0Col> recPi0Col(eventSvc(), "/Event/EvtRec/EvtRecPi0Col");
00144   if ( ! recPi0Col ) {
00145     log << MSG::FATAL << "Could not find EvtRecPi0Col" << endreq;
00146     return StatusCode::FAILURE;
00147   }
00148 
00149   SmartDataPtr<EvtRecEtaToGGCol> recEtaToGGCol(eventSvc(), "/Event/EvtRec/EvtRecEtaToGGCol");
00150   if ( ! recEtaToGGCol ) {
00151     log << MSG::FATAL << "Could not find EvtRecEtaToGGCol" << endreq;
00152     return StatusCode::FAILURE;
00153   }
00154   
00155 
00156   SmartDataPtr<EvtRecVeeVertexCol> recVeeVertexCol(eventSvc(), "/Event/EvtRec/EvtRecVeeVertexCol");
00157   if ( ! recVeeVertexCol ) {
00158     log << MSG::FATAL << "Could not find EvtRecVeeVertexCol" << endreq;
00159     return StatusCode::FAILURE;
00160   }
00161   
00162   
00163   SmartDataPtr<EvtRecDTagCol> recDTagCol(eventSvc(), EventModel::EvtRec::EvtRecDTagCol);
00164   if (!recDTagCol) {
00165     log << MSG::FATAL << "EvtRecDTagCol is not registered yet" << endreq;
00166     return StatusCode::FAILURE;
00167   }
00168 
00169 
00170   //get primary vertex from db
00171   Hep3Vector xorigin(0,0,0);
00172   IVertexDbSvc*  vtxsvc;
00173   Gaudi::svcLocator()->service("VertexDbSvc", vtxsvc);
00174   if (vtxsvc->isVertexValid()) {
00175 
00176     //vertex[0] = vx; vertex[1]= vy; vertex[2] = vz;
00177     double* vertex = vtxsvc->PrimaryVertex();
00178     xorigin.setX(vertex[0]);
00179     xorigin.setY(vertex[1]);
00180     xorigin.setZ(vertex[2]);
00181   }
00182   utility util;
00183 
00184 
00185   //registered in DTag.cxx
00186   /*
00187     if (!recDTagCol) {
00188     recDTagCol = new EvtRecDTagCol;
00189     sc = registerEvtRecDTagCol(recDTagCol, log);
00190     if (sc != StatusCode::SUCCESS) {
00191     return sc;
00192     }
00193     }
00194   */
00195   
00196   
00198   //reconstruct particle lists
00200   
00201   pionSelector.setpidtype(0);
00202   kaonSelector.setpidtype(0);
00203   CDChargedPionList pionList(charged_begin, charged_end, pionSelector);
00204   CDChargedKaonList kaonList(charged_begin, charged_end, kaonSelector);
00205   CDPhotonList      photonList(neutral_begin, neutral_end, photonSelector);
00206 
00207   CDKsList          ksList(ksSelector);
00208   dc_fill(ksList,  recVeeVertexCol->begin(), recVeeVertexCol->end());
00209 
00210 
00211   // do a secondary vertex fit and cut on the results
00212   map<EvtRecVeeVertex*, vector< double > > fitinfo;
00213   for( CDKsList::iterator ksit = ksList.particle_begin(); ksit != ksList.particle_end(); ++ksit ){
00214     EvtRecVeeVertex* ks = const_cast<EvtRecVeeVertex*>( (*ksit).particle().navKshort() );
00215     fitinfo[ks] = util.SecondaryVFit(ks, vtxsvc);
00216   }
00217 
00218   CDPi0List         pi0List(pi0Selector);
00219   dc_fill(pi0List, recPi0Col->begin(), recPi0Col->end());
00220 
00221   CDEtaList         etaList(etatoGGSelector);
00222   dc_fill(etaList, recEtaToGGCol->begin(), recEtaToGGCol->end());
00223 
00224   //pion/kaon list with PID
00225   pionSelector.setpidtype(1);
00226   kaonSelector.setpidtype(1);
00227   CDChargedPionList pionList_tight(charged_begin, charged_end, pionSelector);
00228   CDChargedKaonList kaonList_tight(charged_begin, charged_end, kaonSelector);
00229 
00230 
00231   int run = eventHeader->runNumber();
00232   m_ievt  = eventHeader->eventNumber();
00233   m_nChrg = recEvent->totalCharged();
00234   m_nNeu  = recEvent->totalNeutral();
00235   m_nPion = pionList.size();
00236   m_nKaon = kaonList.size();
00237   m_nPi0  = pi0List.size();
00238   m_nKs   = ksList.size();
00239 
00240 
00242   // get beam energy and beta
00244         //=========================================Wu Lianjin adds
00245   if(m_RdMeasuredEcms&&m_irun!=run){
00246     if(ecmsSvc->isReadDBValid(run)) m_beamE=ecmsSvc->getInfo(run);
00247     if(ecmsSvc->isRunNoValid(run)){
00248       m_beta.setX(ecmsSvc->getPx(run));
00249       m_beta.setY(ecmsSvc->getPy(run));
00250       m_beta.setZ(ecmsSvc->getPz(run));
00251     }
00252   }
00253         log << MSG::INFO << "MeasuredEcmsSvc: " <<m_beamE<< endreq;
00254         //=========================================
00255 
00256   if(m_ReadBeamEFromDB && m_irun!=run){
00257     m_irun=run;
00258     if(m_usecalibBeamE)
00259       m_readDb.setcalib(true);
00260     m_beamE=m_readDb.getbeamE(m_irun,m_beamE);
00261     if(run>0)
00262       m_beta=m_readDb.getbeta();
00263     //cout<<"use beam E from data base:"<<m_beamE<<endl;
00264   }
00265   double ebeam=m_beamE;
00266 
00268   //reconstruct decay lists
00270 
00271 
00272   for(int list=0;list<chanlist.size();list++){
00273 
00274     string channel=chanlist[list];
00275     vector<int> numchan;
00276     dsSelector.setebeam(ebeam);
00277     dsSelector.setbeta(m_beta);
00278     CDDecayList decaylist(dsSelector);
00279 
00280     //K+/-: 1, Pi+/-:2,  Pi0:3,
00281     //Eta: 4, Ks:5,
00282     //eta'(pipieta):    6,
00283     //eta'(rhogamma):   7
00284     //eta'(pipieta(pipipi0)): 8
00285     //eta(pipipi0):             9,
00286     //the fist element of the vector stands for decay mode,
00287     //the rest will be particles, and size of the vector minus 1 will be number of daughers.
00288 
00289     if(channel=="DstoKsK") {
00290       numchan.push_back( EvtRecDTag::kDstoKsK );
00291       numchan.push_back(5);
00292       numchan.push_back(1);
00293       decaylist=ksList* kaonList.plus();
00294     }
00295     else if(channel=="DstoKKPi") {
00296       numchan.push_back( EvtRecDTag::kDstoKKPi );
00297       numchan.push_back(1);
00298       numchan.push_back(1);
00299       numchan.push_back(2);
00300       decaylist=kaonList.minus()* kaonList.plus()* pionList.plus();
00301     }
00302     else if(channel=="DstoKsKPi0") {
00303       numchan.push_back( EvtRecDTag::kDstoKsKPi0 );
00304       numchan.push_back(5);
00305       numchan.push_back(1);
00306       numchan.push_back(3);
00307       decaylist=ksList* kaonList.plus()* pi0List;
00308     }
00309     else if(channel=="DstoKsKsPi") {
00310       numchan.push_back( EvtRecDTag::kDstoKsKsPi );
00311       numchan.push_back(5);
00312       numchan.push_back(5);
00313       numchan.push_back(2);
00314       decaylist=ksList* ksList* pionList.plus();
00315     }
00316     else if(channel=="DstoKKPiPi0") {
00317       numchan.push_back( EvtRecDTag::kDstoKKPiPi0 );
00318       numchan.push_back(1);
00319       numchan.push_back(1);
00320       numchan.push_back(2);
00321       numchan.push_back(3);
00322       decaylist=kaonList.minus()* kaonList.plus()* pionList.plus()* pi0List;
00323     }
00324     else if(channel=="DstoKsKplusPiPi") {
00325       numchan.push_back( EvtRecDTag::kDstoKsKplusPiPi );
00326       numchan.push_back(5);
00327       numchan.push_back(1);
00328       numchan.push_back(2);
00329       numchan.push_back(2);
00330       decaylist=ksList* kaonList.plus()* pionList.plus()* pionList.minus();
00331     }
00332     else if(channel=="DstoKsKminusPiPi") {
00333       numchan.push_back( EvtRecDTag::kDstoKsKminusPiPi );
00334       numchan.push_back(5);
00335       numchan.push_back(1);
00336       numchan.push_back(2);
00337       numchan.push_back(2);
00338       decaylist=ksList* kaonList.minus()* pionList.plus()* pionList.plus();
00339     }
00340     else if(channel=="DstoKKPiPiPi") {
00341       numchan.push_back( EvtRecDTag::kDstoKKPiPiPi );
00342       numchan.push_back(1);
00343       numchan.push_back(1);
00344       numchan.push_back(2);
00345       numchan.push_back(2);
00346       numchan.push_back(2);
00347       decaylist=kaonList.minus()* kaonList.plus()* pionList.plus()* pionList.plus()* pionList.minus();
00348     }
00349     else if(channel=="DstoPiPi0") {
00350       numchan.push_back( EvtRecDTag::kDstoPiPi0 );
00351       numchan.push_back(2);
00352       numchan.push_back(3);
00353       decaylist=pionList.plus()* pi0List;
00354     }
00355     else if(channel=="DstoPiPiPi") {
00356       numchan.push_back( EvtRecDTag::kDstoPiPiPi );
00357       numchan.push_back(2);
00358       numchan.push_back(2);
00359       numchan.push_back(2);
00360       decaylist=pionList.plus()* pionList.plus()* pionList.minus();
00361     }
00362     else if(channel=="DstoPiPiPiPi0") {
00363       numchan.push_back( EvtRecDTag::kDstoPiPiPiPi0 );
00364       numchan.push_back(2);
00365       numchan.push_back(2);
00366       numchan.push_back(2);
00367       numchan.push_back(3);
00368       decaylist=pionList.plus()* pionList.plus()* pionList.minus()* pi0List;
00369     }
00370     else if(channel=="DstoPiPiPiPiPi") {
00371       numchan.push_back( EvtRecDTag::kDstoPiPiPiPiPi );
00372       numchan.push_back(2);
00373       numchan.push_back(2);
00374       numchan.push_back(2);
00375       numchan.push_back(2);
00376       numchan.push_back(2);
00377       decaylist=pionList.plus()* pionList.plus()* pionList.plus()* pionList.minus()* pionList.minus();
00378     }
00379     else if(channel=="DstoPiPiPiPiPiPi0") {
00380       numchan.push_back( EvtRecDTag::kDstoPiPiPiPiPiPi0 );
00381       numchan.push_back(2);
00382       numchan.push_back(2);
00383       numchan.push_back(2);
00384       numchan.push_back(2);
00385       numchan.push_back(2);
00386       numchan.push_back(3);
00387       decaylist=pionList.plus()* pionList.plus()* pionList.plus()* pionList.minus()* pionList.minus()* pi0List;
00388     }
00389     else if(channel=="DstoPiPiPiPi0Pi0") { // <------------- NEW MODE
00390       numchan.push_back( EvtRecDTag::kDstoPiPiPiPi0Pi0 );
00391       numchan.push_back(2);
00392       numchan.push_back(2);
00393       numchan.push_back(2);
00394       numchan.push_back(3);
00395       numchan.push_back(3);
00396       decaylist=pionList.plus()* pionList.plus()* pionList.minus()* pi0List* pi0List;
00397     }
00398     else if(channel=="DstoPiEta") {
00399       numchan.push_back( EvtRecDTag::kDstoPiEta );
00400       numchan.push_back(2);
00401       numchan.push_back(4);
00402       decaylist=pionList.plus()* etaList;
00403     }
00404     else if(channel=="DstoPiEtaPiPiPi0") { // <------------- NEW MODE
00405       numchan.push_back( EvtRecDTag::kDstoPiEtaPiPiPi0 );
00406       numchan.push_back(2);
00407       numchan.push_back(9);
00408       CDDecayList EtaList(etatoPiPiPi0Selector);
00409       EtaList=pionList.plus()* pionList.minus()* pi0List;
00410       decaylist=pionList.plus()* EtaList;
00411     }
00412     else if(channel=="DstoPiPi0Eta") {
00413       numchan.push_back( EvtRecDTag::kDstoPiPi0Eta );
00414       numchan.push_back(2);
00415       numchan.push_back(3);
00416       numchan.push_back(4);
00417       decaylist=pionList.plus()* pi0List* etaList;
00418     }
00419     else if(channel=="DstoPiPi0EtaPiPiPi0") { // <---------- NEW MODE
00420       numchan.push_back( EvtRecDTag::kDstoPiPi0EtaPiPiPi0 );
00421       numchan.push_back(2);
00422       numchan.push_back(3);
00423       numchan.push_back(9);
00424       CDDecayList EtaList(etatoPiPiPi0Selector);
00425       EtaList=pionList.plus()* pionList.minus()* pi0List;
00426       decaylist=pionList.plus()* pi0List* EtaList;
00427     }
00428     else if(channel=="DstoPiPiPiEta") {
00429       numchan.push_back( EvtRecDTag::kDstoPiPiPiEta );
00430       numchan.push_back(2);
00431       numchan.push_back(2);
00432       numchan.push_back(2);
00433       numchan.push_back(4);
00434       decaylist=pionList.plus()* pionList.plus()* pionList.minus()* etaList;
00435     }
00436     else if(channel=="DstoPiPiPiEtaPiPiPi0") { // <---------- NEW MODE
00437       numchan.push_back( EvtRecDTag::kDstoPiPiPiEtaPiPiPi0 );
00438       numchan.push_back(2);
00439       numchan.push_back(2);
00440       numchan.push_back(2);
00441       numchan.push_back(9);
00442       CDDecayList EtaList(etatoPiPiPi0Selector);
00443       EtaList=pionList.plus()* pionList.minus()* pi0List;
00444       decaylist=pionList.plus()* pionList.plus()* pionList.minus()* EtaList;
00445     }
00446     else if(channel=="DstoPiEPPiPiEta") {
00447       numchan.push_back( EvtRecDTag::kDstoPiEPPiPiEta );
00448       numchan.push_back(2);
00449       numchan.push_back(6);
00450       CDDecayList epList(eptoPiPiEtaSelector);
00451       epList=pionList.plus()* pionList.minus()* etaList;
00452       decaylist=pionList.plus()* epList;
00453     }
00454     else if(channel=="DstoPiPi0EPPiPiEta") {
00455       numchan.push_back( EvtRecDTag::kDstoPiPi0EPPiPiEta );
00456       numchan.push_back(2);
00457       numchan.push_back(3);
00458       numchan.push_back(6);
00459       CDDecayList epList(eptoPiPiEtaSelector);
00460       epList=pionList.plus()* pionList.minus()* etaList;
00461       decaylist=pionList.plus()* pi0List* epList;
00462     }
00463     else if(channel=="DstoPiEPPiPiEtaPiPiPi0") {// <------------- New mode: 470 eta'(pipieta, eta->pipipi0)
00464       numchan.push_back( EvtRecDTag::kDstoPiEPPiPiEtaPiPiPi0 );
00465       numchan.push_back(2);
00466       numchan.push_back(8);
00467       CDDecayList EtaList(etatoPiPiPi0Selector);
00468       EtaList=pionList.plus()* pionList.minus()* pi0List;
00469       CDDecayList EtapList(eptoPiPiEta3PiSelector);
00470       EtapList=pionList.plus()* pionList.minus()* EtaList; 
00471       decaylist=pionList.plus()* EtapList;
00472     }
00473     else if(channel=="DstoPiPi0EPPiPiEtaPiPiPi0") { //<------------ New mode: 471 eta'(pipieta, eta->pipipi0)
00474       numchan.push_back( EvtRecDTag::kDstoPiPi0EPPiPiEtaPiPiPi0 );
00475       numchan.push_back(2);
00476       numchan.push_back(3);
00477       numchan.push_back(8);
00478       CDDecayList EtaList(etatoPiPiPi0Selector);
00479       EtaList=pionList.plus()* pionList.minus()* pi0List;
00480       CDDecayList EtapList(eptoPiPiEta3PiSelector);
00481       EtapList=pionList.plus()* pionList.minus()* EtaList;
00482       decaylist=pionList.plus()* pi0List* EtapList;
00483     }
00484 
00485     else if(channel=="DstoPiEPRhoGam") {
00486       numchan.push_back( EvtRecDTag::kDstoPiEPRhoGam );
00487       numchan.push_back(2);
00488       numchan.push_back(7);
00489       CDDecayList rhoList(rhotoPiPiSelector);
00490       rhoList=pionList.plus()* pionList.minus();
00491       CDDecayList epList(eptoRhoGamSelector);
00492       epList=rhoList* photonList;
00493       decaylist=pionList.plus()* epList;
00494     }
00495     else if(channel=="DstoPiPi0EPRhoGam") {
00496       numchan.push_back( EvtRecDTag::kDstoPiPi0EPRhoGam );
00497       numchan.push_back(2);
00498       numchan.push_back(3);
00499       numchan.push_back(7);
00500       CDDecayList rhoList(rhotoPiPiSelector);
00501       rhoList=pionList.plus()* pionList.minus();
00502       CDDecayList epList(eptoRhoGamSelector);
00503       epList=rhoList* photonList;
00504       decaylist=pionList.plus()* pi0List* epList;
00505     }
00506     else if(channel=="DstoKsPi") {
00507       numchan.push_back( EvtRecDTag::kDstoKsPi );
00508       numchan.push_back(5);
00509       numchan.push_back(2);
00510       decaylist=ksList* pionList.plus();
00511     }
00512     else if(channel=="DstoKsPiPi0") {
00513       numchan.push_back( EvtRecDTag::kDstoKsPiPi0 );
00514       numchan.push_back(5);
00515       numchan.push_back(2);
00516       numchan.push_back(3);
00517       decaylist=ksList* pionList.plus()* pi0List;
00518     }
00519     else if(channel=="DstoKPiPi") {
00520       numchan.push_back( EvtRecDTag::kDstoKPiPi );
00521       numchan.push_back(1);
00522       numchan.push_back(2);
00523       numchan.push_back(2);
00524       decaylist=kaonList.plus()* pionList.plus()* pionList.minus();
00525     }
00526     else if(channel=="DstoKPiPiPi0") {
00527       numchan.push_back( EvtRecDTag::kDstoKPiPiPi0 );
00528       numchan.push_back(1);
00529       numchan.push_back(2);
00530       numchan.push_back(2);
00531       numchan.push_back(3);
00532       decaylist=kaonList.plus()* pionList.plus()* pionList.minus()* pi0List;
00533     }
00534     else if(channel=="DstoKKK") {
00535       numchan.push_back( EvtRecDTag::kDstoKKK );
00536       numchan.push_back(1);
00537       numchan.push_back(1);
00538       numchan.push_back(1);
00539       decaylist=kaonList.minus()* kaonList.plus()* kaonList.plus();
00540     }
00541 
00542     CDDecayList::iterator D_begin =decaylist.particle_begin();
00543     CDDecayList::iterator D_end   =decaylist.particle_end();
00544 
00545     for ( CDDecayList::iterator it = D_begin; it != D_end; it++ ) {
00546 
00547       EvtRecDTag* recDTag = new EvtRecDTag;
00548       recDTag->setdecayMode( (EvtRecDTag::DecayMode)numchan[0] );
00549 
00550       vector<int> trackid, showerid;
00551       vector<int> kaonid, pionid;
00552       int numofchildren=numchan.size()-1;
00553 
00554       for(int i=0; i< numofchildren;i++){
00555 
00556         const CDCandidate& daughter=(*it).particle().child(i);
00557 
00558         if(numchan[i+1]==1){
00559           const EvtRecTrack* track=daughter.track();
00560           trackid.push_back(track->trackId());
00561           kaonid.push_back(track->trackId());
00562         }
00563         else if(numchan[i+1]==2){
00564           const EvtRecTrack* track=daughter.track();
00565           trackid.push_back(track->trackId());
00566           pionid.push_back(track->trackId());
00567         }
00568         else if ( numchan[i+1]==3){
00569           const EvtRecTrack* hiEnGamma=daughter.navPi0()->hiEnGamma();
00570           const EvtRecTrack* loEnGamma=daughter.navPi0()->loEnGamma();
00571           showerid.push_back(hiEnGamma->trackId());
00572           showerid.push_back(loEnGamma->trackId());
00573         }
00574         else if ( numchan[i+1]==4){
00575           const EvtRecTrack* hiEnGamma=daughter.navEta()->hiEnGamma();
00576           const EvtRecTrack* loEnGamma=daughter.navEta()->loEnGamma();
00577           showerid.push_back(hiEnGamma->trackId());
00578           showerid.push_back(loEnGamma->trackId());
00579         }
00580         else if ( numchan[i+1]==5){
00581           EvtRecVeeVertex* aKsCand = const_cast<EvtRecVeeVertex*>( daughter.navKshort() );
00582 
00583           // fill fit info
00584           recDTag->addToFitInfo(aKsCand->mass(),fitinfo[aKsCand][0],fitinfo[aKsCand][1],fitinfo[aKsCand][2]);
00585           // fill tracks
00586           EvtRecTrack* pion1Trk = aKsCand->daughter(0);
00587           EvtRecTrack* pion2Trk = aKsCand->daughter(1);    
00588           trackid.push_back(pion1Trk->trackId());
00589           trackid.push_back(pion2Trk->trackId());
00590         }
00591         else if (numchan[i+1]==6){
00592           const CDCandidate& apion = daughter.decay().child(0);
00593           const CDCandidate& spion = daughter.decay().child(1);
00594           const CDCandidate& eta = daughter.decay().child(2);
00595           const EvtRecTrack* apiontrk = apion.track();
00596           const EvtRecTrack* spiontrk = spion.track();
00597           const EvtRecTrack* hiEnGamma=eta.navEta()->hiEnGamma();
00598           const EvtRecTrack* loEnGamma=eta.navEta()->loEnGamma();
00599 
00600           trackid.push_back(apiontrk->trackId());
00601           trackid.push_back(spiontrk->trackId());
00602           showerid.push_back(hiEnGamma->trackId());
00603           showerid.push_back(loEnGamma->trackId());
00604 
00605         }
00606         else if (numchan[i+1]==7){
00607           const CDCandidate& rho = daughter.decay().child(0);
00608           const CDCandidate& apion = rho.decay().child(0);
00609           const CDCandidate& spion = rho.decay().child(1);
00610           const CDCandidate& gamma = daughter.decay().child(1);
00611 
00612           const EvtRecTrack* apiontrk = apion.track();
00613           const EvtRecTrack* spiontrk = spion.track();
00614           const EvtRecTrack* gammatrk = gamma.photon();
00615 
00616 
00617           trackid.push_back(apiontrk->trackId());
00618           trackid.push_back(spiontrk->trackId());
00619           showerid.push_back(gammatrk->trackId());
00620 
00621         }
00622         else if (numchan[i+1]==8){ // <------------ NEW PART FOR ETAP TO PIPIETA TO PIPIPI0
00623           const CDCandidate& apion  = daughter.decay().child(0);
00624           const CDCandidate& spion  = daughter.decay().child(1);
00625           const CDCandidate& eta    = daughter.decay().child(2);
00626           const CDCandidate& e0pion = eta.decay().child(0);
00627           const CDCandidate& e1pion = eta.decay().child(1);
00628           const CDCandidate& pi0    = eta.decay().child(2);
00629 
00630           const EvtRecTrack* apiontrk  = apion.track();
00631           const EvtRecTrack* spiontrk  = spion.track();
00632           const EvtRecTrack* e0piontrk = e0pion.track();
00633           const EvtRecTrack* e1piontrk = e1pion.track();
00634 
00635           const EvtRecTrack* hiEnGamma=pi0.navPi0()->hiEnGamma();
00636           const EvtRecTrack* loEnGamma=pi0.navPi0()->loEnGamma();
00637 
00638           trackid.push_back(apiontrk->trackId());
00639           trackid.push_back(spiontrk->trackId());
00640           trackid.push_back(e0piontrk->trackId());
00641           trackid.push_back(e1piontrk->trackId());
00642           showerid.push_back(hiEnGamma->trackId());
00643           showerid.push_back(loEnGamma->trackId());
00644 
00645         }
00646         else if (numchan[i+1]==9){ // <------- NEW PART FOR ETA TO PIPIPI0
00647           const CDCandidate& apion = daughter.decay().child(0);
00648           const CDCandidate& spion = daughter.decay().child(1);
00649           const CDCandidate& pi0 = daughter.decay().child(2);
00650           const EvtRecTrack* apiontrk = apion.track();
00651           const EvtRecTrack* spiontrk = spion.track();
00652           const EvtRecTrack* hiEnGamma=pi0.navPi0()->hiEnGamma();
00653           const EvtRecTrack* loEnGamma=pi0.navPi0()->loEnGamma();
00654 
00655           trackid.push_back(apiontrk->trackId());
00656           trackid.push_back(spiontrk->trackId());
00657           showerid.push_back(hiEnGamma->trackId());
00658           showerid.push_back(loEnGamma->trackId());
00659 
00660         }
00661 
00662 
00663       }//end of filling track and shower ids
00664 
00665 
00666       saveDsInfo(it, ebeam, numofchildren, recDTag);
00667       savetrack(trackid,showerid,charged_begin,charged_end,neutral_begin,neutral_end,recDTag);
00668       pidtag(kaonid,pionid,kaonList_tight, pionList_tight,recDTag);
00669 
00670 
00671       if(m_usevertexfit){
00672         HepLorentzVector p4change_vfit=util.vfit(channel, kaonid,  pionid, xorigin, charged_begin);
00673         recDTag->setp4(recDTag->p4()+p4change_vfit);
00674       }
00675 
00676 
00677       trackid.clear();
00678       showerid.clear();
00679       kaonid.clear();
00680       pionid.clear();
00681 
00682 
00683 
00684       //write dtag object out
00685       recDTagCol->push_back(recDTag);
00686 
00687     }//end of decaylist iterator
00688 
00689     numchan.clear();
00690 
00691   }//end of reconstrucing all D+ decay lists
00692 
00693 
00694 
00695   return StatusCode::SUCCESS;
00696 }

StatusCode DsReconstruction::finalize (  ) 

Definition at line 93 of file DsReconstruction.cxx.

References chanlist, Bes_Common::INFO, and msgSvc().

00093                                       {
00094   MsgStream log(msgSvc(), name());
00095   log << MSG::INFO << "in finalize()" << endreq;
00096 
00097   chanlist.clear();
00098   
00099   return StatusCode::SUCCESS;
00100 }

vector< string > DsReconstruction::getlist ( string filename  ) 

Definition at line 834 of file DsReconstruction.cxx.

References deljobs::string, and subSeperate::temp.

Referenced by initialize().

00834                                                          {
00835 
00836   string channel;
00837   vector<string> temp;
00838 
00839   ifstream inFile;
00840 
00841   inFile.open(filename.c_str());
00842   if (!inFile) {
00843     cout << "Unable to open decay list file";
00844     exit(1); // terminate with error
00845   }
00846 
00847   while (inFile >> channel) {
00848     temp.push_back(channel);
00849   }
00850 
00851   inFile.close();
00852 
00853   return temp;
00854 
00855 }

StatusCode DsReconstruction::initialize (  ) 

Definition at line 69 of file DsReconstruction.cxx.

References chanlist, ecmsSvc, getlist(), Bes_Common::INFO, m_beta, m_decaylist, m_irun, m_RdMeasuredEcms, and msgSvc().

00069                                         {
00070   MsgStream log(msgSvc(), name());
00071   log << MSG::INFO << "in initialize()" <<endreq;
00072   
00073   m_irun=-100;
00074   m_beta.setX(0.011);
00075   m_beta.setY(0);
00076   m_beta.setZ(0);
00077   chanlist=getlist(m_decaylist);
00078 
00079         //=====================================Wu Lianjin adds
00080         if(m_RdMeasuredEcms){
00081     StatusCode status=serviceLocator()->service("MeasuredEcmsSvc", ecmsSvc, true);
00082     if(!status.isSuccess()){
00083       std::cout<<"ERROR: Can not initial the IMeasuredEcmsSvc right"<<std::endl;
00084       return status;
00085     }
00086   }
00087 
00088         //=================================
00089   return StatusCode::SUCCESS;
00090 }

void DsReconstruction::pidtag ( vector< int >  ,
vector< int >  ,
CDChargedKaonList ,
CDChargedPionList ,
EvtRecDTag  
)

Definition at line 779 of file DsReconstruction.cxx.

References EvtRecDTag::addKaonId(), EvtRecDTag::addPionId(), dchain::ChargedVisibleList< Charged, CandidateClass >::particle_begin(), and dchain::ChargedVisibleList< Charged, CandidateClass >::particle_end().

Referenced by execute().

00779                                                                                                                                                  {
00780 
00781   bool iskaon=false,ispion=false;
00782 
00783 
00784   // save track ids which passed pion/kaon cuts
00785 
00786   for (CDChargedKaonList::iterator kit = kaonList.particle_begin(); kit != kaonList.particle_end(); kit++) {
00787     recDTag->addKaonId( (*kit).particle().track() );
00788   }
00789 
00790   for (CDChargedPionList::iterator pit = pionList.particle_begin(); pit != pionList.particle_end(); pit++) {
00791     recDTag->addPionId( (*pit).particle().track() );
00792   }
00793 
00794 
00795   /*
00796     for(int i=0; i<kaonid.size(); i++){
00797     bool ithkaon=false;
00798     for (CDChargedKaonList::iterator kit = kaonList.particle_begin(); kit != kaonList.particle_end(); kit++) {
00799     if((*kit).particle().track()->trackId()==kaonid[i]){
00800     ithkaon=true;
00801     break;
00802     }
00803     }
00804     if(!ithkaon) break;
00805     if(i==kaonid.size()-1)
00806     iskaon=true;
00807     }
00808 
00809     for(int i=0; i<pionid.size(); i++){
00810     bool ithpion=false;
00811     for (CDChargedPionList::iterator pit = pionList.particle_begin(); pit != pionList.particle_end(); pit++) {
00812     if((*pit).particle().track()->trackId()==pionid[i]){
00813     ithpion=true;
00814     break;
00815     }
00816     }
00817     if(!ithpion) break;
00818     if(i==pionid.size()-1)
00819     ispion=true;
00820     }
00821 
00822 
00823     if( iskaon && ispion)
00824     recDTag->settype( EvtRecDTag::Tight );
00825     else if( (kaonid.size()==0 && ispion) || (pionid.size()==0 && iskaon))
00826     recDTag->settype( EvtRecDTag::Tight );
00827     else if( kaonid.size()==0 && pionid.size()==0 )
00828     recDTag->settype( EvtRecDTag::Tight );
00829   */
00830 
00831 }

StatusCode DsReconstruction::registerEvtRecDTagCol ( EvtRecDTagCol dtagCol,
MsgStream &  log 
) [private]

Definition at line 102 of file DsReconstruction.cxx.

References Bes_Common::FATAL.

00103                                                                                                      {
00104   StatusCode sc = eventSvc()->registerObject("/Event/EvtRec/EvtRecDTagCol",
00105                                              aNewEvtRecDTagCol);
00106   if (sc != StatusCode::SUCCESS) {
00107     log << MSG::FATAL << "Could not register EvtRecDTagCol in TDS!" << endreq;
00108   }
00109   return sc;
00110 }

void DsReconstruction::saveDsInfo ( CDDecayList::iterator  ,
double  ,
int  ,
EvtRecDTag  
)

Definition at line 699 of file DsReconstruction.cxx.

References EvtRecDTag::Loose, m_beta, mass, EvtRecDTag::setbeamE(), EvtRecDTag::setcharge(), EvtRecDTag::setcharm(), EvtRecDTag::setdeltaE(), EvtRecDTag::setmass(), EvtRecDTag::setmBC(), EvtRecDTag::setnumOfChildren(), EvtRecDTag::setp4(), EvtRecDTag::settype(), and EvtRecDTag::Tight.

Referenced by execute().

00699                                                                                                               {
00700 
00701   double mass = (*it).particle().mass();
00702   int charge= (*it).particle().charge();
00703   HepLorentzVector p4((*it).particle().momentum(), (*it).particle().energy());
00704   recDTag->setp4(p4);
00705 
00706   p4.boost(-m_beta);
00707   double mbc2_CMS = ebeam*ebeam - p4.v().mag2();
00708   double mbc_CMS = mbc2_CMS > 0 ? sqrt( mbc2_CMS ) : -10;
00709   double deltaE_CMS = p4.t() - ebeam;
00710 
00711   if((*it).particle().userTag()==1)
00712     recDTag->settype( EvtRecDTag::Tight );
00713   else
00714     recDTag->settype( EvtRecDTag::Loose );
00715   recDTag->setcharge(charge);
00716   recDTag->setcharm(charge);
00717   recDTag->setnumOfChildren(numofchildren);
00718   recDTag->setmass(mass);
00719   recDTag->setmBC(mbc_CMS);
00720   recDTag->setbeamE(ebeam);
00721   recDTag->setdeltaE(deltaE_CMS);
00722 
00723 }

void DsReconstruction::savetrack ( vector< int >  ,
vector< int >  ,
EvtRecTrackIterator  ,
EvtRecTrackIterator  ,
EvtRecTrackIterator  ,
EvtRecTrackIterator  ,
EvtRecDTag  
)

Definition at line 725 of file DsReconstruction.cxx.

References EvtRecDTag::addOtherShower(), EvtRecDTag::addOtherTrack(), EvtRecDTag::addShower(), EvtRecDTag::addTrack(), genRecEmupikp::i, and ganga-rec::j.

Referenced by execute().

00726                                                                                                                          {
00727 
00728   vector<EvtRecTrackIterator> trktemp;
00729   vector<EvtRecTrackIterator> shrtemp;
00730 
00731   //fill tracks
00732   for(EvtRecTrackIterator trk=charged_begin; trk<charged_end;trk++){
00733 
00734     bool isothertrack=true;
00735     for(int i=0; i<trackid.size(); i++){
00736       if( (*trk)->trackId()==trackid[i] ){
00737         trktemp.push_back(trk);
00738         isothertrack=false;
00739         break;
00740       }
00741     }
00742     if(isothertrack)
00743       recDTag->addOtherTrack(*trk);
00744   }
00745   for(int i=0; i<trackid.size();i++){
00746     for(int j=0; j<trktemp.size(); j++){
00747       EvtRecTrackIterator trk=trktemp[j];
00748       if( (*trk)->trackId()==trackid[i])
00749         recDTag->addTrack(*trktemp[j]);
00750     }
00751   }
00752 
00753 
00754   //fill showers
00755   for(EvtRecTrackIterator shr=neutral_begin; shr<neutral_end;shr++){
00756     bool isothershower=true;
00757     for(int i=0; i<showerid.size(); i++){
00758       if( (*shr)->trackId()==showerid[i] ){
00759         shrtemp.push_back(shr);
00760         isothershower=false;
00761         break;
00762       }
00763     }
00764     if(isothershower)
00765       recDTag->addOtherShower(*shr);
00766   }
00767 
00768   for(int i=0; i<showerid.size();i++){
00769     for(int j=0; j<shrtemp.size(); j++){
00770       EvtRecTrackIterator shr=shrtemp[j];
00771       if( (*shr)->trackId()==showerid[i])
00772         recDTag->addShower(*shrtemp[j]);
00773     }
00774   }
00775 
00776 
00777 }


Member Data Documentation

vector<string> DsReconstruction::chanlist [private]

Definition at line 52 of file DsReconstruction.h.

Referenced by execute(), finalize(), and initialize().

IMeasuredEcmsSvc* DsReconstruction::ecmsSvc [private]

Definition at line 60 of file DsReconstruction.h.

Referenced by execute(), and initialize().

double DsReconstruction::m_beamE [private]

Definition at line 54 of file DsReconstruction.h.

Referenced by DsReconstruction(), and execute().

Hep3Vector DsReconstruction::m_beta [private]

Definition at line 55 of file DsReconstruction.h.

Referenced by execute(), initialize(), and saveDsInfo().

bool DsReconstruction::m_debug [private]

Definition at line 40 of file DsReconstruction.h.

Referenced by DsReconstruction().

string DsReconstruction::m_decaylist [private]

Definition at line 51 of file DsReconstruction.h.

Referenced by DsReconstruction(), and initialize().

int DsReconstruction::m_ievt [private]

Definition at line 43 of file DsReconstruction.h.

Referenced by execute().

int DsReconstruction::m_irun [private]

Definition at line 42 of file DsReconstruction.h.

Referenced by execute(), and initialize().

int DsReconstruction::m_nChrg [private]

Definition at line 44 of file DsReconstruction.h.

Referenced by execute().

int DsReconstruction::m_nKaon [private]

Definition at line 47 of file DsReconstruction.h.

Referenced by execute().

int DsReconstruction::m_nKs [private]

Definition at line 49 of file DsReconstruction.h.

Referenced by execute().

int DsReconstruction::m_nNeu [private]

Definition at line 45 of file DsReconstruction.h.

Referenced by execute().

int DsReconstruction::m_nPi0 [private]

Definition at line 48 of file DsReconstruction.h.

Referenced by execute().

int DsReconstruction::m_nPion [private]

Definition at line 46 of file DsReconstruction.h.

Referenced by execute().

bool DsReconstruction::m_RdMeasuredEcms [private]

Definition at line 61 of file DsReconstruction.h.

Referenced by DsReconstruction(), execute(), and initialize().

bool DsReconstruction::m_ReadBeamEFromDB [private]

Definition at line 56 of file DsReconstruction.h.

Referenced by DsReconstruction(), and execute().

ReadBeamInfFromDb DsReconstruction::m_readDb [private]

Definition at line 59 of file DsReconstruction.h.

Referenced by execute().

bool DsReconstruction::m_usecalibBeamE [private]

Definition at line 57 of file DsReconstruction.h.

Referenced by DsReconstruction(), and execute().

bool DsReconstruction::m_usevertexfit [private]

Definition at line 58 of file DsReconstruction.h.

Referenced by DsReconstruction(), and execute().


Generated on Tue Nov 29 23:18:30 2016 for BOSS_7.0.2 by  doxygen 1.4.7