Go to the documentation of this file.00001 #include "ForIA/AnalysisTools/ClusterSelection.hh"
00002 #include "ForIA/Units.hh"
00003 #include "ForIA/Utils.hh"
00004 #include <cmath>
00005 #include <stdexcept>
00006
00007 namespace ForIA {
00008
00009 ClusterSelection::ClusterSelection():
00010 FourVectorSelection(),
00011 m_haveSetetMin(false),
00012 m_haveSeteMin(false),
00013 m_haveSetetaMin(false),
00014 m_haveSetetaMax(false),
00015 m_haveSetEmFrac(false),
00016 m_haveSetEmFracSpike(false),
00017 m_smearE(false),
00018 m_scaleMCEType("NOMINAL"),
00019 m_useEMScale(true)
00020 {
00021 m_eScale.SetRandomSeed(4321);
00022 }
00023
00024 const ClusterVector &ClusterSelection::acceptedClusters() const{
00025 if(m_freshEvent) fillVectors();
00026 return m_acceptedClusters;
00027 }
00028 const ClusterVector &ClusterSelection::rejectedClusters() const{
00029 if(m_freshEvent) fillVectors();
00030 return m_rejectedClusters;
00031 }
00032
00033 bool ClusterSelection::setSelection(DefinedSelection selection){
00034 if(!m_canSetCuts) return false;
00035
00036 m_haveSetscale = false;
00037 m_haveSetetMin = false;
00038 m_haveSeteMin = false;
00039 m_haveSetetaMin= false;
00040 m_haveSetetaMax= false;
00041 m_haveSetEmFrac= false;
00042 m_haveSetEmFracSpike= false;
00043
00044 switch (selection) {
00045 case LOOSE:
00046 setSelection(LOOSE);
00047 setEMin(500 * MeV);
00048 break;
00049
00050 case MEDIUM:
00051 setSelection(MEDIUM);
00052 setEMin(1.0 * GeV);
00053 break;
00054
00055 case TIGHT:
00056 setSelection(TIGHT);
00057 setEMin(5.0 * GeV);
00058 break;
00059
00060 }
00061
00062 return true;
00063 }
00064
00065 void ClusterSelection::fillVectors() const{
00066
00067 m_freshEvent = false;
00068
00069 m_acceptedClusters.clear();
00070 m_passedFourVectors.clear();
00071 m_rejectedClusters.clear();
00072 m_rejectedFourVectors.clear();
00073
00074 if(m_event == 0) return;
00075
00076 ClusterVector input = m_event->clusters();
00077
00078 for(ClusterVector::const_iterator cluster = input.begin();
00079 cluster != input.end(); ++cluster){
00080
00081
00082 (*cluster)->setUseEMScale(m_useEMScale);
00083
00084
00085 if (m_smearE) {
00086 double SF = 1.0;
00087 if ((*cluster)->E() > 0.0) m_eScale.getSmearingCorrection((*cluster)->eta(),(*cluster)->E()/1000. ,0,true,"2010");
00088 (*cluster)->scaleEnergy(SF);
00089 }
00090
00091
00092 if ((*cluster)->isMC() && m_scaleMCEType != "NONE" ) {
00093 double SF = UtilsScaleMC((*cluster)->eta(),m_scaleMCEType);
00094
00095 (*cluster)->scaleEnergy(SF);
00096 }
00097 bool passedCuts = true;
00098
00099 if (m_haveSetetMin && passedCuts){
00100 passedCuts = ((*cluster)->ET() >= m_etMin);
00101
00102 }
00103
00104 if(m_haveSeteMin && passedCuts){
00105
00106 if(m_haveSetscale)
00107 passedCuts = ((*cluster)->E(m_scale) > m_eMin);
00108 else
00109 passedCuts = ((*cluster)->E() > m_eMin);
00110 }
00111 if(m_haveSetetaMin && passedCuts){ passedCuts = (fabs((*cluster)->eta()) >= m_etaMin);}
00112
00113 if(m_haveSetetaMax && passedCuts){ passedCuts = (fabs((*cluster)->eta()) <= m_etaMax);}
00114
00115 if (m_haveSetEmFrac && passedCuts){
00116 float emFraction = (*cluster)->E(Cluster::EM) / ((*cluster)->E(Cluster::EM) + (*cluster)->E(Cluster::HAD));
00117 passedCuts = (emFraction > m_emFrac);
00118 }
00119
00120 if (m_haveSetEmFracSpike && passedCuts){
00121 float emFraction = (*cluster)->E(Cluster::EM) / ((*cluster)->E(Cluster::EM) + (*cluster)->E(Cluster::HAD));
00122 passedCuts = (emFraction > m_emFracSpike) || (fabs((*cluster)->eta()) < 1.3) || (fabs((*cluster)->eta()) > 1.32);
00123
00124 }
00125
00126
00127 if(passedCuts){
00128 m_acceptedClusters.push_back( *cluster );
00129 m_passedFourVectors.push_back( *cluster );
00130 } else {
00131 m_rejectedClusters.push_back( *cluster );
00132 m_rejectedFourVectors.push_back( *cluster );
00133 }
00134 }
00135
00136 return;
00137 }
00138
00139 bool ClusterSelection::setScale(Cluster::Energy scale){
00140 if(!m_canSetCuts) return false;
00141 m_haveSetscale = true;
00142 m_scale = scale;
00143 return true;
00144 }
00145
00146 bool ClusterSelection::setETMin(double etMin){
00147 if(!m_canSetCuts) return false;
00148 m_haveSetetMin = true;
00149 m_etMin = etMin;
00150 return true;
00151 }
00152
00153 bool ClusterSelection::setEMin(double eMin){
00154 if(!m_canSetCuts){ std::cout << "Cuts not allowed!" << std::endl; return false; }
00155 m_haveSeteMin = true;
00156 m_eMin = eMin;
00157
00158 return true;
00159 }
00160
00161 bool ClusterSelection::setEtaMin(double etaMin){
00162 if(!m_canSetCuts) return false;
00163 m_haveSetetaMin = true;
00164 m_etaMin = etaMin;
00165 return true;
00166 }
00167
00168 bool ClusterSelection::setEtaMax(double etaMax){
00169 if(!m_canSetCuts) return false;
00170 m_haveSetetaMax = true;
00171 m_etaMax = etaMax;
00172 return true;
00173 }
00174
00175 bool ClusterSelection::setEmFrac(double emFrac){
00176 if(!m_canSetCuts) return false;
00177 m_haveSetEmFrac = true;
00178 m_emFrac = emFrac;
00179 return true;
00180 }
00181
00182 bool ClusterSelection::setEmFracSpike(double emFracSpike){
00183 if(!m_canSetCuts) return false;
00184 m_haveSetEmFracSpike = true;
00185 m_emFracSpike = emFracSpike;
00186 return true;
00187 }
00188
00189 void ClusterSelection::setSmearE(bool smear){
00190 m_smearE = smear;
00191 return;
00192 }
00193
00194 void ClusterSelection::setUseEMScale(bool useEMScale){
00195 m_useEMScale = useEMScale;
00196 return;
00197 }
00198
00199 void ClusterSelection::setScaleMCClusterEType(std::string type){
00200 m_scaleMCEType = type;
00201 return;
00202 }
00203
00204
00205
00206 }