Ignore:
Timestamp:
05/03/04 10:11:15 (21 years ago)
Author:
gaug
Message:
*** empty log message ***
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/MagicSoft/Mars/mhist/MHCamera.cc

    r3798 r3929  
    5757#include <THLimitsFinder.h>
    5858#include <TProfile.h>
     59#include <TH1.h>
     60#include <TF1.h>
    5961
    6062#include "MLog.h"
     
    6870
    6971#include "MCamEvent.h"
    70 
    7172
    7273#define kItemsLegend 48 // see SetPalette(1,0)
     
    15281529    return TH1D::DrawCopy(fName+";cpy");
    15291530}
     1531
     1532
     1533// --------------------------------------------------------------------------
     1534//
     1535// Draw a projection of MHCamera onto the y-axis values. Depending on the
     1536// variable fit, the following fits are performed:
     1537//
     1538// 0: No fit, simply draw the projection
     1539// 1: Single Gauss (for distributions flat-fielded over the whole camera)
     1540// 2: Double Gauss (for distributions different for inner and outer pixels)
     1541// 3: Triple Gauss (for distributions with inner, outer pixels and outliers)
     1542// 4: flat         (for the probability distributions)
     1543// (1-4:) Moreover, sectors 6,1 and 2 of the camera and sectors 3,4 and 5 are
     1544//        drawn separately, for inner and outer pixels.
     1545// 5: Fit Inner and Outer pixels separately by a single Gaussian
     1546//                 (only for MAGIC cameras)
     1547// 6: Fit Inner and Outer pixels separately by a single Gaussian and display
     1548//                 additionally the two camera halfs separately (for MAGIC camera)
     1549//
     1550//
     1551void MHCamera::DrawProjection(Int_t fit) const
     1552{
     1553 
     1554  TArrayI inner(1);
     1555  inner[0] = 0;
     1556 
     1557  TArrayI outer(1);
     1558  outer[0] = 1;
     1559         
     1560  if (fit==5 || fit==6)
     1561    {
     1562     
     1563      if (GetGeomCam().InheritsFrom("MGeomCamMagic"))
     1564        {
     1565          TArrayI s0(6);
     1566          s0[0] = 6;
     1567          s0[1] = 1;
     1568          s0[2] = 2;
     1569          s0[3] = 3;
     1570          s0[4] = 4;
     1571          s0[5] = 5;
     1572
     1573          TArrayI s1(3);
     1574          s1[0] = 6;
     1575          s1[1] = 1;
     1576          s1[2] = 2;
     1577         
     1578          TArrayI s2(3);
     1579          s2[0] = 3;
     1580          s2[1] = 4;
     1581          s2[2] = 5;
     1582
     1583          gPad->Clear();
     1584          TVirtualPad *pad = gPad;
     1585          pad->Divide(2,1);
     1586         
     1587          TH1D *inout[2];
     1588          inout[0] = ProjectionS(s0, inner, "Inner");
     1589          inout[1] = ProjectionS(s0, outer, "Outer");
     1590         
     1591          inout[0]->SetDirectory(NULL);
     1592          inout[1]->SetDirectory(NULL);
     1593         
     1594          for (int i=0; i<2; i++)
     1595            {
     1596              pad->cd(i+1);
     1597              inout[i]->SetLineColor(kRed+i);
     1598              inout[i]->SetBit(kCanDelete);
     1599              inout[i]->Draw();
     1600              inout[i]->Fit("gaus","Q");
     1601
     1602              if (fit == 6)
     1603                {
     1604                  TH1D *half[2];
     1605                  half[0] = ProjectionS(s1, i==0 ? inner : outer , "Sector 6-1-2");
     1606                  half[1] = ProjectionS(s2, i==0 ? inner : outer , "Sector 3-4-5");
     1607                 
     1608                  for (int j=0; j<2; j++)
     1609                    {
     1610                      half[j]->SetLineColor(kRed+i+j);
     1611                      half[j]->SetDirectory(0);
     1612                      half[j]->SetBit(kCanDelete);
     1613                      half[j]->Draw("same");
     1614                    }
     1615                }
     1616             
     1617            }
     1618         
     1619          gLog << all << GetName()
     1620               << Form("%s%5.3f%s%3.2f"," Mean: Inner Pixels: ",
     1621                       inout[0]->GetFunction("gaus")->GetParameter(1),"+-",
     1622                       inout[0]->GetFunction("gaus")->GetParError(1));
     1623          gLog << Form("%s%5.3f%s%3.2f","  Outer Pixels: ",
     1624                       inout[1]->GetFunction("gaus")->GetParameter(1),"+-",
     1625                       inout[1]->GetFunction("gaus")->GetParError(1)) << endl;
     1626          gLog << all << GetName()
     1627               << Form("%s%5.3f%s%3.2f"," Sigma: Inner Pixels: ",
     1628                       inout[0]->GetFunction("gaus")->GetParameter(2),"+-",
     1629                       inout[0]->GetFunction("gaus")->GetParError(2));
     1630          gLog << Form("%s%5.3f%s%3.2f","  Outer Pixels: ",
     1631                       inout[1]->GetFunction("gaus")->GetParameter(2),"+-",
     1632                       inout[1]->GetFunction("gaus")->GetParError(2)) << endl;
     1633
     1634        }
     1635      return;
     1636    }
     1637 
     1638  TH1D *obj2 = (TH1D*)Projection(GetName());
     1639  obj2->SetDirectory(0);
     1640  obj2->Draw();
     1641  obj2->SetBit(kCanDelete);
     1642 
     1643  if (fit == 0)
     1644    return;
     1645 
     1646  if (GetGeomCam().InheritsFrom("MGeomCamMagic"))
     1647    {
     1648      TArrayI s0(3);
     1649      s0[0] = 6;
     1650      s0[1] = 1;
     1651      s0[2] = 2;
     1652     
     1653      TArrayI s1(3);
     1654      s1[0] = 3;
     1655      s1[1] = 4;
     1656      s1[2] = 5;
     1657     
     1658     
     1659      TH1D *halfInOut[4];
     1660     
     1661      // Just to get the right (maximum) binning
     1662      halfInOut[0] = ProjectionS(s0, inner, "Sector 6-1-2 Inner");
     1663      halfInOut[1] = ProjectionS(s1, inner, "Sector 3-4-5 Inner");
     1664      halfInOut[2] = ProjectionS(s0, outer, "Sector 6-1-2 Outer");
     1665      halfInOut[3] = ProjectionS(s1, outer, "Sector 3-4-5 Outer");
     1666     
     1667      for (int i=0; i<4; i++)
     1668        {
     1669          halfInOut[i]->SetLineColor(kRed+i);
     1670          halfInOut[i]->SetDirectory(0);
     1671          halfInOut[i]->SetBit(kCanDelete);
     1672          halfInOut[i]->Draw("same");
     1673        }
     1674    }
     1675 
     1676  const Double_t min   = obj2->GetBinCenter(obj2->GetXaxis()->GetFirst());
     1677  const Double_t max   = obj2->GetBinCenter(obj2->GetXaxis()->GetLast());
     1678  const Double_t integ = obj2->Integral("width")/2.5;
     1679  const Double_t mean  = obj2->GetMean();
     1680  const Double_t rms   = obj2->GetRMS();
     1681  const Double_t width = max-min;
     1682 
     1683  const TString dgausformula = "([0]-[3])/[2]*exp(-0.5*(x-[1])*(x-[1])/[2]/[2])"
     1684    "+[3]/[5]*exp(-0.5*(x-[4])*(x-[4])/[5]/[5])";
     1685 
     1686  const TString tgausformula = "([0]-[3]-[6])/[2]*exp(-0.5*(x-[1])*(x-[1])/[2]/[2])"
     1687    "+[3]/[5]*exp(-0.5*(x-[4])*(x-[4])/[5]/[5])"
     1688    "+[6]/[8]*exp(-0.5*(x-[7])*(x-[7])/[8]/[8])";
     1689  TF1 *f=0;
     1690  switch (fit)
     1691    {
     1692    case 1:
     1693      f = new TF1("sgaus", "gaus(0)", min, max);
     1694      f->SetLineColor(kYellow);
     1695      f->SetBit(kCanDelete);
     1696      f->SetParNames("Area", "#mu", "#sigma");
     1697      f->SetParameters(integ/rms, mean, rms);
     1698      f->SetParLimits(0, 0,   integ);
     1699      f->SetParLimits(1, min, max);
     1700      f->SetParLimits(2, 0,   width/1.5);
     1701     
     1702      obj2->Fit(f, "QLR");
     1703      break;
     1704     
     1705    case 2:
     1706      f = new TF1("dgaus",dgausformula.Data(),min,max);
     1707      f->SetLineColor(kYellow);
     1708      f->SetBit(kCanDelete);
     1709      f->SetParNames("A_{tot}", "#mu1", "#sigma1", "A2", "#mu2", "#sigma2");
     1710      f->SetParameters(integ,(min+mean)/2.,width/4.,
     1711                       integ/width/2.,(max+mean)/2.,width/4.);
     1712      // The left-sided Gauss
     1713      f->SetParLimits(0,integ-1.5      , integ+1.5);
     1714      f->SetParLimits(1,min+(width/10.), mean);
     1715      f->SetParLimits(2,0              , width/2.);
     1716      // The right-sided Gauss
     1717      f->SetParLimits(3,0   , integ);
     1718      f->SetParLimits(4,mean, max-(width/10.));
     1719      f->SetParLimits(5,0   , width/2.);
     1720      obj2->Fit(f,"QLRM");
     1721      break;
     1722     
     1723    case 3:
     1724      f = new TF1("tgaus",tgausformula.Data(),min,max);
     1725      f->SetLineColor(kYellow);
     1726      f->SetBit(kCanDelete);
     1727      f->SetParNames("A_{tot}","#mu_{1}","#sigma_{1}",
     1728                     "A_{2}","#mu_{2}","#sigma_{2}",
     1729                     "A_{3}","#mu_{3}","#sigma_{3}");
     1730      f->SetParameters(integ,(min+mean)/2,width/4.,
     1731                       integ/width/3.,(max+mean)/2.,width/4.,
     1732                       integ/width/3.,mean,width/2.);
     1733      // The left-sided Gauss
     1734      f->SetParLimits(0,integ-1.5,integ+1.5);
     1735      f->SetParLimits(1,min+(width/10.),mean);
     1736      f->SetParLimits(2,width/15.,width/2.);
     1737      // The right-sided Gauss
     1738      f->SetParLimits(3,0.,integ);
     1739      f->SetParLimits(4,mean,max-(width/10.));
     1740      f->SetParLimits(5,width/15.,width/2.);
     1741      // The Gauss describing the outliers
     1742      f->SetParLimits(6,0.,integ);
     1743      f->SetParLimits(7,min,max);
     1744      f->SetParLimits(8,width/4.,width/1.5);
     1745      obj2->Fit(f,"QLRM");
     1746      break;
     1747     
     1748    case 4:
     1749      obj2->Fit("pol0", "Q");
     1750      obj2->GetFunction("pol0")->SetLineColor(kYellow);
     1751      break;
     1752     
     1753    case 9:
     1754      break;
     1755     
     1756    default:
     1757      obj2->Fit("gaus", "Q");
     1758      obj2->GetFunction("gaus")->SetLineColor(kYellow);
     1759      break;
     1760    }
     1761}
     1762
     1763
     1764// --------------------------------------------------------------------------
     1765//
     1766// Draw a projection of MHCamera vs. the radius from the central pixel.
     1767//
     1768// The inner and outer pixels are drawn separately, both fitted by a polynomial
     1769// of grade 1.
     1770//
     1771void MHCamera::DrawRadialProfile() const
     1772{
     1773 
     1774  TProfile *obj2 = (TProfile*)RadialProfile(GetName());
     1775  obj2->SetDirectory(0);
     1776  obj2->Draw();
     1777  obj2->SetBit(kCanDelete);
     1778 
     1779  if (GetGeomCam().InheritsFrom("MGeomCamMagic"))
     1780    {
     1781
     1782      TArrayI s0(6);
     1783      s0[0] = 1;
     1784      s0[1] = 2;
     1785      s0[2] = 3;
     1786      s0[3] = 4;
     1787      s0[4] = 5;
     1788      s0[5] = 6;
     1789
     1790      TArrayI inner(1);
     1791      inner[0] = 0;
     1792     
     1793      TArrayI outer(1);
     1794      outer[0] = 1;
     1795     
     1796      // Just to get the right (maximum) binning
     1797      TProfile *half[2];
     1798      half[0] = RadialProfileS(s0, inner,Form("%s%s",GetName(),"Inner"));
     1799      half[1] = RadialProfileS(s0, outer,Form("%s%s",GetName(),"Outer"));
     1800     
     1801      for (Int_t i=0; i<2; i++)
     1802        {
     1803          Double_t min = GetGeomCam().GetMinRadius(i);
     1804          Double_t max = GetGeomCam().GetMaxRadius(i);
     1805
     1806          half[i]->SetLineColor(kRed+i);
     1807          half[i]->SetDirectory(0);
     1808          half[i]->SetBit(kCanDelete);
     1809          half[i]->Draw("same");
     1810          half[i]->Fit("pol1","Q","",min,max);
     1811          half[i]->GetFunction("pol1")->SetLineColor(kRed+i);
     1812          half[i]->GetFunction("pol1")->SetLineWidth(1);
     1813        }
     1814    }
     1815}
     1816
Note: See TracChangeset for help on using the changeset viewer.