00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <stdlib.h>
00011 #include "MdcFastTrkAlg/FTTrack.h"
00012 #include "MdcFastTrkAlg/FTSegment.h"
00013 #include "MdcFastTrkAlg/FTFinder.h"
00014 #include "MdcFastTrkAlg/FTWire.h"
00015 #include "MdcFastTrkAlg/MdcParameter.h"
00016
00017 #ifndef OnlineMode
00018 #include "AIDA/IAxis.h"
00019 #include "AIDA/IHistogram1D.h"
00020 #include "AIDA/IHistogram2D.h"
00021 #include "AIDA/IHistogram3D.h"
00022 #include "AIDA/IHistogramFactory.h"
00023
00024 extern IHistogram1D* g_sigmaxy;
00025 extern IHistogram1D* g_sigmaz;
00026 extern IHistogram1D* g_chi2xy;
00027 extern IHistogram1D* g_chi2sz;
00028
00029 #endif
00030
00031
00032
00033
00034 MdcParameter* FTTrack::param = MdcParameter::instance();
00035
00036 int
00037 FTTrack::r_phiFit(void)
00038 {
00039 IMessageSvc *msgSvc;
00040 Gaudi::svcLocator()->service("MessageSvc", msgSvc);
00041
00042 MsgStream log(msgSvc, "FTFinder");
00043
00044
00045 if (fabs(_kappa) > 1.2/param->_minPt) return 0;
00046
00047 _la = new Lpav;
00048 int n = _axial_segments.length();
00049 for (int i = 0; i^n; i++){
00050 FTList<FTWire *> & hits = _axial_segments[i]->wireHits();
00051 int m = hits.length();
00052 for (int j = 0; j^m; j++){
00053 FTWire & h = * hits[j];
00054 if (h.stateAND(FTWireFittingInvalid)){
00055 hits.remove(j);
00056 continue;
00057 }
00058
00059 double par = h.distance()/(0.25*h.layer().csize());
00060 _la->add_point((double)h.x(),(double)h.y(),exp(-par*par));
00061 }
00062 }
00063
00064 double chi2 = _la->fit();
00065 HepVector a = _la->Hpar(m_ftFinder->pivot);
00066 log << MSG::DEBUG << " chi2/_la cut(1): " << chi2 << " / " << _la->nc()
00067 <<" a1(" << param->_minDr << "): " << a(1)
00068 <<" a3(" << 1.05/param->_minPt << "):" << a(3) <<endreq;
00069 if (chi2/_la->nc() > 1.) return 0;
00070 if (fabs(a(3))>(1.05/param->_minPt)) return 0;
00071 if (fabs(a(1))>param->_minDr) return 0;
00072 _la->clear();
00073 log << MSG::DEBUG << " passed chi2/_la, a(3) and a(1) cut" <<endreq;
00074 int layer0 = 0;
00075 for (int i = 0; i^n; i++){
00076 FTList<FTWire *> & hits = _axial_segments[i]->wireHits();
00077 if (!_axial_segments[i]->superLayer().superLayerId()) layer0 = 1;
00078 int m = hits.length();
00079 for (int j = 0; j^m; j++){
00080 FTWire & h = * hits[j];
00081 const float x = h.x();
00082 const float y = h.y();
00083 double d0 = _la->d((double)x,(double)y);
00084 float delta = h.distance()/h.layer().r();
00085 if (fabs(d0) > 0.7*h.layer().csize()) continue;
00086 if (d0>0){
00087 d0 = -d0;
00088 }else{
00089 delta = -delta;
00090 }
00091 _la->add_point(x - delta*y, y + delta*x, 1);
00092 }
00093 }
00094 if (!layer0){
00095 FTList<FTSegment *> & salvage =
00096 m_ftFinder->superLayer(0)->complecated_segments();
00097 HepVector center = _la->center();
00098 const float xc = center(1);
00099 const float yc = center(2);
00100 const float rc = a(1)+(-1. / 2.99792458 /m_pmgnIMF->getReferField())/a(3);
00101 int nn = salvage.length();
00102 for (int i = 0; i^nn; i++){
00103 int salvaged = 0;
00104 FTList<FTWire *> & hits = salvage[i]->wireHits();
00105 int m = hits.length();
00106 for (int j = 0; j^m; j++){
00107 FTWire & h = * hits[j];
00108 float x = h.x();
00109 float y = h.y();
00110 float r = h.layer().r();
00111 if ((y*xc-x*yc)/(r*rc)<0.707) break;
00112 double d0 = _la->d((double)x,(double)y);
00113 float delta = h.distance()/r;
00114 if (fabs(d0) > 0.7*h.layer().csize()) continue;
00115 if (d0>0){
00116 h.stateOR(FTWireHitRight);
00117 d0 = -d0;
00118 }else{
00119 h.stateOR(FTWireHitLeft);
00120 delta = -delta;
00121 }
00122 _la->add_point(x - delta*y, y + delta*x, 1);
00123 salvaged = 1;
00124 }
00125 if (salvaged){
00126 _axial_segments.append(salvage[i]);
00127 break;
00128 }
00129 }
00130 }
00131 chi2 = _la->fit();
00132 _stereo_segments = new FTList<FTSegment *>(6);
00133 _stereo_segments_cache = new FTList<FTSegment *>(3);
00134 _stereo_segments_by_superLayer = new FTList<FTList<FTSegment *> *>(6);
00135 _za = new zav;
00136 _SigmaS = 0.;
00137 _SigmaZ = 0.;
00138 _SigmaSS = 0.;
00139 _SigmaSZ = 0.;
00140 return 1;
00141 }
00142
00143 int
00144 FTTrack::r_phiReFit(float vx, float vy, int vtx_flag)
00145 {
00146 if (vtx_flag) _la->fit(vx, vy, 20*_la->chisq()/_la->nc());
00147 int n = _axial_segments.length();
00148 _la->clear();
00149 for (int i = 0; i^n; i++){
00150 FTList<FTWire *> & hits = _axial_segments[i]->wireHits();
00151 int m = hits.length();
00152 for (int j = 0; j^m; j++){
00153 FTWire & h = * hits[j];
00154 const float x = h.x();
00155 const float y = h.y();
00156 double d0 = _la->d((double)x,(double)y);
00157 float cellsize = h.layer().csize();
00158 if (m_ftFinder->evtTiming){
00159 float time = h.time() + m_ftFinder->evtTiming;
00160 if(time<-100) continue;
00161 h.distance(m_ftFinder->t2x(h.layer(),time));
00162
00163 }
00164 float delta = h.distance()/h.layer().r();
00165 if (fabs(d0) > 0.5*cellsize) continue;
00166 if (d0>0){
00167 h.stateOR(FTWireHitRight);
00168 d0 = -d0;
00169 }else{
00170 h.stateOR(FTWireHitLeft);
00171 delta = -delta;
00172 }
00173 h.setChi2(h.distance()+d0);
00174 #ifndef OnlineMode
00175
00176 g_sigmaxy->fill(h.distance()+d0, 1.0);
00177 #endif
00178 _la->add_point(x - delta*y, y + delta*x, 1);
00179 }
00180 }
00181 HepVector b = _la->Hpar(m_ftFinder->pivot);
00182 double chi2 = _la->fit();
00183 #ifndef OnlineMode
00184 g_chi2xy->fill(chi2/_la->nc(), 1.0);
00185 #endif
00186
00187 return 1;
00188 }
00189
00190 int
00191 FTTrack::r_phi2Fit(float vx, float vy, int vtx_flag)
00192 {
00193 if (vtx_flag) _la->fit(vx, vy, 20*_la->chisq()/_la->nc());
00194 int n = _axial_segments.length();
00195 _la->clear();
00196 int k=0,l=0;
00197 float temp=0;
00198 for (int i = 0; i^n; i++){
00199 FTList<FTWire *> & hits = _axial_segments[i]->wireHits();
00200 int m = hits.length();
00201 for (int j = 0; j^m; j++){
00202 k++;
00203 FTWire & h = * hits[j];
00204 const float x = h.x();
00205 const float y = h.y();
00206 double d0 = _la->d((double)x,(double)y);
00207 float cellsize = h.layer().csize();
00208 if (m_ftFinder->evtTiming){
00209 float time = h.time() + m_ftFinder->evtTiming ;
00210 if(time<-100) continue;
00211 h.distance(m_ftFinder->t2x(h.layer(),time));
00212
00213 }
00214 float delta = h.distance()/h.layer().r();
00215 if (fabs(d0) > 0.5*cellsize) continue;
00216 if (h.distance()<0.1 || h.distance()>0.6) continue;
00217 if (d0>0){
00218 h.stateOR(FTWireHitRight);
00219 d0 = -d0;
00220 }else{
00221 h.stateOR(FTWireHitLeft);
00222 delta = -delta;
00223 }
00224 #ifndef OnlineMode
00225
00226
00227 #endif
00228 _la->add_point(x - delta*y, y + delta*x, 1);
00229 if(temp<fabs(h.distance()+d0)){
00230 temp=fabs(h.distance()+d0);
00231 l=k;
00232 }
00233 }
00234 }
00235 HepVector b = _la->Hpar(m_ftFinder->pivot);
00236 double chi2 = _la->fit();
00237 #ifndef OnlineMode
00238
00239 #endif
00240 if(k>5){
00241 return l;
00242 }
00243 else{
00244 return -99;
00245 }
00246 }
00247
00248 int
00249 FTTrack::r_phi3Fit(int l, float vx, float vy, int vtx_flag)
00250 {
00251 if (vtx_flag) _la->fit(vx, vy, 20*_la->chisq()/_la->nc());
00252 int n = _axial_segments.length();
00253 _la->clear();
00254 int k=0;
00255 for (int i = 0; i^n; i++){
00256 FTList<FTWire *> & hits = _axial_segments[i]->wireHits();
00257 int m = hits.length();
00258 for (int j = 0; j^m; j++){
00259 k++;
00260 FTWire & h = * hits[j];
00261 const float x = h.x();
00262 const float y = h.y();
00263 double d0 = _la->d((double)x,(double)y);
00264 float cellsize = h.layer().csize();
00265 if (m_ftFinder->evtTiming){
00266 float time = h.time() + m_ftFinder->evtTiming ;
00267 if(time<-100) continue;
00268 h.distance(m_ftFinder->t2x(h.layer(),time));
00269
00270 }
00271 float delta = h.distance()/h.layer().r();
00272 if (fabs(d0) > 0.5*cellsize) continue;
00273 if (d0>0){
00274 h.stateOR(FTWireHitRight);
00275 d0 = -d0;
00276 }else{
00277 h.stateOR(FTWireHitLeft);
00278 delta = -delta;
00279 }
00280 if (k==l){
00281
00282 m=hits.remove(j);
00283 continue;
00284 }
00285 _la->add_point(x - delta*y, y + delta*x, 1);
00286
00287 }
00288 }
00289 HepVector b = _la->Hpar(m_ftFinder->pivot);
00290 double chi2 = _la->fit();
00291 return 1;
00292 }
00293
00294 int
00295 FTTrack::r_phi4Fit(float vx, float vy, int vtx_flag)
00296 {
00297 if (vtx_flag) _la->fit(vx, vy, 20*_la->chisq()/_la->nc());
00298 int n = _axial_segments.length();
00299 _la->clear();
00300 for (int i = 0; i^n; i++){
00301 FTList<FTWire *> & hits = _axial_segments[i]->wireHits();
00302 int m = hits.length();
00303 for (int j = 0; j^m; j++){
00304 FTWire & h = * hits[j];
00305 const float x = h.x();
00306 const float y = h.y();
00307 double d0 = _la->d((double)x,(double)y);
00308 float cellsize = h.layer().csize();
00309 if (m_ftFinder->evtTiming){
00310 float time = h.time() + m_ftFinder->evtTiming ;
00311 if(time<-100) continue;
00312 h.distance(m_ftFinder->t2x(h.layer(),time));
00313
00314 }
00315 float delta = h.distance()/h.layer().r();
00316 if (fabs(d0) > 0.5*cellsize) continue;
00317 if (d0>0){
00318 h.stateOR(FTWireHitRight);
00319 d0 = -d0;
00320 }else{
00321 h.stateOR(FTWireHitLeft);
00322 delta = -delta;
00323 }
00324
00325 _la->add_point(x - delta*y, y + delta*x, 1);
00326 h.setChi2(h.distance()+d0);
00327 #ifndef OnlineMode
00328
00329
00330 #endif
00331 }
00332 }
00333 HepVector b = _la->Hpar(m_ftFinder->pivot);
00334 double chi2 = _la->fit();
00335 #ifndef OnlineMode
00336
00337 #endif
00338 return 1;
00339 }
00340
00341 int
00342 FTTrack::linkStereoSegments(void){
00343 delete _stereo_segments_cache;
00344 int n = _stereo_segments_by_superLayer->length();
00345 for (int i = 0; i^n; i++){
00346 FTList<FTSegment *> & segments = *(*_stereo_segments_by_superLayer)[i];
00347 int m = segments.length();
00348 float min_D_z = 9998.;
00349 float S = 0.;
00350 float Z = 0.;
00351 FTSegment * selected = NULL;
00352 for (int j = 0; j^m; j++){
00353 FTSegment * s = segments[j];
00354 float s_tmp = s->s();
00355 float z_tmp = s->z();
00356 double D_z = fabs(d_z(s_tmp,z_tmp));
00357 if (D_z < min_D_z){
00358 selected = s;
00359 min_D_z = D_z;
00360 S = s_tmp;
00361 Z = z_tmp;
00362 }
00363 }
00364 if (selected){
00365 _stereo_segments->append(selected);
00366 _SigmaS += S;
00367 _SigmaZ += Z;
00368 _SigmaSZ += S*Z;
00369 _SigmaSS += S*S;
00370 }
00371 }
00372 _stereo_segments_by_superLayer->deleteAll();
00373 delete _stereo_segments_by_superLayer;
00374 return 0;
00375 }
00376
00377 int
00378 FTTrack::s_zFit(void){
00379 IMessageSvc *msgSvc;
00380 Gaudi::svcLocator()->service("MessageSvc", msgSvc);
00381
00382 MsgStream log(msgSvc, "FTFinder");
00383
00384 HepVector a = _la->Hpar(m_ftFinder->pivot);
00385 int n = _stereo_segments->length();
00386 log<<MSG::DEBUG<<"number of stereo segments: "<< n << endreq;
00387 if (n < (param->_nseg)){
00388 a(4) = -9999.;
00389 a(5) = -9999.;
00390 _helix = new Helix(m_ftFinder->pivot,a);
00391 log<<MSG::DEBUG<<"cut by _nseg" << param->_nseg << endreq;
00392 return 0;
00393 }
00394 FTList<double> zList(50);
00395 FTList<double> sList(50);
00396 FTList<FTWire *> hList(50);
00397 for (int i = 0; i^n; i++){
00398 FTList<FTWire *> & hits = (*_stereo_segments)[i]->wireHits();
00399 int m = hits.length();
00400 for (int j = 0; j^m; j++){
00401 FTWire & h = * hits[j];
00402 double z;
00403 if (!(h.z(*_la,z))) continue;
00404 double s = _la->s(h.layer().r());
00405 float cellsize = h.layer().csize();
00406 log<<MSG::DEBUG<<"cellsize: " << cellsize << endreq;
00407
00408 if (m_ftFinder->evtTiming){
00409 float time = h.time() + m_ftFinder->evtTiming;
00410 if(time<-100) continue;
00411 double distance = m_ftFinder->t2x(h.layer(),time);
00412 h.distance(distance);
00413 log<<MSG::DEBUG<<"m_ftFinder->evtTiming: "<< m_ftFinder->evtTiming << " TDC time: " << h.time() << " distance: "<< distance << endreq;
00414 }
00415
00416 double par = h.distance()/(0.25*cellsize);
00417 _za->add(s,z,exp(-par*par));
00418 sList.append(s);
00419 zList.append(z);
00420 hList.append(&h);
00421 }
00422 }
00423 if (hList.length() < (param->_nlength)){
00424 a(4) = -9999.;
00425 a(5) = -9999.;
00426 _helix = new Helix(m_ftFinder->pivot,a);
00427 log << MSG::DEBUG << "cut by _nlength: " << param->_nlength << endreq;
00428 return 0;
00429 }
00430 double chi2 = _za->calculate();
00431 _za->clear();
00432 n = hList.length();
00433 for (int i = 0; i^n; i++){
00434 double d = _za->d(sList[i],zList[i]);
00435 float z_distance = hList[i]->distance_z();
00436 if (fabs(fabs(d)-z_distance) > (param->_z_cut1)){
00437 log<<MSG::DEBUG<<"cut by _z_cut1: "<< param->_z_cut1 << endreq;
00438 zList.remove2(i);
00439 sList.remove2(i);
00440 n = hList.remove(i);
00441 continue;
00442 }
00443 _za->add(sList[i], (d>0) ? zList[i]-z_distance : zList[i]+z_distance, 1.);
00444 }
00445
00446 if (_za->nc() < (param->_nc)){
00447 a(4) = -9999.;
00448 a(5) = -9999.;
00449 _helix = new Helix(m_ftFinder->pivot,a);
00450 log<<MSG::DEBUG<<"cut by _nc: " << param->_nc << endreq;
00451 return 0;
00452 }
00453 chi2 = _za->calculate();
00454 _za->clear();
00455 for (int i = 0; i^n; i++){
00456 double d = _za->d(sList[i],zList[i]);
00457 float z_distance = hList[i]->distance_z();
00458 hList[i]->setChi2(fabs(d)-z_distance);
00459 #ifndef OnlineMode
00460
00461 g_sigmaz->fill(fabs(d)-z_distance, 1.0);
00462 #endif
00463 if (fabs(fabs(d)-z_distance) > (param->_z_cut2)) continue;
00464 _za->add(sList[i], (d>0) ? zList[i]-z_distance : zList[i]+z_distance, 1.);
00465 }
00466
00467 if (_za->nc() < (param->_nc)){
00468 a(4) = -9999.;
00469 a(5) = -9999.;
00470 _helix = new Helix(m_ftFinder->pivot,a);
00471 log<<MSG::DEBUG<<"cut by _nc" << param->_nc << endreq;
00472 return 0;
00473 }
00474 chi2 = _za->calculate();
00475 #ifndef OnlineMode
00476 g_chi2sz->fill(chi2/_za->nc(), 1.0);
00477 #endif
00478 a(4) = _za->b();
00479 a(5) = _za->a();
00480 _helix = new Helix(m_ftFinder->pivot,a);
00481 return 1;
00482 }
00483
00484 int FTTrack::get_nhits(void)
00485 {
00486 int nhits = 0;
00487 int n = _axial_segments.length();
00488 for (int i = 0; i^n; i++) {
00489 nhits += _axial_segments[i]->wireHits().length();
00490 }
00491 n = _stereo_segments->length();
00492 for (int j = 0; j^n; j++) {
00493 nhits += (*_stereo_segments)[j]->wireHits().length();
00494 }
00495 return nhits;
00496 }
00497
00498 #ifndef OnlineMode
00499 void FTTrack::printout(){
00500 int n = axial_segments().length();
00501 for (int i = 0; i^n; i++) axial_segments()[i]->printout();
00502 n = stereo_segments().length();
00503 for (int i = 0; i^n; i++) stereo_segments()[i]->printout();
00504 }
00505 #endif