74 drawTrackMarkers_(
true),
82 drawCardinalRep_(
true),
90 squareRootFormalism_(
false),
99 if((!gApplication) || (gApplication && gApplication->TestBit(TApplication::kDefaultApplication))) {
100 std::cout <<
"In EventDisplay ctor: gApplication not found, creating..." << std::flush;
101 new TApplication(
"ROOT_application", 0, 0);
102 std::cout <<
"done!" << std::endl;
105 std::cout <<
"In EventDisplay ctor: gEve not found, creating..." << std::flush;
106 TEveManager::Create();
107 std::cout <<
"done!" << std::endl;
117 for(
size_t i = 0; i < opts.length(); ++i) {
152 for(
unsigned int i = 0; i <
events_.size(); i++) {
154 for(
unsigned int j = 0; j <
events_[i]->size(); j++) {
168 std::vector<Track*>* vec =
new std::vector<Track*>;
170 for(
unsigned int i = 0; i < tracks.size(); i++) {
171 vec->push_back(
new Track(*(tracks[i])));
180 std::vector<Track*>* vec =
new std::vector<Track*>;
182 for(
unsigned int i = 0; i < tracks.size(); i++) {
183 vec->push_back(
new Track(*(tracks[i])));
192 std::vector<Track*>* vec =
new std::vector<Track*>;
193 vec->push_back(
new Track(*tr));
206 if(
events_.size() == 0)
return;
225 bool resetCam =
true;
232 std::cout <<
"At event " <<
id << std::endl;
233 if (gEve->GetCurrentEvent()) {
234 gEve->GetCurrentEvent()->DestroyElements();
239 if (gEve->GetCurrentEvent()) {
240 gEve->GetCurrentEvent()->DestroyElements();
250 std::cout <<
"EventDisplay::open(); " <<
getNEvents() <<
" events loaded" << std::endl;
256 std::cout <<
"autoscaling changed the error, draw again." << std::endl;
265 gApplication->Run(kTRUE);
268 std::cout <<
"opened" << std::endl;
275 std::cout <<
"EventDisplay::drawEvent(" <<
id <<
")" << std::endl;
280 TGeoNode* top_node = gGeoManager->GetTopNode();
281 assert(top_node != NULL);
284 TObjArray* volumes = gGeoManager->GetListOfVolumes();
285 for(
int i = 0; i < volumes->GetEntriesFast(); i++) {
286 TGeoVolume* volume =
dynamic_cast<TGeoVolume*
>(volumes->At(i));
287 assert(volume != NULL);
288 volume->SetLineColor(12);
289 volume->SetTransparency(50);
292 TEveGeoTopNode* eve_top_node =
new TEveGeoTopNode(gGeoManager, top_node);
293 eve_top_node->IncDenyDestroy();
294 gEve->AddElement(eve_top_node);
298 for(
unsigned int i = 0; i <
events_.at(
id)->size(); i++) {
303 Track* track =
events_[id]->at(i);
304 if (! track->checkConsistency()){
305 std::cerr<<
"track is not consistent"<<std::endl;
310 boost::scoped_ptr<Track> refittedTrack(NULL);
313 std::cout <<
"Refit track:" << std::endl;
315 boost::scoped_ptr<AbsKalmanFitter> fitter;
319 fitter->setMultipleMeasurementHandling(
mmHandling_);
325 fitter->setMultipleMeasurementHandling(
mmHandling_);
329 fitter.reset(
new DAF(
false));
330 (
static_cast<KalmanFitter*
>( (
static_cast<DAF*
>(fitter.get()))->getKalman() ) )->useSquareRootFormalism(
squareRootFormalism_);
333 fitter.reset(
new DAF());
337 fitter->setDebugLvl(std::max(0, (
int)
debugLvl_-1));
344 refittedTrack.reset(
new Track(*track));
345 refittedTrack->deleteFitterInfo();
348 refittedTrack->Print(
"C");
350 timeval startcputime, endcputime;
353 gettimeofday(&startcputime, NULL);
354 fitter->processTrack(refittedTrack.get(),
resort_);
355 gettimeofday(&endcputime, NULL);
358 std::cerr << e.
what();
359 std::cerr <<
"Exception, could not refit track" << std::endl;
363 int microseconds = 1000000*(endcputime.tv_sec - startcputime.tv_sec) + (endcputime.tv_usec - startcputime.tv_usec);
364 std::cout <<
"it took " << double(microseconds) / 1000 <<
" ms of CPU to fit the track\n";
366 if (! refittedTrack->checkConsistency()){
367 std::cerr<<
"refittedTrack is not consistent"<<std::endl;
371 track = refittedTrack.get();
380 rep = track->getCardinalRep();
381 std::cout <<
"Draw cardinal rep" << std::endl;
384 if (
repId_ >= track->getNumReps())
385 repId_ = track->getNumReps() - 1;
386 rep = track->getTrackRep(
repId_);
387 std::cout <<
"Draw rep" <<
repId_ << std::endl;
393 track->getFitStatus(rep)->Print();
395 if (track->getFitStatus(rep)->isFitted()) {
397 std::cout <<
"fitted state: \n";
398 track->getFittedState().Print();
400 catch (Exception& e) {
401 std::cerr << e.what();
410 unsigned int numhits = track->getNumPointsWithMeasurement();
412 KalmanFitterInfo* fi;
413 KalmanFitterInfo* prevFi = 0;
414 const MeasuredStateOnPlane* fittedState(NULL);
415 const MeasuredStateOnPlane* prevFittedState(NULL);
417 for(
unsigned int j = 0; j < numhits; j++) {
421 TrackPoint* tp = track->getPointWithMeasurement(j);
422 if (! tp->hasRawMeasurements()) {
423 std::cerr<<
"trackPoint has no raw measurements"<<std::endl;
427 const AbsMeasurement*
m = tp->getRawMeasurement();
428 int hit_coords_dim =
m->getDim();
431 if (tp->getNumRawMeasurements() > 1) {
432 bool sameTypes(
true);
433 for (
unsigned int iM=1; iM<tp->getNumRawMeasurements(); ++iM) {
434 AbsMeasurement* tmp = tp->getRawMeasurement(iM);
435 if (
typeid(*tmp) !=
typeid(*
m))
439 std::cerr<<
"cannot draw trackpoint containing multiple Measurements of differend types"<<std::endl;
447 if (! tp->hasFitterInfo(rep)) {
448 std::cerr<<
"trackPoint has no fitterInfo for rep"<<std::endl;
452 AbsFitterInfo* fitterInfo = tp->getFitterInfo(rep);
454 fi =
dynamic_cast<KalmanFitterInfo*
>(fitterInfo);
456 std::cerr<<
"can only display KalmanFitterInfo"<<std::endl;
459 if (! fi->hasPredictionsAndUpdates()) {
460 std::cerr<<
"KalmanFitterInfo does not have all predictions and updates"<<std::endl;
465 fittedState = &(fi->getFittedState(
true));
467 catch (Exception& e) {
468 std::cerr << e.what();
469 std::cerr<<
"can not get fitted state"<<std::endl;
472 prevFittedState = fittedState;
477 if (fittedState == NULL) {
478 if (fi->hasForwardUpdate()) {
479 fittedState = fi->getForwardUpdate();
481 else if (fi->hasBackwardUpdate()) {
482 fittedState = fi->getBackwardUpdate();
484 else if (fi->hasForwardPrediction()) {
485 fittedState = fi->getForwardPrediction();
487 else if (fi->hasBackwardPrediction()) {
488 fittedState = fi->getBackwardPrediction();
492 if (fittedState == NULL) {
493 std::cout <<
"canot get any state from fitterInfo, continue.\n";
495 prevFittedState = fittedState;
499 TVector3 track_pos = fittedState->getPos();
500 double charge = fittedState->getCharge();
506 bool full_hit =
false;
507 bool planar_hit =
false;
508 bool planar_pixel_hit =
false;
509 bool space_hit =
false;
510 bool wire_hit =
false;
511 bool wirepoint_hit =
false;
512 if (
dynamic_cast<const FullMeasurement*
>(
m) != NULL) {
515 else if(
dynamic_cast<const PlanarMeasurement*
>(
m) != NULL) {
517 if(hit_coords_dim == 2) {
518 planar_pixel_hit =
true;
520 }
else if (
dynamic_cast<const SpacepointMeasurement*
>(
m) != NULL) {
522 }
else if (
dynamic_cast<const WireMeasurement*
>(
m) != NULL) {
524 if (
dynamic_cast<const WirePointMeasurement*
>(
m) != NULL) {
525 wirepoint_hit =
true;
528 std::cout <<
"Track " << i <<
", Hit " << j <<
": Unknown measurement type: skipping hit!" << std::endl;
534 for (
unsigned int iMeas = 0; iMeas < fi->getNumMeasurements(); ++iMeas) {
536 if (iMeas > 0 && wire_hit)
539 const MeasurementOnPlane* mop = fi->getMeasurementOnPlane(iMeas);
540 const TVectorT<double>& hit_coords = mop->getState();
541 const TMatrixTSym<double>& hit_cov = mop->getCov();
546 TVector3 o = fittedState->getPlane()->getO();
547 TVector3 u = fittedState->getPlane()->getU();
548 TVector3 v = fittedState->getPlane()->getV();
552 double_t plane_size = 4;
553 TVector2 stripDir(1,0);
556 if(!planar_pixel_hit) {
557 if (
dynamic_cast<RKTrackRep*
>(rep) != NULL) {
558 const TMatrixD& H = mop->getHMatrix()->getMatrix();
559 stripDir.Set(H(0,3), H(0,4));
561 hit_u = hit_coords(0);
563 hit_u = hit_coords(0);
564 hit_v = hit_coords(1);
566 }
else if (wire_hit) {
567 hit_u = fabs(hit_coords(0));
568 hit_v = v*(track_pos-o);
570 hit_v = hit_coords(1);
574 if(plane_size < 4) plane_size = 4;
580 TVector3 move(0,0,0);
581 if (planar_hit) move = track_pos-o;
582 if (wire_hit) move = v*(v*(track_pos-o));
583 TEveBox* box =
boxCreator(o + move, u, v, plane_size, plane_size, 0.01);
585 box->SetMainColor(kCyan);
587 box->SetMainColor(kGray);
589 box->SetMainTransparency(50);
590 gEve->AddElement(box);
595 if (j > 0 && prevFi != NULL) {
599 makeLines(prevFittedState, fittedState, rep, charge > 0 ? kRed : kBlue, 1,
false,
drawErrors_, 0, 0);
607 if(
drawRefTrack_ && fi->hasReferenceState() && prevFi->hasReferenceState())
608 makeLines(prevFi->getReferenceState(), fi->getReferenceState(), rep, charge > 0 ? kRed + 2 : kBlue + 2, 2,
drawTrackMarkers_,
false, 3);
610 else if (j > 0 && prevFi == NULL) {
611 std::cout <<
"previous FitterInfo == NULL \n";
618 TEveGeoShape* det_shape =
new TEveGeoShape(
"det_shape");
619 det_shape->IncDenyDestroy();
620 det_shape->SetShape(
new TGeoTube(std::max(0., (
double)(hit_u-0.0105/2.)), hit_u+0.0105/2., plane_size));
622 TVector3 norm = u.Cross(v);
623 TGeoRotation det_rot(
"det_rot", (u.Theta()*180)/TMath::Pi(), (u.Phi()*180)/TMath::Pi(),
624 (norm.Theta()*180)/TMath::Pi(), (norm.Phi()*180)/TMath::Pi(),
625 (v.Theta()*180)/TMath::Pi(), (v.Phi()*180)/TMath::Pi());
626 TVector3 move = v*(v*(track_pos-o));
627 TGeoCombiTrans det_trans(o(0) + move.X(),
631 det_shape->SetTransMatrix(det_trans);
632 det_shape->SetMainColor(kCyan);
633 det_shape->SetMainTransparency(25);
635 gEve->AddElement(det_shape);
647 StateOnPlane dummy(rep);
648 StateOnPlane dummy2(TVectorD(rep->getDim()),
static_cast<const FullMeasurement*
>(
m)->constructPlane(dummy), rep);
649 MeasuredStateOnPlane sop = *(
static_cast<const FullMeasurement*
>(
m)->constructMeasurementsOnPlane(dummy2)[0]);
652 MeasuredStateOnPlane prevSop(sop);
653 prevSop.extrapolateBy(-3);
654 makeLines(&sop, &prevSop, rep, kYellow, 1,
false,
true, 0, 0);
657 prevSop.extrapolateBy(3);
658 makeLines(&sop, &prevSop, rep, kYellow, 1,
false,
true, 0, 0);
662 if(!planar_pixel_hit) {
664 TVector3 stripDir3 = stripDir.X()*u + stripDir.Y()*v;
665 TVector3 stripDir3perp = stripDir.Y()*u - stripDir.X()*v;
666 TVector3 move = stripDir3perp*(stripDir3perp*(track_pos-o));
667 hit_box =
boxCreator((o + move + hit_u*stripDir3), stripDir3, stripDir3perp,
errorScale_*std::sqrt(hit_cov(0,0)), plane_size, 0.0105);
668 hit_box->SetMainColor(kYellow);
669 hit_box->SetMainTransparency(0);
670 gEve->AddElement(hit_box);
673 TMatrixDEigen eigen_values(hit_cov);
674 TEveGeoShape* cov_shape =
new TEveGeoShape(
"cov_shape");
675 cov_shape->IncDenyDestroy();
676 TMatrixT<double> ev = eigen_values.GetEigenValues();
677 TMatrixT<double> eVec = eigen_values.GetEigenVectors();
678 double pseudo_res_0 =
errorScale_*std::sqrt(ev(0,0));
679 double pseudo_res_1 =
errorScale_*std::sqrt(ev(1,1));
684 double min_cov = std::min(pseudo_res_0,pseudo_res_1);
686 std::cout <<
"Track " << i <<
", Hit " << j <<
": Invalid covariance matrix (Eigenvalue < 1e-5), autoscaling not possible!" << std::endl;
688 if(min_cov < 0.049) {
689 double cor = 0.05 / min_cov;
690 std::cout <<
"Track " << i <<
", Hit " << j <<
": Pixel covariance too small, rescaling by " << cor;
701 cov_shape->SetShape(
new TGeoEltu(pseudo_res_0, pseudo_res_1, 0.0105));
702 TVector3 pix_pos = o + hit_u*u + hit_v*v;
703 TVector3 u_semiaxis = (pix_pos + eVec(0,0)*u + eVec(1,0)*v)-pix_pos;
704 TVector3 v_semiaxis = (pix_pos + eVec(0,1)*u + eVec(1,1)*v)-pix_pos;
705 TVector3 norm = u.Cross(v);
709 TGeoRotation det_rot(
"det_rot", (u_semiaxis.Theta()*180)/TMath::Pi(), (u_semiaxis.Phi()*180)/TMath::Pi(),
710 (v_semiaxis.Theta()*180)/TMath::Pi(), (v_semiaxis.Phi()*180)/TMath::Pi(),
711 (norm.Theta()*180)/TMath::Pi(), (norm.Phi()*180)/TMath::Pi());
712 TGeoCombiTrans det_trans(pix_pos(0),pix_pos(1),pix_pos(2), &det_rot);
713 cov_shape->SetTransMatrix(det_trans);
716 cov_shape->SetMainColor(kYellow);
717 cov_shape->SetMainTransparency(0);
718 gEve->AddElement(cov_shape);
727 TMatrixDEigen eigen_values(
m->getRawHitCov());
728 TEveGeoShape* cov_shape =
new TEveGeoShape(
"cov_shape");
729 cov_shape->IncDenyDestroy();
730 cov_shape->SetShape(
new TGeoSphere(0.,1.));
731 TMatrixT<double> ev = eigen_values.GetEigenValues();
732 TMatrixT<double> eVec = eigen_values.GetEigenVectors();
733 TVector3 eVec1(eVec(0,0),eVec(1,0),eVec(2,0));
734 TVector3 eVec2(eVec(0,1),eVec(1,1),eVec(2,1));
735 TVector3 eVec3(eVec(0,2),eVec(1,2),eVec(2,2));
736 const TVector3 norm = u.Cross(v);
739 static const double radDeg(180./TMath::Pi());
740 TGeoRotation det_rot(
"det_rot", eVec1.Theta()*radDeg, eVec1.Phi()*radDeg,
741 eVec2.Theta()*radDeg, eVec2.Phi()*radDeg,
742 eVec3.Theta()*radDeg, eVec3.Phi()*radDeg);
744 if (! det_rot.IsValid()){
746 if (fabs(eVec2*eVec3) > 1.e-10)
747 eVec3 = eVec1.Cross(eVec2);
749 det_rot.SetAngles(eVec1.Theta()*radDeg, eVec1.Phi()*radDeg,
750 eVec2.Theta()*radDeg, eVec2.Phi()*radDeg,
751 eVec3.Theta()*radDeg, eVec3.Phi()*radDeg);
755 double pseudo_res_0 =
errorScale_*std::sqrt(ev(0,0));
756 double pseudo_res_1 =
errorScale_*std::sqrt(ev(1,1));
757 double pseudo_res_2 =
errorScale_*std::sqrt(ev(2,2));
767 double min_cov = std::min(pseudo_res_0,std::min(pseudo_res_1,pseudo_res_2));
769 std::cout <<
"Track " << i <<
", Hit " << j <<
": Invalid covariance matrix (Eigenvalue < 1e-5), autoscaling not possible!" << std::endl;
771 if(min_cov <= 0.149) {
772 double cor = 0.15 / min_cov;
773 std::cout <<
"Track " << i <<
", Hit " << j <<
": Space hit covariance too small, rescaling by " << cor;
786 TGeoGenTrans det_trans(o(0),o(1),o(2),
789 pseudo_res_0, pseudo_res_1, pseudo_res_2,
791 cov_shape->SetTransMatrix(det_trans);
794 cov_shape->SetMainColor(kYellow);
795 cov_shape->SetMainTransparency(10);
796 gEve->AddElement(cov_shape);
802 TMatrixDEigen eigen_values(hit_cov);
803 TEveGeoShape* cov_shape =
new TEveGeoShape(
"cov_shape");
804 cov_shape->IncDenyDestroy();
805 TMatrixT<double> ev = eigen_values.GetEigenValues();
806 TMatrixT<double> eVec = eigen_values.GetEigenVectors();
807 double pseudo_res_0 =
errorScale_*std::sqrt(ev(0,0));
808 double pseudo_res_1 =
errorScale_*std::sqrt(ev(1,1));
813 double min_cov = std::min(pseudo_res_0,pseudo_res_1);
815 std::cout <<
"Track " << i <<
", Hit " << j <<
": Invalid covariance matrix (Eigenvalue < 1e-5), autoscaling not possible!" << std::endl;
817 if(min_cov < 0.049) {
818 double cor = 0.05 / min_cov;
819 std::cout <<
"Track " << i <<
", Hit " << j <<
": Pixel covariance too small, rescaling by " << cor;
830 cov_shape->SetShape(
new TGeoEltu(pseudo_res_0, pseudo_res_1, 0.0105));
831 TVector3 pix_pos = o + hit_u*u + hit_v*v;
832 TVector3 u_semiaxis = (pix_pos + eVec(0,0)*u + eVec(1,0)*v)-pix_pos;
833 TVector3 v_semiaxis = (pix_pos + eVec(0,1)*u + eVec(1,1)*v)-pix_pos;
834 TVector3 norm = u.Cross(v);
838 static const double radDeg(180./TMath::Pi());
839 TGeoRotation det_rot(
"det_rot", u_semiaxis.Theta()*radDeg, u_semiaxis.Phi()*radDeg,
840 v_semiaxis.Theta()*radDeg, v_semiaxis.Phi()*radDeg,
841 norm.Theta()*radDeg, norm.Phi()*radDeg);
847 TGeoCombiTrans det_trans(pix_pos(0),pix_pos(1),pix_pos(2), &det_rot);
848 cov_shape->SetTransMatrix(det_trans);
851 cov_shape->SetMainColor(kYellow);
852 cov_shape->SetMainTransparency(0);
853 gEve->AddElement(cov_shape);
860 TEveGeoShape* cov_shape =
new TEveGeoShape(
"cov_shape");
861 cov_shape->IncDenyDestroy();
862 double pseudo_res_0 =
errorScale_*std::sqrt(hit_cov(0,0));
863 double pseudo_res_1 = plane_size;
864 if (wirepoint_hit) pseudo_res_1 =
errorScale_*std::sqrt(hit_cov(1,1));
868 if(pseudo_res_0 < 1e-5) {
869 std::cout <<
"Track " << i <<
", Hit " << j <<
": Invalid wire resolution (< 1e-5), autoscaling not possible!" << std::endl;
871 if(pseudo_res_0 < 0.0049) {
872 double cor = 0.005 / pseudo_res_0;
873 std::cout <<
"Track " << i <<
", Hit " << j <<
": Wire covariance too small, rescaling by " << cor;
880 if(wirepoint_hit && pseudo_res_1 < 1e-5) {
881 std::cout <<
"Track " << i <<
", Hit " << j <<
": Invalid wire resolution (< 1e-5), autoscaling not possible!" << std::endl;
883 if(pseudo_res_1 < 0.0049) {
884 double cor = 0.005 / pseudo_res_1;
885 std::cout <<
"Track " << i <<
", Hit " << j <<
": Wire covariance too small, rescaling by " << cor;
895 TVector3 move = v*(v*(track_pos-o));
896 hit_box =
boxCreator((o + move + hit_u*u), u, v,
errorScale_*std::sqrt(hit_cov(0,0)), pseudo_res_1, 0.0105);
897 hit_box->SetMainColor(kYellow);
898 hit_box->SetMainTransparency(0);
899 gEve->AddElement(hit_box);
901 hit_box =
boxCreator((o + move - hit_u*u), u, v,
errorScale_*std::sqrt(hit_cov(0,0)), pseudo_res_1, 0.0105);
902 hit_box->SetMainColor(kYellow);
903 hit_box->SetMainTransparency(0);
904 gEve->AddElement(hit_box);
914 prevFittedState = fittedState;
920 gEve->Redraw3D(resetCam);
929 TEveBox* box =
new TEveBox(
"detPlane_shape");
932 TVector3 norm = u.Cross(v);
937 vertices[0] = o(0) - u(0) - v(0) - norm(0);
938 vertices[1] = o(1) - u(1) - v(1) - norm(1);
939 vertices[2] = o(2) - u(2) - v(2) - norm(2);
941 vertices[3] = o(0) + u(0) - v(0) - norm(0);
942 vertices[4] = o(1) + u(1) - v(1) - norm(1);
943 vertices[5] = o(2) + u(2) - v(2) - norm(2);
945 vertices[6] = o(0) + u(0) - v(0) + norm(0);
946 vertices[7] = o(1) + u(1) - v(1) + norm(1);
947 vertices[8] = o(2) + u(2) - v(2) + norm(2);
949 vertices[9] = o(0) - u(0) - v(0) + norm(0);
950 vertices[10] = o(1) - u(1) - v(1) + norm(1);
951 vertices[11] = o(2) - u(2) - v(2) + norm(2);
953 vertices[12] = o(0) - u(0) + v(0) - norm(0);
954 vertices[13] = o(1) - u(1) + v(1) - norm(1);
955 vertices[14] = o(2) - u(2) + v(2) - norm(2);
957 vertices[15] = o(0) + u(0) + v(0) - norm(0);
958 vertices[16] = o(1) + u(1) + v(1) - norm(1);
959 vertices[17] = o(2) + u(2) + v(2) - norm(2);
961 vertices[18] = o(0) + u(0) + v(0) + norm(0);
962 vertices[19] = o(1) + u(1) + v(1) + norm(1);
963 vertices[20] = o(2) + u(2) + v(2) + norm(2);
965 vertices[21] = o(0) - u(0) + v(0) + norm(0);
966 vertices[22] = o(1) - u(1) + v(1) + norm(1);
967 vertices[23] = o(2) - u(2) + v(2) + norm(2);
970 for(
int k = 0; k < 24; k += 3) box->SetVertex((k/3), vertices[k], vertices[k+1], vertices[k+2]);
978 const Color_t& color,
const Style_t& style,
bool drawMarkers,
bool drawErrors,
double lineWidth,
int markerPos)
980 if (prevState == NULL || state == NULL) {
981 std::cerr <<
"prevState == NULL || state == NULL\n";
985 TVector3 pos, dir, oldPos, oldDir;
986 rep->getPosDir(*state, pos, dir);
987 rep->getPosDir(*prevState, oldPos, oldDir);
989 double distA = (pos-oldPos).Mag();
990 double distB = distA;
991 if ((pos-oldPos)*oldDir < 0)
993 if ((pos-oldPos)*dir < 0)
995 TVector3 intermediate1 = oldPos + 0.3 * distA * oldDir;
996 TVector3 intermediate2 = pos - 0.3 * distB * dir;
997 TEveStraightLineSet* lineSet =
new TEveStraightLineSet;
998 lineSet->AddLine(oldPos(0), oldPos(1), oldPos(2), intermediate1(0), intermediate1(1), intermediate1(2));
999 lineSet->AddLine(intermediate1(0), intermediate1(1), intermediate1(2), intermediate2(0), intermediate2(1), intermediate2(2));
1000 lineSet->AddLine(intermediate2(0), intermediate2(1), intermediate2(2), pos(0), pos(1), pos(2));
1001 lineSet->SetLineColor(color);
1002 lineSet->SetLineStyle(style);
1003 lineSet->SetLineWidth(lineWidth);
1006 lineSet->AddMarker(oldPos(0), oldPos(1), oldPos(2));
1008 lineSet->AddMarker(pos(0), pos(1), pos(2));
1012 gEve->AddElement(lineSet);
1016 const MeasuredStateOnPlane* measuredState;
1018 measuredState =
dynamic_cast<const MeasuredStateOnPlane*
>(prevState);
1020 measuredState =
dynamic_cast<const MeasuredStateOnPlane*
>(state);
1022 if (measuredState != NULL) {
1026 if (markerPos == 0) {
1027 if (fabs(distA) < 1.) {
1028 distA < 0 ? distA = -1 : distA = 1;
1030 eval = 0.2 * distA * oldDir;
1033 if (fabs(distB) < 1.) {
1034 distB < 0 ? distB = -1 : distB = 1;
1036 eval = -0.2 * distB * dir;
1042 TVector3 position, direction;
1043 rep->getPosMomCov(*measuredState, position, direction, cov);
1046 TMatrixDEigen eigen_values(cov.GetSub(0,2, 0,2));
1047 TMatrixT<double> ev = eigen_values.GetEigenValues();
1048 TMatrixT<double> eVec = eigen_values.GetEigenVectors();
1049 TVector3 eVec1, eVec2;
1051 static const double maxErr = 1000.;
1052 double ev0 = std::min(ev(0,0), maxErr);
1053 double ev1 = std::min(ev(1,1), maxErr);
1054 double ev2 = std::min(ev(2,2), maxErr);
1057 if (ev0 < ev1 && ev0 < ev2) {
1058 eVec1.SetXYZ(eVec(0,1),eVec(1,1),eVec(2,1));
1060 eVec2.SetXYZ(eVec(0,2),eVec(1,2),eVec(2,2));
1063 else if (ev1 < ev0 && ev1 < ev2) {
1064 eVec1.SetXYZ(eVec(0,0),eVec(1,0),eVec(2,0));
1066 eVec2.SetXYZ(eVec(0,2),eVec(1,2),eVec(2,2));
1070 eVec1.SetXYZ(eVec(0,0),eVec(1,0),eVec(2,0));
1072 eVec2.SetXYZ(eVec(0,1),eVec(1,1),eVec(2,1));
1076 if (eVec1.Cross(eVec2)*eval < 0)
1080 const TVector3 oldEVec1(eVec1);
1081 const TVector3 oldEVec2(eVec2);
1083 const int nEdges = 24;
1084 std::vector<TVector3> vertices;
1086 vertices.push_back(position);
1089 for (
int i=0; i<nEdges; ++i) {
1090 const double angle = 2*TMath::Pi()/nEdges * i;
1091 vertices.push_back(position + cos(angle)*eVec1 + sin(angle)*eVec2);
1096 DetPlane* newPlane =
new DetPlane(*(measuredState->getPlane()));
1097 newPlane->setO(position + eval);
1099 MeasuredStateOnPlane stateCopy(*measuredState);
1103 catch(Exception& e){
1104 std::cerr<<e.what();
1109 rep->getPosMomCov(stateCopy, position, direction, cov);
1112 TMatrixDEigen eigen_values2(cov.GetSub(0,2, 0,2));
1113 ev = eigen_values2.GetEigenValues();
1114 eVec = eigen_values2.GetEigenVectors();
1116 ev0 = std::min(ev(0,0), maxErr);
1117 ev1 = std::min(ev(1,1), maxErr);
1118 ev2 = std::min(ev(2,2), maxErr);
1121 if (ev0 < ev1 && ev0 < ev2) {
1122 eVec1.SetXYZ(eVec(0,1),eVec(1,1),eVec(2,1));
1124 eVec2.SetXYZ(eVec(0,2),eVec(1,2),eVec(2,2));
1127 else if (ev1 < ev0 && ev1 < ev2) {
1128 eVec1.SetXYZ(eVec(0,0),eVec(1,0),eVec(2,0));
1130 eVec2.SetXYZ(eVec(0,2),eVec(1,2),eVec(2,2));
1134 eVec1.SetXYZ(eVec(0,0),eVec(1,0),eVec(2,0));
1136 eVec2.SetXYZ(eVec(0,1),eVec(1,1),eVec(2,1));
1140 if (eVec1.Cross(eVec2)*eval < 0)
1144 if (oldEVec1*eVec1 < 0) {
1150 double angle0 = eVec1.Angle(oldEVec1);
1151 if (eVec1*(eval.Cross(oldEVec1)) < 0)
1153 for (
int i=0; i<nEdges; ++i) {
1154 const double angle = 2*TMath::Pi()/nEdges * i - angle0;
1155 vertices.push_back(position + cos(angle)*eVec1 + sin(angle)*eVec2);
1158 vertices.push_back(position);
1161 TEveTriangleSet* error_shape =
new TEveTriangleSet(vertices.size(), nEdges*2);
1162 for(
unsigned int k = 0; k < vertices.size(); ++k) {
1163 error_shape->SetVertex(k, vertices[k].X(), vertices[k].Y(), vertices[k].Z());
1166 assert(vertices.size() == 2*nEdges+2);
1169 for (
int i=0; i<nEdges; ++i) {
1171 error_shape->SetTriangle(iTri++, i+1, i+1+nEdges, (i+1)%nEdges+1);
1172 error_shape->SetTriangle(iTri++, (i+1)%nEdges+1, i+1+nEdges, (i+1)%nEdges+1+nEdges);
1178 error_shape->SetMainColor(color);
1179 error_shape->SetMainTransparency(25);
1180 gEve->AddElement(error_shape);
1188 TEveBrowser* browser = gEve->GetBrowser();
1189 browser->StartEmbedding(TRootBrowser::kLeft);
1191 TGMainFrame* frmMain =
new TGMainFrame(gClient->GetRoot(), 1000, 600);
1192 frmMain->SetWindowName(
"XX GUI");
1193 frmMain->SetCleanup(kDeepCleanup);
1196 TGTextButton* tb = 0;
1199 TGHorizontalFrame* hf =
new TGHorizontalFrame(frmMain); {
1201 lbl =
new TGLabel(hf,
"Go to event: ");
1203 guiEvent =
new TGNumberEntry(hf, 0, 9,999, TGNumberFormat::kNESInteger,
1204 TGNumberFormat::kNEANonNegative,
1205 TGNumberFormat::kNELLimitMinMax,
1208 guiEvent->Connect(
"ValueSet(Long_t)",
"genfit::EventDisplay", fh,
"guiGoto()");
1211 tb =
new TGTextButton(hf,
"Redraw Event");
1213 tb->Connect(
"Clicked()",
"genfit::EventDisplay", fh,
"guiGoto()");
1215 frmMain->AddFrame(hf);
1218 hf =
new TGHorizontalFrame(frmMain); {
1219 lbl =
new TGLabel(hf,
"\n Draw Options");
1222 frmMain->AddFrame(hf);
1224 hf =
new TGHorizontalFrame(frmMain); {
1228 guiDrawGeometry_->Connect(
"Toggled(Bool_t)",
"genfit::EventDisplay", fh,
"guiSetDrawParams()");
1230 frmMain->AddFrame(hf);
1232 hf =
new TGHorizontalFrame(frmMain); {
1236 guiDrawDetectors_->Connect(
"Toggled(Bool_t)",
"genfit::EventDisplay", fh,
"guiSetDrawParams()");
1238 frmMain->AddFrame(hf);
1240 hf =
new TGHorizontalFrame(frmMain); {
1244 guiDrawHits_->Connect(
"Toggled(Bool_t)",
"genfit::EventDisplay", fh,
"guiSetDrawParams()");
1246 frmMain->AddFrame(hf);
1250 hf =
new TGHorizontalFrame(frmMain); {
1254 guiDrawPlanes_->Connect(
"Toggled(Bool_t)",
"genfit::EventDisplay", fh,
"guiSetDrawParams()");
1256 frmMain->AddFrame(hf);
1258 hf =
new TGHorizontalFrame(frmMain); {
1262 guiDrawTrackMarkers_->Connect(
"Toggled(Bool_t)",
"genfit::EventDisplay", fh,
"guiSetDrawParams()");
1264 frmMain->AddFrame(hf);
1267 hf =
new TGHorizontalFrame(frmMain); {
1271 guiDrawTrack_->Connect(
"Toggled(Bool_t)",
"genfit::EventDisplay", fh,
"guiSetDrawParams()");
1273 frmMain->AddFrame(hf);
1275 hf =
new TGHorizontalFrame(frmMain); {
1279 guiDrawRefTrack_->Connect(
"Toggled(Bool_t)",
"genfit::EventDisplay", fh,
"guiSetDrawParams()");
1281 frmMain->AddFrame(hf);
1283 hf =
new TGHorizontalFrame(frmMain); {
1287 guiDrawErrors_->Connect(
"Toggled(Bool_t)",
"genfit::EventDisplay", fh,
"guiSetDrawParams()");
1289 frmMain->AddFrame(hf);
1291 hf =
new TGHorizontalFrame(frmMain); {
1295 guiDrawForward_->Connect(
"Toggled(Bool_t)",
"genfit::EventDisplay", fh,
"guiSetDrawParams()");
1297 frmMain->AddFrame(hf);
1299 hf =
new TGHorizontalFrame(frmMain); {
1303 guiDrawBackward_->Connect(
"Toggled(Bool_t)",
"genfit::EventDisplay", fh,
"guiSetDrawParams()");
1305 frmMain->AddFrame(hf);
1308 hf =
new TGHorizontalFrame(frmMain); {
1312 guiDrawAutoScale_->Connect(
"Toggled(Bool_t)",
"genfit::EventDisplay", fh,
"guiSetDrawParams()");
1314 frmMain->AddFrame(hf);
1316 hf =
new TGHorizontalFrame(frmMain); {
1320 guiDrawScaleMan_->Connect(
"Toggled(Bool_t)",
"genfit::EventDisplay", fh,
"guiSetDrawParams()");
1322 frmMain->AddFrame(hf);
1324 hf =
new TGHorizontalFrame(frmMain); {
1326 TGNumberFormat::kNEANonNegative,
1327 TGNumberFormat::kNELLimitMinMax,
1330 guiErrorScale_->Connect(
"ValueSet(Long_t)",
"genfit::EventDisplay", fh,
"guiSetDrawParams()");
1331 lbl =
new TGLabel(hf,
"Error scale");
1334 frmMain->AddFrame(hf);
1338 hf =
new TGHorizontalFrame(frmMain); {
1339 lbl =
new TGLabel(hf,
"\n TrackRep options");
1342 frmMain->AddFrame(hf);
1344 hf =
new TGHorizontalFrame(frmMain); {
1348 guiDrawCardinalRep_->Connect(
"Toggled(Bool_t)",
"genfit::EventDisplay", fh,
"guiSetDrawParams()");
1350 frmMain->AddFrame(hf);
1352 hf =
new TGHorizontalFrame(frmMain); {
1353 guiRepId_ =
new TGNumberEntry(hf,
repId_, 6,999, TGNumberFormat::kNESInteger,
1354 TGNumberFormat::kNEANonNegative,
1355 TGNumberFormat::kNELLimitMinMax,
1358 guiRepId_->Connect(
"ValueSet(Long_t)",
"genfit::EventDisplay", fh,
"guiSetDrawParams()");
1359 lbl =
new TGLabel(hf,
"Else draw rep with id");
1362 frmMain->AddFrame(hf);
1364 hf =
new TGHorizontalFrame(frmMain); {
1368 guiDrawAllTracks_->Connect(
"Toggled(Bool_t)",
"genfit::EventDisplay", fh,
"guiSetDrawParams()");
1370 frmMain->AddFrame(hf);
1372 hf =
new TGHorizontalFrame(frmMain); {
1374 TGNumberFormat::kNEANonNegative,
1375 TGNumberFormat::kNELLimitMinMax,
1378 guiTrackId_->Connect(
"ValueSet(Long_t)",
"genfit::EventDisplay", fh,
"guiSetDrawParams()");
1379 lbl =
new TGLabel(hf,
"Else draw track nr. ");
1382 frmMain->AddFrame(hf);
1386 frmMain->MapSubwindows();
1388 frmMain->MapWindow();
1390 browser->StopEmbedding();
1391 browser->SetTabTitle(
"Draw Control", 0);
1394 browser->StartEmbedding(TRootBrowser::kLeft);
1395 TGMainFrame* frmMain2 =
new TGMainFrame(gClient->GetRoot(), 1000, 600);
1396 frmMain2->SetWindowName(
"XX GUI");
1397 frmMain2->SetCleanup(kDeepCleanup);
1399 hf =
new TGHorizontalFrame(frmMain2); {
1401 lbl =
new TGLabel(hf,
"Go to event: ");
1403 guiEvent2 =
new TGNumberEntry(hf, 0, 9,999, TGNumberFormat::kNESInteger,
1404 TGNumberFormat::kNEANonNegative,
1405 TGNumberFormat::kNELLimitMinMax,
1408 guiEvent2->Connect(
"ValueSet(Long_t)",
"genfit::EventDisplay", fh,
"guiGoto2()");
1411 tb =
new TGTextButton(hf,
"Redraw Event");
1413 tb->Connect(
"Clicked()",
"genfit::EventDisplay", fh,
"guiGoto()");
1415 frmMain2->AddFrame(hf);
1417 hf =
new TGHorizontalFrame(frmMain2); {
1418 lbl =
new TGLabel(hf,
"\n Fitting options");
1421 frmMain2->AddFrame(hf);
1423 hf =
new TGHorizontalFrame(frmMain2); {
1424 guiRefit_ =
new TGCheckButton(hf,
"Refit");
1427 guiRefit_->Connect(
"Toggled(Bool_t)",
"genfit::EventDisplay", fh,
"guiSetDrawParams()");
1429 frmMain2->AddFrame(hf);
1431 hf =
new TGHorizontalFrame(frmMain2); {
1433 TGNumberFormat::kNEANonNegative,
1434 TGNumberFormat::kNELLimitMinMax,
1437 guiDebugLvl_->Connect(
"ValueSet(Long_t)",
"genfit::EventDisplay", fh,
"guiSetDrawParams()");
1438 lbl =
new TGLabel(hf,
"debug level");
1441 frmMain2->AddFrame(hf);
1443 hf =
new TGHorizontalFrame(frmMain2); {
1445 guiFitterId_->Connect(
"Clicked(Int_t)",
"genfit::EventDisplay", fh,
"guiSelectFitterId(int)");
1446 hf->AddFrame(
guiFitterId_,
new TGLayoutHints(kLHintsTop));
1447 TGRadioButton* fitterId_button =
new TGRadioButton(
guiFitterId_,
"Simple Kalman");
1449 new TGRadioButton(
guiFitterId_,
"DAF w/ simple Kalman");
1450 new TGRadioButton(
guiFitterId_,
"DAF w/ reference Kalman");
1451 fitterId_button->SetDown(
true,
false);
1454 frmMain2->AddFrame(hf);
1456 hf =
new TGHorizontalFrame(frmMain2); {
1457 guiMmHandling_ =
new TGButtonGroup(hf,
"Multiple measurement handling in Kalman:");
1458 guiMmHandling_->Connect(
"Clicked(Int_t)",
"genfit::EventDisplay", fh,
"guiSelectMmHandling(int)");
1460 TGRadioButton* mmHandling_button =
new TGRadioButton(
guiMmHandling_,
"weighted average");
1462 new TGRadioButton(
guiMmHandling_,
"weighted, closest to reference");
1463 new TGRadioButton(
guiMmHandling_,
"unweighted, closest to reference");
1464 new TGRadioButton(
guiMmHandling_,
"weighted, closest to prediction");
1465 new TGRadioButton(
guiMmHandling_,
"unweighted, closest to prediction");
1466 new TGRadioButton(
guiMmHandling_,
"weighted, closest to reference for WireMeasurements, weighted average else");
1467 new TGRadioButton(
guiMmHandling_,
"unweighted, closest to reference for WireMeasurements, unweighted average else");
1468 new TGRadioButton(
guiMmHandling_,
"weighted, closest to prediction for WireMeasurements, weighted average else");
1469 new TGRadioButton(
guiMmHandling_,
"unweighted, closest to prediction for WireMeasurements, unweighted average else");
1470 mmHandling_button->SetDown(
true,
false);
1473 frmMain2->AddFrame(hf);
1475 hf =
new TGHorizontalFrame(frmMain2); {
1481 frmMain2->AddFrame(hf);
1483 hf =
new TGHorizontalFrame(frmMain2); {
1484 guiDPVal_ =
new TGNumberEntry(hf,
dPVal_, 6,9999, TGNumberFormat::kNESReal,
1485 TGNumberFormat::kNEANonNegative,
1486 TGNumberFormat::kNELLimitMinMax,
1489 guiDPVal_->Connect(
"ValueSet(Long_t)",
"genfit::EventDisplay", fh,
"guiSetDrawParams()");
1490 lbl =
new TGLabel(hf,
"delta pVal (convergence criterium)");
1493 frmMain2->AddFrame(hf);
1495 hf =
new TGHorizontalFrame(frmMain2); {
1497 TGNumberFormat::kNEANonNegative,
1498 TGNumberFormat::kNELLimitMinMax,
1501 guiRelChi2_->Connect(
"ValueSet(Long_t)",
"genfit::EventDisplay", fh,
"guiSetDrawParams()");
1502 lbl =
new TGLabel(hf,
"rel chi^2 change (non-convergence criterium)");
1505 frmMain2->AddFrame(hf);
1507 hf =
new TGHorizontalFrame(frmMain2); {
1509 TGNumberFormat::kNEANonNegative,
1510 TGNumberFormat::kNELLimitMinMax,
1513 guiNMinIter_->Connect(
"ValueSet(Long_t)",
"genfit::EventDisplay", fh,
"guiSetDrawParams()");
1514 lbl =
new TGLabel(hf,
"Minimum nr of iterations");
1517 frmMain2->AddFrame(hf);
1519 hf =
new TGHorizontalFrame(frmMain2); {
1521 TGNumberFormat::kNEANonNegative,
1522 TGNumberFormat::kNELLimitMinMax,
1525 guiNMaxIter_->Connect(
"ValueSet(Long_t)",
"genfit::EventDisplay", fh,
"guiSetDrawParams()");
1526 lbl =
new TGLabel(hf,
"Maximum nr of iterations");
1529 frmMain2->AddFrame(hf);
1531 hf =
new TGHorizontalFrame(frmMain2); {
1533 TGNumberFormat::kNEAAnyNumber,
1534 TGNumberFormat::kNELLimitMinMax,
1537 guiNMaxFailed_->Connect(
"ValueSet(Long_t)",
"genfit::EventDisplay", fh,
"guiSetDrawParams()");
1538 lbl =
new TGLabel(hf,
"Maximum nr of failed hits");
1541 frmMain2->AddFrame(hf);
1544 hf =
new TGHorizontalFrame(frmMain2); {
1545 guiResort_ =
new TGCheckButton(hf,
"Resort track");
1548 guiResort_->Connect(
"Toggled(Bool_t)",
"genfit::EventDisplay", fh,
"guiSetDrawParams()");
1550 frmMain2->AddFrame(hf);
1555 frmMain2->MapSubwindows();
1557 frmMain2->MapWindow();
1559 browser->StopEmbedding();
1560 browser->SetTabTitle(
"Refit Control", 0);
1565 Long_t n =
guiEvent->GetNumberEntry()->GetIntNumber();
1571 Long_t n =
guiEvent2->GetNumberEntry()->GetIntNumber();