175 MsgStream log(
msgSvc(), name());
176 log << MSG::INFO <<
"in execute()" << endreq;
181 SmartDataPtr<Event::EventHeader> eventHeader(eventSvc(),
"/Event/EventHeader");
183 log << MSG::FATAL <<
"Could not find Event Header" << endreq;
184 return( StatusCode::FAILURE);
186 log << MSG::INFO <<
"Run: " << eventHeader->runNumber() <<
" Event: " << eventHeader->eventNumber() << endreq;
188event = eventHeader->eventNumber();
189run = eventHeader->runNumber();
192 string release = getenv(
"BES_RELEASE");
196 for (std::vector<FilterEvent>::iterator it = m_filter_event.begin();
197 it != m_filter_event.end(); ++it) {
198 const FilterEvent& fe = (*it);
199 if (
release == fe.bossver && run == fe.runid && event == fe.eventid) {
200 cout <<
"SKIP: " << fe.bossver <<
" "
202 << fe.eventid << std::endl;
203 return StatusCode::SUCCESS;
211 Hep3Vector cosmicMom;
213 SmartDataPtr<McParticleCol> mcParticleCol(eventSvc(),
"/Event/MC/McParticleCol");
214 if (!mcParticleCol) {
215 log << MSG::FATAL <<
"Could not find McParticle" << endreq;
216 return( StatusCode::FAILURE);
219 McParticleCol::iterator iter_mc = mcParticleCol->begin();
220 for (;iter_mc != mcParticleCol->end(); iter_mc++, digiId++) {
222 <<
" particleId = " << (*iter_mc)->particleProperty()
224 int pid = (*iter_mc)->particleProperty();
226 if(fabs(pid)!=13)
continue;
228 HepLorentzVector initialMomentum = (*iter_mc)->initialFourMomentum();
229 Hep3Vector startP(initialMomentum.px(), initialMomentum.py(), initialMomentum.pz());
230 Hep3Vector rotate(-initialMomentum.px(),initialMomentum.pz(),initialMomentum.py());
233 m_px_mc = initialMomentum.px();
234 m_py_mc = initialMomentum.py();
235 m_pz_mc = initialMomentum.pz();
237 m_theta_mc = rotate.theta();
238 m_phi_mc = rotate.phi();
240 m_theta_mc_pipe = startP.theta();
241 m_phi_mc_pipe = startP.phi();
307 SmartDataPtr<MucDigiCol> mucDigiCol(eventSvc(),
"/Event/Digi/MucDigiCol");
309 log << MSG::FATAL <<
"Could not find MUC digi" << endreq;
310 return( StatusCode::FAILURE);
313 MucDigiCol::iterator iter4 = mucDigiCol->begin();
315 for (;iter4 != mucDigiCol->end(); iter4++, digiId++) {
317 log << MSG::INFO <<
"MUC digis:: " << digiId << endreq;
318 if( digiId == 0)
return( StatusCode::SUCCESS );
328 if (!aMucRecHitContainer) {
331 aMucRecHitContainer->
Clear();
337 SmartIF<IDataManagerSvc> dataManSvc(eventSvc());
338 DataObject *mucRecHitCol;
339 eventSvc()->findObject(
"/Event/Recon/MucRecHitCol",mucRecHitCol);
340 if(mucRecHitCol !=
NULL) {
341 dataManSvc->clearSubTree(
"/Event/Recon/MucRecHitCol");
342 eventSvc()->unregisterObject(
"/Event/Recon/MucRecHitCol");
345 StatusCode sc = eventSvc()->registerObject(
"/Event/Recon/MucRecHitCol", aMucRecHitContainer->
GetMucRecHitCol());
347 MucDigiCol::iterator iterMuc = mucDigiCol->begin();
349 for (;iterMuc != mucDigiCol->end(); iterMuc++, mucDigiId++) {
350 mucID = (*iterMuc)->identify();
358 aMucRecHitContainer->
AddHit(part, seg, gap, strip);
359 log << MSG::INFO <<
" digit" << mucDigiId <<
" : "
363 <<
" strip " << strip
367 DataObject *aReconEvent ;
368 eventSvc()->findObject(
"/Event/Recon",aReconEvent);
369 if(aReconEvent==
NULL) {
372 StatusCode sc = eventSvc()->registerObject(
"/Event/Recon",aReconEvent);
373 if(sc!=StatusCode::SUCCESS) {
374 log << MSG::FATAL <<
"Could not register ReconEvent" <<endreq;
375 return( StatusCode::FAILURE);
378 StatusCode fr = eventSvc()->findObject(
"/Event/Recon",aReconEvent);
379 if(fr!=StatusCode::SUCCESS) {
380 log << MSG::WARNING <<
"Could not find register ReconEvent, will create it" <<endreq;
381 StatusCode sc = eventSvc()->registerObject(
"/Event/Recon",aReconEvent);
382 if(sc!=StatusCode::SUCCESS) {
383 log << MSG::FATAL <<
"Could not register ReconEvent" <<endreq;
384 return( StatusCode::FAILURE);
390 DataObject *mucTrackCol;
391 eventSvc()->findObject(
"/Event/Recon/RecMucTrackCol",mucTrackCol);
392 if(mucTrackCol !=
NULL) {
393 dataManSvc->clearSubTree(
"/Event/Recon/RecMucTrackCol");
394 eventSvc()->unregisterObject(
"/Event/Recon/RecMucTrackCol");
398 sc = eventSvc()->registerObject(
"/Event/Recon/RecMucTrackCol", aMucTrackCol);
399 aMucTrackCol->clear();
402 SmartDataPtr<RecMucTrackCol> findMucTrackCol(eventSvc(),
"/Event/Recon/RecMucTrackCol");
403 if (!findMucTrackCol) {
404 log << MSG::FATAL <<
"Could not find RecMucTrackCol" << endreq;
405 return( StatusCode::FAILURE);
407 aMucTrackCol->clear();
410 log << MSG::INFO <<
"MaxHitsRec : "<<m_maxHitsRec<< endreq;
411 if(digiId> m_maxHitsRec)
return StatusCode::SUCCESS;
418 else if(m_united == 1){
421 if (!aMucRecHitContainer) {
424 aMucRecHitContainer->
Clear();
426 SmartDataPtr<MucRecHitCol> aMucRecHitCol (eventSvc(),
"/Event/Recon/MucRecHitCol");
427 if(aMucRecHitCol ==
NULL) {
428 log << MSG::WARNING <<
"MucRecHitCol is NULL" << endreq;
433 SmartDataPtr<RecMucTrackCol> mucTrackCol (eventSvc(),
"/Event/Recon/RecMucTrackCol");
434 if(mucTrackCol ==
NULL) {
435 log << MSG::WARNING <<
"aMucTrackCol is NULL" << endreq;
438 log << MSG::INFO <<
"mucTrackCol size: "<<mucTrackCol->size()<<
" hitCol size: "<<aMucRecHitCol->size()<<endreq;
439 aMucTrackCol = mucTrackCol;
442 SmartDataPtr<RecExtTrackCol> aExtTrackCol(eventSvc(),
"/Event/Recon/RecExtTrackCol");
444 log << MSG::WARNING <<
"Can't find ExtTrackCol in TDS!" << endreq;
447 SmartDataPtr<RecMdcTrackCol> aMdcTrackCol(eventSvc(),
"/Event/Recon/RecMdcTrackCol");
449 log << MSG::WARNING <<
"Can't find MdcTrackCol in TDS!" << endreq;
452 if( aExtTrackCol && aMdcTrackCol ) trackId = aMdcTrackCol->size();
453 muctrackId = aMucTrackCol->size();
458 SmartDataPtr<RecEmcShowerCol> aShowerCol(eventSvc(),
"/Event/Recon/RecEmcShowerCol");
460 log << MSG::WARNING <<
"Could not find RecEmcShowerCol" << endreq;
464 RecEmcShowerCol::iterator iShowerCol;
465 for(iShowerCol=aShowerCol->begin();
466 iShowerCol!=aShowerCol->end();
474 if(((*iShowerCol)->position()).phi()>0&&((*iShowerCol)->position()).phi()<3.1415926) hasEmcUp++;
479 m_emcUp = hasEmcUp; m_emcDown = hasEmcDown;
504 log << MSG::INFO <<
"Muc 2D 3D Road Container created" << endreq;
514 int count0, count1,
count, iGap0, iGap1;
519 for (
int iOrient = 0; iOrient < 2; iOrient++) {
522 for (
int iLoop = 0; iLoop < nLoops; iLoop++) {
531 MucDigiCol::iterator iterMuc = mucDigiCol->begin();
534 iGap0 = 0; iGap1 = 0;
535 for (;iterMuc != mucDigiCol->end(); iterMuc++, mucDigiId++) {
536 mucID = (*iterMuc)->identify();
542 if ( (part == 1 && gap % 2 == 0) || (part != 1 && gap % 2 == 1) ) orient = 1;
544 if(part == iPart && seg == iSeg && orient == iOrient && setgap0 == 0){
548 if(part == iPart && seg == iSeg && orient == iOrient && setgap0 == 1 && gap != iGap0 ){
554 if(m_MsOutput) cout <<
"Find seed gap in ( "<<iPart<<
" "<<iSeg<<
" ) gap0: "<<iGap0<<
" gap1: "<<iGap1<<endl;
562 if(iGap1 == iGap0)
continue;
565 for (
int iHit0 = 0; iHit0 < count0; iHit0++) {
567 pHit0 = aMucRecHitContainer->
GetHit(iPart, iSeg, iGap0, iHit0);
569 log << MSG::FATAL <<
"MucRecRoadFinder-E10 " <<
" part " << iPart
570 <<
" seg " << iSeg <<
" gap " << iGap0 <<
" null pointer"
576 if(m_united == 1 && pHit0->
GetHitMode() != -1)
continue;
579 if(m_MsOutput) cout <<
"part " << iPart <<
" seg " << iSeg <<
" orient " << iOrient
580 <<
" gap0 " << iGap0 <<
" count0 " << count0
581 <<
" gap1 " << iGap1 <<
" count1 " << count1 << endl;
582 for (
int iHit1 = 0; iHit1 < count1; iHit1++) {
584 pHit1 = aMucRecHitContainer->
GetHit(iPart, iSeg, iGap1, iHit1);
586 log << MSG::ERROR <<
"MucRecRoadFinder-E10 " <<
" part " << iPart
587 <<
" seg " << iSeg <<
" gap " << iGap1 <<
" null pointer"
592 if(m_united == 1 && pHit1->GetHitMode() != -1)
continue;
598 log << MSG::FATAL <<
"MucRecRoadFinder-E20 " <<
"failed to create 2D road!" << endreq;
603 if (!pHit0->
GetGap()) log << MSG::ERROR <<
"pHit0->GetGap(), null pointer" << endreq;
612 pHit1->SetHitSeed(
true);
615 if(m_MsOutput) cout <<
"pHit0 attached, " << road2D->
GetTotalHits()
616 <<
", hitId= "<<pHit0->
Part()<<
" "<<pHit0->
Seg()<<
" "<<pHit0->
Gap()<<
" "<<pHit0->
Strip()<<endl;
619 if (pHit1->GetGap()->Orient() == iOrient) {
625 if(m_MsOutput) cout <<
"pHit1 attached, " << road2D->
GetTotalHits()
626 <<
", hitId= "<<pHit1->Part()<<
" "<<pHit1->Seg()<<
" "<<pHit1->Gap()<<
" "<<pHit1->Strip()<<endl;
628 if(m_MsOutput) cout <<
"Hit cout " << road2D->
GetTotalHits() <<
", slope " << road2D->
GetSlope() << endl;
635 for (
int i = 0; i < length; i++) {
638 float dXmin = kInfinity;
650 for (
int iHit = 0; iHit <
count; iHit++) {
651 pHit = aMucRecHitContainer->
GetHit(iPart, iSeg, iGap, iHit);
653 log << MSG::FATAL <<
"MucRecRoadFinder-E20 null cluster pointer pHit" << endreq;
659 if(m_united == 1 && pHit->
GetHitMode() != -1)
continue;
663 if(m_MsOutput) cout<<
"dX = "<<dX<<
" Win = "<<Win<<
", hit: "<<pHit->
Part()<<
" "<<pHit->
Seg()<<
" "<<pHit->
Gap()<<
" "<<pHit->
Strip()<<endl;
668 if(iGap == iGap0 || iGap == iGap1) {
677 if(m_onlyseedfit == 0)road2D->
AttachHit(pHit);
679 if(iGap == iGap0 || iGap == iGap1) road2D->
AttachHit(pHit);
696 bool lastGapOK =
false;
707 bool firedGapsOK =
false;
716 bool duplicateRoad =
false;
717 int maxSharedHits = 0, sharedHits = 0;
719 for (
int index = 0; index < (int)p2DRoad0C->size(); index++) {
720 sharedHits =(*p2DRoad0C)[index]->GetNSharedHits(road2D);
722 if (maxSharedHits < sharedHits) maxSharedHits = sharedHits;
725 for (
int index = 0; index < (int)p2DRoad1C->size(); index++) {
726 sharedHits = (*p2DRoad1C)[index]->GetNSharedHits(road2D);
728 if (maxSharedHits < sharedHits) maxSharedHits = sharedHits;
733 duplicateRoad =
true;
734 log<<MSG::INFO <<
" maxSharedHits " << maxSharedHits <<
" > " <<
kMinSharedHits2D << endreq;
743 if (lastGapOK && firedGapsOK && !duplicateRoad) {
745 log<<MSG::INFO <<
"Add a road0" << endreq;
746 p2DRoad0C->add(road2D);
749 log<<MSG::INFO <<
"Add a road1" << endreq;
750 p2DRoad1C->add(road2D);
756 vector<MucRecHit*> road2DHits = road2D->
GetHits();
757 for(
int i=0; i< road2DHits.size(); i++)
760 if(ihit->
Gap() == iGap0 || ihit->
Gap() == iGap1){
776 int print2DRoadInfo = 0;
777 if (print2DRoadInfo == 1) {
779 cout <<
"In 2DRoad container : " << endl
780 <<
" Num of 2DRoad0 = " << p2DRoad0C->size() << endl
783 for (
int iRoad = 0; iRoad < (int)p2DRoad0C->size(); iRoad++) {
786 cout <<
" " << iRoad <<
"th 2DRoad0 :" << endl
787 <<
" Part = " << road->
GetPart() << endl
788 <<
" Seg = " << road->
GetSeg() << endl
789 <<
" Orient = " << road->
GetOrient() << endl
790 <<
" LastGap = " << road->
GetLastGap() << endl
793 <<
" Slope = " << road->
GetSlope() << endl
799 cout <<
" Num of 2DRoad1 = " << p2DRoad1C->size() << endl
802 for (
int iRoad = 0; iRoad < (int)p2DRoad1C->size(); iRoad++) {
805 cout <<
" " << iRoad <<
"th 2DRoad1 :" << endl
806 <<
" Part = " << road->
GetPart() << endl
807 <<
" Seg = " << road->
GetSeg() << endl
808 <<
" Orient = " << road->
GetOrient() << endl
809 <<
" LastGap = " << road->
GetLastGap() << endl
812 <<
" Slope = " << road->
GetSlope() << endl
821 for (
int iRoad0 = 0; iRoad0 < (int)p2DRoad0C->size(); iRoad0++) {
823 for (
int iRoad1 = 0; iRoad1 < (int)p2DRoad1C->size(); iRoad1++){
827 if ( !(road0 &&road1) ) {
828 cout <<
"Null pointer to road0 or road1: "
829 <<
"road0 = " << road0
830 <<
"road1 = " << road1
854 bool lastGapDeltaOK =
false;
856 lastGapDeltaOK =
true;
862 bool totalHitsDeltaOK =
false;
864 totalHitsDeltaOK =
true;
870 bool chiSquareCutOK =
false;
875 chiSquareCutOK =
true;
878 cout <<
"xChiSquare = " << xChiSquare
879 <<
"yChiSquare = " << yChiSquare
883 bool minLastGapOK =
false;
888 log<<MSG::INFO <<
" minLastGap = " << road3D->
GetLastGap() << endreq;
891 bool duplicateRoad =
false;
892 int maxSharedHits = 0, sharedHits = 0;
893 for (
int i = 0; i < (int)p3DRoadC->size(); i++){
894 sharedHits =(*p3DRoadC)[i]->GetNSharedHits(road3D);
895 if ( maxSharedHits < sharedHits) maxSharedHits = sharedHits;
901 duplicateRoad =
true;
902 log<<MSG::INFO <<
" MaxShareHits = " << maxSharedHits << endreq;
905 if ( lastGapDeltaOK &&
910 float vx, vy, x0, y0;
911 float slope1 = 100, slope0 = 100;
928 log<<MSG::INFO <<
"Add a 3D Road ... " << endreq;
930 float startx = 0.0, starty = 0.0, startz = 0.0;
931 float sigmax = 0.0, sigmay = 0.0, sigmaz = 0.0;
932 road3D->
ProjectWithSigma(0, startx, starty, startz, sigmax, sigmay, sigmaz);
938 float sign = vy/fabs(vy);
939 float signx = vx/fabs(vx);
948 else if(road3D->
GetSeg()<2){
964 else if(road3D->
GetPart() == 0){
971 else if(road3D->
GetPart() == 2){
984 Hep3Vector mom(vx, vy, vz);
991 startx /= 10; starty /= 10; startz /= 10;
992 startx -= vx/mom.mag(); starty -= vy/mom.mag(); startz -= vz/mom.mag();
998 aTrack->
SetMucPos(startx, starty, startz);
1007 aTrack->
setId(muctrackId);
1012 aMucTrackCol->add(aTrack);
1014 p3DRoadC->add(road3D);
1018 vector<MucRecHit*> attachedHits = aTrack->
GetHits();
1020 vector<float> distanceHits = aTrack->
getDistHits();
1022 for(
int i=0; i< expectedHits.size(); i++)
1028 vector<int> multiHit;
1029 for(
int i=0; i< attachedHits.size(); i++)
1035 for(
int k=0; k < attachedHits.size(); k++){
1040 multiHit.push_back(hitnum);
1045 for(
int i=0; i< expectedHits.size(); i++)
1053 for(
int j=0; j< attachedHits.size(); j++){
1058 if((jhit->
Part()==ihit->
Part())&&(jhit->
Seg()==ihit->
Seg())&&(jhit->
Gap()==ihit->
Gap())&&attachedHits.size()==distanceHits.size())
1065 m_part = ihit->
Part(); m_seg = ihit->
Seg(); m_gap = ihit->
Gap();
1066 m_strip = jhit->
Strip();
1068 m_dist = distanceHits[j];
1071 m_angle_cosmic = -999;
1072 m_angle_updown = -999;
1079 m_multihit = multiHit[j];
1080 m_run = eventHeader->runNumber();
1081 m_event = eventHeader->eventNumber();
1094 m_part = ihit->
Part(); m_seg = ihit->
Seg(); m_gap = ihit->
Gap();
1095 m_strip = ihit->
Strip();
1098 m_angle_updown = -999;
1099 m_angle_cosmic = -999;
1104 m_run = eventHeader->runNumber();
1105 m_event = eventHeader->eventNumber();
1162 for(
int iTrack = 0; iTrack < (int)aMucTrackCol->size(); iTrack++) {
1163 aaTrack = (*aMucTrackCol)[iTrack];
1168 double px,py,pz,p,theta,phi;
1177 m_angle_updown = -999;
1179 if(m_angle_cosmic>1.57) m_angle_cosmic = 3.14159265 - m_angle_cosmic;
1180 m_run = eventHeader->runNumber();
1181 m_event = eventHeader->eventNumber();
1183 Hep3Vector rotate(-px,pz,py);
1184 theta = rotate.theta();
1187 m_px = px; m_py = py; m_pz = pz;
1188 m_theta = theta; m_phi = phi;
1195 Hep3Vector mucPos = aaTrack->
getMucPos();
1196 double posx, posy, posz;
1197 posx = mucPos.x(); posy = mucPos.y(); posz = mucPos.z();
1199 m_projx = -999; m_projz = -999;
1201 m_projx = posx - px/py*posy;
1202 m_projz = posz - pz/py*posy;
1209 m_mucUp = hasMucUp; m_mucDown = hasMucDown;
1214 if(aMucTrackCol->size()>=2 && forCosmic == 1){
1215 for(
int iTrack = 0; iTrack < (int)aMucTrackCol->size(); iTrack++) {
1216 log << MSG::DEBUG <<
"iTrack " << iTrack <<
" / " <<(int)aMucTrackCol->size()<<endreq;
1217 aaTrack = (*aMucTrackCol)[iTrack];
1218 if(aaTrack->
trackId()>=0)
continue;
1221 for(
int jTrack = iTrack+1; jTrack < (int)aMucTrackCol->size(); jTrack++){
1222 bbTrack = (*aMucTrackCol)[jTrack];
1228 if(fabs(mom_a.angle(mom_b) - 3.1415926)<0.2)
1239 m_angle_cosmic = cosmicMom.angle(mom_a);
1240 if(cosmicMom.angle(mom_a)>1.57) m_angle_cosmic = 3.14159265 - cosmicMom.angle(mom_a);
1242 m_angle_updown = fabs(mom_a.angle(mom_b) - 3.1415926);
1243 m_px = -999; m_py = -999; m_pz = -999; m_theta = -999; m_phi = -999; m_theta_pipe = -999; m_phi_pipe = -999;
1244 m_px_mc = -999; m_py_mc = -999; m_pz_mc = -999; m_theta_mc = -999; m_phi_mc = -999;
1245 m_theta_mc_pipe = -999; m_phi_mc_pipe = -999;
1256 if( p3DRoadC->size() !=0 ) {
1257 log<<MSG::INFO <<
"In 3DRoad container : "
1258 <<
" Num of 3DRoad = " << p3DRoadC->size() <<endreq;
1260 int print2DRoadInfo = 0;
1261 if (print2DRoadInfo == 1) {
1262 for (
int iRoad = 0; iRoad < (int)p3DRoadC->size(); iRoad++) {
1264 cout << endl <<
" " << iRoad <<
"th 3DRoad :" << endl
1265 <<
" Part = " << road->
GetPart() << endl
1266 <<
" Seg = " << road->
GetSeg() << endl
1274 <<
" SlopeZX = " << road->
GetSlopeZX() << endl
1276 <<
" SlopeZY = " << road->
GetSlopeZY() << endl
1278 <<
" Hits Info : " << endl;
1287 for(
int i = 0 ; i < p3DRoadC->size(); i++)
1288 delete (*p3DRoadC)[i];
1289 for(
int i = 0 ; i < p2DRoad0C->size(); i++)
1290 delete (*p2DRoad0C)[i];
1291 for(
int i = 0 ; i < p2DRoad1C->size(); i++)
1292 delete (*p2DRoad1C)[i];
1300 return StatusCode::SUCCESS;