Main Page   Namespace List   Class Hierarchy   Compound List   File List   Compound Members   File Members  

BackgroundCuts.cxx

Go to the documentation of this file.
00001 // $Header: /nfs/slac/g/glast/ground/cvs/merit/src/BackgroundCuts.cxx,v 1.4 2001/10/31 17:05:53 usher Exp $
00002 // Initial author Steve Ritz
00003 
00004 #include "BackgroundCuts.h"
00005 #include "Cut.h"
00006 //=============================================================================
00007 //  Helper classes applying complicated cuts
00008 //=============================================================================
00009 class Cal2Dfrac : public Analyze {
00010 friend class BackgroundCuts;
00011 
00012     Cal2Dfrac (const Tuple& t) 
00013         : Analyze (t, "Cal_eLayer7", "Cal2Dfrac")
00014         , m_csi1(t.tupleItem ("Cal_eLayer0"))
00015         , m_csi8(t.tupleItem ("Cal_eLayer7"))
00016           , m_csiESum(t.tupleItem ("Cal_Energy_Deposit"))
00017     {    }
00018 
00019     virtual bool    apply () {
00020         float lyr8 = item();
00021             float lyr1 = *m_csi1;
00022         float sum  = *m_csiESum;
00023 
00024         // 10/30/01 change energy from MeV to Gev
00025         sum = 0.001*sum;
00026 
00027         return (sum != 0.) ? (lyr8/sum<0.08 || lyr1/sum>0.25 || sum>0.35) : false;
00028     }
00029     
00030     const TupleItem*    m_csi1;
00031     const TupleItem*    m_csi8;
00032     const TupleItem*    m_csiESum;
00033 };
00034     
00035 //=============================================================================
00036 class SurplusHit : public Analyze {
00037     friend class BackgroundCuts;
00038 
00039     SurplusHit (const Tuple& t) 
00040         : Analyze (t, "REC_Surplus_Hit_Ratio", "Surplus_Hit_Ratio")
00041         , m_fstX(t.tupleItem ("TKR_First_XHit"))
00042         , m_SHR(t.tupleItem ("REC_Surplus_Hit_Ratio"))
00043           , m_csiESum(t.tupleItem ("Cal_Energy_Deposit"))
00044     {    }
00045 
00046     virtual bool    apply () {
00047         float SHR = item();
00048             float fstX = *m_fstX;
00049         float sum = *m_csiESum;
00050 // we'll adjust this further for higher energy.  Below 10 GeV this works fine, thanks to MS!
00051         // 10/30/01 change energy from MeV to Gev
00052         sum = 0.001*sum;
00053 
00054         return (SHR>2.25 || (sum>1.&&fstX>13) || sum>5.);
00055     }
00056     
00057     const TupleItem*    m_fstX;
00058     const TupleItem*    m_SHR;
00059     const TupleItem*    m_csiESum;
00060 };
00061     
00062 //=============================================================================
00063 class XtalRatio : public Analyze {
00064     friend class BackgroundCuts;
00065 
00066     XtalRatio (const Tuple& t) 
00067         : Analyze (t, "Cal_Xtal_Ratio", "Cal_Xtal_Ratio>0.25")
00068     {    }
00069 
00070     virtual bool    apply () 
00071     {
00072         float xTalRat = item();
00073 
00074         bool test = xTalRat > 0.25;
00075 
00076         return test;
00077     }
00078 };
00079     
00080 
00081 //=============================================================================
00082 class CalFitNrm : public Analyze {
00083     friend class BackgroundCuts;
00084     CalFitNrm (const Tuple& t) 
00085         : Analyze (t, "Cal_Fit_errNrm", "CalFitNrm")
00086           , m_csiESum(t.tupleItem ("Cal_Energy_Deposit"))
00087     {    }
00088 
00089     virtual bool    apply () {
00090         float fiterr = item();
00091         float sum = *m_csiESum;
00092 
00093         // 10/30/01 change energy from MeV to Gev
00094         sum = 0.001*sum;
00095 
00096 //    we do this because the normalization is bad at low energy
00097         //bool test = (sum > 0.) ? (sum < 1. && fiterr < 10) || fiterr < 4. : false;
00098         bool test = (sum > 0.) ? (sum < 1. && fiterr < 100.) || fiterr < 50. : false;
00099         return test;
00100     }
00101     
00102     const TupleItem*    m_csiESum;
00103 };
00104 //=============================================================================
00105 class NumVetos : public Analyze {
00106 /*  Real gammas will seldom light up more than one ACD tile, whereas cosmics that 
00107     enter and exit will.  We eventually want a more sophisticated analysis that
00108     uses tracker hit cluster information in addition to the spatial information
00109     defined by the tiles.  However, a first look at such events indicates that 
00110     such an analysis will take time to do properly, since our tracker is not 
00111     designed to recognize tracks approximately parallel to the detector planes.  
00112     We should worry about environmental effects on-orbit causing ACD tiles to 
00113     light up randomly at a high enough rate to cause an inefficiency.  A first 
00114     estimate by Jonathan Ormes indicates that soft particle fluxes are not a 
00115     problem here, even during a GRB.  Note that the energy-dependent cuts are 
00116     very far away from any gamma event in the simulation. 
00117 */
00118     friend class BackgroundCuts;
00119     
00120     NumVetos (const Tuple& t) 
00121         : Analyze (t, "ACD_TileCount", "NumVetos")
00122           , m_csiESum(t.tupleItem ("Cal_Energy_Deposit"))
00123     {    }
00124 
00125     virtual bool    apply () {
00126         float num = item();
00127         float sum = *m_csiESum;
00128 
00129         // 10/30/01 change energy from MeV to Gev
00130         sum = 0.001*sum;
00131 
00132 // worry about real-world effects, but these are fairly loose
00133         return (num<1.5 || (sum>1. && num<7.) || sum>50.);
00134     }
00135     
00136     const TupleItem*    m_csiESum;
00137 };
00138 //=============================================================================
00139 class CutWithEthresh : public Cut {
00140     // only apply a cut if E< thresh
00141     friend class BackgroundCuts;
00142     CutWithEthresh(const Tuple& t, const std::string& expression, double thresh)
00143         : Cut(t,expression)
00144         , m_csiESum(t.tupleItem ("Cal_Energy_Deposit"))
00145         , m_thresh(thresh) {}
00146 
00147     virtual bool apply() {
00148         float Esum = *m_csiESum;
00149 
00150         // 10/30/01 change energy from MeV to Gev
00151         Esum = 0.001*Esum;
00152 
00153         return Esum > m_thresh || Cut::apply();
00154     }
00155     const TupleItem* m_csiESum;
00156     double m_thresh;
00157 };   
00158 
00159 //=============================================================================
00160 
00161 
00162 BackgroundCuts::BackgroundCuts(const Tuple& t) : AnalysisList(" Ritz cuts")
00163 {
00164     push_back( new Cut(t, "Cal_Energy_Deposit", Cut::GT, 0., "Cal Energy") );
00165     push_back( new Cut(t, "TKR_No_Tracks",  Cut::GT,   0., "track found") );
00166     //push_back( new Cut(t, "Cal_Xtal_Ratio", Cut::GT, 0.25, "Cal_Xtal_Ratio>0.25" ) );
00167     push_back( new XtalRatio(t) );
00168     
00169     push_back( new SurplusHit (t) );
00170     push_back( new CalFitNrm (t) );
00171     push_back( new NumVetos (t) );
00172     push_back( new Cal2Dfrac (t) );
00173     
00174     push_back( new CutWithEthresh(t, "Cal_long_rms<15.", 0.35 ) );
00175     push_back( new Cut(t, "Cal_Z",          Cut::GT, -30., "Cal_Z>-30.") ); // will loosen slightly above 75 GeV, but still quite efficient even at 300 GeV
00176     push_back( new Cut(t, "TKR_qual",       Cut::GT, 10., "TKR_qual>10.") );
00177     push_back( new CutWithEthresh(t, "Cal_No_Xtals_Trunc<20", 75.) );
00178 
00179 }

Generated at Wed Nov 21 12:20:38 2001 by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000