00001 #include "GfxTrackList.h"
00002 #include "GfxTrackListCfg.h"
00003 #include "GfxProxy.h"
00004 #include "ViewState.h"
00005 #include "GfxTrack.h"
00006 #include <Midad/Gui/GuiSlider.h>
00007 #include <Midad/Base/Mint.h>
00008 #include <RecoBase/CandTrackHandle.h>
00009 #include <RecoBase/CandTrackListHandle.h>
00010 #include <RecoBase/CandFitTrackHandle.h>
00011 #include "GfxTrackListMenu.h"
00012 #include <TClonesArray.h>
00013 #include <Record/RecArrayAllocator.h>
00014 #include <DataUtil/CDL2STL.h>
00015 #include <JobControl/JobC.h>
00016 using namespace DataUtil;
00017
00018 #include <sigc++/sigc++.h>
00019 #include <sigc++/class_slot.h>
00020 using namespace SigC;
00021
00022
00023 #include <Buttons.h>
00024
00025 static GfxProxy<GfxTrackList>
00026 gsGfxTrackListProxy("TrackList", new GfxTrackListMenu());
00027
00028 GfxTrackList::GfxTrackList()
00029 :fCfg(0)
00030 ,fHideTracks(false)
00031 {
00032 fCfg = new GfxTrackListCfg();
00033 fCfg->modified_signal.connect
00034 (SigC::slot_class(*this,&GfxTrackList::ReConfigure));
00035 RecArrayAllocator& a = RecArrayAllocator::Instance();
00036 fTracksCA = a.GetArray("GfxTrack");
00037 }
00038
00039 GfxTrackList::~GfxTrackList()
00040 {
00041 RecArrayAllocator& a = RecArrayAllocator::Instance();
00042 if (fTracksCA) { a.ReleaseArray(fTracksCA); fTracksCA = 0; }
00043 }
00044
00045
00046 void GfxTrackList::Init(PageDisplay& pd, EVD& mp)
00047 {
00048
00049 fEVD= ∓
00050 fPageDisplay= &pd;
00051 ViewState* vs = this->GetViewState();
00052 vs->spatial_metric.connect(slot_class(*this,&GfxTrackList::ReConfigure));
00053 }
00054
00055 void GfxTrackList::Configure(Mint& mint)
00056 {
00057 this->ClearTrackList();
00058 CandRecord* crec = dynamic_cast<CandRecord*>
00059 (mint.GetJobC().Mom.GetFragment("CandRecord", "PrimaryCandidateRecord"));
00060 if (!crec) return;
00061
00062
00063
00064
00065 CandTrackListHandle * ctlh = mint.GetTracks();
00066 if (!ctlh) return;
00067 RangeDouble& time_range =
00068 fPageDisplay->GetTimeSlider().GetRangeCtrl().GetRange();
00069 TIter trackItr(ctlh->GetDaughterIterator());
00070 while (CandTrackHandle *cth = dynamic_cast<CandTrackHandle*>
00071 (trackItr())) {
00072
00073 CandTrackHandle * findtrack=0;
00074 bool addtrack=true;
00075 if(GetEVD()->GetCandSlice()){
00076 CandSliceHandle slc1 = *(GetEVD()->GetCandSlice());
00077 CandSliceHandle slc2;
00078 if(cth->GetCandSlice()) slc2=*(cth->GetCandSlice());
00079 if(slc1!=slc2 && !slc1.IsCloneOf(slc2)){
00080 addtrack=false;
00081 }
00082 }
00083 else if(GetEVD()->GetCandEvent()){
00084 addtrack=false;
00085 for( Int_t itrack=0;itrack<=GetEVD()->GetCandEvent()->GetLastTrack();itrack++){
00086 const CandFitTrackHandle *evtrack = dynamic_cast<const CandFitTrackHandle *>(GetEVD()->GetCandEvent()->GetTrack(itrack));
00087 findtrack=evtrack->GetFinderTrack();
00088 if(findtrack){
00089 if (*findtrack==*cth){
00090 addtrack=true;
00091 break;
00092 }
00093 }
00094 const CandTrackHandle *evtrackbase = dynamic_cast<const CandTrackHandle *>(evtrack);
00095 if(*evtrackbase==*cth){
00096 addtrack=true;
00097 break;
00098 }
00099 }
00100 }
00101
00102 int last = fTracksCA->GetLast()+1;
00103 if(addtrack && (time_range.InRange(cth->GetVtxT()) || GetEVD()->GetNumSlices()<2) ){
00104 new ((*fTracksCA)[last]) GfxTrack(*cth,*this);
00105 GfxTrack* gs = dynamic_cast<GfxTrack*>(fTracksCA->UncheckedAt(last));
00106 fTracks.push_back(gs);
00107 }
00108 }
00109 this->ReConfigure();
00110
00111 }
00112 void GfxTrackList::ReConfigure()
00113 {
00114 if (fHideTracks) return;
00115
00116 for (TrackList_t::iterator it=fTracks.begin(); it != fTracks.end(); ++it) {
00117 (*it)->Configure();
00118 }
00119 }
00120
00121 void GfxTrackList::ClearTrackList()
00122 {
00123 fTracks.clear();
00124 fTracksCA->Clear("C");
00125 }
00126
00127 void GfxTrackList::Draw(Option_t* option)
00128 {
00129
00130 for (TrackList_t::iterator it=fTracks.begin(); it != fTracks.end(); ++it) {
00131
00132 if(GetEVD()->GetDrawAll() || ((*it)->GetColor()==GetEVD()->GetGhostColor() && GetEVD()->GetDrawGhosts()) || ((*it)->GetColor()!=GetEVD()->GetGhostColor() && GetEVD()->GetDrawGhosts())){
00133 (*it)->Draw(option);
00134 }
00135
00136 }
00137 }
00138
00139 void GfxTrackList::ExecuteEvent(int event, int , int , GfxTrack* track)
00140 {
00141 switch (event) {
00142 case kMouseEnter: {
00143 const CandTrackHandle& cth = track->GetTrack();
00144 text_info.emit(Form("%s: %d strips, P=%.1f",
00145 "track", cth.GetNDaughters(),
00146 cth.GetMomentum()));
00147 break;
00148 }
00149 default:
00150 break;
00151 }
00152
00153 }
00154
00155 void GfxTrackList::HideTracks(bool hide)
00156 {
00157 fHideTracks = hide;
00158 this->ReConfigure();
00159 if(GetGraphicsView()==GraphicsView::kXY)fEVD->UpdateCanvas();
00160
00161 }