コード例 #1
0
ファイル: swtrack.cpp プロジェクト: krafczyk/AMS
void SWTrack::drawHits(QPainter *pnt)
{
  int *zly = (TkDBc::Head->GetSetup() == 3) ? &zLayer2[NLAY*lyrConf] : zLayer1;

  int zl1 = -200, zl2 = 200;
  for (int i = 0; i < NLAY; i++) {
    if (zly[i] > zl1) zl1 = zly[i];
    if (zly[i] < zl2) zl2 = zly[i];
  }

  int zl  = zl1-zl2;
  int px  = (wWid-zl)/2+LYR_PX+zl1;
  int py  = (wHei-tHei-LYR_H)/2+tHei+LYR_PY;
  int py1 = py+RES_H+LYR_D;
  int py2 = py-RES_H-LYR_D+LYR_H;
  int px1 = px-zl1-20;
  int px2 = px-zl2+20;

  int ifc = focusStatus/FOCUS_DOBJ/2-1;
  if (!(focusStatus & FOCUS_DOBJ)) ifc = -1;

  for (int i = 0; i < NLAY; i++) {
    if (zly[i] == 0) continue;
    pnt->setPen(QColor(100, 255, 200));
    pnt->drawLine(px-zly[i], py, px-zly[i], py+LYR_H);
    pnt->setPen((ifc == i) ? Qt::white : Qt::green);
    pnt->drawLine(px-zly[i]+1, py, px-zly[i]+1, py+LYR_H);
    pnt->setPen((ifc == i) ? Qt::gray : Qt::darkGreen);
    pnt->drawLine(px-zly[i]+2, py, px-zly[i]+2, py+LYR_H);

    pnt->setPen(Qt::green);
    drawText(pnt, px-zly[i]-3, py-17, Form("%d", i+1));
  }

  TrTrackR *trk = rEvent->pTrTrack(tID);
  if (!trk) return;

  int mfit = (0 <= fID && fID < NPAR) ? fitPar[fID] : 0;
  if (mfit <= 0) return;

  double rscx = 0.001, rscy = 0.001;

  int nhit = trk->GetNhits();

  for (int i = 0; i < nhit; i++) {
    TrRecHitR *hit = trk->GetHit(i);
    if (!hit) continue;

    int ily = hit->GetLayer()-1;
    if (zly[ily] == 0) continue;

    AMSPoint res = trk->GetResidualO(hit->GetLayer(), mfit);
    if (!hit->OnlyY() && abs(res.x()) > rscx) rscx = abs(res.x());
    if (!hit->OnlyX() && abs(res.y()) > rscy) rscy = abs(res.y());
  }

  rscx = (rscx < 0.005) ? (int)(rscx*2000)*0.0005 
       : (rscx < 1.000) ? (int)(rscx*200) *0.005
                        : (int)(rscx*20)  *0.05;
  rscy = (rscy < 0.005) ? (int)(rscy*2000)*0.0005 
       : (rscy < 1.000) ? (int)(rscy*200) *0.005
                        : (int)(rscy*20)  *0.05;

  int bx1, bx2, by1, by2;
  int n1 = 0, n2 = 0;

  int    idx[NLAY];
  double zht[NLAY];
  for (int i = 0; i < nhit; i++)
    zht[i] = trk->GetHit(i)->GetCoord().z();

  TMath::Sort(nhit, zht, idx);

  for (int i = 0; i < nhit; i++) {
    TrRecHitR *hit = trk->GetHit(idx[i]);
    int lay = hit->GetLayer();
    int ily = lay-1;
    if (zly[ily] == 0) continue;

    int x  = px-zly[ily];
    int y1 = py1-RES_H*trk->GetResidualO(lay, mfit).x()/rscx;
    int y2 = py2-RES_H*trk->GetResidualO(lay, mfit).y()/rscy;

    if (lyrSta[ily] == LSTA_HITT) {
      pnt->setPen(Qt::white);
      pnt->drawRect(x-3, y1-3, 6, 6);
      pnt->setPen((ifc == ily) ? Qt::darkGray : Qt::darkRed);
      pnt->drawRect(x-2, y1-2, 6, 6);
      pnt->fillRect(x-2, y1-2, 6, 6, 
		    (ifc == ily) ? QColor(Qt::gray) : QColor(Qt::red));

      if (n1++ > 0) {
	pnt->setPen(Qt::red);
	pnt->drawLine(bx1, by1, x, y1);
	pnt->setPen(Qt::darkRed);
	if (abs(x-bx1) > abs(y1-by1))
	  pnt->drawLine(bx1, by1+1, x, y1+1);
	else
	  pnt->drawLine(bx1+1, by1, x+1, y1);
      }
      bx1 = x;
      by1 = y1;
    }

    pnt->setPen(Qt::white);
    pnt->drawRect(x-3, y2-3, 6, 6);
    pnt->setPen((ifc == ily) ? Qt::darkGray : Qt::darkRed);
    pnt->drawRect(x-2, y2-2, 6, 6);
    pnt->fillRect(x-2, y2-2, 6, 6, 
		  (ifc == ily) ? QColor(Qt::gray) : QColor(Qt::red));

    if (n2++ > 0) {
      pnt->setPen(Qt::red);
      pnt->drawLine(bx2, by2, x, y2);
      pnt->setPen(Qt::darkRed);
      if (abs(x-bx2) > abs(y2-by2))
	pnt->drawLine(bx2, by2+1, x, y2+1);
      else
	pnt->drawLine(bx2+1, by2, x+1, y2);
    }
    bx2 = x;
    by2 = y2;
  }

  pnt->save();
  pnt->rotate(-90);
  pnt->setPen(QColor(255, 50, 50));
  drawText(pnt, -py1-14, px1-47, "ResX");
  drawText(pnt, -py2-14, px1-47, "ResY");
  drawText(pnt, -py1-20, px1-30, (rscx < 0.005) ? Form("%.0fum", rscx*2e4)
	                       : (rscx < 1.000) ? Form("%.1fmm", rscx*2e1)
	                                        : Form("%.1fcm", rscx*2));
  drawText(pnt, -py2-20, px1-30, (rscy < 0.005) ? Form("%.0fum", rscy*2e4)
	                       : (rscy < 1.000) ? Form("%.1fmm", rscy*2e1)
	                                        : Form("%.1fcm", rscy*2));
  pnt->restore();

  pnt->setPen(QColor(255, 30, 30));
  pnt->drawLine(px1, py1, px2, py1);
  pnt->drawLine(px1, py2, px2, py2);

  pnt->drawLine(px1-7, py1-RES_H, px1-7, py1+RES_H);
  pnt->drawLine(px1-9, py1-RES_H, px1-5, py1-RES_H);
  pnt->drawLine(px1-9, py1+RES_H, px1-5, py1+RES_H);

  pnt->drawLine(px1-7, py2-RES_H, px1-7, py2+RES_H);
  pnt->drawLine(px1-9, py2-RES_H, px1-5, py2-RES_H);
  pnt->drawLine(px1-9, py2+RES_H, px1-5, py2+RES_H);
}
コード例 #2
0
ファイル: infotext.cpp プロジェクト: krafczyk/AMS
QString &InfoText::TrackInfo(AMSEventR *event, int itrk)
{
  static QString str;
  str = "";

  if (!event) return str;

  TrTrackR *trk = event->pTrTrack(itrk);
  if (!trk) return str;

  int id1 = TrTrackR::kChoutko;
  int id2 = TrTrackR::kChoutko+TrTrackR::kMultScat;
  if (!trk->ParExists(id1)) id1 = TrTrackR::kLinear;
  if (!trk->ParExists(id2)) id2 = id1;
  if (!trk->ParExists(id1)) return str;

  int fpat[8];
  for (int i = 0; i < 8; i++) fpat[i] = 0;
  for (int i = 0; i < trk->GetNhits(); i++) {
    TrRecHitR *hit = trk->GetHit(i);
    int ily = hit->GetLayer()-1;
    if (hit->OnlyY()) fpat[ily] = 1;
    else fpat[ily] = 2;
  }
  TString spat;
  for (int i = 0; i < 8; i++) {
    if (fpat[i] == 0) spat += "_";
    if (fpat[i] == 1) spat += "Y";
    if (fpat[i] == 2) spat += "O";
  }

  str += Form("Track[%d]\n", itrk);
  str += Form("  nHit: %d\n",    trk->GetNhits());
  str += Form("  nHitXY: %d\n",  trk->GetNhitsXY());
  str += Form("  Pattern: %d [%s]\n", trk->GetPattern(), spat.Data());
  str += "\n";
  str += Form("  Rigidity (noMS): %.2f\n", trk->GetRigidity(id1));
  str += Form("  Rigidity (Fast): %.2f\n", trk->GetRigidity(id2));
  str += Form("   errRinv (Fast): %.2f\n", trk->GetErrRinv (id2));
  str += "\n";
  str += Form("  Chi2Fast:    %.2f\n",     trk->GetChisq   (id2));
  str += Form("    Chi2X/Ndf: %.2f/%d\n",  trk->GetChisqX  (id2), 
	                                  trk->GetNdofX   (id2));
  str += Form("    Chi2Y/Ndf: %.2f/%d\n",  trk->GetChisqY  (id2), 
	                                  trk->GetNdofY   (id2));
  str += "\n";
  str += Form("  P0:    (%.2f, %.2f, %.2f)\n",  
	      trk->GetP0x(id2), trk->GetP0y(id2), trk->GetP0z(id2));
  str += Form("  th/ph: (%.1f, %.1f)\n",  
	      trk->GetTheta(id2)*TMath::RadToDeg(),
	      trk->GetPhi  (id2)*TMath::RadToDeg());

  for (int i = 0; i < trk->GetNhits(); i++) {
    TrRecHitR *hit = trk->GetHit(i);
    if (!hit) continue;
    int lay = hit->GetLayer();
    str += Form("\nHit[%d]\n  ", i);
    str += hit->Info(i);
    str += Form("Residual: %.4f %.4f\n", trk->GetResidualO(lay).x(),
		                         trk->GetResidualO(lay).y());
  }

  return str;
}
コード例 #3
0
ファイル: swtrack.cpp プロジェクト: krafczyk/AMS
void SWTrack::drawInfobar(QPainter *pnt)
{
  pnt->fillRect(QRect(0, 0, wWid-2, tHei), QColor(0, 0, 0, 200));
  drawButtons(pnt);

  TrTrackR *trk = rEvent->pTrTrack(tID);
  if (!trk) return;

  int mfit = (0 <= fID && fID < NPAR) ? fitPar[fID] : 0;
  if (mfit <= 0) return;

  TString hpat;
  for (int i = 0; i < NLAY; i++) {
    if      (lyrSta[i] == LSTA_HITY) hpat += "Y";
    else if (lyrSta[i] == LSTA_HITT) hpat += "O";
    else                             hpat += "_";
  }

  pnt->setPen(Qt::white);
  drawText(pnt,  28, 10, Form("Track [%d]", tID));
  drawText(pnt, 100, 10, Form("nHit: %d",    trk->GetNhits()));
  drawText(pnt, 170, 10, Form("nHitXY: %d",  trk->GetNhitsXY()));
  drawText(pnt, 270, 10, Form("fPat: %s",  hpat.Data()));
  drawText(pnt,  28, 30, Form("Fit %d", fitPar[fID]));
  drawText(pnt, 100, 30, Form("chi2/Ndf (X): %.2f/%d", 
			      trk->GetChisqX(mfit), trk->GetNdofX(mfit)));
  drawText(pnt, 270, 30, Form("chi2/Ndf (Y): %.2f/%d", 
			      trk->GetChisqY(mfit), trk->GetNdofY(mfit)));
  drawText(pnt, 100, 50, Form("rigidity: %.2f", trk->GetRigidity(mfit)));
  drawText(pnt, 270, 50, Form("errRinv: %.2f",  trk->GetErrRinv(mfit)));

  int ifc = focusStatus/FOCUS_DOBJ/2-1;
  if ((focusStatus & FOCUS_DOBJ) && ifc >= 0) {
    int iht = getFocusHid();
    TrRecHitR *hit = trk->GetHit(iht);

    if (hit) {
      char cf1 = (hit->OnlyY()) ? 'G' : '_';
      char cf2 = (hit->checkstatus(AMSDBc::USED)) ? 'T' : '_';

      int lay = hit->GetLayer();
      drawText(pnt,  40, 70, Form("Hit [%d]", iht));
      drawText(pnt,  90, 70, Form("TkID: %d", hit->GetTkId()));
      drawText(pnt, 180, 70, Form("Flag: %c%c", cf1, cf2));
      drawText(pnt, 250, 70, Form("Residual: %.4f %.4f", 
				  trk->GetResidualO(lay, mfit).x(),
				  trk->GetResidualO(lay, mfit).y()));
    }
    else if (abs(lyrSta[ifc]) > 10) {
      int tkid = lyrSta[ifc];

      int nclx = 0, ncly = 0, nhit = 0, nhtt = 0, nhtg = 0;
      for (int i = 0; rEvent && i < rEvent->nTrCluster(); i++) {
	TrClusterR *cls = rEvent->pTrCluster(i);
	if (!cls || cls->GetTkId() != tkid) continue;
	if (cls->GetSide() == 0) nclx++; 
	else ncly++;
      }
      for (int i = 0; rEvent && i < rEvent->nTrRecHit(); i++) {
	TrRecHitR *hit = rEvent->pTrRecHit(i);
	if (!hit || hit->GetTkId() != tkid) continue;
	nhit++;
	if (hit->checkstatus(AMSDBc::USED)) nhtt++;
	else if (hit->OnlyY()) nhtg++;
      }

      drawText(pnt,  40, 70, "Ladder");
      drawText(pnt,  90, 70, Form("TkID: %d", tkid));
      drawText(pnt, 170, 70, Form("nClsX/Y: %d/%d", nclx, ncly));
      drawText(pnt, 270, 70, Form("nHit/T/G: %d/%d/%d", nhit, nhtt, nhtg));
    }
  }
}