14#include "GaudiKernel/MsgStream.h"
15#include "GaudiKernel/ThreadGaudi.h"
16#include "GaudiKernel/AlgFactory.h"
17#include "GaudiKernel/ISvcLocator.h"
18#include "GaudiKernel/IMessageSvc.h"
19#include "GaudiKernel/IDataProviderSvc.h"
20#include "GaudiKernel/SmartDataPtr.h"
21#include "GaudiKernel/SmartRef.h"
22#include "GaudiKernel/SmartRefVector.h"
23#include "GaudiKernel/IDataProviderSvc.h"
24#include "GaudiKernel/PropertyMgr.h"
25#include "GaudiKernel/IJobOptionsSvc.h"
26#include "GaudiKernel/IMessageSvc.h"
27#include "GaudiKernel/Bootstrap.h"
28#include "GaudiKernel/StatusCode.h"
29#include "GaudiKernel/IDataManagerSvc.h"
30#include "GaudiKernel/IPartPropSvc.h"
66#include "AIDA/IAxis.h"
67#include "AIDA/IHistogram1D.h"
68#include "AIDA/IHistogram2D.h"
69#include "AIDA/IHistogram3D.h"
70#include "AIDA/IHistogramFactory.h"
87extern NTuple::Item<long>
g_ntrk;
98extern IHistogram1D*
g_nhit;
143 _axialSegCollect(10),
152 StatusCode scmgn = Gaudi::svcLocator()->service(
"MagneticFieldSvc",m_pmgnIMF);
153 if(scmgn!=StatusCode::SUCCESS) {
154 std::cout<<
"Unable to open Magnetic field service"<<std::endl;
161 if (!param->
_doIt)
return;
165 IPartPropSvc* p_PartPropSvc;
166 static const bool CREATEIFNOTTHERE(
true);
167 StatusCode PartPropStatus = Gaudi::svcLocator()->service(
"PartPropSvc", p_PartPropSvc, CREATEIFNOTTHERE);
168 if (!PartPropStatus.isSuccess() || 0 == p_PartPropSvc) {
170 std::cerr <<
"Could not initialize Particle Properties Service" << std::endl;
174 m_particleTable = p_PartPropSvc->PDT();
177 StatusCode
RawData = Gaudi::svcLocator()-> service (
"RawDataProviderSvc", m_rawDataProviderSvc, CREATEIFNOTTHERE);
179 std::cerr <<
"Could not load RawDataProviderSvc!" << m_rawDataProviderSvc << endreq;
321 if (param->
_doIt) clear();
323 delete _linkedSegments;
324 if (!param->
_doIt)
return;
336 if (!param->
_doIt)
return;
341 StatusCode sc = Gaudi::svcLocator()->service(
"MdcGeomSvc", mdcGeomSvc);
343 if (sc == StatusCode::SUCCESS) {
355 std::cerr <<
"FTFINDER::GEOCDC not found (please put cdctable before l4)" << std::endl;
356 std::cerr <<
"JOB will stop" << std::endl;
360 if (!_wire) _wire = (
FTWire *) malloc((Nwire+1) *
sizeof(
FTWire));
362 if (!_superLayer) _superLayer =
365 if (!_wire || !_layer || !_superLayer){
366 std::cerr <<
"FTFINDER::Cannot allocate geometries" << std::endl;
367 std::cerr <<
"JOB will stop" << std::endl;
371 int superLayerID = 0;
373 int localLayerID = 0;
382 int NlocalWireID[44];
384 for (wireID = 0;wireID <= Nwire; wireID++){
386 if (layer != layer_back){
391 Nlayer[k] = localLayerID;
396 NlocalWireID[layerID] = localWireID;
412 superLayer_back = NULL;
413 for (wireID = 0;wireID < Nwire; wireID++){
415 if (layer != layer_back){
423 Nlocal[superLayerID+1],
425 Nlayer[superLayerID+1],
431 double slantWithSymbol = (mdcGeomSvc->
Layer(layerID)->
Slant())*(mdcGeomSvc->
Layer(layerID)->
Sup()->
Type());
435 layerID, localLayerID++, NlocalWireID[layerID+1],
436 _superLayer[superLayerID]);
441 if (superLayerID == 2 || superLayerID == 3 ||
442 superLayerID == 4 || superLayerID == 9 ||
447 _layer[layerID], localID++, _wire+Nwire);
454 _layer[layerID], localID++, _wire+Nwire);
459 new(_wire+Nwire)
FTWire();
461 for (
int i = 0; i < Nwire; i++){
466 for (
int k = 1; k < 43; k++){
467 _widbase[k] = _widbase[k-1] + (*(_layer+k-1)).NWire();
474 Gaudi::svcLocator()->service(
"MessageSvc",
msgSvc);
476 MsgStream log(
msgSvc,
"FTFinder");
478 IDataProviderSvc* eventSvc = NULL;
479 Gaudi::svcLocator()->service(
"EventDataSvc", eventSvc);
481 if (!param->
_doIt)
return;
488 DataObject *aReconEvent;
489 eventSvc->findObject(
"/Event/Recon",aReconEvent);
493 StatusCode sc = eventSvc->registerObject(
"/Event/Recon",recevt );
494 if(sc!=StatusCode::SUCCESS) {
495 log << MSG::FATAL <<
"Could not register ReconEvent" <<endreq;
500 IDataManagerSvc *dataManSvc =
dynamic_cast<IDataManagerSvc*
> (eventSvc);
501 DataObject *aEsTimeEvent;
502 eventSvc->findObject(
"/Event/Recon/RecEsTimeCol",aEsTimeEvent);
503 if(aEsTimeEvent != NULL) {
504 dataManSvc->clearSubTree(
"/Event/Recon/RecEsTimeCol");
505 eventSvc->unregisterObject(
"/Event/Recon/RecEsTimeCol");
510 est = eventSvc->registerObject(
"/Event/Recon/RecEsTimeCol",aRecEsTimeCol);
511 if( est.isFailure() ) {
512 log << MSG::FATAL <<
"Could not register RecEsTimeCol" << endreq;
515 log << MSG::DEBUG <<
"RecEsTimeCol registered successfully!" <<endreq;
524 for (
int i = 0; i^11; i++){
525 (*(_superLayer+i)).mkSegmentList();
530 for(
int j=0;j<10;j++){
531 (*(_superLayer+j)).reduce_noise(
tEstime);
552 log << MSG::DEBUG <<
"number of 2D tracks: " <<
n <<endreq;
556 for (
int i = 0; i^
n; i++){
557 if (!_tracks[i]->r_phiFit()){
559 log<<MSG::DEBUG<<
"===========>deleted 2D track : "<< i+1 <<endreq;
569 aRecEsTimeCol->push_back(arecestime);
586 for (
int i = 0; i^
n; i++){
587 _tracks[i]->r_phiReFit(_vx, _vy, vtx_flag);
594 for (
int i = 0; i^
n; i++){
595 for(
int j = 0; j<2; j++){
596 i_rPhiFit= _tracks[i]->r_phi2Fit(_vx, _vy, vtx_flag);
599 _tracks[i]->r_phi4Fit(_vx, _vy, vtx_flag);
612 log<< MSG::DEBUG <<
"number of 3D tracks: " <<
n << endreq;
618 for (
int i = 0; i^
n; i++) {
621 log<<MSG::DEBUG<<
"=======>3D track: "<<i<<endreq;
622 _tracks[i]->printout();
625 if (_tracks[i]->get_nhits() < 18) {
627 log<< MSG::DEBUG <<
"================>deleted 3D track : "<< i+1 <<endreq;
637 for (
int i = 0; i^
n; i++){
638 _tracks[i]->s_zFit();
649 log<<MSG::DEBUG<<
"final number of tracks: " <<
n << endreq;
653 if (param->
_mkMdst) makeMdst();
660 if (param->
_mkTds) makeTds();
665FTFinder::updateMdc(
void){
667 Gaudi::svcLocator()->service(
"MessageSvc",
msgSvc);
669 MsgStream log(
msgSvc,
"FTFinder");
671 IDataProviderSvc* eventSvc = NULL;
672 Gaudi::svcLocator()->service(
"EventDataSvc", eventSvc);
678 log << MSG::FATAL <<
"Could not find Event Header" << endreq;
685 SmartDataPtr<Event::EventHeader> eventHeader(eventSvc,
"/Event/EventHeader");
687 log << MSG::FATAL <<
"Could not find Event Header" << endreq;
688 return( StatusCode::FAILURE);
690 log << MSG::DEBUG <<
"MdcFastTrkAlg: retrieved event: " << eventHeader->eventNumber() <<
" run: " << eventHeader->runNumber() << endreq;
691 eventNo = eventHeader->eventNumber();
692 runNo = eventHeader->runNumber();
701 SmartDataPtr<McParticleCol> mcParticleCol(eventSvc,
"/Event/MC/McParticleCol");
702 if (!mcParticleCol) {
703 log << MSG::WARNING <<
"Could not find McParticle" << endreq;
707 McParticleCol ::iterator iter_mc = mcParticleCol->begin();
711 for (;iter_mc != mcParticleCol->end(); iter_mc++, digiId++) {
712 log << MSG::DEBUG <<
"MDC digit No: " << digiId << endreq;
714 <<
" particleId = " << (*iter_mc)->particleProperty ()
716 int statusFlags = (*iter_mc)->statusFlags();
717 int pid = (*iter_mc)->particleProperty();
719 if(m_particleTable->particle( pid )){
720 charge = (int)m_particleTable->particle( pid )->charge();
722 }
else if ( pid <0 ) {
723 if(m_particleTable->particle( -pid )){
724 charge = (int)m_particleTable->particle( -pid )->charge();
728 log << MSG::WARNING <<
"wrong particle id, please check data" <<endreq;
731 if(charge==0 ||
abs(
cos((*iter_mc)->initialFourMomentum().theta()))>0.93)
continue;
733 g_theta0MC[ntrkMC] = (*iter_mc)->initialFourMomentum().theta();
734 g_phi0MC[ntrkMC] = (*iter_mc)->initialFourMomentum().phi();
735 g_pxMC[ntrkMC] = (*iter_mc)->initialFourMomentum().px();
736 g_pyMC[ntrkMC] = (*iter_mc)->initialFourMomentum().py();
737 g_pzMC[ntrkMC] = (*iter_mc)->initialFourMomentum().pz();
747 SmartDataPtr<MdcDigiCol> mdcDigiVec(eventSvc,
"/Event/Digi/MdcDigiCol");
749 log << MSG::FATAL <<
"Could not find MDC digi" << endreq;
750 return( StatusCode::FAILURE);
752 MdcDigiCol::iterator iter1 = mdcDigiVec->begin();
757 for (;iter1 != mdcDigiVec->end(); iter1++, digiId++) {
762 MdcDigiVec::iterator iter1 = mdcDigiVec.begin();
767 for (;iter1 != mdcDigiVec.end(); iter1++, digiId++) {
769 mdcId = (*iter1)->identify();
773 log << MSG::DEBUG <<
"MDC digit No: " << digiId << endreq;
777 <<
" layerId = " << layerId
778 <<
" wireId = " << wireId
782 const int localwid = wireId;
783 const int wid = localwid + _widbase[layerId];
789 if (wid < 0 || wid > 6795)
continue;
790 FTWire & w = *(_wire + wid);
821 float time = tdc-sqrt(w.
x()*w.
x()+w.
y()*w.
y())/30;
843FTFinder::clear(
void){
847 for (
int i = 0; i^11; i++) (*(_superLayer+i)).clear();
854 for (
int i = 0; i < 10; i++) {
860FTFinder::getTestime(
void)
863 Gaudi::svcLocator()->service(
"MessageSvc",
msgSvc);
865 MsgStream log(
msgSvc,
"FTFinder");
867 IDataProviderSvc* eventSvc = NULL;
868 Gaudi::svcLocator()->service(
"EventDataSvc", eventSvc);
870 float sumT=0,estime=0;
874 for(
int i=0;i<10;i++){
888 int nbunch=((int)(estime-
tOffSet))/_bunchtime;
889 if(((
int)(estime-
tOffSet))%(int)_bunchtime>_bunchtime/2) nbunch=nbunch+1;
905 SmartDataPtr<TrigData> trigData(eventSvc,
"/Event/Trig/TrigData");
907 trigtimming=trigData->getTimingType();
908 log << MSG::INFO <<
"Timing type: "<< trigData->getTimingType() << endreq;
922FTFinder::mkTrackList(
void)
926 Gaudi::svcLocator()->service(
"MessageSvc",
msgSvc);
928 MsgStream log(
msgSvc,
"FTFinder");
931 int * Nsame = (
int *)malloc( 6 *
sizeof(
int));
943 linkAxialSuperLayer234(inner_segments);
944 linkAxialSuperLayer910(outer_segments);
946 _axialSegCollect.
append(inner_segments);
947 _axialSegCollect.
append(outer_segments);
949 int innerN = inner_segments.length();
950 int outerN = outer_segments.length();
952 log << MSG::DEBUG << innerN <<
" segments in inner axial layers!"<<endreq;
953 log << MSG::DEBUG << outerN <<
" segments in outer axial layers!"<<endreq;
955 for (l = 0; l^innerN; l++){
956 if (inner_segments[l]->track())
continue;
965 track_cand = linkAxialSegments(&inner, NULL);
966 if(!track_cand)
continue;
972 for (i = 0; i <
n; i++){
973 segments[i]->track(track_cand);
975 _tracks.
append(track_cand);
981 for(k = 0; k^outerN; k++) {
982 if (outer_segments[k]->track()) {
984 if (inner_segments[l]->track())
continue;
985 track_cand = linkAxialSegments(&inner, NULL);
986 if(!track_cand)
continue;
991 for (i = 0; i <
n; i++){
992 segments[i]->track(track_cand);
994 _tracks.
append(track_cand);
1002 track_cand = linkAxialSegments(&inner, &outer);
1005 if( k == outerN-1 ) {
1006 if (inner_segments[l]->track())
continue;
1007 track_cand = linkAxialSegments(&inner, NULL);
1009 if(!track_cand)
continue;
1026 if(inner_segments[l]->track()) {
1027 FTTrack * trk_tmp = inner_segments[l]->track();
1028 int nTrks = _tracks.
length();
1030 for (i = 0; i^nTrks; i++){
1031 if (_tracks[i] == trk_tmp){
1040 for (i = 0; i <
n2; i++){
1041 segments2[i]->track(NULL);
1043 for (i = 0; i <
n; i++){
1044 segments[i]->track(track_cand);
1046 _tracks.
replace(cache_i,track_cand);
1054 for (i = 0; i <
n; i++){
1055 segments[i]->track(track_cand);
1057 _tracks.
append(track_cand);
1068 for(
int i=0; i<
n; i++){
1070 log << MSG::DEBUG <<
" loop connected axial track: " << i <<endreq;
1072 for(
int j=0; j<l; j++){
1073 segments[j]->printout();
1084 _linkedSegments->
clear();
1087 int n = (*inner)->wireHits().length();
1088 _linkedSegments->
append(*inner);
1089 if(
n >= 7)
return (
new FTTrack(*_linkedSegments, (*inner)->kappa(), chi2_kappa));
1092 int n = _linkedSegments->
append(*outer);
1093 float SigmaK = (*outer)->kappa();
1094 float SigmaRR = (*outer)->r();
1096 float SigmaKRR = SigmaK*SigmaRR;
1097 float SigmaKKRR = SigmaK*SigmaKRR;
1100 float SigmaK_cache, SigmaRR_cache, SigmaKRR_cache, SigmaKKRR_cache;
1103 float inX =
s.incomingX();
1104 float inY =
s.incomingY();
1108 float in_r =
s.innerBoundHits().first()->layer().r();
1109 float incomingPhi =
s.incomingPhi();
1112 const FTWire & NextOuterBoundHit = *
next->outerBoundHits().first();
1116 float outX =
next->outgoingX();
1117 float outY =
next->outgoingY();
1120 float _trk_d = -2*(-1. / 2.99792458 /m_pmgnIMF->
getReferField())/
s.kappa();
1121 float _angle1 = asin(NextOuterBoundHit.
layer().
r()/_trk_d);
1122 float _angle2 = asin(
s.outerBoundHits().first()->layer().r()/_trk_d);
1123 float _ang_diff = _angle2 - _angle1;
1124 float _diff =
s.outgoingPhi() -
next->outgoingPhi();
1125 _diff = _diff - (int(_diff/
M_PI))*2*
M_PI;
1126 float _require = _ang_diff - _diff;
1128 if (_require < -0.10 || _require > 0.11)
return NULL;
1130 float SegK =
next->kappa();
1131 float SegRR =
next->r();
1133 const float out_r = NextOuterBoundHit.
layer().
r();
1135 float GapK = 2.*(-1. / 2.99792458 /m_pmgnIMF->
getReferField())*(inX*outY-inY*outX) /
1136 (in_r*out_r*sqrt((inX-outX)*(inX-outX)+(inY-outY)*(inY-outY)));
1138 float GapRR = 0.5*(in_r+out_r);
1140 float SigmaK_tmp = (SigmaK + SegK + GapK);
1141 float SigmaRR_tmp = SigmaRR + SegRR + GapRR;
1142 float SigmaKRR_tmp = SigmaKRR + SegK*SegRR + GapK*GapRR;
1143 float SigmaKKRR_tmp = SigmaKKRR + SegK*SegK*SegRR + GapK*GapK*GapRR;
1144 float MuK_tmp = SigmaK_tmp/(2*
n+1);
1145 float chi2 = (MuK_tmp*MuK_tmp*SigmaRR_tmp
1146 - 2.*MuK_tmp*SigmaKRR_tmp + SigmaKKRR_tmp)/(2*
n+1);
1147 if ((chi2-chi2_kappa) < Min_chi2){
1149 innerSegment =
next;
1150 SigmaK_cache = SigmaK_tmp;
1151 SigmaRR_cache = SigmaRR_tmp;
1152 SigmaKRR_cache = SigmaKRR_tmp;
1153 SigmaKKRR_cache = SigmaKKRR_tmp;
1156 n = _linkedSegments->
append(*inner);
1157 SigmaK = SigmaK_cache;
1158 SigmaRR = SigmaRR_cache;
1159 SigmaKRR = SigmaKRR_cache;
1160 SigmaKKRR = SigmaKKRR_cache;
1161 chi2_kappa = Min_chi2;
1163 if (
n > 1)
return (
new FTTrack(*_linkedSegments,SigmaK/(2*
n-1),chi2_kappa));
1183 linkAxialSegments_step(SuperLayer3Segments, SuperLayer4Segments,
1185 _segments34.append(SuperLayer3Segments);
1186 SuperLayer3Segments.
clear();
1189 linkAxialSegments_step(SuperLayer2Segments, _segments34,
1191 inner_segments.
append(_segments34);
1194 int n = SuperLayer2Segments.
length();
1195 int m = SuperLayer4Segments.
length();
1196 for (
int i = 0; i^
n; i++) {
1197 FTSegment * inner = SuperLayer2Segments[i];
1200 for (
int j = 0; j^m; j++) {
1201 FTSegment * outer = SuperLayer4Segments[j];
1204 float D_phi = fabs(in_outerPhi - out_innerPhi);
1205 if (D_phi >
M_PI) D_phi = 2*
M_PI - D_phi;
1207 if (D_phi >
M_PI/12.5)
continue;
1214 float GapK = 2.*(-1. / 2.99792458 /m_pmgnIMF->
getReferField())*(inY*outX-inX*outY) /
1215 (in_r*out_r*sqrt((inX-outX)*(inX-outX)+(inY-outY)*(inY-outY)));
1217 float cache_in = ((outer->
kappa()+GapK)/3.0 - inner->
kappa()*2.0/3.0)/in_r;
1218 float cache_out = ((inner->
kappa()+GapK)/3.0 - outer->
kappa()*2.0/3.0)/out_r;
1219 float cache_gap = ((inner->
kappa()+outer->
kappa())/3.0-GapK*2.0/3.0)*2.0/(in_r+out_r);
1220 float chi2_z = cache_in*cache_in + cache_out*cache_out + cache_gap*cache_gap;
1221 if (chi2_z > param->
_D_phi1)
continue;
1225 inner_segments.
append(inner);
1226 n = SuperLayer2Segments.
remove(i);
1227 m = SuperLayer4Segments.
remove(j);
1232 inner_segments.
append(SuperLayer2Segments);
1233 SuperLayer2Segments.
clear();
1234 inner_segments.
append(SuperLayer4Segments);
1235 SuperLayer4Segments.
clear();
1243 linkAxialSegments_step(SuperLayer9Segments, SuperLayer10Segments,
1245 outer_segments.
append(SuperLayer9Segments);
1246 SuperLayer9Segments.
clear();
1247 outer_segments.
append(SuperLayer10Segments);
1248 SuperLayer10Segments.
clear();
1255 float maxDphi,
float maxChi2)
1258 Gaudi::svcLocator()->service(
"MessageSvc",
msgSvc);
1259 MsgStream log(
msgSvc,
"FTFinder");
1261 int n = InnerSegments.
length();
1262 int m = OuterSegments.
length();
1263 for (
int i = 0; i^
n; i++){
1271 float min_Dphi =
M_PI/2;
1272 int min_Dphi_index = -1;
1273 for (
int j = 0; j^m; j++) {
1279 float D_phi = fabs(in_outerPhi - outer->
incomingPhi());
1280 if (D_phi >
M_PI) D_phi = 2*
M_PI - D_phi;
1281 if (D_phi > min_Dphi)
continue;
1288 float allK = 2.*(-1. / 2.99792458 /m_pmgnIMF->
getReferField())*(inY*outX-inX*outY) /
1289 (in_r*out_r*sqrt((inX-outX)*(inX-outX)+(inY-outY)*(inY-outY)));
1291 float cache_in = ((outer->
kappa() + allK)/3.0 - inner->
kappa()*2/3.0)/in_r;
1292 float cache_out = ((inner->
kappa() + allK)/3.0 - outer->
kappa()*2/3.0)/out_r;
1293 float cache_all = ((inner->
kappa()+outer->
kappa())/3.0-allK*2/3.0)*2.0/(in_r+out_r);
1294 float chi2_z = cache_in*cache_in + cache_out*cache_out + cache_all*cache_all;
1295 log<<MSG::DEBUG<<
"D_phi: "<< D_phi <<
" chi2_z: "<< chi2_z <<
" maxChi2: " <<maxChi2 <<endreq;
1296 if (chi2_z > maxChi2)
continue;
1300 if (min_Dphi_index < 0)
continue;
1301 log<<MSG::DEBUG<<
"min_Dphi: "<< min_Dphi <<endreq;
1302 FTSegment * outer = OuterSegments[min_Dphi_index];
1306 if (min_Dphi > maxDphi)
continue;
1309 if (min_Dphi > maxDphi*1.5)
continue;
1312 if (min_Dphi > maxDphi*2.25)
continue;
1322 m = OuterSegments.
remove(min_Dphi_index);
1323 log<<MSG::DEBUG<<
"DONE!!"<<endreq;
1329FTFinder::mkTrack3D(
void){
1331 Gaudi::svcLocator()->service(
"MessageSvc",
msgSvc);
1332 MsgStream log(
msgSvc,
"FTFinder");
1337 for (
int i=8; i>=0 ; i-- ){
1341 int m = segments.
length();
1342 for (
int j = 0; j^m; j++){
1349 for (
int k = 0; k^
n; k++){
1351 log<<MSG::DEBUG<<
"coupling to track: " << k <<endreq;
1354 if (
s->update3D(_tracks[k])){
1363 t->append_stereo_cache(
s);
1366 multi_trk_cand.append(
s);
1371 for (
int j = 0; j^
n; j++) _tracks[j]->updateSZ();
1374 for (
int i = 0; i^
n; i++) _tracks[i]->linkStereoSegments();
1375 n = multi_trk_cand.length();
1376 for (
int i = 0; i^
n; i++) multi_trk_cand[i]->linkStereoSegments();
1380FTFinder::VertexFit2D()
1382 int nTrks = _tracks.
length();
1394 for (
int i = 0; i < nTrks; i++){
1395 const Lpav & la = _tracks[i]->lpav();
1398 const float dr_i = a(1);
1399 if (fabs(a(1)) > 1.5)
continue;
1400 const float px_i = -
sin(a(2));
1401 const float py_i =
cos(a(2));
1406 float weight_i = la.
chisq()/(la.
nc()*0.02);
1410 dx.append(dr_i*py_i);
1411 dy.append(-dr_i*px_i);
1414 if (dx.length() < 2){
1420 double S_weight = 0.;
1421 for (
int i = dx.length() - 1; i; i--){
1422 const float px_i = px[i];
1423 const float py_i = py[i];
1424 const float dx_i = dx[i];
1425 const float dy_i = dy[i];
1426 const float weight_i =
weight[i];
1427 for (
int j = 0; j < i; j++){
1428 const float px_j = px[j];
1429 const float py_j = py[j];
1432 const float ddx = dx[j] - dx_i;
1433 const float ddy = dx[j] - dy_i;
1435 const float tmp_par = px_i*py_j - px_j*py_i;
1436 const float par = (py_j*ddx-px_j*ddy)/tmp_par;
1438 double weight_ij = weight_i*
weight[j];
1439 S_weight += weight_i*
weight[j];
1441 par < -0.5 || (py_i*ddx-px_i*ddy)/tmp_par < -0.5 ||
1442 fabs((px_i*px_j + py_i*py_j)/
1443 sqrt((px_i*px_i+py_i*py_i)*(px_j*px_j+py_j*py_j)))>0.86){
1444 _vx += (dx_i+0.5*ddx)*weight_ij;
1445 _vy += (dy_i+0.5*ddy)*weight_ij;
1447 _vx += (dx_i+par*px_i)*weight_ij;
1448 _vy += (dy_i+par*py_i)*weight_ij;
1454 if (S_weight == 0.){
1469FTFinder::VertexFit(
int z_flag)
1475 return VertexFit2D();
1496 for (
int i = 0; i <
n; i++){
1497 const Lpav & la = _tracks[i]->lpav();
1498 if (la.
nc() <= 3)
continue;
1499 const zav & za = _tracks[i]->Zav();
1500 if(za.
nc() > 2 && za.
b() > -900){
1504 sigma2_z.append(za.
chisq()/(za.
nc()-2));
1505 weight_z.append(
exp(-(za.
chisq()/(za.
nc()-2))));
1512 const float dr_i = a(1);
1513 const float px_i = - std::sin(a(2));
1514 const float py_i = std::cos(a(2));
1518 dx.append(dr_i*py_i);
1519 dy.append(-dr_i*px_i);
1520 sigma2_r.append(std::sqrt(la.
chisq())/(la.
nc()-3));
1539 for (
int i =
n - 1; i; i--){
1540 for (
int j = 0; j < i; j++){
1542 const float pij_x = py[i]*pz[j]-pz[i]*py[j];
1543 const float pij_y = pz[i]*px[j]-px[i]*pz[j];
1544 const float pij_z = px[i]*py[j]-py[i]*px[j];
1546 if (pij_x == 0.0f && pij_y == 0.0f && pij_z == 0.0f )
continue;
1548 const float sr = sigma2_r[i]+sigma2_r[j];
1549 const float sz = sigma2_z[i]+sigma2_z[j];
1551 const float ddx = dx[i]-dx[j];
1552 const float ddy = dy[i]-dy[j];
1553 const float ddz = dz[i]-dz[j];
1555 const float pij_mag2 = pij_x*pij_x/(sr*sz)+pij_y*pij_y/(sr*sz)+pij_z*pij_z/(sr*sr);
1557 const float d_i = (pij_x*(py[j]*ddz-pz[j]*ddy)/(sr*sz)+
1558 pij_y*(pz[j]*ddx-px[j]*ddz)/(sr*sz)+
1559 pij_z*(px[j]*ddy-py[j]*ddx)/(sr*sr))/pij_mag2;
1561 const float d_j = (pij_x*(py[i]*ddz-pz[i]*ddy)/(sr*sz)+
1562 pij_y*(pz[i]*ddx-px[i]*ddz)/(sr*sz)+
1563 pij_z*(px[i]*ddy-py[i]*ddx)/(sr*sr))/pij_mag2;
1565 const float vtx_x_i = dx[i] + px[i]*d_i;
1566 const float vtx_y_i = dy[i] + py[i]*d_i;
1567 const float vtx_z_i = dz[i] + pz[i]*d_i;
1569 const float vtx_x_j = dx[j] + px[j]*d_j;
1570 const float vtx_y_j = dy[j] + py[j]*d_j;
1571 const float vtx_z_j = dz[j] + pz[j]*d_j;
1574 vtx_x.append((
weight[j]*vtx_x_i +
weight[i]*vtx_x_j)/weight_ij);
1575 vtx_y.append((
weight[j]*vtx_y_i +
weight[i]*vtx_y_j)/weight_ij);
1576 vtx_z.append((weight_z[j]*vtx_z_i + weight_z[i]*vtx_z_j)/(weight_z[i]+weight_z[j]));
1578 weight2.append(
exp(-sr));
1579 weight2_z.append(
exp(-sz));
1580 vtx_chi2.append(((vtx_x_i-vtx_x_j)*(vtx_x_i-vtx_x_j)+(vtx_y_i-vtx_y_j)*(vtx_y_i-vtx_y_j))/sr +
1581 (vtx_z_i-vtx_z_j)*(vtx_z_i-vtx_z_j)/sz);
1585 n = vtx_chi2.length();
1586 float S_weight(0.0f);
1587 float S_weight_z(0.0f);
1588 for (
int i = 0; i !=
n; i++){
1589 if (vtx_chi2[i] > 10.)
continue;
1590 float w(std::exp(-vtx_chi2[i]));
1591 _vx += vtx_x[i]*weight2[i]*w;
1592 _vy += vtx_y[i]*weight2[i]*w;
1593 _vz += vtx_z[i]*weight2_z[i]*w;
1594 S_weight += weight2[i]*w;
1595 S_weight_z += weight2_z[i]*w;
1598 if (S_weight <= 0.){
1606 if (!z_flag)
return rtn_flag;
1607 if (S_weight_z <= 0.){
1617FTFinder::findBestVertex(
void)
1619 int nTrks = _tracks.
length();
1626 float min_dr = 9999.;
1628 for (
int i = 0; i < nTrks; i++){
1629 HepVector a = _tracks[i]->lpav().Hpar(
pivot);
1630 if (fabs(a(1)) < fabs(min_dr)){
1635 _vx = min_dr*
cos(phi0);
1636 _vy = min_dr*
sin(phi0);
1642 return Hep3Vector(_vx,_vy,_vz);
1646FTFinder::CorrectEvtTiming(
void)
1648 int nTrks = _tracks.
length();
1649 float weight_sum = 0.;
1651 for (
int i = 0; i^nTrks; i++){
1655 const Lpav & la = _tracks[i]->lpav();
1657 int m = axial_sgmnts.
length();
1658 for (
int j = 0; j^m; j++){
1661 for (
int k = 0; k^l; k++){
1663 const float x = h.
x();
1664 const float y = h.
y();
1665 double d0 = fabs(la.
d((
double)x,(
double)y));
1674 if (!nHits)
continue;
1675 float weight_t =
exp(-(dtt_sum - (dt_sum*dt_sum/nHits))/(nHits*1600));
1676 weight_sum += (nHits*weight_t);
1677 dt_sum2 += (dt_sum*weight_t);
1680 return int(dt_sum2/weight_sum);
1686FTFinder::makeMdst(
void)
1689 const int nTrks = _tracks.
length();
1692 for (
int i = 0; i<nTrks; i++){
1694 const FTTrack & trk = * _tracks[i];
1697 int axialSegmentsN = axialSegments.
length();
1698 int stereoSegmentsN = stereoSegments.
length();
1699 for (
int i = 0; i < axialSegmentsN ; i++) {
1702 int wiresN = wires.
length();
1703 for (
int j=0; j < wiresN; j++) {
1709 for (
int i = 0; i < stereoSegmentsN ; i++) {
1712 int wiresN = wires.
length();
1713 for (
int j=0; j < wiresN; j++) {
1720 if (h.
tanl() < -9000.)
continue;
1727 g_px[Ntable-1] = p.x();
1729 g_py[Ntable-1] = p.y();
1731 g_pz[Ntable-1] = p.z();
1732 g_p[Ntable-1] = p.mag();
1733 g_phi[Ntable-1] = atan2(m_py, m_px);
1742 g_vx[Ntable-1] =
v(0);
1743 g_vy[Ntable-1] =
v(1);
1744 g_vz[Ntable-1] =
v(2);
1758FTFinder::makeTds(
void)
1761 Gaudi::svcLocator()->service(
"MessageSvc",
msgSvc);
1762 MsgStream log(
msgSvc,
"FTFinder");
1764 IDataProviderSvc* eventSvc = NULL;
1765 Gaudi::svcLocator()->service(
"EventDataSvc", eventSvc);
1770 log << MSG::FATAL <<
"makeTds:Could not find eventSvc" << endreq;
1771 return StatusCode::FAILURE ;
1779 log << MSG::DEBUG <<
"beginning to make RecMdcTrackCol" <<endreq;
1783 for (
int i =0; i < ntrk; i++) {
1792 log << MSG::DEBUG <<
"deleted trackId = " << i+1 <<
" due to tanl = " << fttrk->
helix()->
tanl() << endreq;
1800 m_a = fttrk->
helix()->
a();
1802 HepSymMatrix m_ea = fttrk->
helix()->
Ea();
1803 float fiterm = fttrk->
lpav().
phi(77.0);
1805 float chi2zav = fttrk->
Zav().
chisq();
1811 m_ea[0][0] = 0.0085;
1812 m_ea[1][1] = 0.000011;
1813 m_ea[2][2] = 0.0018;
1815 m_ea[4][4] = 0.00026;
1816 m_ea[1][0] = m_ea[0][1] = -0.00029;
1817 m_ea[2][0] = m_ea[0][2] = charge*0.004;
1818 m_ea[2][1] = m_ea[1][2] = charge*0.00012;
1819 m_ea[3][0] = m_ea[0][3] = -0.017;
1820 m_ea[3][1] = m_ea[1][3] = 0.0;
1821 m_ea[3][2] = m_ea[2][3] = 0.0;
1822 m_ea[4][0] = m_ea[0][4] = 0.0;
1823 m_ea[4][1] = m_ea[1][4] = 0.0;
1824 m_ea[4][2] = m_ea[2][4] = 0.0;
1825 m_ea[4][3] = m_ea[3][4] = -0.018;
1832 trk->
setChi2(chi2lpav+chi2zav);
1834 log <<MSG::DEBUG <<
" trackId = " << i << endreq;
1835 log <<MSG::DEBUG <<
"fast-tracking kappa "<<m_a[2]
1836 <<
" fast-tracking tanl "<<m_a[4]
1838 log <<MSG::DEBUG <<
"push_backed kappa "<<trk->
helix(2)
1839 <<
" push_backed tanl "<< trk->
helix(4)
1842 log << MSG::DEBUG <<
"beginning to make hitlist and RecMdcHitCol " <<endreq;
1851 int nseg_ax = seglist_ax.
length();
1853 for (
int iseg_ax = 0; iseg_ax < nseg_ax; iseg_ax++) {
1855 int nhitlist_ax = hitlist_ax.
length();
1856 ntrackhits += nhitlist_ax;
1857 for(
int ihit_ax = 0; ihit_ax < nhitlist_ax; ihit_ax++,hitindex++) {
1858 FTWire wire_ax = *(hitlist_ax[ihit_ax]);
1861 double tdc = wire_ax.
time();
1862 double chi2 = wire_ax.
getChi2();
1866 hit->
setId(hitindex);
1874 log << MSG::DEBUG <<
"Hit DriftDistLeft " << hit->
getDriftDistLeft() << endreq;
1875 log << MSG::DEBUG <<
"MDC Hit ADC " << hit->
getAdc() << endreq;
1876 log << MSG::DEBUG <<
"Hit MDC Identifier " << hit->
getMdcId() << endreq;
1877 log << MSG::DEBUG <<
"Hit Chisq " << hit->
getChisqAdd() << endreq;
1879 hitcol->push_back(hit);
1880 SmartRef<RecMdcHit> refhit(hit);
1881 hitrefvec.push_back(refhit);
1887 int nseg_st = seglist_st.
length();
1890 for (
int iseg_st = 0; iseg_st < nseg_st; iseg_st++) {
1892 int nhitlist_st = hitlist_st.
length();
1893 ntrackhits += nhitlist_st;
1894 ntrackster += nhitlist_st;
1895 for(
int ihit_st = 0; ihit_st < nhitlist_st; ihit_st++,hitindex++) {
1896 FTWire wire_st = *(hitlist_st[ihit_st]);
1900 double tdc = wire_st.
time();
1901 double chi2 = wire_st.
getChi2();
1905 hit->
setId(hitindex);
1913 log << MSG::DEBUG <<
"Z Hit DriftDistLeft " << hit->
getDriftDistLeft() << endreq;
1914 log << MSG::DEBUG <<
"Z MDC Hit ADC " << hit->
getAdc() << endreq;
1915 log << MSG::DEBUG <<
"Z Hit MDC Identifier " << hit->
getMdcId() << endreq;
1916 log << MSG::DEBUG <<
"Z Hit Chisq " << hit->
getChisqAdd() << endreq;
1918 hitcol->push_back(hit);
1919 SmartRef<RecMdcHit> refhit(hit);
1920 hitrefvec.push_back(refhit);
1926 trkcol->push_back(trk);
1929 g_naxialhit->fill((
float)(ntrackhits-ntrackster), 1.0);
1931 g_nhit->fill((
float)ntrackhits, 1.0);
1935 IDataManagerSvc *dataManSvc =
dynamic_cast<IDataManagerSvc*
> (eventSvc);
1936 DataObject *aTrackCol;
1937 eventSvc->findObject(
"/Event/Recon/RecMdcTrackCol",aTrackCol);
1938 if(aTrackCol != NULL) {
1939 dataManSvc->clearSubTree(
"/Event/Recon/RecMdcTrackCol");
1940 eventSvc->unregisterObject(
"/Event/Recon/RecMdcTrackCol");
1942 DataObject *aRecHitCol;
1943 eventSvc->findObject(
"/Event/Recon/RecMdcHitCol",aRecHitCol);
1944 if(aRecHitCol != NULL) {
1945 dataManSvc->clearSubTree(
"/Event/Recon/RecMdcHitCol");
1946 eventSvc->unregisterObject(
"/Event/Recon/RecMdcHitCol");
1951 hitsc = eventSvc->registerObject(
"/Event/Recon/RecMdcHitCol", hitcol);
1952 if( hitsc.isFailure() ) {
1953 log << MSG::FATAL <<
"Could not register RecMdcHitCol" << endreq;
1957 log << MSG::DEBUG <<
"RecMdcHitCol registered successfully!" <<endreq;
1959 RecMdcTrackCol::iterator bef = trkcol->begin();
1960 for( ; bef != trkcol->end(); bef++) {
1961 log <<MSG::DEBUG <<
" registered kappa"<<(*bef)->helix(2)
1962 <<
" registered tanl"<< (*bef)->helix(4)
1969 trksc = eventSvc->registerObject(
"/Event/Recon/RecMdcTrackCol", trkcol);
1970 if( trksc.isFailure() ) {
1971 log << MSG::FATAL <<
"Could not register RecMdcHit" << endreq;
1975 log << MSG::DEBUG <<
"RecMdcTrackCol registered successfully!" <<endreq;
1978 SmartDataPtr<RecMdcHitCol> newhitCol(eventSvc,
"/Event/Recon/RecMdcHitCol");
1980 log << MSG::FATAL <<
"Could not find RecMdcHit" << endreq;
1981 return( StatusCode::FAILURE);
1983 log << MSG::DEBUG <<
"Begin to check RecMdcHitCol"<<endreq;
1984 RecMdcHitCol::iterator iter_hit = newhitCol->begin();
1985 for( ; iter_hit != newhitCol->end(); iter_hit++){
1986 log << MSG::DEBUG <<
"retrieved MDC Hit:"
1987 <<
" DDL " <<(*iter_hit)->getDriftDistLeft()
1988 <<
" DDR " <<(*iter_hit)->getDriftDistRight()
1989 <<
" ADC " <<(*iter_hit)->getAdc() << endreq;
1993 SmartDataPtr<RecMdcTrackCol> newtrkCol(eventSvc,
"/Event/Recon/RecMdcTrackCol");
1995 log << MSG::FATAL <<
"Could not find RecMdcTrackCol" << endreq;
1996 return( StatusCode::FAILURE);
1998 log << MSG::DEBUG <<
"Begin to check RecMdcTrackCol"<<endreq;
1999 RecMdcTrackCol::iterator iter_trk = newtrkCol->begin();
2000 for( ; iter_trk != newtrkCol->end(); iter_trk++){
2001 log << MSG::DEBUG <<
"retrieved MDC track:"
2002 <<
"Track Id: " << (*iter_trk)->trackId()
2003 <<
" Pivot: " << (*iter_trk)->poca()[0] <<
" "
2004 << (*iter_trk)->poca()[1] <<
" " << (*iter_trk)->poca()[2]
2020 log << MSG::DEBUG <<
"hitList of this track:" << endreq;
2021 HitRefVec gothits = (*iter_trk)->getVecHits();
2022 HitRefVec::iterator it_gothit = gothits.begin();
2023 for( ; it_gothit != gothits.end(); it_gothit++){
2024 log << MSG::DEBUG <<
"hits Id: "<<(*it_gothit)->getId()
2025 <<
" hits DDL&DDR " <<(*it_gothit)->getDriftDistLeft()
2026 <<
" hits MDC IDentifier " <<(*it_gothit)->getMdcId()
2028 <<
" hits TDC " <<(*it_gothit)->getTdc()
2029 <<
" hits ADC " <<(*it_gothit)->getAdc() << endreq;
2035 return StatusCode::SUCCESS;
double sin(const BesAngle a)
double cos(const BesAngle a)
EvtComplex exp(const EvtComplex &c)
double abs(const EvtComplex &c)
IHistogram1D * g_nstereohit
NTuple::Array< float > g_pz
NTuple::Array< float > g_theta
NTuple::Array< float > g_pxMC
NTuple::Array< float > g_pzMC
NTuple::Array< float > g_pyMC
NTuple::Array< float > g_dr
IHistogram2D * g_hitmap[20]
NTuple::Array< float > g_kappa
NTuple::Item< long > g_eventNo
NTuple::Array< float > g_ptMC
NTuple::Item< float > g_estime
NTuple::Array< float > g_dz
NTuple::Array< float > g_tanl
NTuple::Item< long > g_ntrk
NTuple::Item< long > g_ntrkMC
NTuple::Array< float > g_phi0MC
NTuple::Array< float > g_py
NTuple::Array< float > g_px
NTuple::Array< float > g_pt
NTuple::Array< float > g_p
NTuple::Array< float > g_phi0
NTuple::Array< float > g_vx
IHistogram1D * g_naxialhit
NTuple::Array< float > g_vy
NTuple::Array< float > g_theta0MC
NTuple::Array< float > g_vz
NTuple::Array< float > g_phi
*********Class see also m_nmax DOUBLE PRECISION m_MasPhot DOUBLE PRECISION m_phsu DOUBLE PRECISION m_Xenph DOUBLE PRECISION m_r2 DOUBLE PRECISION m_WtMass INTEGER m_nmax INTEGER m_Nevgen INTEGER m_IsFSR INTEGER m_MarTot *COMMON c_KarFin $ !Output file $ !Event serial number $ !alpha QED at Thomson limit $ !minimum energy at CMS for remooval $ !infrared dimensionless $ !dummy photon IR regulator $ !crude photon multiplicity enhancement factor *EVENT $ !MC crude volume of PhhSpace *Sfactors $ !YFS formfactor IR part only $ !YFS formfactor non IR finite part $ !mass weight
**********Class see also m_nmax DOUBLE PRECISION m_amel DOUBLE PRECISION m_x2 DOUBLE PRECISION m_alfinv DOUBLE PRECISION m_Xenph INTEGER m_KeyWtm INTEGER m_idyfs DOUBLE PRECISION m_zini DOUBLE PRECISION m_q2 DOUBLE PRECISION m_Wt_KF DOUBLE PRECISION m_WtCut INTEGER m_KFfin *COMMON c_KarLud $ !Input CMS energy[GeV] $ !CMS energy after beam spread beam strahlung[GeV] $ !Beam energy spread[GeV] $ !z boost due to beam spread $ !electron beam mass *ff pair spectrum $ !minimum v
NTuple::Item< double > m_pz
std::vector< MdcDigi * > MdcDigiVec
ObjectVector< RecEsTime > RecEsTimeCol
ObjectVector< RecMdcHit > RecMdcHitCol
ObjectVector< RecMdcTrack > RecMdcTrackCol
SmartRefVector< RecMdcHit > HitRefVec
void setTrackId(const int trackId)
void setNster(const int ns)
void setError(double err[15])
void setHelix(double helix[5])
const HepVector helix() const
......
void setChi2(const double chi)
CLHEP::Hep3Vector vertex(void) const
returns event primary vertex
FTSuperLayer * superLayer(int id) const
returns superlayer
void event()
track finder core
void init()
initializer(creates geometry)
FTList< float > tEstime[10]
void begin_run()
begin run function(reads constants)
FTList< FTTrack * > & tracks(void) const
returns track list
int getWireId(FTWire *) const
returns wire ID for given FTWire object
FTFinder()
Constructors and destructor.
float x2t(const FTLayer &l, const float x) const
convert x to t
const float r(void) const
returns r form origin
const int layerId(void) const
returns layer ID
const FTSuperLayer & superLayer(void) const
returns super-layer
double csize(void) const
returns cell size
T & first(void) const
returns the first object in the list
void deleteAll(void)
delete all object and clear(allocated memory remains same)
void replace(int i, T src)
replace index-th object by the object src
void clear(void)
clear lists but the allocated memory remains same
int remove(int &)
remove objects by index and returns decremented index and length
int length(void) const
returns the length of the list
int append(const T &x)
append an object into the end of the list
float incomingPhi(void) const
returns phi of incoming position
float outgoingY(void) const
returns y of outgoing position
float outgoingPhi(void) const
returns phi of outgoing position
FTList< FTWire * > & innerBoundHits(void) const
returns innerBoundHits
float incomingY(void) const
returns y of incoming position
void update(void)
update information for axial segment
FTList< FTWire * > & wireHits(void) const
returns wire-hit list
float outgoingX(void) const
returns x of outgoing position
float kappa(void) const
returns kappa(axial)
void connect_outer(const FTList< FTWire * > &, const FTList< FTWire * > &)
connect short segments
FTList< FTWire * > & outerBoundHits(void) const
returns outerBoundHits
float incomingX(void) const
returns x of incoming position
FTList< FTSegment * > & segments(void) const
returns segement list
void appendHit(FTWire *)
append wireHit to the list of hits
Helix * helix(void) const
returns helix parameters
FTList< FTSegment * > & axial_segments(void) const
returns axial segments
void setFTFinder(FTFinder *)
const zav & Zav(void) const
returns zav
FTList< FTSegment * > & stereo_segments(void) const
returns stereo_segments
const Lpav & lpav(void) const
returns lpav
float chi2_kappa_tmp(void) const
returns sigmaKappa at linking
const float y(void) const
returns position y
float distance(void) const
returns drift distance
float getChi2(void) const
unsigned state(void) const
returns state
void initNeighbor(void)
initNeighbor
const FTLayer & layer(void) const
returns layer
void setAdc(float adc)
wangdy add:set Adc value
const int localId(void) const
returns local ID
const float x(void) const
returns position x
void wireId(int wireID)
set wireId
float time(void) const
rerurns TDC time(after t0 subtraction)
void setChi2(float chi2)
set residual fit chi2
Hep3Vector momentum(double dPhi=0.) const
returns momentum vector after rotating angle dPhi in phi direction.
const HepSymMatrix & Ea(void) const
returns error matrix.
HepPoint3D x(double dPhi=0.) const
returns position after rotating angle dPhi in phi direction.
double dr(void) const
returns an element of parameters.
const HepVector & a(void) const
returns helix parameters.
const HepPoint3D & pivot(void) const
returns pivot position.
virtual double getReferField()=0
virtual const int getLayerSize()=0
virtual const MdcGeoLayer *const Layer(unsigned id)=0
virtual const MdcGeoWire *const Wire(unsigned id)=0
virtual const int getWireSize()=0
virtual const int getSuperLayerSize()=0
virtual MdcDigiVec & getMdcDigiVec(uint32_t control=0)=0
double d(double x, double y) const
HepVector Hpar(const HepPoint3D &pivot) const
double phi(double r, int dir=0) const
double Radius(void) const
double Length(void) const
MdcGeoSuper * Sup(void) const
double Offset(void) const
MdcGeoLayer * Lyr(void) const
HepPoint3D Forward(void) const
HepPoint3D Backward(void) const
static Identifier wire_id(int wireType, int layer, int wire)
For a single wire.
static int layer(const Identifier &id)
Values of different levels (failure returns 0)
static int wire(const Identifier &id)
const int _findEventVertex
static MdcParameter * instance()
static int MdcChargeChannel(double charge)
static double MdcTime(int timeChannel)
static double MdcCharge(int chargeChannel)
void setMdcId(Identifier mdcid)
const double getChisqAdd(void) const
void setDriftDistLeft(double ddl)
const double getAdc(void) const
const Identifier getMdcId(void) const
const double getDriftDistLeft(void) const
void setChisqAdd(double pChisq)
void setDriftDistRight(double ddr)
void setPivot(const HepPoint3D &pivot)
void setVecHits(HitRefVec vechits)
void setFiTerm(double fiterm)
IHistogram1D * g_nstereohit
NTuple::Array< float > g_pz
NTuple::Array< float > g_theta
NTuple::Array< float > g_pxMC
NTuple::Array< float > g_pzMC
NTuple::Array< float > g_pyMC
NTuple::Array< float > g_dr
IHistogram2D * g_hitmap[20]
NTuple::Array< float > g_kappa
NTuple::Item< long > g_eventNo
NTuple::Array< float > g_ptMC
NTuple::Item< float > g_estime
NTuple::Array< float > g_dz
NTuple::Array< float > g_tanl
NTuple::Item< long > g_ntrk
NTuple::Item< long > g_ntrkMC
NTuple::Array< float > g_phi0MC
NTuple::Array< float > g_py
NTuple::Array< float > g_px
NTuple::Array< float > g_pt
NTuple::Array< float > g_p
NTuple::Array< float > g_phi0
NTuple::Array< float > g_vx
IHistogram1D * g_naxialhit
NTuple::Array< float > g_vy
NTuple::Array< float > g_theta0MC
NTuple::Array< float > g_vz
NTuple::Array< float > g_phi