AssociatedTracks.cpp

Go to the documentation of this file.
00001 
00002 #include "cafe/AssociatedTracks.hpp"
00003 #include "cafe/Event.hpp"
00004 #include "cafe/Config.hpp"
00005 
00006 #include <iostream>
00007 #include <stdexcept>
00008 
00009 namespace cafe {
00010 
00011     AssociatedTracks::AssociatedTracks(const char *name)
00012         : cafe::Processor(name)
00013     {
00014         Config config(name);
00015     
00016         _trackBranch   = config.get("TrackBranch","Track");
00017         _trackListName = config.get("TrackList", "KeepTracks");
00018         _branches      = config.getVString("Branches", " ,");
00019 
00020         out() << "AssociatedTracks[" << name << "] Track Branch = " << _trackBranch << std::endl;
00021         out() << "AssociatedTracks[" << name << "] Track List   = " << _trackListName << std::endl;
00022         out() << "AssociatedTracks[" << name << "] Branches     = ";
00023         for(std::vector<std::string>::const_iterator it = _branches.begin();
00024             it != _branches.end();
00025             ++it) {
00026             out() << *it << " ";
00027         }
00028         out() << std::endl;
00029     }
00030 
00031     bool AssociatedTracks::processEvent(Event& event)
00032     {
00033         using namespace std;
00034 
00035         // result
00036         TObjArray *keepTracks = new TObjArray;
00037         
00038         Collection<TMBTrack> tracks(event.getCollection<TMBTrack>(_trackBranch));
00039 
00040         for(Collection<TMBTrack>::iterator it = tracks.begin();
00041             it != tracks.end();
00042             ++it) {
00043             const TMBTrack& track = *it;
00044 
00045             for(vector<string>::iterator br = _branches.begin();
00046                 br != _branches.end();
00047                 ++br) {
00048                 
00049                 if(const TClonesArray *array = event.getClonesArray((*br).c_str())) {
00050                     if(array->GetClass() == TMBMuon::Class()) {
00051                         // Muons
00052                         Collection<TMBMuon> muons(event.getCollection<TMBMuon>(*br));
00053 
00054                         for(size_t i = 0; i < muons.size(); i++) {
00055                             if(const TMBTrack *p = muons[i].GetChargedTrack()) {
00056                                 if(p == &track) {
00057                                     if(keepTracks->FindObject(p) == 0) {
00058                                         keepTracks->AddLast((TObject *)p);
00059                                     }
00060                                 }
00061                             }
00062                         }
00063                     } else if(array->GetClass() == TMBEMCluster::Class()) {
00064                         // EM objects
00065                         Collection<TMBEMCluster> ems(event.getEM(*br));
00066                         
00067                         for(size_t i = 0; i < ems.size(); i++) {
00068                             if(const TMBTrack *p = ems[i].GetChargedTrack()) {
00069                                 if(p == &track) {
00070                                     if(keepTracks->FindObject(p) == 0) {
00071                                         keepTracks->AddLast((TObject *)p);
00072                                     }
00073                                 }
00074                             }
00075                         }
00076                     } else if(array->GetClass() == TMBJet::Class()) {
00077 
00078                         // Jets
00079                         Collection<TMBJet> jets(event.getJets(*br));
00080                         for(size_t i = 0; i < jets.size(); i++) {
00081                             
00082                             for(Int_t j = 0; j < jets[i].Ntr(); j++) {
00083                                 if(const TMBTrack * p = jets[i].GetChargedTrack(j)) {
00084                                     if(p == &track) {
00085                                         if(keepTracks->FindObject(p) == 0) {
00086                                             keepTracks->AddLast((TObject *)p);
00087                                         }
00088                                     }
00089                                 }
00090                             }   
00091                         }
00092                     } else if (array->GetClass() == TMBTau::Class()) {
00093                         // Taus
00094                         Collection<TMBTau> taus(event.getCollection<TMBTau>(*br));
00095                         for(size_t i = 0; i < taus.size(); i++) {
00096                             
00097                             for(Int_t j = 0; j < taus[i].ntrk(); j++) {
00098                                 if(const TMBTrack *p = taus[i].GetChargedTrack(j)) {
00099                                     if(p == &track) {
00100                                         if(keepTracks->FindObject(p) == 0) {
00101                                             keepTracks->AddLast((TObject *)p);
00102                                         }
00103                                     }
00104                                 }
00105                             }
00106                         }
00107                     } else {
00108                         throw std::runtime_error(string("AssociatedTracks: cannot handle object type: ") + array->GetClass()->GetName());
00109                     }
00110                 } else {
00111                         throw std::runtime_error("AssociatedTracks: no such branch: " + *br);
00112                 }
00113                 
00114             }
00115         }
00116 
00117         event.put(_trackListName, keepTracks);
00118     
00119         return true;
00120     }
00121 }
00122 
00123 ClassImp(cafe::AssociatedTracks);
00124 
00125 

Generated on Thu Apr 3 04:14:22 2008 for CAF by doxygen 1.3.4