134 std::cout<<
"main"<<std::endl;
135 gRandom->SetSeed(14);
138 const unsigned int nEvents = 100;
139 const unsigned int nMeasurements = 56;
140 const double BField = 15.;
141 const double momentum = 0.4;
142 const double theta = 120;
143 const double thetaDetPlane = 90;
144 const double phiDetPlane = 0;
145 const double pointDist = 5;
146 const double resolution = 0.02;
148 const double resolutionWire = 5*resolution;
149 const TVector3 wireDir(0,0,1);
150 const double skewAngle(5);
151 const bool useSkew =
true;
152 const int nSuperLayer = 10;
153 const double minDrift = 0.;
154 const double maxDrift = 2;
155 const bool idealLRResolution =
false;
157 const double outlierProb = -0.1;
158 const double outlierRange = 2;
160 const double hitSwitchProb = -0.1;
162 const int splitTrack = -5;
163 const bool fullMeasurement =
false;
178 const int nIter = 20;
179 const double dPVal = 1.E-3;
181 const bool resort =
true;
182 const bool prefit =
false;
183 const bool refit =
false;
185 const bool twoReps =
false;
189 const bool smearPosMom =
true;
190 const double chargeSwitchProb = -0.1;
191 const double posSmear = 10*resolution;
192 const double momSmear = 5. /180.*TMath::Pi();
193 const double momMagSmear = 0.2;
194 const double zSmearFac = 2;
197 const bool matFX =
false;
199 const bool debug =
false;
200 const bool onlyDisplayFailed =
true;
202 std::vector<genfit::eMeasurementType> measurementTypes;
209 for (
unsigned int i = 0; i<50; ++i)
220 fitter->setMultipleMeasurementHandling(mmHandling);
225 fitter->setMultipleMeasurementHandling(mmHandling);
235 fitter->setMaxIterations(nIter);
237 fitter->setDebugLvl(10);
267 new TGeoManager(
"Geometry",
"Geane geometry");
268 TGeoManager::Import(
"genfitGeom.root");
273 const double charge = TDatabasePDG::Instance()->GetParticle(pdg)->Charge()/(3.);
284 gROOT->SetStyle(
"Plain");
285 gStyle->SetPalette(1);
286 gStyle->SetOptFit(1111);
288 TH1D *hmomRes =
new TH1D(
"hmomRes",
"mom res",500,-10*resolution*momentum/nMeasurements,10*resolution*momentum/nMeasurements);
289 TH1D *hupRes =
new TH1D(
"hupRes",
"u' res",500,-5*resolution/nMeasurements, 5*resolution/nMeasurements);
290 TH1D *hvpRes =
new TH1D(
"hvpRes",
"v' res",500,-5*resolution/nMeasurements, 5*resolution/nMeasurements);
291 TH1D *huRes =
new TH1D(
"huRes",
"u res",500,-5*resolution, 5*resolution);
292 TH1D *hvRes =
new TH1D(
"hvRes",
"v res",500,-5*resolution, 5*resolution);
294 TH1D *hqopPu =
new TH1D(
"hqopPu",
"q/p pull",200,-6.,6.);
295 TH1D *pVal =
new TH1D(
"pVal",
"p-value",100,0.,1.00000001);
297 TH1D *hupPu =
new TH1D(
"hupPu",
"u' pull",200,-6.,6.);
298 TH1D *hvpPu =
new TH1D(
"hvpPu",
"v' pull",200,-6.,6.);
299 TH1D *huPu =
new TH1D(
"huPu",
"u pull",200,-6.,6.);
300 TH1D *hvPu =
new TH1D(
"hvPu",
"v pull",200,-6.,6.);
302 TH1D *weights =
new TH1D(
"weights",
"Daf vs true weights",500,-1.01,1.01);
304 TH1D *trackLenRes =
new TH1D(
"trackLenRes",
"(trueLen - FittedLen) / trueLen",500,-0.01,0.01);
308 unsigned int nTotalIterConverged(0);
309 unsigned int nTotalIterNotConverged(0);
310 unsigned int nTotalIterSecondConverged(0);
311 unsigned int nTotalIterSecondNotConverged(0);
312 unsigned int nConvergedFits(0);
313 unsigned int nUNConvergedFits(0);
314 unsigned int nConvergedFitsSecond(0);
315 unsigned int nUNConvergedFitsSecond(0);
324 for (
unsigned int iEvent=0; iEvent<nEvents; ++iEvent){
331 if (debug || (iEvent)%10==0)
332 std::cout <<
"Event Nr. " << iEvent <<
" ";
333 else std::cout <<
". ";
334 if (debug || (iEvent+1)%10==0)
346 TVector3 pos(0, 0, 0);
347 TVector3 mom(1.,0,0);
348 mom.SetPhi(gRandom->Uniform(0.,2*TMath::Pi()));
350 mom.SetTheta(theta*TMath::Pi()/180);
351 mom.SetMag(momentum);
353 for (
int i = 0; i < 3; ++i)
354 covM(i,i) = resolution*resolution;
355 for (
int i = 3; i < 6; ++i)
356 covM(i,i) = pow(resolution / nMeasurements / sqrt(3), 2);
359 std::cout <<
"start values \n";
372 posM.SetX(gRandom->Gaus(posM.X(),posSmear));
373 posM.SetY(gRandom->Gaus(posM.Y(),posSmear));
374 posM.SetZ(gRandom->Gaus(posM.Z(),zSmearFac*posSmear));
376 momM.SetPhi(gRandom->Gaus(mom.Phi(),momSmear));
377 momM.SetTheta(gRandom->Gaus(mom.Theta(),momSmear));
378 momM.SetMag(gRandom->Gaus(mom.Mag(), momMagSmear*mom.Mag()));
384 if (chargeSwitchProb > gRandom->Uniform(1.))
388 if (chargeSwitchProb > gRandom->Uniform(1.))
406 std::vector< std::vector<genfit::AbsMeasurement*> > measurements;
408 std::vector<bool> outlierTrue;
411 std::vector<int> leftRightTrue;
417 for (
unsigned int i=0; i<measurementTypes.size(); ++i){
418 trueLen = i*pointDist;
420 measurements.push_back(measurementCreator.
create(measurementTypes[i], trueLen, outlier, lr));
421 outlierTrue.push_back(outlier);
422 leftRightTrue.push_back(lr);
424 assert(measurementTypes.size() == leftRightTrue.size());
425 assert(measurementTypes.size() == outlierTrue.size());
428 std::cerr<<
"Exception, next track"<<std::endl;
429 std::cerr << e.
what();
433 if (debug) std::cout <<
"... done creating measurements \n";
438 TVectorD seedState(6);
439 TMatrixDSym seedCov(6);
444 fitTrack->addTrackRep(secondRep);
451 assert(fitTrack->checkConsistency());
455 for(
unsigned int i=0; i<measurements.size(); ++i){
456 if (splitTrack > 0 && (
int)i >= splitTrack)
458 if (i>0 && hitSwitchProb > gRandom->Uniform(1.))
463 assert(fitTrack->checkConsistency());
467 if (splitTrack > 0) {
468 for(
unsigned int i=splitTrack; i<measurements.size(); ++i){
469 if (i>0 && hitSwitchProb > gRandom->Uniform(1.))
478 assert(fitTrack->checkConsistency());
485 if (debug) std::cout<<
"Starting the fitter"<<std::endl;
493 fitter->processTrack(fitTrack, resort);
495 fitter->processTrack(secondTrack, resort);
497 if (debug) std::cout<<
"fitter is finished!"<<std::endl;
500 std::cerr << e.
what();
501 std::cerr <<
"Exception, next track" << std::endl;
505 if (splitTrack > 0) {
506 if (debug) fitTrack->Print(
"C");
507 if (debug) secondTrack->
Print(
"C");
509 if (fullMeasurement) {
514 fitTrack->mergeTrack(secondTrack);
516 if (debug) fitTrack->Print(
"C");
519 if (debug) std::cout<<
"Starting the fitter"<<std::endl;
520 fitter->processTrack(fitTrack, resort);
521 if (debug) std::cout<<
"fitter is finished!"<<std::endl;
524 std::cerr << e.
what();
525 std::cerr <<
"Exception, next track" << std::endl;
531 if (refit && !fitTrack->getFitStatus(rep)->isFitConverged()) {
532 std::cout<<
"Trying to fit again "<<std::endl;
533 fitter->processTrack(fitTrack, resort);
539 fitTrack->Print(
"C");
540 fitTrack->getFitStatus(rep)->Print();
543 assert(fitTrack->checkConsistency());
547 if (!onlyDisplayFailed && iEvent < 1000)
549 else if (onlyDisplayFailed &&
550 (!fitTrack->getFitStatus(rep)->isFitConverged() ||
551 fitTrack->getFitStatus(rep)->getPVal() < 0.01)) {
558 if (fitTrack->getFitStatus(rep)->isFitConverged()) {
563 nTotalIterNotConverged +=
static_cast<genfit::KalmanFitStatus*
>(fitTrack->getFitStatus(rep))->getNumIterations();
564 nUNConvergedFits += 1;
568 if (fitTrack->getFitStatus(secondRep)->isFitConverged()) {
569 nTotalIterSecondConverged +=
static_cast<genfit::KalmanFitStatus*
>(fitTrack->getFitStatus(secondRep))->getNumIterations();
570 nConvergedFitsSecond += 1;
573 nTotalIterSecondNotConverged +=
static_cast<genfit::KalmanFitStatus*
>(fitTrack->getFitStatus(secondRep))->getNumIterations();
574 nUNConvergedFitsSecond += 1;
580 if (! fitTrack->getFitStatus(rep)->isFitConverged()) {
581 std::cout <<
"Track could not be fitted successfully! Fit is not converged! \n";
588 std::cout <<
"Track has no TrackPoint with fitterInfo! \n";
593 std::cout <<
"state before extrapolating back to reference plane \n";
602 std::cerr<<
"Exception, next track"<<std::endl;
603 std::cerr << e.
what();
609 const TVectorD& referenceState = stateRefOrig.
getState();
611 const TVectorD& state = kfsop.
getState();
612 const TMatrixDSym& cov = kfsop.
getCov();
614 double pval = fitter->getPVal(fitTrack, rep);
617 hmomRes->Fill( (charge/state[0]-momentum));
618 hupRes->Fill( (state[1]-referenceState[1]));
619 hvpRes->Fill( (state[2]-referenceState[2]));
620 huRes->Fill( (state[3]-referenceState[3]));
621 hvRes->Fill( (state[4]-referenceState[4]));
623 hqopPu->Fill( (state[0]-referenceState[0]) / sqrt(cov[0][0]) );
625 hupPu->Fill( (state[1]-referenceState[1]) / sqrt(cov[1][1]) );
626 hvpPu->Fill( (state[2]-referenceState[2]) / sqrt(cov[2][2]) );
627 huPu->Fill( (state[3]-referenceState[3]) / sqrt(cov[3][3]) );
628 hvPu->Fill( (state[4]-referenceState[4]) / sqrt(cov[4][4]) );
632 trackLenRes->Fill( (trueLen - fitTrack->getTrackLen(rep)) / trueLen );
635 std::cout <<
"true track length = " << trueLen <<
"; fitted length = " << fitTrack->getTrackLen(rep) <<
"\n";
636 std::cout <<
"fitted tof = " << fitTrack->getTOF(rep) <<
" ns\n";
640 std::cerr << e.
what();
641 std::cout <<
"could not get TrackLen or TOF! \n";
647 for (
unsigned int i=0; i<fitTrack->getNumPointsWithMeasurement(); ++i){
649 if (! fitTrack->getPointWithMeasurement(i)->hasFitterInfo(rep))
653 std::vector<double> dafWeights =
dynamic_cast<genfit::KalmanFitterInfo*
>(fitTrack->getPointWithMeasurement(i)->getFitterInfo(rep))->getWeights();
654 std::cout <<
"hit " << i;
655 if (outlierTrue[i]) std::cout <<
" is an OUTLIER";
656 std::cout <<
" weights: ";
657 for (
unsigned int j=0; j<dafWeights.size(); ++j){
658 std::cout << dafWeights[j] <<
" ";
660 std::cout <<
" l/r: " << leftRightTrue[i];
663 int trueSide = leftRightTrue[i];
664 if (trueSide == 0)
continue;
665 if (outlierTrue[i])
continue;
666 std::vector<double> dafWeightLR =
dynamic_cast<genfit::KalmanFitterInfo*
>(fitTrack->getPointWithMeasurement(i)->getFitterInfo(rep))->getWeights();
667 if(dafWeightLR.size() != 2)
670 double weightCorrectSide, weightWrongSide;
673 weightCorrectSide = dafWeightLR[0];
674 weightWrongSide = dafWeightLR[1];
677 weightCorrectSide = dafWeightLR[1];
678 weightWrongSide = dafWeightLR[0];
680 weightWrongSide -= 1.;
682 weights->Fill(weightCorrectSide);
683 weights->Fill(weightWrongSide);
685 if (weightCorrectSide>maxWeight) maxWeight = weightCorrectSide;
688 for (
unsigned int i=0; i<fitTrack->getNumPointsWithMeasurement(); ++i){
689 if (! fitTrack->getPointWithMeasurement(i)->hasFitterInfo(rep))
692 std::vector<double> dafWeights =
dynamic_cast<genfit::KalmanFitterInfo*
>(fitTrack->getPointWithMeasurement(i)->getFitterInfo(rep))->getWeights();
694 if (outlierTrue[i]) {
695 for (
unsigned int j=0; j<dafWeights.size(); ++j){
696 weights->Fill(dafWeights[j]-1);
699 else if (leftRightTrue[i] == 0) {
700 for (
unsigned int j=0; j<dafWeights.size(); ++j){
701 weights->Fill(dafWeights[j]);
711 std::cout<<
" pruned track: ";
727 std::cout<<
"maxWeight = " << maxWeight << std::endl;
728 std::cout<<
"avg nr iterations = " << (double)(nTotalIterConverged + nTotalIterNotConverged)/(double)(nConvergedFits + nUNConvergedFits) << std::endl;
729 std::cout<<
"avg nr iterations of converged fits = " << (double)(nTotalIterConverged)/(double)(nConvergedFits) << std::endl;
730 std::cout<<
"avg nr iterations of UNconverged fits = " << (double)(nTotalIterNotConverged)/(double)(nUNConvergedFits) << std::endl;
731 std::cout<<
"fit efficiency = " << (double)nConvergedFits/nEvents << std::endl;
734 std::cout<<
"second rep: \navg nr iterations = " << (double)(nTotalIterSecondConverged + nTotalIterSecondNotConverged)/(double)(nConvergedFitsSecond + nUNConvergedFitsSecond) << std::endl;
735 std::cout<<
"avg nr iterations of converged fits = " << (double)(nTotalIterSecondConverged)/(double)(nConvergedFitsSecond) << std::endl;
736 std::cout<<
"avg nr iterations of UNconverged fits = " << (double)(nTotalIterSecondNotConverged)/(double)(nUNConvergedFitsSecond) << std::endl;
737 std::cout<<
"fit efficiency = " << (double)nConvergedFitsSecond/nEvents << std::endl;
747 if (debug) std::cout<<
"Draw histograms ...";
749 TCanvas* c1 =
new TCanvas();
753 hmomRes->Fit(
"gaus");
777 TCanvas* c2 =
new TCanvas();
807 TCanvas* c3 =
new TCanvas();
811 trackLenRes->Fit(
"gaus");
816 if (debug) std::cout<<
"... done"<<std::endl;