NeutralDReconstruction Class Reference

#include <NeutralDReconstruction.h>

List of all members.

Public Member Functions

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

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 NeutralDReconstruction.h.


Constructor & Destructor Documentation

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

Definition at line 57 of file NeutralDReconstruction.cxx.

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

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


Member Function Documentation

StatusCode NeutralDReconstruction::execute (  ) 

Definition at line 114 of file NeutralDReconstruction.cxx.

References chanlist, EvtRecVeeVertex::daughter(), dc_fill(), Bes_Common::DEBUG, CDCandidate::decay(), ebeam, ecmsSvc, eptoPiPiEtaSelector, eptoRhoGamSelector, etatoGGSelector, EventModel::EvtRec::EvtRecDTagCol, EventModel::EvtRec::EvtRecEvent, EventModel::EvtRec::EvtRecTrackCol, Bes_Common::FATAL, ReadBeamInfFromDb::getbeamE(), ReadBeamInfFromDb::getbeta(), IMeasuredEcmsSvc::getInfo(), IMeasuredEcmsSvc::getPx(), IMeasuredEcmsSvc::getPy(), IMeasuredEcmsSvc::getPz(), EvtRecEtaToGG::hiEnGamma(), genRecEmupikp::i, Bes_Common::INFO, IMeasuredEcmsSvc::isReadDBValid(), IMeasuredEcmsSvc::isRunNoValid(), IVertexDbSvc::isVertexValid(), kaonSelector, EvtRecDTag::kD0toKK, EvtRecDTag::kD0toKKPi0, EvtRecDTag::kD0toKKPi0Pi0, EvtRecDTag::kD0toKKPiPi, EvtRecDTag::kD0toKKPiPiPi0, EvtRecDTag::kD0toKPi, EvtRecDTag::kD0toKPiEta, EvtRecDTag::kD0toKPiPi0, EvtRecDTag::kD0toKPiPi0Pi0, EvtRecDTag::kD0toKPiPiPi, EvtRecDTag::kD0toKPiPiPiPi0, EvtRecDTag::kD0toKsEPPiPiEta, EvtRecDTag::kD0toKsEPRhoGam, EvtRecDTag::kD0toKsEta, EvtRecDTag::kD0toKsKK, EvtRecDTag::kD0toKsKPi, EvtRecDTag::kD0toKsKPiPi0, EvtRecDTag::kD0toKsKs, EvtRecDTag::kD0toKsKsKs, EvtRecDTag::kD0toKsKsPi0, EvtRecDTag::kD0toKsKsPiPi, EvtRecDTag::kD0toKsPi0, EvtRecDTag::kD0toKsPi0Eta, EvtRecDTag::kD0toKsPi0Pi0, EvtRecDTag::kD0toKsPi0Pi0Pi0, EvtRecDTag::kD0toKsPiPi, EvtRecDTag::kD0toKsPiPiPi0, EvtRecDTag::kD0toKsPiPiPiPi, EvtRecDTag::kD0toPi0Pi0, EvtRecDTag::kD0toPi0Pi0Pi0, EvtRecDTag::kD0toPiPi, EvtRecDTag::kD0toPiPiPi0, EvtRecDTag::kD0toPiPiPi0Pi0, EvtRecDTag::kD0toPiPiPiPi, EvtRecDTag::kD0toPiPiPiPiPi0, ksSelector, 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(), neutralDSelector, 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, saveD0Info(), savetrack(), utility::SecondaryVFit(), NeutralDSelector::setbeta(), ReadBeamInfFromDb::setcalib(), NeutralDSelector::setebeam(), LocalKaonSelector::setpidtype(), LocalPionSelector::setpidtype(), dchain::CandidateList< CandidateClass >::size(), deljobs::string, CDCandidate::track(), EvtRecTrack::trackId(), and utility::vfit().

00114                                            {
00115   MsgStream log(msgSvc(), name());
00116   log << MSG::INFO << "in execute()" << endreq;
00117 
00118   StatusCode sc;
00119 
00121   // Read REC data
00123   SmartDataPtr<Event::EventHeader> eventHeader(eventSvc(),"/Event/EventHeader");
00124   int event= eventHeader->eventNumber();
00125   // if ( m_debug || ( (event & 0x3FF) == 0 ) )
00126   //std::cout << "event: " << event << std::endl;
00127 
00128   SmartDataPtr<EvtRecEvent> recEvent(eventSvc(), EventModel::EvtRec::EvtRecEvent);
00129   SmartDataPtr<EvtRecTrackCol> recTrackCol(eventSvc(), EventModel::EvtRec::EvtRecTrackCol);
00130   log << MSG::DEBUG << "run and event = " << eventHeader->runNumber()
00131                                         << " " << eventHeader->eventNumber() << endreq;
00132   log << MSG::DEBUG <<"ncharg, nneu, tottks = "
00133           << recEvent->totalCharged() << " , "
00134           << recEvent->totalNeutral() << " , "
00135       << recEvent->totalTracks() <<endreq;
00136   
00137   EvtRecTrackIterator charged_begin = recTrackCol->begin();
00138   EvtRecTrackIterator charged_end = charged_begin + recEvent->totalCharged();
00139 
00140   EvtRecTrackIterator neutral_begin = recTrackCol->begin()+recEvent->totalCharged();
00141   EvtRecTrackIterator neutral_end = recTrackCol->begin()+recEvent->totalTracks();
00142 
00143   
00144   SmartDataPtr<EvtRecPi0Col> recPi0Col(eventSvc(), "/Event/EvtRec/EvtRecPi0Col");
00145   if ( ! recPi0Col ) {
00146     log << MSG::FATAL << "Could not find EvtRecPi0Col" << endreq;
00147     return StatusCode::FAILURE;
00148   }
00149 
00150 
00151   
00152   SmartDataPtr<EvtRecEtaToGGCol> recEtaToGGCol(eventSvc(), "/Event/EvtRec/EvtRecEtaToGGCol");
00153   if ( ! recEtaToGGCol ) {
00154     log << MSG::FATAL << "Could not find EvtRecEtaToGGCol" << endreq;
00155     return StatusCode::FAILURE;
00156   }
00157   
00158 
00159   SmartDataPtr<EvtRecVeeVertexCol> recVeeVertexCol(eventSvc(), "/Event/EvtRec/EvtRecVeeVertexCol");
00160    if ( ! recVeeVertexCol ) {
00161      log << MSG::FATAL << "Could not find EvtRecVeeVertexCol" << endreq;
00162      return StatusCode::FAILURE;
00163    }
00164    
00165 
00166   SmartDataPtr<EvtRecDTagCol> recDTagCol(eventSvc(), EventModel::EvtRec::EvtRecDTagCol);
00167   if (!recDTagCol) {
00168     log << MSG::FATAL << "EvtRecDTagCol is not registered in TDS" << endreq;
00169     return StatusCode::FAILURE;
00170   }
00171   
00172   //get primary vertex from db
00173   Hep3Vector xorigin(0,0,0);
00174   IVertexDbSvc*  vtxsvc;
00175   Gaudi::svcLocator()->service("VertexDbSvc", vtxsvc);
00176   if (vtxsvc->isVertexValid()) {
00177     
00178     //vertex[0] = vx; vertex[1]= vy; vertex[2] = vz;
00179     double* vertex = vtxsvc->PrimaryVertex();
00180     xorigin.setX(vertex[0]);
00181     xorigin.setY(vertex[1]);
00182     xorigin.setZ(vertex[2]);
00183   }
00184   utility util;
00185 
00186 
00187   
00188   //registered in the parent file DTag.cxx
00189   /*
00190     if (!recDTagCol) {
00191     recDTagCol = new EvtRecDTagCol;
00192     sc = registerEvtRecDTagCol(recDTagCol, log);
00193     if (sc != StatusCode::SUCCESS) {
00194     return sc;
00195     }
00196     }
00197   */
00198   
00200   //reconstruct particle lists
00202   
00203   pionSelector.setpidtype(0);
00204   kaonSelector.setpidtype(0);
00205   CDChargedPionList pionList(charged_begin, charged_end, pionSelector);
00206   CDChargedKaonList kaonList(charged_begin, charged_end, kaonSelector);
00207   CDPhotonList      photonList(neutral_begin, neutral_end, photonSelector);
00208 
00209   CDKsList          ksList(ksSelector);
00210   dc_fill(ksList,  recVeeVertexCol->begin(), recVeeVertexCol->end());
00211 
00212   // do a secondary vertex fit and cut on the results
00213   map<EvtRecVeeVertex*, vector< double > > fitinfo;
00214   for( CDKsList::iterator ksit = ksList.particle_begin(); ksit != ksList.particle_end(); ++ksit ){
00215     EvtRecVeeVertex* ks = const_cast<EvtRecVeeVertex*>( (*ksit).particle().navKshort() );
00216     fitinfo[ks] = util.SecondaryVFit(ks, vtxsvc);
00217   }
00218 
00219   CDPi0List         pi0List(pi0Selector);
00220   dc_fill(pi0List, recPi0Col->begin(), recPi0Col->end());
00221 
00222   CDEtaList         etaList(etatoGGSelector);
00223   dc_fill(etaList, recEtaToGGCol->begin(), recEtaToGGCol->end());
00224   
00225   
00226   //pion/kaon list with PID
00227   pionSelector.setpidtype(1);
00228   kaonSelector.setpidtype(1);
00229   CDChargedPionList pionList_tight(charged_begin, charged_end, pionSelector);
00230   CDChargedKaonList kaonList_tight(charged_begin, charged_end, kaonSelector);
00231 
00232   int run  = eventHeader->runNumber();
00233   m_ievt  = eventHeader->eventNumber();
00234   m_nChrg = recEvent->totalCharged();
00235   m_nNeu  = recEvent->totalNeutral();
00236   m_nPion = pionList.size();
00237   m_nKaon = kaonList.size();
00238   m_nPi0  = pi0List.size();
00239   m_nKs   = ksList.size();
00240   
00242   // get beam energy and beta 
00244   
00245         //==============================Wu Lianjin adds
00246         if(m_RdMeasuredEcms&&m_irun!=run){
00247     if(ecmsSvc->isReadDBValid(run)) m_beamE=ecmsSvc->getInfo(run);
00248     if(ecmsSvc->isRunNoValid(run)){
00249       m_beta.setX(ecmsSvc->getPx(run));
00250       m_beta.setY(ecmsSvc->getPy(run));
00251       m_beta.setZ(ecmsSvc->getPz(run));
00252     }
00253   }
00254         log << MSG::INFO << "MeasuredEcmsSvc: " <<m_beamE<< endreq;
00255         //===============================
00256 
00257   if(m_ReadBeamEFromDB && m_irun!=run){
00258     m_irun=run;
00259     if(m_usecalibBeamE)
00260       m_readDb.setcalib(true);
00261     m_beamE=m_readDb.getbeamE(m_irun, m_beamE);
00262     if(run>0)
00263       m_beta=m_readDb.getbeta();
00264     
00265     //cout<<"use beam E from data base:"<<m_beamE<<endl;
00266   }
00267   double ebeam=m_beamE;
00268   
00270   //reconstruct decay lists
00272   
00273 
00274   
00275   for(int list=0;list<chanlist.size();list++){
00276  
00277     string channel=chanlist[list];
00278     vector<int> numchan;
00279     neutralDSelector.setebeam(ebeam);
00280     neutralDSelector.setbeta(m_beta);
00281     CDDecayList decaylist(neutralDSelector);
00282     
00283     bool isFlavorMode=false;
00284     
00285     //K+/-: 1, Pi+/-:2,  Pi0:3, Eta: 4, Ks:5, Eta'(pipiEta):6, Eta'(rhogam):7
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     //the first particle in the vector will be used to get charm
00289     
00290     if(channel=="D0toKPi") {
00291       numchan.push_back( EvtRecDTag::kD0toKPi );
00292       numchan.push_back(1);
00293       numchan.push_back(2);
00294       decaylist=kaonList.minus() * pionList.plus();
00295       isFlavorMode=true;
00296     }
00297     else if(channel=="D0toKPiPi0"){
00298       numchan.push_back( EvtRecDTag::kD0toKPiPi0);
00299       numchan.push_back(1);
00300       numchan.push_back(2);
00301       numchan.push_back(3);
00302       decaylist=kaonList.minus() * pionList.plus() * pi0List;
00303       isFlavorMode=true;
00304     }
00305     else if(channel=="D0toKPiPi0Pi0"){
00306       numchan.push_back( EvtRecDTag::kD0toKPiPi0Pi0);
00307       numchan.push_back(1);
00308       numchan.push_back(2);
00309       numchan.push_back(3);
00310       numchan.push_back(3);
00311       decaylist=kaonList.minus() * pionList.plus() * pi0List * pi0List;
00312       isFlavorMode=true;
00313     }
00314     else if(channel=="D0toKPiPiPi"){
00315       numchan.push_back( EvtRecDTag::kD0toKPiPiPi);
00316       numchan.push_back(1);
00317       numchan.push_back(2);
00318       numchan.push_back(2);
00319       numchan.push_back(2);
00320       decaylist=kaonList.minus()* pionList.plus()* pionList.plus() * pionList.minus();
00321       isFlavorMode=true;
00322     }
00323     else if(channel=="D0toKPiPiPiPi0"){
00324       numchan.push_back( EvtRecDTag::kD0toKPiPiPiPi0);
00325       numchan.push_back(1);
00326       numchan.push_back(2);
00327       numchan.push_back(2);
00328       numchan.push_back(2);
00329       numchan.push_back(3);
00330       decaylist=kaonList.minus()* pionList.plus()* pionList.plus()* pionList.minus()* pi0List;
00331       isFlavorMode=true;
00332     }
00333     else if(channel=="D0toKPiEta"){
00334       numchan.push_back( EvtRecDTag::kD0toKPiEta);
00335       numchan.push_back(1);
00336       numchan.push_back(2);
00337       numchan.push_back(4);
00338       decaylist=kaonList.minus() * pionList.plus() * etaList;
00339       isFlavorMode=true;
00340     }
00341     else if(channel=="D0toKsKPi"){
00342       numchan.push_back( EvtRecDTag::kD0toKsKPi);
00343       numchan.push_back(5);
00344       numchan.push_back(1);
00345       numchan.push_back(2);
00346       decaylist=ksList* kaonList.minus()* pionList.plus();
00347     }
00348     else if(channel=="D0toKsKPiPi0"){
00349       numchan.push_back( EvtRecDTag::kD0toKsKPiPi0);
00350       numchan.push_back(5);
00351       numchan.push_back(1);
00352       numchan.push_back(2);
00353       numchan.push_back(3);
00354       decaylist=ksList* kaonList.minus() * pionList.plus()* pi0List;
00355     }
00356     else if(channel=="D0toKsPiPi"){
00357       numchan.push_back( EvtRecDTag::kD0toKsPiPi);
00358       numchan.push_back(5);
00359       numchan.push_back(2);
00360       numchan.push_back(2);
00361       decaylist=ksList* pionList.plus()* pionList.minus();
00362     }
00363     else if(channel=="D0toKsPiPiPi0"){
00364       numchan.push_back( EvtRecDTag::kD0toKsPiPiPi0);
00365       numchan.push_back(5);
00366       numchan.push_back(2);
00367       numchan.push_back(2);
00368       numchan.push_back(3);
00369       decaylist=ksList* pionList.plus()* pionList.minus()* pi0List;
00370     }
00371     else if(channel=="D0toKsPi0"){
00372       numchan.push_back( EvtRecDTag::kD0toKsPi0);
00373       numchan.push_back(5);
00374       numchan.push_back(3);
00375       decaylist=ksList* pi0List;
00376     }
00377     else if(channel=="D0toPiPiPi0"){
00378       numchan.push_back( EvtRecDTag::kD0toPiPiPi0);
00379       numchan.push_back(2);
00380       numchan.push_back(2);
00381       numchan.push_back(3);
00382       decaylist=pionList.plus()* pionList.minus()* pi0List;
00383     }
00384     else if(channel=="D0toPiPi"){
00385       numchan.push_back( EvtRecDTag::kD0toPiPi);
00386       numchan.push_back(2);
00387       numchan.push_back(2);
00388       decaylist=pionList.plus()* pionList.minus(); 
00389     }
00390     else if(channel=="D0toKK"){
00391       numchan.push_back( EvtRecDTag::kD0toKK);
00392       numchan.push_back(1);
00393       numchan.push_back(1);
00394       decaylist=kaonList.minus()* kaonList.plus(); 
00395     }
00396     else if(channel=="D0toKKPi0"){
00397       numchan.push_back( EvtRecDTag::kD0toKKPi0);
00398       numchan.push_back(1);
00399       numchan.push_back(1);
00400       numchan.push_back(3);
00401       decaylist=kaonList.minus()* kaonList.plus()* pi0List; 
00402     }
00403     else if(channel=="D0toPi0Pi0"){
00404       numchan.push_back( EvtRecDTag::kD0toPi0Pi0);
00405       numchan.push_back(3);
00406       numchan.push_back(3);
00407       decaylist=pi0List* pi0List; 
00408     }
00409     else if(channel=="D0toKsKs"){
00410       numchan.push_back( EvtRecDTag::kD0toKsKs);
00411       numchan.push_back(5);
00412       numchan.push_back(5);
00413       decaylist=ksList* ksList;
00414     }
00415     else if(channel=="D0toKsKsPi0"){
00416       numchan.push_back( EvtRecDTag::kD0toKsKsPi0);
00417       numchan.push_back(5);
00418       numchan.push_back(5);
00419       numchan.push_back(3);
00420       decaylist=ksList* ksList* pi0List;
00421     }
00422     else if(channel=="D0toKsPi0Pi0"){
00423       numchan.push_back( EvtRecDTag::kD0toKsPi0Pi0);
00424       numchan.push_back(5);
00425       numchan.push_back(3);
00426       numchan.push_back(3);
00427       decaylist=ksList* pi0List* pi0List;
00428     }
00429     else if(channel=="D0toKsKK"){
00430       numchan.push_back( EvtRecDTag::kD0toKsKK);
00431       numchan.push_back(5);
00432       numchan.push_back(1);
00433       numchan.push_back(1);
00434       decaylist=ksList* kaonList.minus()* kaonList.plus();
00435     }
00436     else if(channel=="D0toKsEta"){
00437       numchan.push_back( EvtRecDTag::kD0toKsEta);
00438       numchan.push_back(5);
00439       numchan.push_back(4);
00440       decaylist=ksList* etaList;
00441     }
00442     else if(channel=="D0toPi0Pi0Pi0"){
00443       numchan.push_back( EvtRecDTag::kD0toPi0Pi0Pi0);
00444       numchan.push_back(3);
00445       numchan.push_back(3);
00446       numchan.push_back(3);
00447       decaylist=pi0List* pi0List* pi0List;
00448     }
00449     else if(channel=="D0toKsKsKs"){
00450       numchan.push_back( EvtRecDTag::kD0toKsKsKs);
00451       numchan.push_back(5);
00452       numchan.push_back(5);
00453       numchan.push_back(5);
00454       decaylist=ksList* ksList* ksList;
00455     }
00456     else if(channel=="D0toPiPiPiPi"){
00457       numchan.push_back( EvtRecDTag::kD0toPiPiPiPi);
00458       numchan.push_back(2);
00459       numchan.push_back(2);
00460       numchan.push_back(2);
00461       numchan.push_back(2);
00462       decaylist=pionList.plus()* pionList.plus()* pionList.minus()* pionList.minus();
00463     }
00464     else if(channel=="D0toPiPiPi0Pi0"){
00465       numchan.push_back( EvtRecDTag::kD0toPiPiPi0Pi0);
00466       numchan.push_back(2);
00467       numchan.push_back(2);
00468       numchan.push_back(3);
00469       numchan.push_back(3);
00470       decaylist=pionList.plus()* pionList.minus()* pi0List* pi0List;
00471     }
00472     else if(channel=="D0toKKPiPi"){
00473       numchan.push_back( EvtRecDTag::kD0toKKPiPi);
00474       numchan.push_back(1);
00475       numchan.push_back(1);
00476       numchan.push_back(2);
00477       numchan.push_back(2);
00478       decaylist=kaonList.minus()* kaonList.plus()* pionList.plus()* pionList.minus();
00479     }
00480     else if(channel=="D0toKKPi0Pi0"){
00481       numchan.push_back( EvtRecDTag::kD0toKKPi0Pi0);
00482       numchan.push_back(1);
00483       numchan.push_back(1);
00484       numchan.push_back(3);
00485       numchan.push_back(3);
00486       decaylist=kaonList.minus()* kaonList.plus()* pi0List* pi0List;
00487     }
00488     else if(channel=="D0toKsKsPiPi"){
00489       numchan.push_back( EvtRecDTag::kD0toKsKsPiPi);
00490       numchan.push_back(5);
00491       numchan.push_back(5);
00492       numchan.push_back(2);
00493       numchan.push_back(2);
00494       decaylist=ksList* ksList* pionList.plus()* pionList.minus();
00495     }
00496     else if(channel=="D0toPiPiPiPiPi0"){
00497       numchan.push_back( EvtRecDTag::kD0toPiPiPiPiPi0);
00498       numchan.push_back(2);
00499       numchan.push_back(2);
00500       numchan.push_back(2);
00501       numchan.push_back(2);
00502       numchan.push_back(3);
00503       decaylist=pionList.plus()* pionList.plus()* pionList.minus()* pionList.minus()* pi0List;
00504     }
00505     else if(channel=="D0toKsPiPiPiPi"){
00506       numchan.push_back( EvtRecDTag::kD0toKsPiPiPiPi);
00507       numchan.push_back(5);
00508       numchan.push_back(2);
00509       numchan.push_back(2);
00510       numchan.push_back(2);
00511       numchan.push_back(2);
00512       decaylist=ksList* pionList.plus()* pionList.plus()* pionList.minus()* pionList.minus();
00513     }
00514     else if(channel=="D0toKKPiPiPi0"){
00515       numchan.push_back( EvtRecDTag::kD0toKKPiPiPi0);
00516       numchan.push_back(1);
00517       numchan.push_back(1);
00518       numchan.push_back(2);
00519       numchan.push_back(2);
00520       numchan.push_back(3);
00521       decaylist=kaonList.minus()* kaonList.plus()* pionList.plus()* pionList.minus()* pi0List;
00522     }
00523     else if(channel=="D0toKsPi0Eta"){
00524       numchan.push_back( EvtRecDTag::kD0toKsPi0Eta);
00525       numchan.push_back(5);
00526       numchan.push_back(3);
00527       numchan.push_back(4);
00528       decaylist=ksList* pi0List* etaList;
00529     }
00530     else if(channel=="D0toKsEPPiPiEta"){
00531       numchan.push_back( EvtRecDTag::kD0toKsEPPiPiEta);
00532       numchan.push_back(5);
00533       numchan.push_back(6);
00534       CDDecayList epList(eptoPiPiEtaSelector);
00535       epList=pionList.plus()* pionList.minus()* etaList;
00536       decaylist= ksList* epList;
00537     }
00538     else if(channel=="D0toKsEPRhoGam"){
00539       numchan.push_back( EvtRecDTag::kD0toKsEPRhoGam);
00540       numchan.push_back(5);
00541       numchan.push_back(7);
00542       CDDecayList rhoList(rhotoPiPiSelector);
00543       rhoList=pionList.plus()* pionList.minus();
00544       CDDecayList epList(eptoRhoGamSelector);
00545       epList=rhoList* photonList;
00546       decaylist= ksList* epList;
00547     }
00548     else if(channel=="D0toKsPi0Pi0Pi0"){
00549       numchan.push_back( EvtRecDTag::kD0toKsPi0Pi0Pi0);
00550       numchan.push_back(5);
00551       numchan.push_back(3);
00552       numchan.push_back(3);
00553       numchan.push_back(3);
00554       decaylist=ksList* pi0List* pi0List* pi0List;
00555     }
00556     
00557 
00558     CDDecayList::iterator D_begin =decaylist.particle_begin();
00559     CDDecayList::iterator D_end   =decaylist.particle_end();
00560     
00561     for ( CDDecayList::iterator it = D_begin; it != D_end; it++ ) {
00562       
00563       EvtRecDTag* recDTag = new EvtRecDTag;
00564       recDTag->setdecayMode( (EvtRecDTag::DecayMode)numchan[0] );
00565      
00566       
00567       vector<int> trackid, showerid;
00568       vector<int> kaonid, pionid;
00569       int charm=0;
00570       int numofchildren=numchan.size()-1;
00571       
00572       for(int i=0; i< numofchildren;i++){
00573         
00574         const CDCandidate& daughter=(*it).particle().child(i);
00575         if(isFlavorMode && i==0)
00576           charm=-daughter.charge();
00577         
00578         if(numchan[i+1]==1){
00579           const EvtRecTrack* track=daughter.track();
00580           trackid.push_back(track->trackId());
00581           kaonid.push_back(track->trackId());
00582         }
00583         else if(numchan[i+1]==2){
00584           const EvtRecTrack* track=daughter.track();
00585           trackid.push_back(track->trackId());
00586           pionid.push_back(track->trackId());
00587         }
00588         else if ( numchan[i+1]==3){
00589           const EvtRecTrack* hiEnGamma=daughter.navPi0()->hiEnGamma();
00590           const EvtRecTrack* loEnGamma=daughter.navPi0()->loEnGamma();
00591           showerid.push_back(hiEnGamma->trackId());
00592           showerid.push_back(loEnGamma->trackId());
00593         }
00594         else if ( numchan[i+1]==4){
00595           const EvtRecTrack* hiEnGamma=daughter.navEta()->hiEnGamma();
00596           const EvtRecTrack* loEnGamma=daughter.navEta()->loEnGamma();
00597           showerid.push_back(hiEnGamma->trackId());
00598           showerid.push_back(loEnGamma->trackId());
00599         }
00600         else if ( numchan[i+1]==5){
00601           EvtRecVeeVertex* aKsCand = const_cast<EvtRecVeeVertex*>( daughter.navKshort() );
00602           // fill fit info
00603           recDTag->addToFitInfo(aKsCand->mass(),fitinfo[aKsCand][0],fitinfo[aKsCand][1],fitinfo[aKsCand][2]);
00604           // fill tracks
00605           EvtRecTrack* pion1Trk = aKsCand->daughter(0);
00606           EvtRecTrack* pion2Trk = aKsCand->daughter(1);    
00607           trackid.push_back(pion1Trk->trackId());
00608           trackid.push_back(pion2Trk->trackId());
00609         }
00610         else if (numchan[i+1]==6){
00611           const CDCandidate& apion = daughter.decay().child(0);
00612           const CDCandidate& spion = daughter.decay().child(1);
00613           const CDCandidate& eta = daughter.decay().child(2);
00614           const EvtRecTrack* apiontrk = apion.track();
00615           const EvtRecTrack* spiontrk = spion.track();
00616           const EvtRecTrack* hiEnGamma=eta.navEta()->hiEnGamma();
00617           const EvtRecTrack* loEnGamma=eta.navEta()->loEnGamma();
00618           
00619           trackid.push_back(apiontrk->trackId());
00620           trackid.push_back(spiontrk->trackId());
00621           showerid.push_back(hiEnGamma->trackId());
00622           showerid.push_back(loEnGamma->trackId());
00623           
00624         }
00625         else if (numchan[i+1]==7){
00626           const CDCandidate& rho = daughter.decay().child(0);
00627           const CDCandidate& gamma = daughter.decay().child(1);  
00628           const CDCandidate& apion = rho.decay().child(0);
00629           const CDCandidate& spion = rho.decay().child(1);
00630           
00631           
00632           const EvtRecTrack* apiontrk = apion.track();
00633           const EvtRecTrack* spiontrk = spion.track();
00634           const EvtRecTrack* gammatrk = gamma.photon();
00635           
00636           
00637           trackid.push_back(apiontrk->trackId());
00638           trackid.push_back(spiontrk->trackId());
00639           showerid.push_back(gammatrk->trackId());
00640 
00641         }
00642         
00643 
00644       }//end of filling track and shower ids
00645       
00646             
00647       saveD0Info(it, ebeam, charm, numofchildren, recDTag);
00648       savetrack(trackid,showerid,charged_begin,charged_end,neutral_begin,neutral_end,recDTag);
00649       pidtag(kaonid,pionid,kaonList_tight, pionList_tight,recDTag);
00650       
00651       if(m_usevertexfit){
00652         HepLorentzVector p4change_vfit=util.vfit(channel, kaonid,  pionid, xorigin, charged_begin);
00653         recDTag->setp4(recDTag->p4()+p4change_vfit);
00654       }
00655 
00656       
00657       trackid.clear();
00658       showerid.clear();
00659       kaonid.clear();
00660       pionid.clear();
00661 
00662       
00663       //write recdtag out
00664       recDTagCol->push_back(recDTag);
00665       
00666     } //end of decay list iterator
00667     
00668     numchan.clear();
00669     
00670   } //end of reconstrucing all D0 decay lists
00671 
00672     
00673   return StatusCode::SUCCESS;
00674 }

StatusCode NeutralDReconstruction::finalize (  ) 

Definition at line 94 of file NeutralDReconstruction.cxx.

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

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

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

Definition at line 814 of file NeutralDReconstruction.cxx.

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

Referenced by initialize().

00814                                                                {
00815 
00816   string channel;
00817   vector<string> temp;
00818   
00819   ifstream inFile;
00820  
00821   inFile.open(filename.c_str());
00822   if (!inFile) {
00823     cout << "Unable to open decay list file";
00824     exit(1); // terminate with error
00825   }
00826     
00827   while (inFile >> channel) {
00828     temp.push_back(channel);
00829   }
00830     
00831   inFile.close();
00832   
00833   return temp;
00834   
00835 }

StatusCode NeutralDReconstruction::initialize (  ) 

Definition at line 70 of file NeutralDReconstruction.cxx.

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

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

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

Definition at line 757 of file NeutralDReconstruction.cxx.

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

Referenced by execute().

00757                                                                                                                                                        {
00758 
00759   bool iskaon=false,ispion=false;
00760   
00761   
00762   // save track ids which passed pion/kaon cuts
00763 
00764   for (CDChargedKaonList::iterator kit = kaonList.particle_begin(); kit != kaonList.particle_end(); kit++) {
00765     recDTag->addKaonId( (*kit).particle().track() );
00766   }
00767 
00768   for (CDChargedPionList::iterator pit = pionList.particle_begin(); pit != pionList.particle_end(); pit++) {
00769     recDTag->addPionId( (*pit).particle().track() );
00770   }
00771   
00772 
00773 
00774   /*
00775   for(int i=0; i<kaonid.size(); i++){
00776     bool ithkaon=false;
00777     for (CDChargedKaonList::iterator kit = kaonList.particle_begin(); kit != kaonList.particle_end(); kit++) {
00778       if((*kit).particle().track()->trackId()==kaonid[i]){
00779         ithkaon=true;
00780         break;
00781       }
00782     }
00783     if(!ithkaon) break;
00784     if(i==kaonid.size()-1)
00785       iskaon=true;
00786   }
00787 
00788   for(int i=0; i<pionid.size(); i++){
00789     bool ithpion=false;
00790     for (CDChargedPionList::iterator pit = pionList.particle_begin(); pit != pionList.particle_end(); pit++) {
00791       if((*pit).particle().track()->trackId()==pionid[i]){
00792         ithpion=true;
00793         break;
00794       }
00795     }
00796     if(!ithpion) break;
00797     if(i==pionid.size()-1)
00798       ispion=true;
00799   }
00800   
00801 
00802   if( iskaon && ispion)
00803     recDTag->settype( EvtRecDTag::Tight );
00804   else if( (kaonid.size()==0 && ispion) || (pionid.size()==0 && iskaon))
00805     recDTag->settype( EvtRecDTag::Tight );
00806   else if( kaonid.size()==0 && pionid.size()==0 )
00807     recDTag->settype( EvtRecDTag::Tight );
00808   */
00809 
00810 }

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

Definition at line 103 of file NeutralDReconstruction.cxx.

References Bes_Common::FATAL.

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

void NeutralDReconstruction::saveD0Info ( CDDecayList::iterator  ,
double  ,
int  ,
int  ,
EvtRecDTag  
)

Definition at line 676 of file NeutralDReconstruction.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(), add_one_line::tag, and EvtRecDTag::Tight.

Referenced by execute().

00676                                                                                                                                {
00677 
00678   double mass = (*it).particle().mass();
00679   HepLorentzVector p4((*it).particle().momentum(), (*it).particle().energy());
00680   recDTag->setp4(p4);
00681   
00682   p4.boost(-m_beta);
00683   double mbc2_CMS = ebeam*ebeam - p4.v().mag2();
00684   double mbc_CMS = mbc2_CMS > 0 ? sqrt( mbc2_CMS ) : -10;
00685   double deltaE_CMS = p4.t() - ebeam;
00686   
00687   int tag=(*it).particle().userTag();
00688   if(tag==1)
00689     recDTag->settype( EvtRecDTag::Tight );
00690   else
00691     recDTag->settype( EvtRecDTag::Loose );
00692   recDTag->setcharge(0);
00693   recDTag->setcharm(charm);
00694   recDTag->setnumOfChildren(numofchildren);
00695   recDTag->setmass(mass);
00696   recDTag->setmBC(mbc_CMS);
00697   recDTag->setbeamE(ebeam);
00698   recDTag->setdeltaE(deltaE_CMS);
00699   
00700 }

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

Definition at line 702 of file NeutralDReconstruction.cxx.

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

Referenced by execute().

00703                                                                                                                              {
00704 
00705   vector<EvtRecTrackIterator> trktemp;
00706   vector<EvtRecTrackIterator> shrtemp;
00707  
00708   //fill tracks
00709   for(EvtRecTrackIterator trk=charged_begin; trk<charged_end;trk++){
00710 
00711     bool isothertrack=true;
00712     for(int i=0; i<trackid.size(); i++){
00713       if( (*trk)->trackId()==trackid[i] ){
00714         trktemp.push_back(trk);
00715         isothertrack=false;
00716         break;
00717       }
00718     }
00719     if(isothertrack)
00720       recDTag->addOtherTrack(*trk);
00721   }
00722   for(int i=0; i<trackid.size();i++){
00723     for(int j=0; j<trktemp.size(); j++){
00724       EvtRecTrackIterator trk=trktemp[j];
00725       if( (*trk)->trackId()==trackid[i])
00726         recDTag->addTrack(*trktemp[j]);
00727     }
00728   }
00729 
00730   
00731   //fill showers
00732   for(EvtRecTrackIterator shr=neutral_begin; shr<neutral_end;shr++){
00733     bool isothershower=true;
00734     for(int i=0; i<showerid.size(); i++){
00735       if( (*shr)->trackId()==showerid[i] ){
00736         shrtemp.push_back(shr);
00737         isothershower=false;
00738         break;
00739       }
00740     }
00741     if(isothershower)
00742       recDTag->addOtherShower(*shr);
00743   }
00744 
00745   for(int i=0; i<showerid.size();i++){
00746     for(int j=0; j<shrtemp.size(); j++){
00747       EvtRecTrackIterator shr=shrtemp[j];
00748       if( (*shr)->trackId()==showerid[i])
00749         recDTag->addShower(*shrtemp[j]);
00750     }
00751   }
00752   
00753   
00754 }


Member Data Documentation

vector<string> NeutralDReconstruction::chanlist [private]

Definition at line 52 of file NeutralDReconstruction.h.

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

IMeasuredEcmsSvc* NeutralDReconstruction::ecmsSvc [private]

Definition at line 60 of file NeutralDReconstruction.h.

Referenced by execute(), and initialize().

double NeutralDReconstruction::m_beamE [private]

Definition at line 54 of file NeutralDReconstruction.h.

Referenced by execute(), and NeutralDReconstruction().

Hep3Vector NeutralDReconstruction::m_beta [private]

Definition at line 55 of file NeutralDReconstruction.h.

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

bool NeutralDReconstruction::m_debug [private]

Definition at line 40 of file NeutralDReconstruction.h.

Referenced by NeutralDReconstruction().

string NeutralDReconstruction::m_decaylist [private]

Definition at line 51 of file NeutralDReconstruction.h.

Referenced by initialize(), and NeutralDReconstruction().

int NeutralDReconstruction::m_ievt [private]

Definition at line 43 of file NeutralDReconstruction.h.

Referenced by execute().

int NeutralDReconstruction::m_irun [private]

Definition at line 42 of file NeutralDReconstruction.h.

Referenced by execute(), and initialize().

int NeutralDReconstruction::m_nChrg [private]

Definition at line 44 of file NeutralDReconstruction.h.

Referenced by execute().

int NeutralDReconstruction::m_nKaon [private]

Definition at line 47 of file NeutralDReconstruction.h.

Referenced by execute().

int NeutralDReconstruction::m_nKs [private]

Definition at line 49 of file NeutralDReconstruction.h.

Referenced by execute().

int NeutralDReconstruction::m_nNeu [private]

Definition at line 45 of file NeutralDReconstruction.h.

Referenced by execute().

int NeutralDReconstruction::m_nPi0 [private]

Definition at line 48 of file NeutralDReconstruction.h.

Referenced by execute().

int NeutralDReconstruction::m_nPion [private]

Definition at line 46 of file NeutralDReconstruction.h.

Referenced by execute().

bool NeutralDReconstruction::m_RdMeasuredEcms [private]

Definition at line 61 of file NeutralDReconstruction.h.

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

bool NeutralDReconstruction::m_ReadBeamEFromDB [private]

Definition at line 56 of file NeutralDReconstruction.h.

Referenced by execute(), and NeutralDReconstruction().

ReadBeamInfFromDb NeutralDReconstruction::m_readDb [private]

Definition at line 59 of file NeutralDReconstruction.h.

Referenced by execute().

bool NeutralDReconstruction::m_usecalibBeamE [private]

Definition at line 57 of file NeutralDReconstruction.h.

Referenced by execute(), and NeutralDReconstruction().

bool NeutralDReconstruction::m_usevertexfit [private]

Definition at line 58 of file NeutralDReconstruction.h.

Referenced by execute(), and NeutralDReconstruction().


Generated on Tue Nov 29 23:20:38 2016 for BOSS_7.0.2 by  doxygen 1.4.7