00124 {
00125
00126 MsgStream log(msgSvc(), name());
00127 log << MSG::INFO << "in execute()" << endreq;
00128
00129
00130
00131
00132 setFilterPassed(false);
00133
00134 SmartDataPtr<Event::EventHeader> eventHeader(eventSvc(),"/Event/EventHeader");
00135 m_runNo=eventHeader->runNumber();
00136 m_event=eventHeader->eventNumber();
00137 log << MSG::DEBUG <<"run, evtnum = "
00138 << m_runNo << " , "
00139 << m_event <<endreq;
00140
00141
00142 SmartDataPtr<EvtRecEvent> evtRecEvent(eventSvc(), EventModel::EvtRec::EvtRecEvent);
00143 log << MSG::DEBUG <<"ncharg, nneu, tottks = "
00144 << evtRecEvent->totalCharged() << " , "
00145 << evtRecEvent->totalNeutral() << " , "
00146 << evtRecEvent->totalTracks() <<endreq;
00147
00148 SmartDataPtr<EvtRecTrackCol> evtRecTrkCol(eventSvc(), EventModel::EvtRec::EvtRecTrackCol);
00149
00150 if(evtRecEvent->totalNeutral()>100) {
00151 return StatusCode::SUCCESS;
00152 }
00153
00154 Vint iGood, iplus, iminus;
00155 iGood.clear();
00156 iplus.clear();
00157 iminus.clear();
00158 Vp4 ppip, ppim;
00159 ppip.clear();
00160 ppim.clear();
00161
00162 Hep3Vector xorigin(0,0,0);
00163
00164 IVertexDbSvc* vtxsvc;
00165 Gaudi::svcLocator()->service("VertexDbSvc", vtxsvc);
00166 if(vtxsvc->isVertexValid()){
00167 double* dbv = vtxsvc->PrimaryVertex();
00168 double* vv = vtxsvc->SigmaPrimaryVertex();
00169 xorigin.setX(dbv[0]);
00170 xorigin.setY(dbv[1]);
00171 xorigin.setZ(dbv[2]);
00172 }
00173
00174 int nCharge = 0;
00175 for(int i = 0; i < evtRecEvent->totalCharged(); i++){
00176 EvtRecTrackIterator itTrk=evtRecTrkCol->begin() + i;
00177 if(!(*itTrk)->isMdcTrackValid()) continue;
00178 if (!(*itTrk)->isMdcKalTrackValid()) continue;
00179 RecMdcTrack *mdcTrk = (*itTrk)->mdcTrack();
00180
00181 double pch =mdcTrk->p();
00182 double x0 =mdcTrk->x();
00183 double y0 =mdcTrk->y();
00184 double z0 =mdcTrk->z();
00185 double phi0=mdcTrk->helix(1);
00186 double xv=xorigin.x();
00187 double yv=xorigin.y();
00188 double Rxy=fabs((x0-xv)*cos(phi0)+(y0-yv)*sin(phi0));
00189
00190 if(fabs(z0) >= m_vz0cut) continue;
00191 if(Rxy >= m_vr0cut) continue;
00192
00193
00194
00195 TH1 *h(0);
00196 if (m_thsvc->getHist("/DQAHist/JsiLL/hrxy", h).isSuccess()) {
00197 h->Fill(Rxy);
00198 } else {
00199 log << MSG::ERROR << "Couldn't retrieve hrxy" << endreq;
00200 }
00201 if (m_thsvc->getHist("/DQAHist/JsiLL/hz", h).isSuccess()) {
00202 h->Fill(z0);
00203 } else {
00204 log << MSG::ERROR << "Couldn't retrieve hz" << endreq;
00205 }
00206
00207
00208 iGood.push_back(i);
00209 nCharge += mdcTrk->charge();
00210 if (mdcTrk->charge() > 0) {
00211 iplus.push_back(i);
00212 } else {
00213 iminus.push_back(i);
00214 }
00215 }
00216
00217
00218
00219
00220 int nGood = iGood.size();
00221 log << MSG::DEBUG << "ngood, totcharge = " << nGood << " , " << nCharge << endreq;
00222 if((nGood != 4)||(nCharge!=0)){
00223 return StatusCode::SUCCESS;
00224 }
00225
00226
00227
00228
00229
00230
00231
00232
00233 int pidp0 = 5, pidp1 = 3, pidm0 = 5, pidm1 = 3;
00234
00235 RecMdcKalTrack *itTrkp = (*(evtRecTrkCol->begin() + iplus[0]))->mdcKalTrack();
00236 RecMdcKalTrack *itTrkpip = (*(evtRecTrkCol->begin() + iplus[1]))->mdcKalTrack();
00237 RecMdcKalTrack *itTrkpb = (*(evtRecTrkCol->begin() + iminus[0]))->mdcKalTrack();
00238 RecMdcKalTrack *itTrkpim = (*(evtRecTrkCol->begin() + iminus[1]))->mdcKalTrack();
00239
00240
00241
00242 if (itTrkp->p() < itTrkpip->p()){
00243 itTrkp = (*(evtRecTrkCol->begin() + iplus[1]))->mdcKalTrack();
00244 itTrkpip = (*(evtRecTrkCol->begin() + iplus[0]))->mdcKalTrack();
00245 pidp0 = 3;
00246 pidp1 = 5;
00247 }
00248 if (itTrkpb->p() < itTrkpim->p()){
00249 itTrkpb = (*(evtRecTrkCol->begin() + iminus[1]))->mdcKalTrack();
00250 itTrkpim = (*(evtRecTrkCol->begin() + iminus[0]))->mdcKalTrack();
00251 pidm0 = 3;
00252 pidm1 = 5;
00253 }
00254 if (itTrkp->p() < 0.7 || itTrkp->p() >1.1) return StatusCode::SUCCESS;
00255 if (itTrkpb->p() < 0.7 || itTrkpb->p() >1.1) return StatusCode::SUCCESS;
00256 if (itTrkpip->p() > 0.35) return StatusCode::SUCCESS;
00257 if (itTrkpim->p() > 0.35) return StatusCode::SUCCESS;
00258
00259
00260
00261 itTrkp->setPidType(RecMdcKalTrack::proton);
00262 itTrkpb->setPidType(RecMdcKalTrack::proton);
00263 itTrkpip->setPidType(RecMdcKalTrack::pion);
00264 itTrkpim->setPidType(RecMdcKalTrack::pion);
00265
00266
00267 m_chisq = 9999.0;
00268
00269 HepPoint3D vx(0., 0., 0.);
00270 HepSymMatrix Evx(3, 0);
00271 double bx = 1E+6;
00272 double by = 1E+6;
00273 double bz = 1E+6;
00274 Evx[0][0] = bx*bx;
00275 Evx[1][1] = by*by;
00276 Evx[2][2] = bz*bz;
00277
00278 VertexParameter vxpar;
00279 vxpar.setVx(vx);
00280 vxpar.setEvx(Evx);
00281
00282 VertexFit* vtxfita0 = VertexFit::instance();
00283 SecondVertexFit *vtxfita = SecondVertexFit::instance();
00284 VertexFit* vtxfitb0 = VertexFit::instance();
00285 SecondVertexFit *vtxfitb = SecondVertexFit::instance();
00286 VertexFit* vtxfit = VertexFit::instance();
00287
00288 WTrackParameter wpip = WTrackParameter(mpi, itTrkpip->getZHelix(), itTrkpip->getZError());
00289 WTrackParameter wpim = WTrackParameter(mpi, itTrkpim->getZHelix(), itTrkpim->getZError());
00290 WTrackParameter wp = WTrackParameter(mproton, itTrkp->getZHelixP(), itTrkp->getZErrorP());
00291 WTrackParameter wpb = WTrackParameter(mproton, itTrkpb->getZHelixP(), itTrkpb->getZErrorP());
00292
00293 vtxfita0->init();
00294 vtxfita0->AddTrack(0, wp);
00295 vtxfita0->AddTrack(1, wpim);
00296 vtxfita0->AddVertex(0, vxpar, 0, 1);
00297 if(!vtxfita0->Fit(0)) return StatusCode::SUCCESS;
00298 vtxfita0->Swim(0);
00299 vtxfita0->BuildVirtualParticle(0);
00300 vtxfita->init();
00301 vtxfita->AddTrack(0, vtxfita0->wVirtualTrack(0));
00302 vtxfita->setVpar(vtxfita0->vpar(0));
00303 if(!vtxfita->Fit()) return StatusCode::SUCCESS;
00304
00305 WTrackParameter wLambda = vtxfita->wpar();
00306
00307 vtxfitb0->init();
00308 vtxfitb0->AddTrack(0, wpb);
00309 vtxfitb0->AddTrack(1, wpip);
00310 vtxfitb0->AddVertex(0, vxpar, 0, 1);
00311 if(!vtxfitb0->Fit(0)) return StatusCode::SUCCESS;
00312 vtxfitb0->Swim(0);
00313 vtxfitb0->BuildVirtualParticle(0);
00314
00315 vtxfitb->init();
00316 vtxfitb->AddTrack(0, vtxfitb0->wVirtualTrack(0));
00317 vtxfitb->setVpar(vtxfitb0->vpar(0));
00318 if(!vtxfitb->Fit()) return StatusCode::SUCCESS;
00319
00320 WTrackParameter wLambdabar = vtxfitb->wpar();
00321
00322 vtxfit->init();
00323 vtxfit->AddTrack(0, wLambda);
00324 vtxfit->AddTrack(1, wLambdabar);
00325 vtxfit->AddVertex(0, vxpar,0, 1);
00326 if(!vtxfit->Fit(0)) return StatusCode::SUCCESS;
00327 vtxfit->Swim(0);
00328 WTrackParameter wwLambda = vtxfit->wtrk(0);
00329 WTrackParameter wwLambdabar = vtxfit->wtrk(1);
00330
00331
00332
00333
00334 KinematicFit* kmfit = KinematicFit::instance();
00335
00336
00337 HepLorentzVector ecms(0.034065,0.0,0.0,3.0969);
00338 const Hep3Vector u_cms = -ecms.boostVector();
00339
00340 kmfit->init();
00341 kmfit->AddTrack(0, wwLambda);
00342 kmfit->AddTrack(1, wwLambdabar);
00343 kmfit->AddFourMomentum(0, ecms);
00344
00345 if(!kmfit->Fit()) return StatusCode::SUCCESS;
00346 m_chisq = kmfit->chisq();
00347 if(m_chisq > 50) return StatusCode::SUCCESS;
00348 HepLorentzVector kmf_pLambda = kmfit->pfit(0);
00349 HepLorentzVector kmf_pLambdabar = kmfit->pfit(1);
00350
00351 kmf_pLambda.boost(u_cms);
00352 kmf_pLambdabar.boost(u_cms);
00353 m_mLambda = kmf_pLambda.m();
00354 m_mLambdabar = kmf_pLambdabar.m();
00355 m_pLambda = kmf_pLambda.rho();
00356 m_pLambdabar = kmf_pLambdabar.rho();
00357
00358 if(fabs(m_mLambda-1.1157)>0.003||fabs(m_mLambdabar-1.1157)>0.003) return StatusCode::SUCCESS;
00359
00360
00361 m_tuple->write();
00362
00363
00365
00366
00367
00368
00369 (*(evtRecTrkCol->begin()+iplus[0]))->setPartId(pidp0);
00370 (*(evtRecTrkCol->begin()+iplus[1]))->setPartId(pidp1);
00371 (*(evtRecTrkCol->begin()+iminus[0]))->setPartId(pidm0);
00372 (*(evtRecTrkCol->begin()+iminus[1]))->setPartId(pidm1);
00373
00374
00375
00376
00377
00378 (*(evtRecTrkCol->begin()+iplus[0]))->setQuality(0);
00379 (*(evtRecTrkCol->begin()+iplus[1]))->setQuality(0);
00380 (*(evtRecTrkCol->begin()+iminus[0]))->setQuality(0);
00381 (*(evtRecTrkCol->begin()+iminus[1]))->setQuality(0);
00382
00383
00384
00385
00386 setFilterPassed(true);
00388
00389 return StatusCode::SUCCESS;
00390
00391 }