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
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
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
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
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
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