00001
00002
00003
00004
00005
00006
00007
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00046
00048
00049
00050
00051
00052
00054
00055 class StChain;
00056 class StMaker;
00057 class StEventDisplayMaker;
00058 class StEventDisplayInfo;
00059 class StEventControlPanel {
00060 public:
00061
00062 TGMainFrame *fBar;
00063 TGLayoutHints *fL1;
00064
00065 static StMaker *fgChain;
00066 static StEventDisplayMaker *fgDispMk;
00067 static TGMainFrame *fgBar;
00068 static StEventDisplayInfo *fgHlp;
00069 private:
00070 Int_t fNum;
00071 TList *fGarb;
00072
00073 protected:
00074
00075
00076
00077 TGTextButton *AddButt(const Char_t *buttonName, const Char_t *command)
00078 {
00079 TGTextButton *tb = new TGTextButton(fBar,buttonName,command);
00080 fGarb->Add(tb);
00081 int col = (fNum&1)*2;
00082 int row = (fNum/2)*2;
00083 fNum++;
00084 UInt_t uHintsNam = kLHintsCenterY | kLHintsFillX;
00085 TGTableLayoutHints *hi = new TGTableLayoutHints(col,col+1,row,row+1
00086 ,uHintsNam,10,10,10);
00087 fGarb->Add(hi);
00088
00089 fBar->AddFrame(tb,hi);
00090 Show();
00091 return tb;
00092 }
00093
00094
00095 public:
00096 StEventControlPanel()
00097 {
00098 fgChain = 0; fgDispMk=0; fgHlp = 0; fNum=0;
00099 fGarb = new TList;
00100 TClass *kl = gROOT->GetClass("StChain");
00101 if (kl && kl->GetClassInfo())
00102 {
00103 fgChain = StMaker::GetChain();
00104 fgDispMk = (StEventDisplayMaker*)fgChain->GetMaker("EventDisplay");
00105 }
00106
00107 Build();
00108 }
00109
00110
00111 void Build(){
00112
00113 const char *listEvents[] = {
00114 "dst/point" ,"dst/point(id_track,position[0]:position[1]:charge)",
00115 "dst/primtrk" ,"dst/primtrk" ,
00116 "dst/globtrk" ,"dst/globtrk" ,
00117 "dst/vertex" ,"dst/vertex(vtx_id,x:y:z)" ,
00118 "All Used Hits" ,"StEvent(All Used Hits)" ,
00119 "All Unused Hits" ,"StEvent(All Unused Hits)" ,
00120 "TPC Used Hits" ,"StEvent(Tpc Used Hits)" ,
00121 "TPC Unused Hits" ,"StEvent(Tpc Unused Hits)" ,
00122 "FTPC Used Hits" ,"StEvent(Ftpc Used Hits)" ,
00123 "FTPC Unused Hits" ,"StEvent(Ftpc Unused Hits)" ,
00124 "SVT Used Hits" ,"StEvent(Svt Used Hits)" ,
00125 "SVT Unused Hits" ,"StEvent(Svt Unused Hits)" ,
00126 "SSD Used Hits" ,"StEvent(Ssd Used Hits)" ,
00127 "SSD Unused Hits" ,"StEvent(Ssd Unused Hits)" ,
00128 "RICH Used Hits" ,"StEvent(Rich Used Hits)" ,
00129 "RICH Unused Hits" ,"StEvent(Rich Unused Hits)" ,
00130 "EMC Used Hits" ,"StEvent(Emc Used Hits)" ,
00131 "EMC Unused Hits" ,"StEvent(Emc Unused Hits)" ,
00132 "TOF Used Hits" ,"StEvent(Tof Used Hits)" ,
00133 "TOF Unused Hits" ,"StEvent(Tof Unused Hits)" ,
00134 "All Tracks", ,"StEvent(All Tracks)" ,
00135 "All Track Hits" ,"StEvent(All Track Hits)" ,
00136 "Primary Tracks" ,"StEvent(Primary Tracks)" ,
00137 "Primary Track Hits" ,"StEvent(Primary Track Hits)" ,
00138 "Kink Tracks" ,"StEvent(Kink Tracks)" ,
00139 "Kink Track Hits" ,"StEvent(Kink Track Hits)" ,
00140 "V0 Tracks" ,"StEvent(V0 Tracks)" ,
00141 "V0 Track Hits" ,"StEvent(V0 Track Hits)" ,
00142 "Xi Tracks" ,"StEvent(Xi Tracks)" ,
00143 "Xi Track Hits" ,"StEvent(Xi Track Hits)" ,
00144 0};
00145
00146 fBar = new TGMainFrame(gClient->GetRoot(), 250,550);
00147 fBar->SetWindowName("EventControl");
00148 TGTableLayout *lay = new TGTableLayout(fBar,40,4,0,0);
00149 fBar->SetLayoutManager(lay);
00150 fgBar = fBar;
00151
00152
00153
00154 int i;
00155 char cbuf[200];
00156 for (i=0;listEvents[i];i+=2) {
00157 TGTextButton *button = AddButt(listEvents[i],"");
00158 sprintf(cbuf,"StEventControlPanel::ToggleDisplayName(\"%s\",(TGTextButton*)%p)"
00159 ,listEvents[i+1],button);
00160 button->SetCommand(cbuf);
00161 }
00162
00163 AddButt("Show selections", "StEventControlPanel::PrintNames();");
00164 Refresh();
00165 Show();
00166 }
00167
00168 ~StEventControlPanel()
00169 {
00170 fGarb->Delete();
00171 delete fGarb;
00172 delete fBar;
00173 }
00174
00175
00176 static void PrintNames()
00177 {
00178 if (!fgDispMk) return;
00179 TList *tl = fgDispMk->GetNameList();
00180 if (!fgHlp) new StEventDisplayInfo(&fgHlp, "Draw Selections", 200, 100);
00181 TListIter nextOne(tl);
00182 TObject *n=0;
00183 int nk=0;
00184 while ((n=nextOne())) {
00185 if (nk) {fgHlp->AddText(n->GetName());}
00186 else {fgHlp->SetText(n->GetName());}
00187 nk=1;
00188 }
00189 fgHlp->Popup();
00190 }
00191
00192 void Refresh()
00193 {
00194 if (!fgDispMk) return;
00195 TList *tl = fgDispMk->GetNameList();
00196 if (!tl) return;
00197 TGButton *but=0;TObject *n=0;
00198 TList *frameList = fBar->GetList();
00199 TListIter nextFrame(frameList);
00200 TGFrameElement *fe=0;
00201 while ((fe=(TGFrameElement*)nextFrame())) {
00202 but = (TGButton*)fe->fFrame;
00203 TListIter nextOne(tl);
00204 while ((n=nextOne())) {
00205 if (strchr(n->GetName(),'(')==0) continue;
00206 if (strstr(but->GetCommand(),n->GetName())) break; }
00207 int state = (n) ? kButtonDown:kButtonUp;
00208 but->SetState(state);
00209 }
00210 Show();
00211 }
00212
00213 static void ToggleDisplayName(const char *name,TGTextButton *button)
00214 {
00215 if (!fgDispMk) return;
00216 TList *lis = fgDispMk->GetNameList();
00217 if (!lis || !(lis->FindObject(name))) {
00218 fgDispMk->AddName(name);
00219 button->SetState(kButtonDown);
00220 } else {
00221 fgDispMk->RemoveName(name);
00222 button->SetState(kButtonUp);
00223 }
00224 }
00225
00226 TGTextButton *AddFilter(TObject *filter)
00227 {
00228 char cbuf[100];
00229 sprintf(cbuf,"((StFilterABC*)%p)->Update();",filter);
00230 printf("AddFilter: %s::%s\n",filter->GetName(),cbuf);
00231 return AddButt(filter->GetName(), cbuf);
00232 }
00233
00234
00235
00236 void Show()
00237 {
00238
00239
00240 fBar->MapSubwindows();
00241 fBar->Layout();
00242
00243 fBar->MapWindow();
00244 fBar->MapRaised();
00245
00246 }
00247 };
00248
00249 StEventControlPanel __StEventControlPanel__;
00250
00251