10#include "GaudiKernel/MsgStream.h"
11#include "GaudiKernel/AlgFactory.h"
12#include "GaudiKernel/ISvcLocator.h"
13#include "GaudiKernel/SmartDataPtr.h"
14#include "GaudiKernel/IDataProviderSvc.h"
15#include "GaudiKernel/IDataManagerSvc.h"
16#include "GaudiKernel/PropertyMgr.h"
30#include "GaudiKernel/IPartPropSvc.h"
50 Algorithm(name, pSvcLocator)
53 declareProperty(
"FittingMethod", m_fittingMethod = 2);
54 declareProperty(
"ConfigFile", m_configFile =
"MucConfig.xml");
55 declareProperty(
"McCosmic", m_mccosmic = 0);
56 declareProperty(
"OnlySeedFit", m_onlyseedfit = 0);
57 declareProperty(
"NtOutput", m_NtOutput = 0);
58 declareProperty(
"MaxHitsRec", m_maxHitsRec = 200);
59 declareProperty(
"United", m_united = 0);
60 declareProperty(
"SeedType", m_seedtype = 0);
61 declareProperty(
"MsOutput", m_MsOutput =
false);
62 declareProperty(
"FilterFile", m_filter_filename);
68 MsgStream log(
msgSvc(), name());
69 log << MSG::INFO <<
"in initialize()" << endreq;
73 for(
int i = 0; i < 20; i++) m_NHitsLost.push_back(0);
74 for(
int i = 0; i < 10; i++) m_NHitsLostInGap.push_back(0);
81 StatusCode sc = service(
"MucGeomSvc", mucGeomSvc);
82 if (sc == StatusCode::SUCCESS) {
88 return StatusCode::FAILURE;
91 aMucRecHitContainer = 0;
96 if ( nt1 ) { m_tuple = nt1;}
99 m_tuple =
ntupleSvc()->book (
"FILE401/T", CLID_RowWiseTuple,
"MucTrkRecon N-Tuple");
101 sc = m_tuple->addItem (
"part", m_part);
102 sc = m_tuple->addItem (
"seg", m_seg);
103 sc = m_tuple->addItem (
"gap", m_gap);
104 sc = m_tuple->addItem (
"strip", m_strip);
105 sc = m_tuple->addItem (
"diff", m_diff);
106 sc = m_tuple->addItem (
"dist", m_dist);
107 sc = m_tuple->addItem (
"run", m_run);
108 sc = m_tuple->addItem (
"event", m_event);
109 sc = m_tuple->addItem (
"ngap", m_ngapwithhits);
110 sc = m_tuple->addItem (
"nhit", m_nhit);
111 sc = m_tuple->addItem (
"maxhit", m_maxhit);
112 sc = m_tuple->addItem (
"multihit",m_multihit);
113 sc = m_tuple->addItem (
"angleCosmic",m_angle_cosmic);
114 sc = m_tuple->addItem (
"angleUpdown",m_angle_updown);
115 sc = m_tuple->addItem (
"px",m_px);
116 sc = m_tuple->addItem (
"py",m_py);
117 sc = m_tuple->addItem (
"pz",m_pz);
118 sc = m_tuple->addItem (
"theta",m_theta);
119 sc = m_tuple->addItem (
"phi",m_phi);
120 sc = m_tuple->addItem (
"theta_pipe",m_theta_pipe);
121 sc = m_tuple->addItem (
"phi_pipe",m_phi_pipe);
122 sc = m_tuple->addItem (
"pxmc",m_px_mc);
123 sc = m_tuple->addItem (
"pymc",m_py_mc);
124 sc = m_tuple->addItem (
"pzmc",m_pz_mc);
125 sc = m_tuple->addItem (
"thetamc",m_theta_mc);
126 sc = m_tuple->addItem (
"phimc",m_phi_mc);
127 sc = m_tuple->addItem (
"thetamc_pipe",m_theta_mc_pipe);
128 sc = m_tuple->addItem (
"phimc_pipe",m_phi_mc_pipe);
129 sc = m_tuple->addItem (
"emcUp",m_emcUp);
130 sc = m_tuple->addItem (
"emcDown",m_emcDown);
131 sc = m_tuple->addItem (
"mucUp",m_mucUp);
132 sc = m_tuple->addItem (
"mucDown",m_mucDown);
133 sc = m_tuple->addItem (
"projx",m_projx);
134 sc = m_tuple->addItem (
"projz",m_projz);
138 log << MSG::ERROR <<
" Cannot book N-tuple:" << long(m_tuple) << endmsg;
145 if ( m_filter_filename ==
"") {
146 m_filter_filename =getenv(
"MUCRECALGROOT");
147 m_filter_filename +=
"/share/filter.txt";
150 if (m_filter_filename.size()) {
151 std::ifstream infile(m_filter_filename.c_str());
153 while (!infile.eof()) {
154 FilterEvent filterevt;
155 infile >> filterevt.bossver >> filterevt.runid >> filterevt.eventid;
156 if ((!infile.good()) || (infile.eof())) {
160 m_filter_event.push_back(filterevt);
167 return StatusCode::SUCCESS;
173 MsgStream log(
msgSvc(), name());
174 log << MSG::INFO <<
"in execute()" << endreq;
179 SmartDataPtr<Event::EventHeader> eventHeader(eventSvc(),
"/Event/EventHeader");
181 log << MSG::FATAL <<
"Could not find Event Header" << endreq;
182 return( StatusCode::FAILURE);
184 log << MSG::INFO <<
"Run: " << eventHeader->runNumber() <<
" Event: " << eventHeader->eventNumber() << endreq;
186event = eventHeader->eventNumber();
187run = eventHeader->runNumber();
190 string release = getenv(
"BES_RELEASE");
194 for (std::vector<FilterEvent>::iterator it = m_filter_event.begin();
195 it != m_filter_event.end(); ++it) {
196 const FilterEvent& fe = (*it);
197 if (
release == fe.bossver && run == fe.runid && event == fe.eventid) {
198 cout <<
"SKIP: " << fe.bossver <<
" "
200 << fe.eventid << std::endl;
201 return StatusCode::SUCCESS;
209 Hep3Vector cosmicMom;
211 SmartDataPtr<McParticleCol> mcParticleCol(eventSvc(),
"/Event/MC/McParticleCol");
212 if (!mcParticleCol) {
213 log << MSG::FATAL <<
"Could not find McParticle" << endreq;
214 return( StatusCode::FAILURE);
217 McParticleCol::iterator iter_mc = mcParticleCol->begin();
218 for (;iter_mc != mcParticleCol->end(); iter_mc++, digiId++) {
220 <<
" particleId = " << (*iter_mc)->particleProperty()
222 int pid = (*iter_mc)->particleProperty();
224 if(fabs(pid)!=13)
continue;
226 HepLorentzVector initialMomentum = (*iter_mc)->initialFourMomentum();
227 Hep3Vector startP(initialMomentum.px(), initialMomentum.py(), initialMomentum.pz());
228 Hep3Vector rotate(-initialMomentum.px(),initialMomentum.pz(),initialMomentum.py());
231 m_px_mc = initialMomentum.px();
232 m_py_mc = initialMomentum.py();
233 m_pz_mc = initialMomentum.pz();
235 m_theta_mc = rotate.theta();
236 m_phi_mc = rotate.phi();
238 m_theta_mc_pipe = startP.theta();
239 m_phi_mc_pipe = startP.phi();
305 SmartDataPtr<MucDigiCol> mucDigiCol(eventSvc(),
"/Event/Digi/MucDigiCol");
307 log << MSG::FATAL <<
"Could not find MUC digi" << endreq;
308 return( StatusCode::FAILURE);
311 MucDigiCol::iterator iter4 = mucDigiCol->begin();
313 for (;iter4 != mucDigiCol->end(); iter4++, digiId++) {
315 log << MSG::INFO <<
"MUC digis:: " << digiId << endreq;
316 if( digiId == 0)
return( StatusCode::SUCCESS );
326 if (!aMucRecHitContainer) {
329 aMucRecHitContainer->
Clear();
335 SmartIF<IDataManagerSvc> dataManSvc(eventSvc());
336 DataObject *mucRecHitCol;
337 eventSvc()->findObject(
"/Event/Recon/MucRecHitCol",mucRecHitCol);
338 if(mucRecHitCol !=
NULL) {
339 dataManSvc->clearSubTree(
"/Event/Recon/MucRecHitCol");
340 eventSvc()->unregisterObject(
"/Event/Recon/MucRecHitCol");
343 StatusCode sc = eventSvc()->registerObject(
"/Event/Recon/MucRecHitCol", aMucRecHitContainer->
GetMucRecHitCol());
345 MucDigiCol::iterator iterMuc = mucDigiCol->begin();
347 for (;iterMuc != mucDigiCol->end(); iterMuc++, mucDigiId++) {
348 mucID = (*iterMuc)->identify();
356 aMucRecHitContainer->
AddHit(part, seg, gap, strip);
357 log << MSG::INFO <<
" digit" << mucDigiId <<
" : "
361 <<
" strip " << strip
365 DataObject *aReconEvent ;
366 eventSvc()->findObject(
"/Event/Recon",aReconEvent);
367 if(aReconEvent==
NULL) {
370 StatusCode sc = eventSvc()->registerObject(
"/Event/Recon",aReconEvent);
371 if(sc!=StatusCode::SUCCESS) {
372 log << MSG::FATAL <<
"Could not register ReconEvent" <<endreq;
373 return( StatusCode::FAILURE);
376 StatusCode fr = eventSvc()->findObject(
"/Event/Recon",aReconEvent);
377 if(fr!=StatusCode::SUCCESS) {
378 log << MSG::WARNING <<
"Could not find register ReconEvent, will create it" <<endreq;
379 StatusCode sc = eventSvc()->registerObject(
"/Event/Recon",aReconEvent);
380 if(sc!=StatusCode::SUCCESS) {
381 log << MSG::FATAL <<
"Could not register ReconEvent" <<endreq;
382 return( StatusCode::FAILURE);
388 DataObject *mucTrackCol;
389 eventSvc()->findObject(
"/Event/Recon/RecMucTrackCol",mucTrackCol);
390 if(mucTrackCol !=
NULL) {
391 dataManSvc->clearSubTree(
"/Event/Recon/RecMucTrackCol");
392 eventSvc()->unregisterObject(
"/Event/Recon/RecMucTrackCol");
396 sc = eventSvc()->registerObject(
"/Event/Recon/RecMucTrackCol", aMucTrackCol);
397 aMucTrackCol->clear();
400 SmartDataPtr<RecMucTrackCol> findMucTrackCol(eventSvc(),
"/Event/Recon/RecMucTrackCol");
401 if (!findMucTrackCol) {
402 log << MSG::FATAL <<
"Could not find RecMucTrackCol" << endreq;
403 return( StatusCode::FAILURE);
405 aMucTrackCol->clear();
408 log << MSG::INFO <<
"MaxHitsRec : "<<m_maxHitsRec<< endreq;
409 if(digiId> m_maxHitsRec)
return StatusCode::SUCCESS;
416 else if(m_united == 1){
419 if (!aMucRecHitContainer) {
422 aMucRecHitContainer->
Clear();
424 SmartDataPtr<MucRecHitCol> aMucRecHitCol (eventSvc(),
"/Event/Recon/MucRecHitCol");
425 if(aMucRecHitCol ==
NULL) {
426 log << MSG::WARNING <<
"MucRecHitCol is NULL" << endreq;
431 SmartDataPtr<RecMucTrackCol> mucTrackCol (eventSvc(),
"/Event/Recon/RecMucTrackCol");
432 if(mucTrackCol ==
NULL) {
433 log << MSG::WARNING <<
"aMucTrackCol is NULL" << endreq;
436 log << MSG::INFO <<
"mucTrackCol size: "<<mucTrackCol->size()<<
" hitCol size: "<<aMucRecHitCol->size()<<endreq;
437 aMucTrackCol = mucTrackCol;
440 SmartDataPtr<RecExtTrackCol> aExtTrackCol(eventSvc(),
"/Event/Recon/RecExtTrackCol");
442 log << MSG::WARNING <<
"Can't find ExtTrackCol in TDS!" << endreq;
445 SmartDataPtr<RecMdcTrackCol> aMdcTrackCol(eventSvc(),
"/Event/Recon/RecMdcTrackCol");
447 log << MSG::WARNING <<
"Can't find MdcTrackCol in TDS!" << endreq;
450 if( aExtTrackCol && aMdcTrackCol ) trackId = aMdcTrackCol->size();
451 muctrackId = aMucTrackCol->size();
456 SmartDataPtr<RecEmcShowerCol> aShowerCol(eventSvc(),
"/Event/Recon/RecEmcShowerCol");
458 log << MSG::WARNING <<
"Could not find RecEmcShowerCol" << endreq;
462 RecEmcShowerCol::iterator iShowerCol;
463 for(iShowerCol=aShowerCol->begin();
464 iShowerCol!=aShowerCol->end();
472 if(((*iShowerCol)->position()).phi()>0&&((*iShowerCol)->position()).phi()<3.1415926) hasEmcUp++;
477 m_emcUp = hasEmcUp; m_emcDown = hasEmcDown;
502 log << MSG::INFO <<
"Muc 2D 3D Road Container created" << endreq;
512 int count0, count1,
count, iGap0, iGap1;
517 for (
int iOrient = 0; iOrient < 2; iOrient++) {
520 for (
int iLoop = 0; iLoop < nLoops; iLoop++) {
529 MucDigiCol::iterator iterMuc = mucDigiCol->begin();
532 iGap0 = 0; iGap1 = 0;
533 for (;iterMuc != mucDigiCol->end(); iterMuc++, mucDigiId++) {
534 mucID = (*iterMuc)->identify();
540 if ( (part == 1 && gap % 2 == 0) || (part != 1 && gap % 2 == 1) ) orient = 1;
542 if(part == iPart && seg == iSeg && orient == iOrient && setgap0 == 0){
546 if(part == iPart && seg == iSeg && orient == iOrient && setgap0 == 1 && gap != iGap0 ){
552 if(m_MsOutput) cout <<
"Find seed gap in ( "<<iPart<<
" "<<iSeg<<
" ) gap0: "<<iGap0<<
" gap1: "<<iGap1<<endl;
560 if(iGap1 == iGap0)
continue;
563 for (
int iHit0 = 0; iHit0 < count0; iHit0++) {
565 pHit0 = aMucRecHitContainer->
GetHit(iPart, iSeg, iGap0, iHit0);
567 log << MSG::FATAL <<
"MucRecRoadFinder-E10 " <<
" part " << iPart
568 <<
" seg " << iSeg <<
" gap " << iGap0 <<
" null pointer"
574 if(m_united == 1 && pHit0->
GetHitMode() != -1)
continue;
577 if(m_MsOutput) cout <<
"part " << iPart <<
" seg " << iSeg <<
" orient " << iOrient
578 <<
" gap0 " << iGap0 <<
" count0 " << count0
579 <<
" gap1 " << iGap1 <<
" count1 " << count1 << endl;
580 for (
int iHit1 = 0; iHit1 < count1; iHit1++) {
582 pHit1 = aMucRecHitContainer->
GetHit(iPart, iSeg, iGap1, iHit1);
584 log << MSG::ERROR <<
"MucRecRoadFinder-E10 " <<
" part " << iPart
585 <<
" seg " << iSeg <<
" gap " << iGap1 <<
" null pointer"
590 if(m_united == 1 && pHit1->GetHitMode() != -1)
continue;
596 log << MSG::FATAL <<
"MucRecRoadFinder-E20 " <<
"failed to create 2D road!" << endreq;
601 if (!pHit0->
GetGap()) log << MSG::ERROR <<
"pHit0->GetGap(), null pointer" << endreq;
610 pHit1->SetHitSeed(
true);
613 if(m_MsOutput) cout <<
"pHit0 attached, " << road2D->
GetTotalHits()
614 <<
", hitId= "<<pHit0->
Part()<<
" "<<pHit0->
Seg()<<
" "<<pHit0->
Gap()<<
" "<<pHit0->
Strip()<<endl;
617 if (pHit1->GetGap()->Orient() == iOrient) {
623 if(m_MsOutput) cout <<
"pHit1 attached, " << road2D->
GetTotalHits()
624 <<
", hitId= "<<pHit1->Part()<<
" "<<pHit1->Seg()<<
" "<<pHit1->Gap()<<
" "<<pHit1->Strip()<<endl;
626 if(m_MsOutput) cout <<
"Hit cout " << road2D->
GetTotalHits() <<
", slope " << road2D->
GetSlope() << endl;
633 for (
int i = 0; i < length; i++) {
636 float dXmin = kInfinity;
648 for (
int iHit = 0; iHit <
count; iHit++) {
649 pHit = aMucRecHitContainer->
GetHit(iPart, iSeg, iGap, iHit);
651 log << MSG::FATAL <<
"MucRecRoadFinder-E20 null cluster pointer pHit" << endreq;
657 if(m_united == 1 && pHit->
GetHitMode() != -1)
continue;
661 if(m_MsOutput) cout<<
"dX = "<<dX<<
" Win = "<<Win<<
", hit: "<<pHit->
Part()<<
" "<<pHit->
Seg()<<
" "<<pHit->
Gap()<<
" "<<pHit->
Strip()<<endl;
666 if(iGap == iGap0 || iGap == iGap1) {
675 if(m_onlyseedfit == 0)road2D->
AttachHit(pHit);
677 if(iGap == iGap0 || iGap == iGap1) road2D->
AttachHit(pHit);
694 bool lastGapOK =
false;
705 bool firedGapsOK =
false;
714 bool duplicateRoad =
false;
715 int maxSharedHits = 0, sharedHits = 0;
717 for (
int index = 0; index < (int)p2DRoad0C->size(); index++) {
718 sharedHits =(*p2DRoad0C)[index]->GetNSharedHits(road2D);
720 if (maxSharedHits < sharedHits) maxSharedHits = sharedHits;
723 for (
int index = 0; index < (int)p2DRoad1C->size(); index++) {
724 sharedHits = (*p2DRoad1C)[index]->GetNSharedHits(road2D);
726 if (maxSharedHits < sharedHits) maxSharedHits = sharedHits;
731 duplicateRoad =
true;
732 log<<MSG::INFO <<
" maxSharedHits " << maxSharedHits <<
" > " <<
kMinSharedHits2D << endreq;
741 if (lastGapOK && firedGapsOK && !duplicateRoad) {
743 log<<MSG::INFO <<
"Add a road0" << endreq;
744 p2DRoad0C->add(road2D);
747 log<<MSG::INFO <<
"Add a road1" << endreq;
748 p2DRoad1C->add(road2D);
754 vector<MucRecHit*> road2DHits = road2D->
GetHits();
755 for(
int i=0; i< road2DHits.size(); i++)
758 if(ihit->
Gap() == iGap0 || ihit->
Gap() == iGap1){
774 int print2DRoadInfo = 0;
775 if (print2DRoadInfo == 1) {
777 cout <<
"In 2DRoad container : " << endl
778 <<
" Num of 2DRoad0 = " << p2DRoad0C->size() << endl
781 for (
int iRoad = 0; iRoad < (int)p2DRoad0C->size(); iRoad++) {
784 cout <<
" " << iRoad <<
"th 2DRoad0 :" << endl
785 <<
" Part = " << road->
GetPart() << endl
786 <<
" Seg = " << road->
GetSeg() << endl
787 <<
" Orient = " << road->
GetOrient() << endl
788 <<
" LastGap = " << road->
GetLastGap() << endl
791 <<
" Slope = " << road->
GetSlope() << endl
797 cout <<
" Num of 2DRoad1 = " << p2DRoad1C->size() << endl
800 for (
int iRoad = 0; iRoad < (int)p2DRoad1C->size(); iRoad++) {
803 cout <<
" " << iRoad <<
"th 2DRoad1 :" << endl
804 <<
" Part = " << road->
GetPart() << endl
805 <<
" Seg = " << road->
GetSeg() << endl
806 <<
" Orient = " << road->
GetOrient() << endl
807 <<
" LastGap = " << road->
GetLastGap() << endl
810 <<
" Slope = " << road->
GetSlope() << endl
819 for (
int iRoad0 = 0; iRoad0 < (int)p2DRoad0C->size(); iRoad0++) {
821 for (
int iRoad1 = 0; iRoad1 < (int)p2DRoad1C->size(); iRoad1++){
825 if ( !(road0 &&road1) ) {
826 cout <<
"Null pointer to road0 or road1: "
827 <<
"road0 = " << road0
828 <<
"road1 = " << road1
852 bool lastGapDeltaOK =
false;
854 lastGapDeltaOK =
true;
860 bool totalHitsDeltaOK =
false;
862 totalHitsDeltaOK =
true;
868 bool chiSquareCutOK =
false;
873 chiSquareCutOK =
true;
876 cout <<
"xChiSquare = " << xChiSquare
877 <<
"yChiSquare = " << yChiSquare
881 bool minLastGapOK =
false;
886 log<<MSG::INFO <<
" minLastGap = " << road3D->
GetLastGap() << endreq;
889 bool duplicateRoad =
false;
890 int maxSharedHits = 0, sharedHits = 0;
891 for (
int i = 0; i < (int)p3DRoadC->size(); i++){
892 sharedHits =(*p3DRoadC)[i]->GetNSharedHits(road3D);
893 if ( maxSharedHits < sharedHits) maxSharedHits = sharedHits;
899 duplicateRoad =
true;
900 log<<MSG::INFO <<
" MaxShareHits = " << maxSharedHits << endreq;
903 if ( lastGapDeltaOK &&
908 float vx, vy, x0, y0;
909 float slope1 = 100, slope0 = 100;
926 log<<MSG::INFO <<
"Add a 3D Road ... " << endreq;
928 float startx = 0.0, starty = 0.0, startz = 0.0;
929 float sigmax = 0.0, sigmay = 0.0, sigmaz = 0.0;
930 road3D->
ProjectWithSigma(0, startx, starty, startz, sigmax, sigmay, sigmaz);
936 float sign = vy/fabs(vy);
937 float signx = vx/fabs(vx);
946 else if(road3D->
GetSeg()<2){
962 else if(road3D->
GetPart() == 0){
969 else if(road3D->
GetPart() == 2){
982 Hep3Vector mom(vx, vy, vz);
989 startx /= 10; starty /= 10; startz /= 10;
990 startx -= vx/mom.mag(); starty -= vy/mom.mag(); startz -= vz/mom.mag();
996 aTrack->
SetMucPos(startx, starty, startz);
1005 aTrack->
setId(muctrackId);
1010 aMucTrackCol->add(aTrack);
1012 p3DRoadC->add(road3D);
1016 vector<MucRecHit*> attachedHits = aTrack->
GetHits();
1018 vector<float> distanceHits = aTrack->
getDistHits();
1020 for(
int i=0; i< expectedHits.size(); i++)
1026 vector<int> multiHit;
1027 for(
int i=0; i< attachedHits.size(); i++)
1033 for(
int k=0; k < attachedHits.size(); k++){
1038 multiHit.push_back(hitnum);
1043 for(
int i=0; i< expectedHits.size(); i++)
1051 for(
int j=0; j< attachedHits.size(); j++){
1056 if((jhit->
Part()==ihit->
Part())&&(jhit->
Seg()==ihit->
Seg())&&(jhit->
Gap()==ihit->
Gap())&&attachedHits.size()==distanceHits.size())
1063 m_part = ihit->
Part(); m_seg = ihit->
Seg(); m_gap = ihit->
Gap();
1064 m_strip = jhit->
Strip();
1066 m_dist = distanceHits[j];
1069 m_angle_cosmic = -999;
1070 m_angle_updown = -999;
1077 m_multihit = multiHit[j];
1078 m_run = eventHeader->runNumber();
1079 m_event = eventHeader->eventNumber();
1092 m_part = ihit->
Part(); m_seg = ihit->
Seg(); m_gap = ihit->
Gap();
1093 m_strip = ihit->
Strip();
1096 m_angle_updown = -999;
1097 m_angle_cosmic = -999;
1102 m_run = eventHeader->runNumber();
1103 m_event = eventHeader->eventNumber();
1160 for(
int iTrack = 0; iTrack < (int)aMucTrackCol->size(); iTrack++) {
1161 aaTrack = (*aMucTrackCol)[iTrack];
1166 double px,py,pz,p,theta,phi;
1175 m_angle_updown = -999;
1177 if(m_angle_cosmic>1.57) m_angle_cosmic = 3.14159265 - m_angle_cosmic;
1178 m_run = eventHeader->runNumber();
1179 m_event = eventHeader->eventNumber();
1181 Hep3Vector rotate(-px,pz,py);
1182 theta = rotate.theta();
1185 m_px = px; m_py = py; m_pz = pz;
1186 m_theta = theta; m_phi = phi;
1193 Hep3Vector mucPos = aaTrack->
getMucPos();
1194 double posx, posy, posz;
1195 posx = mucPos.x(); posy = mucPos.y(); posz = mucPos.z();
1197 m_projx = -999; m_projz = -999;
1199 m_projx = posx - px/py*posy;
1200 m_projz = posz - pz/py*posy;
1207 m_mucUp = hasMucUp; m_mucDown = hasMucDown;
1212 if(aMucTrackCol->size()>=2 && forCosmic == 1){
1213 for(
int iTrack = 0; iTrack < (int)aMucTrackCol->size(); iTrack++) {
1214 log << MSG::DEBUG <<
"iTrack " << iTrack <<
" / " <<(int)aMucTrackCol->size()<<endreq;
1215 aaTrack = (*aMucTrackCol)[iTrack];
1216 if(aaTrack->
trackId()>=0)
continue;
1219 for(
int jTrack = iTrack+1; jTrack < (int)aMucTrackCol->size(); jTrack++){
1220 bbTrack = (*aMucTrackCol)[jTrack];
1226 if(fabs(mom_a.angle(mom_b) - 3.1415926)<0.2)
1237 m_angle_cosmic = cosmicMom.angle(mom_a);
1238 if(cosmicMom.angle(mom_a)>1.57) m_angle_cosmic = 3.14159265 - cosmicMom.angle(mom_a);
1240 m_angle_updown = fabs(mom_a.angle(mom_b) - 3.1415926);
1241 m_px = -999; m_py = -999; m_pz = -999; m_theta = -999; m_phi = -999; m_theta_pipe = -999; m_phi_pipe = -999;
1242 m_px_mc = -999; m_py_mc = -999; m_pz_mc = -999; m_theta_mc = -999; m_phi_mc = -999;
1243 m_theta_mc_pipe = -999; m_phi_mc_pipe = -999;
1254 if( p3DRoadC->size() !=0 ) {
1255 log<<MSG::INFO <<
"In 3DRoad container : "
1256 <<
" Num of 3DRoad = " << p3DRoadC->size() <<endreq;
1258 int print2DRoadInfo = 0;
1259 if (print2DRoadInfo == 1) {
1260 for (
int iRoad = 0; iRoad < (int)p3DRoadC->size(); iRoad++) {
1262 cout << endl <<
" " << iRoad <<
"th 3DRoad :" << endl
1263 <<
" Part = " << road->
GetPart() << endl
1264 <<
" Seg = " << road->
GetSeg() << endl
1272 <<
" SlopeZX = " << road->
GetSlopeZX() << endl
1274 <<
" SlopeZY = " << road->
GetSlopeZY() << endl
1276 <<
" Hits Info : " << endl;
1285 for(
int i = 0 ; i < p3DRoadC->size(); i++)
1286 delete (*p3DRoadC)[i];
1287 for(
int i = 0 ; i < p2DRoad0C->size(); i++)
1288 delete (*p2DRoad0C)[i];
1289 for(
int i = 0 ; i < p2DRoad1C->size(); i++)
1290 delete (*p2DRoad1C)[i];
1298 return StatusCode::SUCCESS;
1304 MsgStream log(
msgSvc(), name());
1305 log << MSG::INFO <<
"in finalize()" << endreq;
1311 return StatusCode::SUCCESS;
1317 MsgStream log(
msgSvc(), name());
1326 int firstHitFound[2] = { 0, 0};
1327 int firstHitGap[2] = {-1, -1};
1334 float xInsct, yInsct, zInsct;
1335 aTrack->
Project(iPart, iGap, xInsct, yInsct, zInsct, seg);
1336 if(m_MsOutput) cout<<
"part "<<iPart<<
" gap "<<iGap<<
" x "<<xInsct<<
" y "<<yInsct<<
" z "<<zInsct<<
" seg "<<seg<<endl;
1346 for(
int iDeltaSeg = 0; iDeltaSeg <
kNSegSearch; iDeltaSeg++) {
1353 for (
int iHit = 0; iHit < aMucRecHitContainer->
GetGapHitCount(iPart, iSeg, iGap); iHit++) {
1354 log << MSG::DEBUG <<
"iSeg " << iSeg <<
" iHit " << iHit << endreq;
1355 MucRecHit* pHit = aMucRecHitContainer->
GetHit(iPart, iSeg, iGap, iHit);
1359 log << MSG::WARNING <<
"MucRecTrkExt: null pointer to pHit" << endreq;
1369 log << MSG::DEBUG <<
"distance = " << setw(8) << dX <<
" size " << setw(4) << window << endreq;
1401 if (firstHitGap[orient] == -1) firstHitGap[orient] = iGap;
1402 firstHitFound[orient] = 1;
1408 log << MSG::DEBUG <<
" part " << iPart <<
" seg " << iSeg <<
" gap " << iGap
1409 <<
" strip " << setw(2) << pHit->
Strip() <<
" attatched" << endreq;
1410 log << MSG::DEBUG <<
"current total hits " << aTrack->
GetTotalHits() << endreq;
1413 m_NHitsLostInGap[iGap]++;
1423 if(m_onlyseedfit == 0) {
1425 if (firstHitFound[orient] && firstHitGap[orient] != iGap) aTrack->
CorrectDir();
1436 log << MSG::INFO <<
"Fit track done! trackIndex: " << aTrack->
trackId() <<
", mucId: " << aTrack->
id() <<
", RecMode: " << aTrack->
GetRecMode() << endreq;
DOUBLE_PRECISION count[3]
ObjectVector< MucRec2DRoad > MucRec2DRoadContainer
ObjectVector< MucRec3DRoad > MucRec3DRoadContainer
ObjectVector< MucRecHit > MucRecHitCol
const int kMaxDeltaLastGap
const int kMinSharedHits2D
const int kDeltaSeg[kNSegSearch]
const int kMaxDeltaTotalHits
const float kWindowSize[3][9]
const int kSearchOrder[kNSeedLoops][3][2][5]
const int kMaxSkippedGaps
const int kSearchLength[kNSeedLoops][3][2]
ObjectVector< RecMucTrack > RecMucTrackCol
int maxHitsInLayer() const
MucGeoGap * GetGap(const int part, const int seg, const int gap) const
Get a pointer to the gap identified by (part,seg,gap).
static MucGeoGeneral * Instance()
Get a pointer to the single instance of MucGeoGeneral.
static int barrel_ec(const Identifier &id)
Values of different levels.
static int layer(const Identifier &id)
static int channel(const Identifier &id)
static int segment(const Identifier &id)
static value_type getPartNum()
static value_type getSegNum(int part)
static value_type getGapNum(int part)
int GetNGapsWithHits() const
How many gaps provide hits attached to this road?
int GetTotalHits() const
How many hits in all does this road contain?
float GetReducedChiSquare() const
Chi-square parameter (per degree of freedom) of the trajectory fit.
float GetIntercept() const
Intercept of trajectory.
void AttachHit(MucRecHit *hit)
Attach the given hit to this road.
int GetLastGap() const
Which gap is the last one with hits attached to this road?
void AttachHitNoFit(MucRecHit *hit)
Attach the given hit to this road, but not fit this road.
float GetSlope() const
Slope of trajectory.
void SetMaxNSkippedGaps(const int &nGaps)
int GetPart() const
In which part was this road found?
float GetHitDistance(const MucRecHit *hit)
Distance to a hit.
int GetDegreesOfFreedom() const
How many degrees of freedom in the trajectory fit?
vector< MucRecHit * > GetHits() const
int GetSeg() const
In which segment was this road found?
int GetOrient() const
In which orientation was this road found?
float GetSlopeZX() const
Get Z-X dimension slope.
float GetSlopeZY() const
Get Z-Y dimension slope.
void TransformPhiRToXY(const float &vk, const float &vr, const float &k0, const float &r0, float &vx, float &vy, float &x0, float &y0) const
Where does the trajectory of this road intersect the reference plane?
int GetLastGapDelta() const
Difference between the last gap in the two 1-D roads.
int GetPart() const
In which part was this road found?
int GetLastGap() const
Which gap is the last one with hits attached to this road?
int GetTotalHitsDelta() const
Difference between the number of hits in the two 1-D roads.
int GetTotalHits() const
How many hits in all does this road contain?
float GetInterceptZY() const
Get Z-Y dimension intercept.
void SetSimpleFitParams(const float &m_SlopeZX, const float &m_InterceptZX, const float &m_SlopeZY, const float &m_InterceptZY)
set the fit parameters : slope and intercept for XZ and YZ.
int GetSeg() const
In which segment was this road found?
int GetDegreesOfFreedom() const
How many degrees of freedom in the trajectory fit?
void ProjectWithSigma(const int &gap, float &x, float &y, float &z, float &sigmaX, float &sigmaY, float &sigmaZ)
Where does the trajectory of this road intersect a specific gap?
float GetInterceptZX() const
Get Z-X dimension intercept.
int GetNGapsWithHits() const
How many gaps provide hits attached to this road?
float GetReducedChiSquare() const
Chi-square parameter (per degree of freedom) of the trajectory fit.
int GetMaxHitsPerGap() const
How many hits were attached in the gap with the most attached hits?
void Clear()
Remove all hit objects from the container, and destroy them.
MucRecHit * GetHit(const MucRecHitID hitID)
Get a MucRecHit object by hit identifier.
void AddHit(const Identifier id)
MucRecHitCol * GetMucRecHitCol()
Get MucRecHitCol pointer.
void SetMucRecHitCol(MucRecHitCol *p)
int GetGapHitCount(const MucRecHitID gapID)
How many hits are there in this gap?
void SetHitSeed(int seed)
MucGeoGap * GetGap() const
Get geometry data for the gap containing this hit.
int Part() const
Get Part.
int Strip() const
Get Strip.
void SetHitMode(int recmode)
MucRecRoadFinder(const std::string &name, ISvcLocator *pSvcLocator)
void TrackFinding(RecMucTrack *aTrack)
int GetTotalHits() const
How many hits in all does this track contain?
void LineFit(int fittingMethod)
Line fit with hits on a seg with max hits.
void CorrectPos()
Correct current position of this trajectory.
void CorrectDir()
Correct direction of this trajectory.
void ComputeTrackInfo(int fittingmethod)
Get corresponding monte carlo track pointer.
Hep3Vector getMucPos() const
start position of this track in Muc.
void AttachInsct(Hep3Vector insct)
Attach the intersection to this trajectory.
void SetExtMucPos(const float x, const float y, const float z)
set start position of ext track in Muc. (compute from MdcPos MdcMomentum or get from ExtTrack)
void SetCurrentDir(const float x, const float y, const float z)
set current direction of the trajectory.
float GetHitDistance(const MucRecHit *hit)
Calculate the distance of the hit to the intersection in read direction.
void setTrackId(const int trackId)
set the index for this track.
Hep3Vector GetCurrentDir() const
Current direction.
Hep3Vector CalculateInsct(const int part, const int seg, const int gap)
Calculate intersection from all hits attached on this gap.
void Project(const int &part, const int &gap, float &x, float &y, float &z, int &seg)
Where does the trajectory of this track intersect a specific gap?
void SetMucMomentum(const float px, const float py, const float pz)
set start moment of the track in Muc.
Hep3Vector GetCurrentInsct() const
Current intersection.
void SetExtMucMomentum(const float px, const float py, const float pz)
set start moment of ext track in Muc.
vector< MucRecHit * > GetHits() const
Get all hits on this track.
void AttachHit(MucRecHit *hit)
set corresponding monte carlo track pointer.
Hep3Vector GetCurrentPos() const
Current position.
void SetCurrentInsct(const float x, const float y, const float z)
set current intersection of the trajectory with strip plane.
Hep3Vector getMucMomentum() const
Start momentum of this track in Muc.
void SetCurrentPos(const float x, const float y, const float z)
set current position of the trajectory.
vector< MucRecHit * > GetExpectedHits() const
void SetRecMode(int recmode)
void SetMucPos(const float x, const float y, const float z)
set start position of the track in Muc. (after line fit and correction)
vector< float > getDistHits() const