| | 425 | } |
| | 426 | }}} |
| | 427 | |
| | 428 | |
| | 429 | == Optim Disp (Leakage==0) == |
| | 430 | |
| | 431 | {{{#!Spoiler |
| | 432 | {{{#!cpp |
| | 433 | #include <iostream> |
| | 434 | #include <iomanip> |
| | 435 | |
| | 436 | #include <TMath.h> |
| | 437 | #include <TH2.h> |
| | 438 | #include <TChain.h> |
| | 439 | #include <TCanvas.h> |
| | 440 | |
| | 441 | void optimdisp2() |
| | 442 | { |
| | 443 | // Create chain for the tree Result |
| | 444 | // This is just easier than using TFile/TTree |
| | 445 | TChain c("Result"); |
| | 446 | |
| | 447 | // Add the input file to the |
| | 448 | c.AddFile("simulation.root"); |
| | 449 | |
| | 450 | // Define variables for all leaves to be accessed |
| | 451 | // By definition rootifysql writes only doubles |
| | 452 | double FileId, EvtNumber, X, Y, MeanX, MeanY, Width, Length, CosDelta, SinDelta, |
| | 453 | M3Long, SlopeLong, Leakage1, SlopeSpreadWeighted, Size, |
| | 454 | ConcCore, ConcCOG, NumIslands, NumUsedPixels, Zd; |
| | 455 | |
| | 456 | // Connect the variables to the cordesponding leaves |
| | 457 | c.SetBranchAddress("FileId", &FileId); |
| | 458 | c.SetBranchAddress("EvtNumber", &EvtNumber); |
| | 459 | c.SetBranchAddress("X", &X); |
| | 460 | c.SetBranchAddress("Y", &Y); |
| | 461 | c.SetBranchAddress("MeanX", &MeanX); |
| | 462 | c.SetBranchAddress("MeanY", &MeanY); |
| | 463 | c.SetBranchAddress("Width", &Width); |
| | 464 | c.SetBranchAddress("Length", &Length); |
| | 465 | c.SetBranchAddress("CosDelta", &CosDelta); |
| | 466 | c.SetBranchAddress("SinDelta", &SinDelta); |
| | 467 | c.SetBranchAddress("M3Long", &M3Long); |
| | 468 | c.SetBranchAddress("SlopeLong", &SlopeLong); |
| | 469 | c.SetBranchAddress("Leakage1", &Leakage1); |
| | 470 | c.SetBranchAddress("NumIslands", &NumIslands); |
| | 471 | c.SetBranchAddress("NumUsedPixels", &NumUsedPixels); |
| | 472 | c.SetBranchAddress("Size", &Size); |
| | 473 | |
| | 474 | // Set some constants (they could be included in the database |
| | 475 | // in the future) |
| | 476 | double mm2deg = +0.0117193246260285378; |
| | 477 | |
| | 478 | // -------------------- Source dependent parameter calculation ------------------- |
| | 479 | |
| | 480 | TH2F hist("", "", |
| | 481 | 26, 1.300-0.0025, 1.430-0.0025, |
| | 482 | 20, 0.040-0.0025, 0.140-0.0025); |
| | 483 | |
| | 484 | for (float xi0=1.30; xi0<1.43; xi0+=0.005) |
| | 485 | for (float slope0=0.04; slope0<0.14; slope0+=0.005) |
| | 486 | { |
| | 487 | int cnt_on = 0; |
| | 488 | |
| | 489 | for (int i=0; i<c.GetEntries(); i++) |
| | 490 | { |
| | 491 | // read the i-th event from the file |
| | 492 | c.GetEntry(i); |
| | 493 | |
| | 494 | // First calculate all cuts to speedup the analysis |
| | 495 | double area = TMath::Pi()*Width*Length; |
| | 496 | |
| | 497 | // The abberation correction does increase also Width and Length by 1.02 |
| | 498 | |
| | 499 | bool cutq = NumIslands<3.5 && NumUsedPixels>5.5 && Leakage1==0; |
| | 500 | if (!cutq) |
| | 501 | continue; |
| | 502 | |
| | 503 | bool cut0 = area < log10(Size)*898-1535; |
| | 504 | if (!cut0) |
| | 505 | continue; |
| | 506 | |
| | 507 | int angle = 0; |
| | 508 | |
| | 509 | // -------------------- Source dependent parameter calculation ------------------- |
| | 510 | |
| | 511 | double cr = cos(angle*TMath::DegToRad()); |
| | 512 | double sr = sin(angle*TMath::DegToRad()); |
| | 513 | |
| | 514 | double px = cr*X-sr*Y; |
| | 515 | double py = cr*Y+sr*X; |
| | 516 | |
| | 517 | double dx = MeanX - px*1.02; |
| | 518 | double dy = MeanY - py*1.02; |
| | 519 | |
| | 520 | double norm = sqrt(dx*dx + dy*dy); |
| | 521 | double dist = norm*mm2deg; |
| | 522 | |
| | 523 | double lx = min(max((CosDelta*dy - SinDelta*dx)/norm, -1.), 1.); |
| | 524 | double ly = min(max((CosDelta*dx + SinDelta*dy)/norm, -1.), 1.); |
| | 525 | |
| | 526 | double alpha = asin(lx); |
| | 527 | double sgn = TMath::Sign(1., ly); |
| | 528 | |
| | 529 | // ------------------------------- Application ---------------------------------- |
| | 530 | |
| | 531 | double m3l = M3Long*sgn*mm2deg; |
| | 532 | double slope = SlopeLong*sgn/mm2deg; |
| | 533 | |
| | 534 | // --------------------------------- Analysis ----------------------------------- |
| | 535 | |
| | 536 | double xi = xi0 + slope0 *slope; |
| | 537 | |
| | 538 | double sign1 = m3l+0.07; |
| | 539 | double sign2 = (dist-0.5)*7.2-slope; |
| | 540 | |
| | 541 | double disp = (sign1<0 || sign2<0 ? -xi : xi)*(1-Width/Length); |
| | 542 | |
| | 543 | double thetasq = disp*disp + dist*dist - 2*disp*dist*sqrt(1-lx*lx); |
| | 544 | |
| | 545 | if (thetasq<0.024) |
| | 546 | cnt_on++; |
| | 547 | } |
| | 548 | |
| | 549 | hist.Fill(xi0, slope0, cnt_on); |
| | 550 | |
| | 551 | cout << xi0 << " " << slope0 << " " << cnt_on << endl; |
| | 552 | } |
| | 553 | |
| | 554 | TCanvas *canv = new TCanvas; |
| | 555 | canv->SetTopMargin(0.01); |
| | 556 | |
| | 557 | hist.SetStats(kFALSE); |
| | 558 | hist.SetContour(100); |
| | 559 | hist.SetXTitle("Xi_{0} / deg"); |
| | 560 | hist.SetYTitle("Slope_{0} #dot ns/deg^{2} "); |
| | 561 | hist.GetYaxis()->SetTitleOffset(1.2); |
| | 562 | hist.DrawCopy("colz cont2"); |
| | 563 | |
| | 564 | } |
| | 565 | }}} |
| | 566 | }}} |
| | 567 | |
| | 568 | Results in |
| | 569 | |
| | 570 | [[Image(Result.png)]] |
| | 571 | |
| | 572 | == Optim Disp (Leakage>0) == |
| | 573 | |
| | 574 | {{{#!Spoiler |
| | 575 | {{{#!cpp |
| | 576 | #include <iostream> |
| | 577 | #include <iomanip> |
| | 578 | |
| | 579 | #include <TMath.h> |
| | 580 | #include <TH2.h> |
| | 581 | #include <TChain.h> |
| | 582 | #include <TCanvas.h> |
| | 583 | |
| | 584 | void optimdisp3() |
| | 585 | { |
| | 586 | // Create chain for the tree Result |
| | 587 | // This is just easier than using TFile/TTree |
| | 588 | TChain c("Result"); |
| | 589 | |
| | 590 | // Add the input file to the |
| | 591 | c.AddFile("simulation.root"); |
| | 592 | |
| | 593 | // Define variables for all leaves to be accessed |
| | 594 | // By definition rootifysql writes only doubles |
| | 595 | double FileId, EvtNumber, X, Y, MeanX, MeanY, Width, Length, CosDelta, SinDelta, |
| | 596 | M3Long, SlopeLong, Leakage1, SlopeSpreadWeighted, Size, |
| | 597 | ConcCore, ConcCOG, NumIslands, NumUsedPixels, Zd; |
| | 598 | |
| | 599 | // Connect the variables to the cordesponding leaves |
| | 600 | c.SetBranchAddress("FileId", &FileId); |
| | 601 | c.SetBranchAddress("EvtNumber", &EvtNumber); |
| | 602 | c.SetBranchAddress("X", &X); |
| | 603 | c.SetBranchAddress("Y", &Y); |
| | 604 | c.SetBranchAddress("MeanX", &MeanX); |
| | 605 | c.SetBranchAddress("MeanY", &MeanY); |
| | 606 | c.SetBranchAddress("Width", &Width); |
| | 607 | c.SetBranchAddress("Length", &Length); |
| | 608 | c.SetBranchAddress("CosDelta", &CosDelta); |
| | 609 | c.SetBranchAddress("SinDelta", &SinDelta); |
| | 610 | c.SetBranchAddress("M3Long", &M3Long); |
| | 611 | c.SetBranchAddress("SlopeLong", &SlopeLong); |
| | 612 | c.SetBranchAddress("Leakage1", &Leakage1); |
| | 613 | c.SetBranchAddress("NumIslands", &NumIslands); |
| | 614 | c.SetBranchAddress("NumUsedPixels", &NumUsedPixels); |
| | 615 | //c.SetBranchAddress("SlopeSpreadWeighted", &SlopeSpreadWeighted); |
| | 616 | c.SetBranchAddress("Size", &Size); |
| | 617 | c.SetBranchAddress("Zd", &Zd); |
| | 618 | //c.SetBranchAddress("ConcCOG", &ConcCOG); |
| | 619 | //c.SetBranchAddress("ConcCore", &ConcCore); |
| | 620 | |
| | 621 | // Set some constants (they could be included in the database |
| | 622 | // in the future) |
| | 623 | double mm2deg = +0.0117193246260285378; |
| | 624 | //double abberation = 1.02; |
| | 625 | |
| | 626 | // -------------------- Source dependent parameter calculation ------------------- |
| | 627 | |
| | 628 | TH2F hist("", "", |
| | 629 | 32, 0.800-0.0250, 2.400-0.0250, |
| | 630 | 60, 3.000-0.0250, 6.000-0.0250); |
| | 631 | |
| | 632 | |
| | 633 | for (float l0=0.8; l0<2.4; l0+=0.05) |
| | 634 | for (float l1=3; l1<6; l1+=0.05) |
| | 635 | { |
| | 636 | int cnt_on = 0; |
| | 637 | |
| | 638 | for (int i=0; i<c.GetEntries(); i++) |
| | 639 | { |
| | 640 | // read the i-th event from the file |
| | 641 | c.GetEntry(i); |
| | 642 | |
| | 643 | // First calculate all cuts to speedup the analysis |
| | 644 | double area = TMath::Pi()*Width*Length; |
| | 645 | |
| | 646 | // The abberation correction does increase also Width and Length by 1.02 |
| | 647 | |
| | 648 | bool cutq = NumIslands<3.5 && NumUsedPixels>5.5 && Leakage1>0; |
| | 649 | if (!cutq) |
| | 650 | continue; |
| | 651 | |
| | 652 | bool cut0 = area < log10(Size)*898-1535; |
| | 653 | if (!cut0) |
| | 654 | continue; |
| | 655 | |
| | 656 | int angle = 0; |
| | 657 | |
| | 658 | // -------------------- Source dependent parameter calculation ------------------- |
| | 659 | |
| | 660 | double cr = cos(angle*TMath::DegToRad()); |
| | 661 | double sr = sin(angle*TMath::DegToRad()); |
| | 662 | |
| | 663 | double px = cr*X-sr*Y; |
| | 664 | double py = cr*Y+sr*X; |
| | 665 | |
| | 666 | double dx = MeanX - px*1.02; |
| | 667 | double dy = MeanY - py*1.02; |
| | 668 | |
| | 669 | double norm = sqrt(dx*dx + dy*dy); |
| | 670 | double dist = norm*mm2deg; |
| | 671 | |
| | 672 | double lx = min(max((CosDelta*dy - SinDelta*dx)/norm, -1.), 1.); |
| | 673 | double ly = min(max((CosDelta*dx + SinDelta*dy)/norm, -1.), 1.); |
| | 674 | |
| | 675 | double alpha = asin(lx); |
| | 676 | double sgn = TMath::Sign(1., ly); |
| | 677 | |
| | 678 | // ------------------------------- Application ---------------------------------- |
| | 679 | |
| | 680 | double m3l = M3Long*sgn*mm2deg; |
| | 681 | double slope = SlopeLong*sgn/mm2deg; |
| | 682 | |
| | 683 | // --------------------------------- Analysis ----------------------------------- |
| | 684 | |
| | 685 | double xi = 1.36 + 0.085*slope + l0 *(1-1/(1+l1*Leakage1)); |
| | 686 | |
| | 687 | // Optim: 1.36 + 0.085 |
| | 688 | |
| | 689 | double sign1 = m3l+0.07; |
| | 690 | double sign2 = (dist-0.5)*7.2-slope; |
| | 691 | |
| | 692 | double disp = (sign1<0 || sign2<0 ? -xi : xi)*(1-Width/Length); |
| | 693 | |
| | 694 | double thetasq = disp*disp + dist*dist - 2*disp*dist*sqrt(1-lx*lx); |
| | 695 | |
| | 696 | if (thetasq<0.024) |
| | 697 | cnt_on++; |
| | 698 | } |
| | 699 | |
| | 700 | hist.Fill(l0, l1, cnt_on); |
| | 701 | |
| | 702 | cout << l0 << " " << l1 << " " << cnt_on << endl; |
| | 703 | } |
| | 704 | |
| | 705 | TCanvas *canv = new TCanvas; |
| | 706 | canv->SetTopMargin(0.01); |
| | 707 | |
| | 708 | hist.SetStats(kFALSE); |
| | 709 | hist.SetContour(100); |
| | 710 | hist.SetXTitle("L_{0} / deg"); |
| | 711 | hist.SetYTitle("L_{1} / deg"); |
| | 712 | hist.GetYaxis()->SetTitleOffset(1.2); |
| | 713 | hist.DrawCopy("colz cont2"); |
| | 714 | |
| | 715 | } |
| | 716 | }}} |
| | 717 | }}} |
| | 718 | |
| | 719 | Results in |
| | 720 | |
| | 721 | [[Image(Result2.png)]] |
| | 722 | |
| | 723 | == Energy Optimization == |
| | 724 | |
| | 725 | {{{#!cpp |
| | 726 | #include <iostream> |
| | 727 | #include <iomanip> |
| | 728 | |
| | 729 | #include <TMath.h> |
| | 730 | #include <TF1.h> |
| | 731 | #include <TH1.h> |
| | 732 | #include <TH2.h> |
| | 733 | #include <TProfile.h> |
| | 734 | #include <TChain.h> |
| | 735 | #include <TGraph.h> |
| | 736 | #include <TCanvas.h> |
| | 737 | #include <TStopwatch.h> |
| | 738 | |
| | 739 | void optimenergy() |
| | 740 | { |
| | 741 | // Create chain for the tree Result |
| | 742 | // This is just easier than using TFile/TTree |
| | 743 | TChain c("Result"); |
| | 744 | |
| | 745 | // Add the input file to the |
| | 746 | c.AddFile("simulation.root"); |
| | 747 | |
| | 748 | // Define variables for all leaves to be accessed |
| | 749 | // By definition rootifysql writes only doubles |
| | 750 | double X, Y, MeanX, MeanY, Width, Length, CosDelta, SinDelta, |
| | 751 | M3Long, SlopeLong, Leakage1, SlopeSpreadWeighted, Size, |
| | 752 | ConcCore, ConcCOG, NumIslands, NumUsedPixels, Zd, Energy; |
| | 753 | |
| | 754 | // Connect the variables to the cordesponding leaves |
| | 755 | //c.SetBranchAddress("FileId", &FileId); |
| | 756 | //c.SetBranchAddress("EvtNumber", &EvtNumber); |
| | 757 | c.SetBranchAddress("X", &X); |
| | 758 | c.SetBranchAddress("Y", &Y); |
| | 759 | c.SetBranchAddress("MeanX", &MeanX); |
| | 760 | c.SetBranchAddress("MeanY", &MeanY); |
| | 761 | c.SetBranchAddress("Width", &Width); |
| | 762 | c.SetBranchAddress("Length", &Length); |
| | 763 | c.SetBranchAddress("CosDelta", &CosDelta); |
| | 764 | c.SetBranchAddress("SinDelta", &SinDelta); |
| | 765 | c.SetBranchAddress("M3Long", &M3Long); |
| | 766 | c.SetBranchAddress("SlopeLong", &SlopeLong); |
| | 767 | c.SetBranchAddress("Leakage1", &Leakage1); |
| | 768 | c.SetBranchAddress("NumIslands", &NumIslands); |
| | 769 | c.SetBranchAddress("NumUsedPixels", &NumUsedPixels); |
| | 770 | c.SetBranchAddress("Size", &Size); |
| | 771 | c.SetBranchAddress("Zd", &Zd); |
| | 772 | c.SetBranchAddress("Energy", &Energy); |
| | 773 | |
| | 774 | // Set some constants (they could be included in the database |
| | 775 | // in the future) |
| | 776 | double mm2deg = +0.0117193246260285378; |
| | 777 | //double abberation = 1.02; |
| | 778 | |
| | 779 | // -------------------- Source dependent parameter calculation ------------------- |
| | 780 | |
| | 781 | TH2F h2svse ("H_SvsE", "", 26*3, 2.2, 4.8, 3*30, 1.3, 4.3); |
| | 782 | TH2F h2est ("H_EstVsMC", "", 26*3, 2.2, 4.8, 26*3, 2.2, 4.8); |
| | 783 | TH2F h2bias ("H_BiasLog", "", 26*3, 2.2, 4.8, 100, -1, 1); |
| | 784 | TH2F h2lin ("H_BiasLin", "", 26*3, 2.2, 4.8, 100, -1, 2); |
| | 785 | |
| | 786 | TH2F h2size ("H_ResSize", "", 26*3, 2.2, 4.8, 100, -1, 1); |
| | 787 | TH2F h2dist ("H_ResDist", "", 50, 0, 2.5, 100, -1, 1); |
| | 788 | TH2F h2slope("H_ResSlope", "", 50, -10, 10, 100, -1, 1); |
| | 789 | TH2F h2zd ("H_ResZd", "", 90, 0, 90, 100, -1, 1); |
| | 790 | |
| | 791 | h2svse.SetStats(kFALSE); |
| | 792 | h2bias.SetStats(kFALSE); |
| | 793 | h2lin.SetStats(kFALSE); |
| | 794 | h2est.SetStats(kFALSE); |
| | 795 | h2size.SetStats(kFALSE); |
| | 796 | h2dist.SetStats(kFALSE); |
| | 797 | h2slope.SetStats(kFALSE); |
| | 798 | h2zd.SetStats(kFALSE); |
| | 799 | |
| | 800 | // Loop over all events |
| | 801 | TStopwatch clock; |
| | 802 | // Loop over all wobble positions in the camera |
| | 803 | for (int i=0; i<c.GetEntries(); i++) |
| | 804 | { |
| | 805 | // read the i-th event from the file |
| | 806 | c.GetEntry(i); |
| | 807 | |
| | 808 | // First calculate all cuts to speedup the analysis |
| | 809 | double area = TMath::Pi()*Width*Length; |
| | 810 | |
| | 811 | // The abberation correction does increase also Width and Length by 1.02 |
| | 812 | |
| | 813 | int angle = 0; |
| | 814 | |
| | 815 | // -------------------- Source dependent parameter calculation ------------------- |
| | 816 | |
| | 817 | double cr = cos(angle*TMath::DegToRad()); |
| | 818 | double sr = sin(angle*TMath::DegToRad()); |
| | 819 | |
| | 820 | double px = cr*X-sr*Y; |
| | 821 | double py = cr*Y+sr*X; |
| | 822 | |
| | 823 | double dx = MeanX - px*1.022; |
| | 824 | double dy = MeanY - py*1.022; |
| | 825 | |
| | 826 | double norm = sqrt(dx*dx + dy*dy); |
| | 827 | double dist = norm*mm2deg; |
| | 828 | |
| | 829 | double lx = min(max((CosDelta*dy - SinDelta*dx)/norm, -1.), 1.); |
| | 830 | double ly = min(max((CosDelta*dx + SinDelta*dy)/norm, -1.), 1.); |
| | 831 | |
| | 832 | double alpha = asin(lx); |
| | 833 | double sgn = TMath::Sign(1., ly); |
| | 834 | |
| | 835 | // ------------------------------- Application ---------------------------------- |
| | 836 | |
| | 837 | double m3l = M3Long*sgn*mm2deg; |
| | 838 | double slope = SlopeLong*sgn/mm2deg; |
| | 839 | |
| | 840 | // --------------------------------- Analysis ----------------------------------- |
| | 841 | |
| | 842 | //double xi = 1.34723 + 0.15214 *slope + 0.970704*(1-1/(1+8.89826*Leakage1)); |
| | 843 | double xi = 1.340 + 0.0755 *slope + 1.67972 *(1-1/(1+4.86232*Leakage1)); |
| | 844 | |
| | 845 | double sign1 = m3l+0.07; |
| | 846 | double sign2 = (dist-0.5)*7.2-slope; |
| | 847 | |
| | 848 | double disp = (sign1<0 || sign2<0 ? -xi : xi)*(1-Width/Length); |
| | 849 | |
| | 850 | double thetasq = disp*disp + dist*dist - 2*disp*dist*sqrt(1-lx*lx); |
| | 851 | |
| | 852 | if (thetasq<0.024) |
| | 853 | continue; |
| | 854 | |
| | 855 | bool cutq = NumIslands<3.5 && NumUsedPixels>5.5 && Leakage1<0.1; |
| | 856 | if (!cutq) |
| | 857 | continue; |
| | 858 | |
| | 859 | bool cut0 = area < log10(Size)*898-1535; |
| | 860 | if (!cut0) |
| | 861 | continue; |
| | 862 | |
| | 863 | h2svse.Fill(log10(Energy), log10(Size)); |
| | 864 | |
| | 865 | double step = 0.8; |
| | 866 | double dd = dist<step ? -(dist-step)*0.4 : (dist-step)*0.65; |
| | 867 | |
| | 868 | double energy = pow(10, 0.33 + log10(Size)/1.1 + Zd*0.02 + dd + slope*0.01); |
| | 869 | |
| | 870 | h2est.Fill(log10(Energy), log10(energy)); |
| | 871 | h2bias.Fill(log10(energy), log10(energy)-log10(Energy)); |
| | 872 | h2lin.Fill(log10(energy), (energy-Energy)/Energy); |
| | 873 | |
| | 874 | h2size.Fill (log10(Size), log10(energy)-log10(Energy)); |
| | 875 | h2dist.Fill (dist, log10(energy)-log10(Energy)); |
| | 876 | h2slope.Fill(slope, log10(energy)-log10(Energy)); |
| | 877 | h2zd.Fill( Zd, log10(energy)-log10(Energy)); |
| | 878 | } |
| | 879 | |
| | 880 | clock.Print(); |
| | 881 | |
| | 882 | TF1 fx("f", "x", -100, 100); |
| | 883 | TF1 f0("f", "0", -100, 100); |
| | 884 | |
| | 885 | TCanvas *canv = new TCanvas("Canvas", "Energy estimation", 800, 900); |
| | 886 | canv->Divide(2,4); |
| | 887 | |
| | 888 | canv->cd(1); |
| | 889 | gPad->SetGridy(); |
| | 890 | h2size.DrawCopy("colz"); |
| | 891 | f0.DrawCopy("same"); |
| | 892 | |
| | 893 | canv->cd(3); |
| | 894 | gPad->SetGridy(); |
| | 895 | h2dist.DrawCopy("colz"); |
| | 896 | f0.DrawCopy("same"); |
| | 897 | |
| | 898 | canv->cd(5); |
| | 899 | gPad->SetGridy(); |
| | 900 | h2slope.DrawCopy("colz"); |
| | 901 | f0.DrawCopy("same"); |
| | 902 | |
| | 903 | canv->cd(7); |
| | 904 | gPad->SetGridy(); |
| | 905 | h2zd.DrawCopy("colz"); |
| | 906 | f0.DrawCopy("same"); |
| | 907 | |
| | 908 | canv->cd(2); |
| | 909 | gPad->SetGridy(); |
| | 910 | h2svse.DrawCopy("colz"); |
| | 911 | fx.DrawCopy("same"); |
| | 912 | |
| | 913 | canv->cd(4); |
| | 914 | gPad->SetGridy(); |
| | 915 | h2est.DrawCopy("colz"); |
| | 916 | fx.DrawCopy("same"); |
| | 917 | |
| | 918 | canv->cd(6); |
| | 919 | gPad->SetGridy(); |
| | 920 | h2bias.DrawCopy("colz"); |
| | 921 | f0.DrawCopy("same"); |
| | 922 | |
| | 923 | |
| | 924 | canv->cd(8); |
| | 925 | |
| | 926 | TGraph grlin; |
| | 927 | TGraph grlog; |
| | 928 | |
| | 929 | for (int x=1; x<h2bias.GetNbinsX(); x++) |
| | 930 | { |
| | 931 | TH1D *p = h2bias.ProjectionY("_py", x, x); |
| | 932 | if (p->GetRMS()>0) |
| | 933 | grlog.SetPoint(grlog.GetN(), h2bias.GetXaxis()->GetBinCenter(x), pow(10, p->GetRMS())-1); |
| | 934 | delete p; |
| | 935 | |
| | 936 | p = h2lin.ProjectionY("_py", x, x); |
| | 937 | if (p->GetRMS()>0) |
| | 938 | grlin.SetPoint(grlin.GetN(), h2lin.GetXaxis()->GetBinCenter(x), p->GetRMS()); |
| | 939 | delete p; |
| | 940 | } |
| | 941 | |
| | 942 | grlog.SetMarkerColor(kBlue); |
| | 943 | grlin.SetMinimum(0); |
| | 944 | grlin.DrawClone("A*"); |
| | 945 | grlog.DrawClone("*"); |
| 575 | | |
| 576 | | == Optim Disp (Leakage==0) == |
| 577 | | |
| 578 | | {{{#!Spoiler |
| 579 | | {{{#!cpp |
| 580 | | #include <iostream> |
| 581 | | #include <iomanip> |
| 582 | | |
| 583 | | #include <TMath.h> |
| 584 | | #include <TH2.h> |
| 585 | | #include <TChain.h> |
| 586 | | #include <TCanvas.h> |
| 587 | | |
| 588 | | void optimdisp2() |
| 589 | | { |
| 590 | | // Create chain for the tree Result |
| 591 | | // This is just easier than using TFile/TTree |
| 592 | | TChain c("Result"); |
| 593 | | |
| 594 | | // Add the input file to the |
| 595 | | c.AddFile("simulation.root"); |
| 596 | | |
| 597 | | // Define variables for all leaves to be accessed |
| 598 | | // By definition rootifysql writes only doubles |
| 599 | | double FileId, EvtNumber, X, Y, MeanX, MeanY, Width, Length, CosDelta, SinDelta, |
| 600 | | M3Long, SlopeLong, Leakage1, SlopeSpreadWeighted, Size, |
| 601 | | ConcCore, ConcCOG, NumIslands, NumUsedPixels, Zd; |
| 602 | | |
| 603 | | // Connect the variables to the cordesponding leaves |
| 604 | | c.SetBranchAddress("FileId", &FileId); |
| 605 | | c.SetBranchAddress("EvtNumber", &EvtNumber); |
| 606 | | c.SetBranchAddress("X", &X); |
| 607 | | c.SetBranchAddress("Y", &Y); |
| 608 | | c.SetBranchAddress("MeanX", &MeanX); |
| 609 | | c.SetBranchAddress("MeanY", &MeanY); |
| 610 | | c.SetBranchAddress("Width", &Width); |
| 611 | | c.SetBranchAddress("Length", &Length); |
| 612 | | c.SetBranchAddress("CosDelta", &CosDelta); |
| 613 | | c.SetBranchAddress("SinDelta", &SinDelta); |
| 614 | | c.SetBranchAddress("M3Long", &M3Long); |
| 615 | | c.SetBranchAddress("SlopeLong", &SlopeLong); |
| 616 | | c.SetBranchAddress("Leakage1", &Leakage1); |
| 617 | | c.SetBranchAddress("NumIslands", &NumIslands); |
| 618 | | c.SetBranchAddress("NumUsedPixels", &NumUsedPixels); |
| 619 | | c.SetBranchAddress("Size", &Size); |
| 620 | | |
| 621 | | // Set some constants (they could be included in the database |
| 622 | | // in the future) |
| 623 | | double mm2deg = +0.0117193246260285378; |
| 624 | | |
| 625 | | // -------------------- Source dependent parameter calculation ------------------- |
| 626 | | |
| 627 | | TH2F hist("", "", |
| 628 | | 26, 1.300-0.0025, 1.430-0.0025, |
| 629 | | 20, 0.040-0.0025, 0.140-0.0025); |
| 630 | | |
| 631 | | for (float xi0=1.30; xi0<1.43; xi0+=0.005) |
| 632 | | for (float slope0=0.04; slope0<0.14; slope0+=0.005) |
| 633 | | { |
| 634 | | int cnt_on = 0; |
| 635 | | |
| 636 | | for (int i=0; i<c.GetEntries(); i++) |
| 637 | | { |
| 638 | | // read the i-th event from the file |
| 639 | | c.GetEntry(i); |
| 640 | | |
| 641 | | // First calculate all cuts to speedup the analysis |
| 642 | | double area = TMath::Pi()*Width*Length; |
| 643 | | |
| 644 | | // The abberation correction does increase also Width and Length by 1.02 |
| 645 | | |
| 646 | | bool cutq = NumIslands<3.5 && NumUsedPixels>5.5 && Leakage1==0; |
| 647 | | if (!cutq) |
| 648 | | continue; |
| 649 | | |
| 650 | | bool cut0 = area < log10(Size)*898-1535; |
| 651 | | if (!cut0) |
| 652 | | continue; |
| 653 | | |
| 654 | | int angle = 0; |
| 655 | | |
| 656 | | // -------------------- Source dependent parameter calculation ------------------- |
| 657 | | |
| 658 | | double cr = cos(angle*TMath::DegToRad()); |
| 659 | | double sr = sin(angle*TMath::DegToRad()); |
| 660 | | |
| 661 | | double px = cr*X-sr*Y; |
| 662 | | double py = cr*Y+sr*X; |
| 663 | | |
| 664 | | double dx = MeanX - px*1.02; |
| 665 | | double dy = MeanY - py*1.02; |
| 666 | | |
| 667 | | double norm = sqrt(dx*dx + dy*dy); |
| 668 | | double dist = norm*mm2deg; |
| 669 | | |
| 670 | | double lx = min(max((CosDelta*dy - SinDelta*dx)/norm, -1.), 1.); |
| 671 | | double ly = min(max((CosDelta*dx + SinDelta*dy)/norm, -1.), 1.); |
| 672 | | |
| 673 | | double alpha = asin(lx); |
| 674 | | double sgn = TMath::Sign(1., ly); |
| 675 | | |
| 676 | | // ------------------------------- Application ---------------------------------- |
| 677 | | |
| 678 | | double m3l = M3Long*sgn*mm2deg; |
| 679 | | double slope = SlopeLong*sgn/mm2deg; |
| 680 | | |
| 681 | | // --------------------------------- Analysis ----------------------------------- |
| 682 | | |
| 683 | | double xi = xi0 + slope0 *slope; |
| 684 | | |
| 685 | | double sign1 = m3l+0.07; |
| 686 | | double sign2 = (dist-0.5)*7.2-slope; |
| 687 | | |
| 688 | | double disp = (sign1<0 || sign2<0 ? -xi : xi)*(1-Width/Length); |
| 689 | | |
| 690 | | double thetasq = disp*disp + dist*dist - 2*disp*dist*sqrt(1-lx*lx); |
| 691 | | |
| 692 | | if (thetasq<0.024) |
| 693 | | cnt_on++; |
| 694 | | } |
| 695 | | |
| 696 | | hist.Fill(xi0, slope0, cnt_on); |
| 697 | | |
| 698 | | cout << xi0 << " " << slope0 << " " << cnt_on << endl; |
| 699 | | } |
| 700 | | |
| 701 | | TCanvas *canv = new TCanvas; |
| 702 | | canv->SetTopMargin(0.01); |
| 703 | | |
| 704 | | hist.SetStats(kFALSE); |
| 705 | | hist.SetContour(100); |
| 706 | | hist.SetXTitle("Xi_{0} / deg"); |
| 707 | | hist.SetYTitle("Slope_{0} #dot ns/deg^{2} "); |
| 708 | | hist.GetYaxis()->SetTitleOffset(1.2); |
| 709 | | hist.DrawCopy("colz cont2"); |
| 710 | | |
| 711 | | } |
| 712 | | }}} |
| 713 | | }}} |
| 714 | | |
| 715 | | Results in |
| 716 | | |
| 717 | | [[Image(Result.png)]] |
| 718 | | |
| 719 | | == Optim Disp (Leakage>0) == |
| 720 | | |
| 721 | | {{{#!Spoiler |
| 722 | | {{{#!cpp |
| 723 | | #include <iostream> |
| 724 | | #include <iomanip> |
| 725 | | |
| 726 | | #include <TMath.h> |
| 727 | | #include <TH2.h> |
| 728 | | #include <TChain.h> |
| 729 | | #include <TCanvas.h> |
| 730 | | |
| 731 | | void optimdisp3() |
| 732 | | { |
| 733 | | // Create chain for the tree Result |
| 734 | | // This is just easier than using TFile/TTree |
| 735 | | TChain c("Result"); |
| 736 | | |
| 737 | | // Add the input file to the |
| 738 | | c.AddFile("simulation.root"); |
| 739 | | |
| 740 | | // Define variables for all leaves to be accessed |
| 741 | | // By definition rootifysql writes only doubles |
| 742 | | double FileId, EvtNumber, X, Y, MeanX, MeanY, Width, Length, CosDelta, SinDelta, |
| 743 | | M3Long, SlopeLong, Leakage1, SlopeSpreadWeighted, Size, |
| 744 | | ConcCore, ConcCOG, NumIslands, NumUsedPixels, Zd; |
| 745 | | |
| 746 | | // Connect the variables to the cordesponding leaves |
| 747 | | c.SetBranchAddress("FileId", &FileId); |
| 748 | | c.SetBranchAddress("EvtNumber", &EvtNumber); |
| 749 | | c.SetBranchAddress("X", &X); |
| 750 | | c.SetBranchAddress("Y", &Y); |
| 751 | | c.SetBranchAddress("MeanX", &MeanX); |
| 752 | | c.SetBranchAddress("MeanY", &MeanY); |
| 753 | | c.SetBranchAddress("Width", &Width); |
| 754 | | c.SetBranchAddress("Length", &Length); |
| 755 | | c.SetBranchAddress("CosDelta", &CosDelta); |
| 756 | | c.SetBranchAddress("SinDelta", &SinDelta); |
| 757 | | c.SetBranchAddress("M3Long", &M3Long); |
| 758 | | c.SetBranchAddress("SlopeLong", &SlopeLong); |
| 759 | | c.SetBranchAddress("Leakage1", &Leakage1); |
| 760 | | c.SetBranchAddress("NumIslands", &NumIslands); |
| 761 | | c.SetBranchAddress("NumUsedPixels", &NumUsedPixels); |
| 762 | | //c.SetBranchAddress("SlopeSpreadWeighted", &SlopeSpreadWeighted); |
| 763 | | c.SetBranchAddress("Size", &Size); |
| 764 | | c.SetBranchAddress("Zd", &Zd); |
| 765 | | //c.SetBranchAddress("ConcCOG", &ConcCOG); |
| 766 | | //c.SetBranchAddress("ConcCore", &ConcCore); |
| 767 | | |
| 768 | | // Set some constants (they could be included in the database |
| 769 | | // in the future) |
| 770 | | double mm2deg = +0.0117193246260285378; |
| 771 | | //double abberation = 1.02; |
| 772 | | |
| 773 | | // -------------------- Source dependent parameter calculation ------------------- |
| 774 | | |
| 775 | | TH2F hist("", "", |
| 776 | | 32, 0.800-0.0250, 2.400-0.0250, |
| 777 | | 60, 3.000-0.0250, 6.000-0.0250); |
| 778 | | |
| 779 | | |
| 780 | | for (float l0=0.8; l0<2.4; l0+=0.05) |
| 781 | | for (float l1=3; l1<6; l1+=0.05) |
| 782 | | { |
| 783 | | int cnt_on = 0; |
| 784 | | |
| 785 | | for (int i=0; i<c.GetEntries(); i++) |
| 786 | | { |
| 787 | | // read the i-th event from the file |
| 788 | | c.GetEntry(i); |
| 789 | | |
| 790 | | // First calculate all cuts to speedup the analysis |
| 791 | | double area = TMath::Pi()*Width*Length; |
| 792 | | |
| 793 | | // The abberation correction does increase also Width and Length by 1.02 |
| 794 | | |
| 795 | | bool cutq = NumIslands<3.5 && NumUsedPixels>5.5 && Leakage1>0; |
| 796 | | if (!cutq) |
| 797 | | continue; |
| 798 | | |
| 799 | | bool cut0 = area < log10(Size)*898-1535; |
| 800 | | if (!cut0) |
| 801 | | continue; |
| 802 | | |
| 803 | | int angle = 0; |
| 804 | | |
| 805 | | // -------------------- Source dependent parameter calculation ------------------- |
| 806 | | |
| 807 | | double cr = cos(angle*TMath::DegToRad()); |
| 808 | | double sr = sin(angle*TMath::DegToRad()); |
| 809 | | |
| 810 | | double px = cr*X-sr*Y; |
| 811 | | double py = cr*Y+sr*X; |
| 812 | | |
| 813 | | double dx = MeanX - px*1.02; |
| 814 | | double dy = MeanY - py*1.02; |
| 815 | | |
| 816 | | double norm = sqrt(dx*dx + dy*dy); |
| 817 | | double dist = norm*mm2deg; |
| 818 | | |
| 819 | | double lx = min(max((CosDelta*dy - SinDelta*dx)/norm, -1.), 1.); |
| 820 | | double ly = min(max((CosDelta*dx + SinDelta*dy)/norm, -1.), 1.); |
| 821 | | |
| 822 | | double alpha = asin(lx); |
| 823 | | double sgn = TMath::Sign(1., ly); |
| 824 | | |
| 825 | | // ------------------------------- Application ---------------------------------- |
| 826 | | |
| 827 | | double m3l = M3Long*sgn*mm2deg; |
| 828 | | double slope = SlopeLong*sgn/mm2deg; |
| 829 | | |
| 830 | | // --------------------------------- Analysis ----------------------------------- |
| 831 | | |
| 832 | | double xi = 1.36 + 0.085*slope + l0 *(1-1/(1+l1*Leakage1)); |
| 833 | | |
| 834 | | // Optim: 1.36 + 0.085 |
| 835 | | |
| 836 | | double sign1 = m3l+0.07; |
| 837 | | double sign2 = (dist-0.5)*7.2-slope; |
| 838 | | |
| 839 | | double disp = (sign1<0 || sign2<0 ? -xi : xi)*(1-Width/Length); |
| 840 | | |
| 841 | | double thetasq = disp*disp + dist*dist - 2*disp*dist*sqrt(1-lx*lx); |
| 842 | | |
| 843 | | if (thetasq<0.024) |
| 844 | | cnt_on++; |
| 845 | | } |
| 846 | | |
| 847 | | hist.Fill(l0, l1, cnt_on); |
| 848 | | |
| 849 | | cout << l0 << " " << l1 << " " << cnt_on << endl; |
| 850 | | } |
| 851 | | |
| 852 | | TCanvas *canv = new TCanvas; |
| 853 | | canv->SetTopMargin(0.01); |
| 854 | | |
| 855 | | hist.SetStats(kFALSE); |
| 856 | | hist.SetContour(100); |
| 857 | | hist.SetXTitle("L_{0} / deg"); |
| 858 | | hist.SetYTitle("L_{1} / deg"); |
| 859 | | hist.GetYaxis()->SetTitleOffset(1.2); |
| 860 | | hist.DrawCopy("colz cont2"); |
| 861 | | |
| 862 | | } |
| 863 | | }}} |
| 864 | | }}} |
| 865 | | |
| 866 | | Results in |
| 867 | | |
| 868 | | [[Image(Result2.png)]] |
| 869 | | |
| 870 | | == Energy Optimization == |
| 871 | | |
| 872 | | {{{#!cpp |
| 873 | | #include <iostream> |
| 874 | | #include <iomanip> |
| 875 | | |
| 876 | | #include <TMath.h> |
| 877 | | #include <TF1.h> |
| 878 | | #include <TH1.h> |
| 879 | | #include <TH2.h> |
| 880 | | #include <TProfile.h> |
| 881 | | #include <TChain.h> |
| 882 | | #include <TGraph.h> |
| 883 | | #include <TCanvas.h> |
| 884 | | #include <TStopwatch.h> |
| 885 | | |
| 886 | | void optimenergy() |
| 887 | | { |
| 888 | | // Create chain for the tree Result |
| 889 | | // This is just easier than using TFile/TTree |
| 890 | | TChain c("Result"); |
| 891 | | |
| 892 | | // Add the input file to the |
| 893 | | c.AddFile("simulation.root"); |
| 894 | | |
| 895 | | // Define variables for all leaves to be accessed |
| 896 | | // By definition rootifysql writes only doubles |
| 897 | | double X, Y, MeanX, MeanY, Width, Length, CosDelta, SinDelta, |
| 898 | | M3Long, SlopeLong, Leakage1, SlopeSpreadWeighted, Size, |
| 899 | | ConcCore, ConcCOG, NumIslands, NumUsedPixels, Zd, Energy; |
| 900 | | |
| 901 | | // Connect the variables to the cordesponding leaves |
| 902 | | //c.SetBranchAddress("FileId", &FileId); |
| 903 | | //c.SetBranchAddress("EvtNumber", &EvtNumber); |
| 904 | | c.SetBranchAddress("X", &X); |
| 905 | | c.SetBranchAddress("Y", &Y); |
| 906 | | c.SetBranchAddress("MeanX", &MeanX); |
| 907 | | c.SetBranchAddress("MeanY", &MeanY); |
| 908 | | c.SetBranchAddress("Width", &Width); |
| 909 | | c.SetBranchAddress("Length", &Length); |
| 910 | | c.SetBranchAddress("CosDelta", &CosDelta); |
| 911 | | c.SetBranchAddress("SinDelta", &SinDelta); |
| 912 | | c.SetBranchAddress("M3Long", &M3Long); |
| 913 | | c.SetBranchAddress("SlopeLong", &SlopeLong); |
| 914 | | c.SetBranchAddress("Leakage1", &Leakage1); |
| 915 | | c.SetBranchAddress("NumIslands", &NumIslands); |
| 916 | | c.SetBranchAddress("NumUsedPixels", &NumUsedPixels); |
| 917 | | c.SetBranchAddress("Size", &Size); |
| 918 | | c.SetBranchAddress("Zd", &Zd); |
| 919 | | c.SetBranchAddress("Energy", &Energy); |
| 920 | | |
| 921 | | // Set some constants (they could be included in the database |
| 922 | | // in the future) |
| 923 | | double mm2deg = +0.0117193246260285378; |
| 924 | | //double abberation = 1.02; |
| 925 | | |
| 926 | | // -------------------- Source dependent parameter calculation ------------------- |
| 927 | | |
| 928 | | TH2F h2svse ("H_SvsE", "", 26*3, 2.2, 4.8, 3*30, 1.3, 4.3); |
| 929 | | TH2F h2est ("H_EstVsMC", "", 26*3, 2.2, 4.8, 26*3, 2.2, 4.8); |
| 930 | | TH2F h2bias ("H_BiasLog", "", 26*3, 2.2, 4.8, 100, -1, 1); |
| 931 | | TH2F h2lin ("H_BiasLin", "", 26*3, 2.2, 4.8, 100, -1, 2); |
| 932 | | |
| 933 | | TH2F h2size ("H_ResSize", "", 26*3, 2.2, 4.8, 100, -1, 1); |
| 934 | | TH2F h2dist ("H_ResDist", "", 50, 0, 2.5, 100, -1, 1); |
| 935 | | TH2F h2slope("H_ResSlope", "", 50, -10, 10, 100, -1, 1); |
| 936 | | TH2F h2zd ("H_ResZd", "", 90, 0, 90, 100, -1, 1); |
| 937 | | |
| 938 | | h2svse.SetStats(kFALSE); |
| 939 | | h2bias.SetStats(kFALSE); |
| 940 | | h2lin.SetStats(kFALSE); |
| 941 | | h2est.SetStats(kFALSE); |
| 942 | | h2size.SetStats(kFALSE); |
| 943 | | h2dist.SetStats(kFALSE); |
| 944 | | h2slope.SetStats(kFALSE); |
| 945 | | h2zd.SetStats(kFALSE); |
| 946 | | |
| 947 | | // Loop over all events |
| 948 | | TStopwatch clock; |
| 949 | | // Loop over all wobble positions in the camera |
| 950 | | for (int i=0; i<c.GetEntries(); i++) |
| 951 | | { |
| 952 | | // read the i-th event from the file |
| 953 | | c.GetEntry(i); |
| 954 | | |
| 955 | | // First calculate all cuts to speedup the analysis |
| 956 | | double area = TMath::Pi()*Width*Length; |
| 957 | | |
| 958 | | // The abberation correction does increase also Width and Length by 1.02 |
| 959 | | |
| 960 | | int angle = 0; |
| 961 | | |
| 962 | | // -------------------- Source dependent parameter calculation ------------------- |
| 963 | | |
| 964 | | double cr = cos(angle*TMath::DegToRad()); |
| 965 | | double sr = sin(angle*TMath::DegToRad()); |
| 966 | | |
| 967 | | double px = cr*X-sr*Y; |
| 968 | | double py = cr*Y+sr*X; |
| 969 | | |
| 970 | | double dx = MeanX - px*1.022; |
| 971 | | double dy = MeanY - py*1.022; |
| 972 | | |
| 973 | | double norm = sqrt(dx*dx + dy*dy); |
| 974 | | double dist = norm*mm2deg; |
| 975 | | |
| 976 | | double lx = min(max((CosDelta*dy - SinDelta*dx)/norm, -1.), 1.); |
| 977 | | double ly = min(max((CosDelta*dx + SinDelta*dy)/norm, -1.), 1.); |
| 978 | | |
| 979 | | double alpha = asin(lx); |
| 980 | | double sgn = TMath::Sign(1., ly); |
| 981 | | |
| 982 | | // ------------------------------- Application ---------------------------------- |
| 983 | | |
| 984 | | double m3l = M3Long*sgn*mm2deg; |
| 985 | | double slope = SlopeLong*sgn/mm2deg; |
| 986 | | |
| 987 | | // --------------------------------- Analysis ----------------------------------- |
| 988 | | |
| 989 | | //double xi = 1.34723 + 0.15214 *slope + 0.970704*(1-1/(1+8.89826*Leakage1)); |
| 990 | | double xi = 1.340 + 0.0755 *slope + 1.67972 *(1-1/(1+4.86232*Leakage1)); |
| 991 | | |
| 992 | | double sign1 = m3l+0.07; |
| 993 | | double sign2 = (dist-0.5)*7.2-slope; |
| 994 | | |
| 995 | | double disp = (sign1<0 || sign2<0 ? -xi : xi)*(1-Width/Length); |
| 996 | | |
| 997 | | double thetasq = disp*disp + dist*dist - 2*disp*dist*sqrt(1-lx*lx); |
| 998 | | |
| 999 | | if (thetasq<0.024) |
| 1000 | | continue; |
| 1001 | | |
| 1002 | | bool cutq = NumIslands<3.5 && NumUsedPixels>5.5 && Leakage1<0.1; |
| 1003 | | if (!cutq) |
| 1004 | | continue; |
| 1005 | | |
| 1006 | | bool cut0 = area < log10(Size)*898-1535; |
| 1007 | | if (!cut0) |
| 1008 | | continue; |
| 1009 | | |
| 1010 | | h2svse.Fill(log10(Energy), log10(Size)); |
| 1011 | | |
| 1012 | | double step = 0.8; |
| 1013 | | double dd = dist<step ? -(dist-step)*0.4 : (dist-step)*0.65; |
| 1014 | | |
| 1015 | | double energy = pow(10, 0.33 + log10(Size)/1.1 + Zd*0.02 + dd + slope*0.01); |
| 1016 | | |
| 1017 | | h2est.Fill(log10(Energy), log10(energy)); |
| 1018 | | h2bias.Fill(log10(energy), log10(energy)-log10(Energy)); |
| 1019 | | h2lin.Fill(log10(energy), (energy-Energy)/Energy); |
| 1020 | | |
| 1021 | | h2size.Fill (log10(Size), log10(energy)-log10(Energy)); |
| 1022 | | h2dist.Fill (dist, log10(energy)-log10(Energy)); |
| 1023 | | h2slope.Fill(slope, log10(energy)-log10(Energy)); |
| 1024 | | h2zd.Fill( Zd, log10(energy)-log10(Energy)); |
| 1025 | | } |
| 1026 | | |
| 1027 | | clock.Print(); |
| 1028 | | |
| 1029 | | TF1 fx("f", "x", -100, 100); |
| 1030 | | TF1 f0("f", "0", -100, 100); |
| 1031 | | |
| 1032 | | TCanvas *canv = new TCanvas("Canvas", "Energy estimation", 800, 900); |
| 1033 | | canv->Divide(2,4); |
| 1034 | | |
| 1035 | | canv->cd(1); |
| 1036 | | gPad->SetGridy(); |
| 1037 | | h2size.DrawCopy("colz"); |
| 1038 | | f0.DrawCopy("same"); |
| 1039 | | |
| 1040 | | canv->cd(3); |
| 1041 | | gPad->SetGridy(); |
| 1042 | | h2dist.DrawCopy("colz"); |
| 1043 | | f0.DrawCopy("same"); |
| 1044 | | |
| 1045 | | canv->cd(5); |
| 1046 | | gPad->SetGridy(); |
| 1047 | | h2slope.DrawCopy("colz"); |
| 1048 | | f0.DrawCopy("same"); |
| 1049 | | |
| 1050 | | canv->cd(7); |
| 1051 | | gPad->SetGridy(); |
| 1052 | | h2zd.DrawCopy("colz"); |
| 1053 | | f0.DrawCopy("same"); |
| 1054 | | |
| 1055 | | canv->cd(2); |
| 1056 | | gPad->SetGridy(); |
| 1057 | | h2svse.DrawCopy("colz"); |
| 1058 | | fx.DrawCopy("same"); |
| 1059 | | |
| 1060 | | canv->cd(4); |
| 1061 | | gPad->SetGridy(); |
| 1062 | | h2est.DrawCopy("colz"); |
| 1063 | | fx.DrawCopy("same"); |
| 1064 | | |
| 1065 | | canv->cd(6); |
| 1066 | | gPad->SetGridy(); |
| 1067 | | h2bias.DrawCopy("colz"); |
| 1068 | | f0.DrawCopy("same"); |
| 1069 | | |
| 1070 | | |
| 1071 | | canv->cd(8); |
| 1072 | | |
| 1073 | | TGraph grlin; |
| 1074 | | TGraph grlog; |
| 1075 | | |
| 1076 | | for (int x=1; x<h2bias.GetNbinsX(); x++) |
| 1077 | | { |
| 1078 | | TH1D *p = h2bias.ProjectionY("_py", x, x); |
| 1079 | | if (p->GetRMS()>0) |
| 1080 | | grlog.SetPoint(grlog.GetN(), h2bias.GetXaxis()->GetBinCenter(x), pow(10, p->GetRMS())-1); |
| 1081 | | delete p; |
| 1082 | | |
| 1083 | | p = h2lin.ProjectionY("_py", x, x); |
| 1084 | | if (p->GetRMS()>0) |
| 1085 | | grlin.SetPoint(grlin.GetN(), h2lin.GetXaxis()->GetBinCenter(x), p->GetRMS()); |
| 1086 | | delete p; |
| 1087 | | } |
| 1088 | | |
| 1089 | | grlog.SetMarkerColor(kBlue); |
| 1090 | | grlin.SetMinimum(0); |
| 1091 | | grlin.DrawClone("A*"); |
| 1092 | | grlog.DrawClone("*"); |
| 1093 | | } |
| 1094 | | }}} |