| | 575 | |
| | 576 | == Energy Optimization == |
| | 577 | |
| | 578 | {{{#!cpp |
| | 579 | #include <iostream> |
| | 580 | #include <iomanip> |
| | 581 | |
| | 582 | #include <TMath.h> |
| | 583 | #include <TF1.h> |
| | 584 | #include <TH1.h> |
| | 585 | #include <TH2.h> |
| | 586 | #include <TProfile.h> |
| | 587 | #include <TChain.h> |
| | 588 | #include <TGraph.h> |
| | 589 | #include <TCanvas.h> |
| | 590 | #include <TStopwatch.h> |
| | 591 | |
| | 592 | void optimenergy() |
| | 593 | { |
| | 594 | // Create chain for the tree Result |
| | 595 | // This is just easier than using TFile/TTree |
| | 596 | TChain c("Result"); |
| | 597 | |
| | 598 | // Add the input file to the |
| | 599 | c.AddFile("simulation.root"); |
| | 600 | |
| | 601 | // Define variables for all leaves to be accessed |
| | 602 | // By definition rootifysql writes only doubles |
| | 603 | double X, Y, MeanX, MeanY, Width, Length, CosDelta, SinDelta, |
| | 604 | M3Long, SlopeLong, Leakage1, SlopeSpreadWeighted, Size, |
| | 605 | ConcCore, ConcCOG, NumIslands, NumUsedPixels, Zd, Energy; |
| | 606 | |
| | 607 | // Connect the variables to the cordesponding leaves |
| | 608 | //c.SetBranchAddress("FileId", &FileId); |
| | 609 | //c.SetBranchAddress("EvtNumber", &EvtNumber); |
| | 610 | c.SetBranchAddress("X", &X); |
| | 611 | c.SetBranchAddress("Y", &Y); |
| | 612 | c.SetBranchAddress("MeanX", &MeanX); |
| | 613 | c.SetBranchAddress("MeanY", &MeanY); |
| | 614 | c.SetBranchAddress("Width", &Width); |
| | 615 | c.SetBranchAddress("Length", &Length); |
| | 616 | c.SetBranchAddress("CosDelta", &CosDelta); |
| | 617 | c.SetBranchAddress("SinDelta", &SinDelta); |
| | 618 | c.SetBranchAddress("M3Long", &M3Long); |
| | 619 | c.SetBranchAddress("SlopeLong", &SlopeLong); |
| | 620 | c.SetBranchAddress("Leakage1", &Leakage1); |
| | 621 | c.SetBranchAddress("NumIslands", &NumIslands); |
| | 622 | c.SetBranchAddress("NumUsedPixels", &NumUsedPixels); |
| | 623 | c.SetBranchAddress("Size", &Size); |
| | 624 | c.SetBranchAddress("Zd", &Zd); |
| | 625 | c.SetBranchAddress("Energy", &Energy); |
| | 626 | |
| | 627 | // Set some constants (they could be included in the database |
| | 628 | // in the future) |
| | 629 | double mm2deg = +0.0117193246260285378; |
| | 630 | //double abberation = 1.02; |
| | 631 | |
| | 632 | // -------------------- Source dependent parameter calculation ------------------- |
| | 633 | |
| | 634 | TH2F h2svse ("H_SvsE", "", 26*3, 2.2, 4.8, 3*30, 1.3, 4.3); |
| | 635 | TH2F h2est ("H_EstVsMC", "", 26*3, 2.2, 4.8, 26*3, 2.2, 4.8); |
| | 636 | TH2F h2bias ("H_BiasLog", "", 26*3, 2.2, 4.8, 100, -1, 1); |
| | 637 | TH2F h2lin ("H_BiasLin", "", 26*3, 2.2, 4.8, 100, -1, 2); |
| | 638 | |
| | 639 | TH2F h2size ("H_ResSize", "", 26*3, 2.2, 4.8, 100, -1, 1); |
| | 640 | TH2F h2dist ("H_ResDist", "", 50, 0, 2.5, 100, -1, 1); |
| | 641 | TH2F h2slope("H_ResSlope", "", 50, -10, 10, 100, -1, 1); |
| | 642 | TH2F h2zd ("H_ResZd", "", 90, 0, 90, 100, -1, 1); |
| | 643 | |
| | 644 | h2svse.SetStats(kFALSE); |
| | 645 | h2bias.SetStats(kFALSE); |
| | 646 | h2lin.SetStats(kFALSE); |
| | 647 | h2est.SetStats(kFALSE); |
| | 648 | h2size.SetStats(kFALSE); |
| | 649 | h2dist.SetStats(kFALSE); |
| | 650 | h2slope.SetStats(kFALSE); |
| | 651 | h2zd.SetStats(kFALSE); |
| | 652 | |
| | 653 | // Loop over all events |
| | 654 | TStopwatch clock; |
| | 655 | // Loop over all wobble positions in the camera |
| | 656 | for (int i=0; i<c.GetEntries(); i++) |
| | 657 | { |
| | 658 | // read the i-th event from the file |
| | 659 | c.GetEntry(i); |
| | 660 | |
| | 661 | // First calculate all cuts to speedup the analysis |
| | 662 | double area = TMath::Pi()*Width*Length; |
| | 663 | |
| | 664 | // The abberation correction does increase also Width and Length by 1.02 |
| | 665 | |
| | 666 | int angle = 0; |
| | 667 | |
| | 668 | // -------------------- Source dependent parameter calculation ------------------- |
| | 669 | |
| | 670 | double cr = cos(angle*TMath::DegToRad()); |
| | 671 | double sr = sin(angle*TMath::DegToRad()); |
| | 672 | |
| | 673 | double px = cr*X-sr*Y; |
| | 674 | double py = cr*Y+sr*X; |
| | 675 | |
| | 676 | double dx = MeanX - px*1.022; |
| | 677 | double dy = MeanY - py*1.022; |
| | 678 | |
| | 679 | double norm = sqrt(dx*dx + dy*dy); |
| | 680 | double dist = norm*mm2deg; |
| | 681 | |
| | 682 | double lx = min(max((CosDelta*dy - SinDelta*dx)/norm, -1.), 1.); |
| | 683 | double ly = min(max((CosDelta*dx + SinDelta*dy)/norm, -1.), 1.); |
| | 684 | |
| | 685 | double alpha = asin(lx); |
| | 686 | double sgn = TMath::Sign(1., ly); |
| | 687 | |
| | 688 | // ------------------------------- Application ---------------------------------- |
| | 689 | |
| | 690 | double m3l = M3Long*sgn*mm2deg; |
| | 691 | double slope = SlopeLong*sgn/mm2deg; |
| | 692 | |
| | 693 | // --------------------------------- Analysis ----------------------------------- |
| | 694 | |
| | 695 | //double xi = 1.34723 + 0.15214 *slope + 0.970704*(1-1/(1+8.89826*Leakage1)); |
| | 696 | double xi = 1.340 + 0.0755 *slope + 1.67972 *(1-1/(1+4.86232*Leakage1)); |
| | 697 | |
| | 698 | double sign1 = m3l+0.07; |
| | 699 | double sign2 = (dist-0.5)*7.2-slope; |
| | 700 | |
| | 701 | double disp = (sign1<0 || sign2<0 ? -xi : xi)*(1-Width/Length); |
| | 702 | |
| | 703 | double thetasq = disp*disp + dist*dist - 2*disp*dist*sqrt(1-lx*lx); |
| | 704 | |
| | 705 | if (thetasq<0.024) |
| | 706 | continue; |
| | 707 | |
| | 708 | bool cutq = NumIslands<3.5 && NumUsedPixels>5.5 && Leakage1<0.1; |
| | 709 | if (!cutq) |
| | 710 | continue; |
| | 711 | |
| | 712 | bool cut0 = area < log10(Size)*898-1535; |
| | 713 | if (!cut0) |
| | 714 | continue; |
| | 715 | |
| | 716 | h2svse.Fill(log10(Energy), log10(Size)); |
| | 717 | |
| | 718 | double step = 0.8; |
| | 719 | double dd = dist<step ? -(dist-step)*0.4 : (dist-step)*0.65; |
| | 720 | |
| | 721 | double energy = pow(10, 0.33 + log10(Size)/1.1 + Zd*0.02 + dd + slope*0.01); |
| | 722 | |
| | 723 | h2est.Fill(log10(Energy), log10(energy)); |
| | 724 | h2bias.Fill(log10(energy), log10(energy)-log10(Energy)); |
| | 725 | h2lin.Fill(log10(energy), (energy-Energy)/Energy); |
| | 726 | |
| | 727 | h2size.Fill (log10(Size), log10(energy)-log10(Energy)); |
| | 728 | h2dist.Fill (dist, log10(energy)-log10(Energy)); |
| | 729 | h2slope.Fill(slope, log10(energy)-log10(Energy)); |
| | 730 | h2zd.Fill( Zd, log10(energy)-log10(Energy)); |
| | 731 | } |
| | 732 | |
| | 733 | clock.Print(); |
| | 734 | |
| | 735 | TF1 fx("f", "x", -100, 100); |
| | 736 | TF1 f0("f", "0", -100, 100); |
| | 737 | |
| | 738 | TCanvas *canv = new TCanvas("Canvas", "Energy estimation", 800, 900); |
| | 739 | canv->Divide(2,4); |
| | 740 | |
| | 741 | canv->cd(1); |
| | 742 | gPad->SetGridy(); |
| | 743 | h2size.DrawCopy("colz"); |
| | 744 | f0.DrawCopy("same"); |
| | 745 | |
| | 746 | canv->cd(3); |
| | 747 | gPad->SetGridy(); |
| | 748 | h2dist.DrawCopy("colz"); |
| | 749 | f0.DrawCopy("same"); |
| | 750 | |
| | 751 | canv->cd(5); |
| | 752 | gPad->SetGridy(); |
| | 753 | h2slope.DrawCopy("colz"); |
| | 754 | f0.DrawCopy("same"); |
| | 755 | |
| | 756 | canv->cd(7); |
| | 757 | gPad->SetGridy(); |
| | 758 | h2zd.DrawCopy("colz"); |
| | 759 | f0.DrawCopy("same"); |
| | 760 | |
| | 761 | canv->cd(2); |
| | 762 | gPad->SetGridy(); |
| | 763 | h2svse.DrawCopy("colz"); |
| | 764 | fx.DrawCopy("same"); |
| | 765 | |
| | 766 | canv->cd(4); |
| | 767 | gPad->SetGridy(); |
| | 768 | h2est.DrawCopy("colz"); |
| | 769 | fx.DrawCopy("same"); |
| | 770 | |
| | 771 | canv->cd(6); |
| | 772 | gPad->SetGridy(); |
| | 773 | h2bias.DrawCopy("colz"); |
| | 774 | f0.DrawCopy("same"); |
| | 775 | |
| | 776 | |
| | 777 | canv->cd(8); |
| | 778 | |
| | 779 | TGraph grlin; |
| | 780 | TGraph grlog; |
| | 781 | |
| | 782 | for (int x=1; x<h2bias.GetNbinsX(); x++) |
| | 783 | { |
| | 784 | TH1D *p = h2bias.ProjectionY("_py", x, x); |
| | 785 | if (p->GetRMS()>0) |
| | 786 | grlog.SetPoint(grlog.GetN(), h2bias.GetXaxis()->GetBinCenter(x), pow(10, p->GetRMS())-1); |
| | 787 | delete p; |
| | 788 | |
| | 789 | p = h2lin.ProjectionY("_py", x, x); |
| | 790 | if (p->GetRMS()>0) |
| | 791 | grlin.SetPoint(grlin.GetN(), h2lin.GetXaxis()->GetBinCenter(x), p->GetRMS()); |
| | 792 | delete p; |
| | 793 | } |
| | 794 | |
| | 795 | grlog.SetMarkerColor(kBlue); |
| | 796 | grlin.SetMinimum(0); |
| | 797 | grlin.DrawClone("A*"); |
| | 798 | grlog.DrawClone("*"); |
| | 799 | } |
| | 800 | }}} |