Go to the documentation of this file.00001 #include "ForIA/Event.hh"
00002 #include "ForIA/DataConverter.hh"
00003 #include "ForIA/JetKey.hh"
00004 #include "ForIA/Jet.hh"
00005
00006 #include "ForIA/Utils.hh"
00007
00008 #include <boost/cast.hpp>
00009
00010 namespace ForIA{
00011
00012 Event::Event(DataConverter *converter ): m_converter(converter),
00013 m_goodRun(true), m_goodLumiBlock(true),
00014 m_gotClusters(false), m_gotDetectorErrors(false),
00015 m_gotTracks(false), m_gotVertices(false), m_gotTriggerConfiguration(false),
00016 m_gotTriggerDecision(false), m_gotTruth(false), m_gotTruthJets(false),
00017 m_gotTruthVertices(false), m_gotL1Trigger(false),
00018 m_gotL2SpacePoints(false){
00019
00020 }
00022 unsigned long Event::runNumber()const{
00023 return m_runNumber;
00024 }
00025
00027 unsigned long Event::eventNumber()const{
00028 return boost::numeric_cast<unsigned long>(m_eventNumber);
00029 }
00030
00032 unsigned int Event::lumiBlock()const{
00033 return m_lumiBlock;
00034 }
00035
00037 double Event::weight()const{
00038 return m_weight;
00039 }
00040
00042 bool Event::goodRun() const{
00043 return m_goodRun;
00044 }
00045
00047 bool Event::goodLumiBlock() const{
00048 return m_goodLumiBlock;
00049 }
00050
00052 const TrackVector &Event::tracks() const {
00053 if(m_gotTracks) return m_tracks;
00054 m_tracks = m_converter->loadTracks(this);
00055 m_gotTracks = true;
00056 return m_tracks;
00057 }
00058
00060 const ClusterVector &Event::clusters() const {
00061 if(m_gotClusters) return m_clusters;
00062 m_clusters = m_converter->loadClusters();
00063 m_gotClusters = true;
00064 return m_clusters;
00065 }
00066
00068 DetectorErrorsConstPtr Event::detectorErrors()const{
00069 if(m_gotDetectorErrors) return m_detectorErrors;
00070 m_detectorErrors = m_converter->loadDetectorErrors();
00071 m_gotDetectorErrors = true;
00072 return m_detectorErrors;
00073 }
00074
00076 const JetVector &Event::jets(const JetKey &jetKey) const {
00077 if(m_gotJets[jetKey]) return m_jets[jetKey];
00078
00079 boost::unordered_map<JetKey, JetVector>::iterator jetIt = m_jets.find(jetKey);
00080 if(jetIt == m_jets.end()){
00081 jetIt = m_jets.insert(std::make_pair(jetKey, m_converter->loadJets(jetKey, this))).first;
00082 }else{
00083 jetIt->second = m_converter->loadJets(jetKey, this);
00084 }
00085
00086 m_gotJets[jetKey] = true;
00087 return jetIt->second;
00088 }
00089
00091
00092 struct TrackAndJet{
00093 TrackAndJet(double d, JetConstPtr j ): dr(d), jet(j){}
00094 bool operator <( const TrackAndJet &right)const{
00095 return this->dr < right.dr;
00096 }
00097
00098 double dr;
00099 JetConstPtr jet;
00100 };
00102 void Event::matchTracksToJets(const JetKey &key)const{
00103
00104 vector<vector< TrackAndJet> > matchings;
00105
00106 JetVector jets = this->jets(key);
00107 TrackVector tracks = this->tracks();
00108
00109 for(TrackVector::const_iterator track = tracks.begin();
00110 track != tracks.end(); ++track){
00111 matchings.push_back(vector<TrackAndJet>());
00112
00113 for(JetVector::iterator jet = jets.begin();
00114 jet != jets.end(); ++jet){
00115
00116 if((*jet)->m_matchedTracks.size() != 0){
00117 throw std::runtime_error("matchTracksToJets: trying to match jets that have already been matched to tracks");
00118 }
00119
00120 (*jet)->m_gotMatchedTracks = true;
00121
00122 double dr = deltaR(*track, *jet);
00123 if(dr < (*jet)->rParam()){
00124 matchings.back().push_back(TrackAndJet(dr, *jet));
00125 }
00126 }
00127 }
00128
00129 for(size_t ii = 0; ii != tracks.size(); ++ii){
00130 if(matchings[ii].size()==0) continue;
00131
00132 std::sort(matchings[ii].begin(), matchings[ii].end());
00133 matchings[ii][0].jet->m_matchedTracks.push_back(tracks[ii]);
00134
00135 }
00136
00137 return;
00138 }
00139
00141 void Event::matchVerticesToTracks()const{
00142
00143 const TrackVector &allTracks = this->tracks();
00144
00145 for(TrackVector::const_iterator track = allTracks.begin();
00146 track != allTracks.end(); ++track){
00147 (*track)->m_vertices.clear();
00148 (*track)->m_haveMatchedVertices = true;
00149 }
00150
00151 const VertexVector &vertices = this->vertices();
00152
00153 int nTracks = 0;
00154
00155 for(VertexVector::const_iterator vtx = vertices.begin();
00156 vtx != vertices.end(); ++vtx){
00157
00158 const TrackVector &tracks = (*vtx)->associatedTracks();
00159 for(TrackVector::const_iterator track = tracks.begin();
00160 track != tracks.end(); ++track){
00161 (*track)->m_vertices.push_back(*vtx);
00162 (*track)->m_haveMatchedVertices = true;
00163 ++nTracks;
00164 }
00165 }
00166
00167 return;
00168 }
00169
00171 const JetVector &Event::jets()const{
00172 static JetKey key(Jet::ANTI_KT, 0.6, Jet::TOPO);
00173 return jets(key);
00174 }
00175
00177 EtMissPtr Event::met() const{
00178 if(m_gotMet) return m_etMiss;
00179 m_etMiss = m_converter->loadEtMiss();
00180 m_gotMet = true;
00181 return m_etMiss;
00182 }
00183
00185 const VertexVector &Event::vertices() const{
00186 if(m_gotVertices) return m_vertices;
00187 m_vertices = m_converter->loadVertices(this);
00188 m_gotVertices = true;
00189 return m_vertices;
00190 }
00192 const TriggerConfiguration &Event::triggerConfiguration()const{
00193 if(m_gotTriggerConfiguration) return m_triggerConfiguration;
00194
00195 m_triggerConfiguration = m_converter->loadTriggerConfiguration();
00196 m_gotTriggerConfiguration = true;
00197 return m_triggerConfiguration;
00198 }
00200 TriggerDecisionPtr Event::triggerDecision()const{
00201 if(m_gotTriggerDecision) return m_triggerDecision;
00202 m_triggerDecision = m_converter->loadTriggerDecision();
00203 m_gotTriggerDecision = true;
00204 m_triggerDecision->setEvent(*this);
00205 return m_triggerDecision;
00206 }
00208 const TruthParticleVector &Event::truthParticles() const{
00209 if(m_gotTruth) return m_truthParticles;
00210 m_truthParticles = m_converter->loadTruthParticles();
00211 m_gotTruth = true;
00212 return m_truthParticles;
00213 }
00214
00216 const TruthJetVector &Event::truthJets() const{
00217 if(m_gotTruthJets) return m_truthJets;
00218 m_truthJets = m_converter->loadTruthJets();
00219 m_gotTruthJets = true;
00220 return m_truthJets;
00221 }
00222
00224 const VertexVector &Event::truthVertices()const{
00225 if(m_gotTruthVertices) return m_truthVertices;
00226 m_truthVertices = m_converter->loadTruthVertices();
00227 m_gotTruthVertices = true;
00228 return m_truthVertices;
00229 }
00230
00232 L1TriggerBitPtr Event::l1Trigger()const{
00233 if(m_gotL1Trigger) return m_l1Trigger;
00234 m_l1Trigger = m_converter->loadL1Trigger();
00235 m_gotL1Trigger = true;
00236 return m_l1Trigger;
00237 }
00238
00240 L2SpacePointsConstPtr Event::l2SpacePoints()const{
00241 if(m_gotL2SpacePoints) return m_l2SpacePoints;
00242 m_l2SpacePoints = m_converter->loadL2SpacePoints();
00243 return m_l2SpacePoints;
00244 }
00245
00247 void Event::clear(){
00248
00249 m_gotTracks = false;
00250 m_gotClusters = false;
00251 m_gotDetectorErrors = false;
00252 m_gotVertices = false;
00253 m_gotTriggerConfiguration = false;
00254 m_gotTriggerDecision = false;
00255 m_gotTruth = false;
00256 m_gotTruthVertices = false;
00257 m_gotL1Trigger = false;
00258 m_gotL2SpacePoints = false;
00259
00260 m_eventNumber = -1;
00261
00262 for(boost::unordered_map<JetKey, bool>::iterator got = m_gotJets.begin();
00263 got != m_gotJets.end(); ++got){
00264 got->second=false;
00265 }
00266
00267 return;
00268 }
00269
00271 std::ostream &operator << (std::ostream &out, const Event &evt){
00272 out<<"Event: "<<evt.eventNumber()<<", Run number: "<<evt.m_runNumber<<", Lumi block: "<<evt.m_lumiBlock;
00273 return out;
00274 }
00275
00276 }
00277