Go to the documentation of this file.00001 #include "ForIA/AnalysisTools/VertexCuts.hh"
00002
00003 #include "ForIA/Event.hh"
00004
00005 #include "ForIA/MessageBox.hh"
00006
00007 #include <sstream>
00008
00009 namespace ForIA {
00010
00011 VertexCuts::VertexCuts(): m_canSetCuts(true), m_haveSetPileUpCut(false),
00012 m_haveSetRequirePrimary(false), m_haveSetNTracksForPrimary(false), m_haveSetNTracksForPileUp(false){
00013
00014 }
00015
00016 bool VertexCuts::setEvent(const Event &evt){
00017
00018 m_canSetCuts = false;
00019 m_gotPrimary = false;
00020 m_gotPasses = false;
00021 m_goodVertices.clear();
00022
00023 VertexVector vertices = evt.vertices();
00024 for(VertexVector::const_iterator vertex = vertices.begin();
00025 vertex != vertices.end(); ++vertex){
00026
00027 if((*vertex)->type() == Vertex::PRIMARY){
00028
00029 if(m_gotPrimary){
00031 std::cout<<"ERROR: Two vertices labelled as the primary vertex are found!!"<<std::endl;
00032 std::cout<<"ERROR: Not completing vertex cuts!!"<<std::endl;
00033 return false;
00034 }
00035
00036 m_gotPrimary = (!m_haveSetNTracksForPrimary || (*vertex)->nTracks() >= m_nTracksForPrimary)? true: false;
00037 if(m_gotPrimary) m_goodVertices.push_back(*vertex);
00038 }
00039
00040 if((*vertex)->type() == Vertex::PILE_UP){
00041 if(!m_haveSetNTracksForPileUp || (*vertex)->nTracks() >= m_nTracksForPileUp){
00042 m_goodVertices.push_back(*vertex);
00043 }
00044 }
00045
00046 }
00047 return true;
00048 }
00049
00050 const VertexVector &VertexCuts::goodVertices()const{
00051 return m_goodVertices;
00052 }
00053
00054 bool VertexCuts::passesCuts()const{
00055 if(!m_gotPasses){
00056 m_passes = (m_haveSetRequirePrimary)? m_gotPrimary: true;
00057 if(m_haveSetPileUpCut) m_passes = m_passes && (m_goodVertices.size() < 2);
00058 }
00059
00060 return m_passes;
00061 }
00062
00063 bool VertexCuts::doPileUpCut(bool pileUpCut){
00064 if(!m_canSetCuts) return false;
00065 m_pileUpCut = pileUpCut;
00066 m_haveSetPileUpCut = true;
00067 return true;
00068 }
00069
00070 bool VertexCuts::setNTracksForPrimaryVertex(int nTracks){
00071 if(!m_canSetCuts) return false;
00072 m_nTracksForPrimary = nTracks;
00073 m_haveSetNTracksForPrimary = true;
00074 return true;
00075 }
00076
00077 bool VertexCuts::setNTracksForPileUpVertex(int nTracks){
00078 if(!m_canSetCuts) return false;
00079 m_nTracksForPileUp = nTracks;
00080 m_haveSetNTracksForPileUp = true;
00081 return true;
00082 }
00083
00084 bool VertexCuts::setRequirePrimary(bool require){
00085 if(!m_canSetCuts) return false;
00086 m_requirePrimary = require;
00087 m_haveSetRequirePrimary = true;
00088 return true;
00089 }
00090
00091 MessageBox &operator << (MessageBox &box, const VertexCuts &cuts){
00092 box.setTitle("Vertex Cuts");
00093 box.addEntry("Require primary vertex", (cuts.m_haveSetRequirePrimary && cuts.m_requirePrimary)? "true": "false");
00094
00095 vector<string> vtxType;
00096 vtxType.push_back("vertex type = PriVtx");
00097 if(cuts.m_haveSetNTracksForPrimary){
00098 std::stringstream ss;
00099 ss<<"Number of tracks >= "<<cuts.m_nTracksForPrimary;
00100 vtxType.push_back(ss.str());
00101 }else{
00102 vtxType.push_back("No cut on number of tracks");
00103 }
00104 box.addEntry("Primary Vertex definition", vtxType);
00105 box.addEntry("Reject pile up", (cuts.m_haveSetPileUpCut && cuts.m_pileUpCut)? "true": "false");
00106 if(cuts.m_haveSetNTracksForPileUp){
00107 std::stringstream ss;
00108 ss<<cuts.m_nTracksForPileUp;
00109 box.addEntry("Number of tracks for pile up vertex", ss.str());
00110 }
00111
00112 return box;
00113 }
00114
00115 std::ostream &operator << (std::ostream &out, const VertexCuts &cuts){
00116
00117 MessageBox tmp;
00118 tmp<<cuts;
00119 out<<tmp;
00120
00121 return out;
00122 }
00123
00124 }