00001 #include "TFancyHistogramCanvas.hxx"
00002
00003 #include "TMesytecData.hxx"
00004
00005 ClassImp(TFancyHistogramCanvas)
00006
00007 TFancyHistogramCanvas::TFancyHistogramCanvas(THistogramArrayBase* histoArray,
00008 std::string name, int numberChannelsInGroups,
00009 bool disableAutoUpdate):
00010 TCanvasHandleBase(name),
00011 fHistoArray(histoArray){
00012
00013 if(histoArray->GetNumberChannelsInGroup() != -1){
00014 fNumberChannelsInGroups = histoArray->GetNumberChannelsInGroup();
00015 }else if(numberChannelsInGroups > 1)
00016 fNumberChannelsInGroups = numberChannelsInGroups;
00017 else
00018 fNumberChannelsInGroups = -1;
00019
00020 fLabelframe = 0;
00021 fChannelCounterButton = 0;
00022 fLabelChannels = 0;
00023 fChannelName = "Histogram";
00024 if(histoArray->GetChannelName().compare("")!=0)
00025 fChannelName = histoArray->GetChannelName();
00026
00027 fGroupCounterButton = 0;
00028 fLabelGroup = 0;
00029 fGroupName = "Group";
00030 if(histoArray->GetGroupName().compare("")!=0)
00031 fGroupName = histoArray->GetGroupName();
00032
00033 fMultiCanvasButton = 0;
00034 fNCanvasButtonGroup =0;
00035 fNCanvasButtons[0]=0;
00036 fNCanvasButtons[1]=0;
00037 fNCanvasButtons[2]=0;
00038 fNCanvasButtons[3]=0;
00039 fOverlayHistoButton = 0;
00040 fNHistoButton = 0;
00041 labelNHisto = 0;
00042
00043
00044 fNHistoLegend = new TLegend(0.6,0.6,0.89,0.8);
00045 fNHistoLegend->SetFillColor(10);
00046
00047 fDisableAutoUpdate = disableAutoUpdate;
00048 if(histoArray->HasAutoUpdate())
00049 fDisableAutoUpdate = histoArray->GetDisableAutoUpdate();
00050
00051 }
00052
00053 TFancyHistogramCanvas::~TFancyHistogramCanvas(){
00054
00055 }
00056
00057
00058 void TFancyHistogramCanvas::SetUpCompositeFrame(TGCompositeFrame *compFrame, TRootanaDisplay *display){
00059
00060
00061
00062 fDisplay = display;
00063
00064
00065
00066 fLabelframe = new TGHorizontalFrame(compFrame,200,40);
00067 compFrame->AddFrame(fLabelframe, new TGLayoutHints(kLHintsCenterX,2,2,2,2));
00068
00069
00070
00071 if(fNumberChannelsInGroups > 1){
00072
00073 TGVerticalFrame *hframe1 = new TGVerticalFrame(fLabelframe, 120, 40, kFixedWidth);
00074 fLabelframe->AddFrame(hframe1, new TGLayoutHints(kLHintsLeft,2,2,2,2));
00075 int numberGroups = (int)(((double)fHistoArray->size())/((double)fNumberChannelsInGroups));
00076
00077 fGroupCounterButton = new TGNumberEntry(hframe1, 0, 9,999, TGNumberFormat::kNESInteger,
00078 TGNumberFormat::kNEANonNegative,
00079 TGNumberFormat::kNELLimitMinMax,
00080 0, numberGroups-1);
00081
00082 hframe1->AddFrame(fGroupCounterButton, new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1));
00083
00084 fGroupCounterButton->Connect("ValueSet(Long_t)", "TRootanaDisplay", display, "UpdatePlotsAction()");
00085 fGroupCounterButton->GetNumberEntry()->Connect("ReturnPressed()", "TRootanaDisplay", display, "UpdatePlotsAction()");
00086
00087
00088 fLabelGroup = new TGLabel(hframe1, "");
00089 hframe1->AddFrame(fLabelGroup, new TGLayoutHints(kLHintsLeft , 1, 1, 1, 1));
00090 SetGroupName(fGroupName);
00091 }
00092
00093
00094
00095
00096
00097
00098 TGVerticalFrame *hframe2 = new TGVerticalFrame(fLabelframe, 120, 40, kFixedWidth);
00099 fLabelframe->AddFrame(hframe2, new TGLayoutHints(kLHintsLeft,2,2,2,2));
00100 int numberChannels = fHistoArray->size();
00101 if(fNumberChannelsInGroups > 1){
00102 numberChannels = fNumberChannelsInGroups;
00103 }
00104 fChannelCounterButton = new TGNumberEntry(hframe2, 0, 9,999, TGNumberFormat::kNESInteger,
00105 TGNumberFormat::kNEANonNegative,
00106 TGNumberFormat::kNELLimitMinMax,
00107 0, numberChannels-1);
00108
00109 hframe2->AddFrame(fChannelCounterButton, new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1));
00110
00111 fChannelCounterButton->Connect("ValueSet(Long_t)", "TRootanaDisplay", display, "UpdatePlotsAction()");
00112 fChannelCounterButton->GetNumberEntry()->Connect("ReturnPressed()", "TRootanaDisplay", display, "UpdatePlotsAction()");
00113
00114
00115 fLabelChannels = new TGLabel(hframe2, "");
00116 hframe2->AddFrame(fLabelChannels, new TGLayoutHints(kLHintsLeft, 5, 5, 5, 5));
00117 SetChannelName(fChannelName);
00118
00119
00120
00121 fMultiCanvasButton = new TGCheckButton(fLabelframe, new TGHotString("Multi-Canvas"));
00122 fLabelframe->AddFrame(fMultiCanvasButton, new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 5));
00123
00124
00125 fMultiCanvasButton->Connect("Toggled(Bool_t)", "TFancyHistogramCanvas", this, "ActivateMultiCanvasButton()");
00126 fMultiCanvasButton->Connect("Toggled(Bool_t)", "TRootanaDisplay", display, "UpdatePlotsAction()");
00127
00128
00129 fNCanvasButtonGroup = new TGHButtonGroup(fLabelframe, "Number of Canvases:");
00130 fNCanvasButtons[0] = new TGRadioButton(fNCanvasButtonGroup, new TGHotString("2 | "),1);
00131 fNCanvasButtons[1] = new TGRadioButton(fNCanvasButtonGroup, new TGHotString("4 | "),2);
00132 fNCanvasButtons[2] = new TGRadioButton(fNCanvasButtonGroup, new TGHotString("8 | "),3);
00133 fNCanvasButtons[3] = new TGRadioButton(fNCanvasButtonGroup, new TGHotString("16 | "),4);
00134 fNCanvasButtons[0]->SetOn();
00135 for(int i = 0; i < 4; i++)
00136 fNCanvasButtons[i]->Connect("Toggled(Bool_t)", "TRootanaDisplay", fDisplay, "UpdatePlotsAction()");
00137
00138 fNCanvasButtonGroup->SetRadioButtonExclusive(kTRUE);
00139
00140 fNCanvasButtonGroup->Show();
00141 fLabelframe->AddFrame(fNCanvasButtonGroup, new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 5));
00142 fNCanvasButtonGroup->SetState(false);
00143
00144
00145
00146 fOverlayHistoButton = new TGCheckButton(fLabelframe, new TGHotString("Overlay-Histo"));
00147 fLabelframe->AddFrame(fOverlayHistoButton, new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 5));
00148
00149
00150 fOverlayHistoButton->Connect("Toggled(Bool_t)", "TFancyHistogramCanvas", this, "ActivateOverlayButton()");
00151 fOverlayHistoButton->Connect("Toggled(Bool_t)", "TRootanaDisplay", display, "UpdatePlotsAction()");
00152
00153
00154
00155
00156 TGVerticalFrame *hframe3 = new TGVerticalFrame(fLabelframe, 120, 40, kFixedWidth);
00157 fLabelframe->AddFrame(hframe3, new TGLayoutHints(kLHintsLeft,2,2,2,2));
00158
00159 fNHistoButton = new TGNumberEntry(hframe3, 2, 9,999, TGNumberFormat::kNESInteger,
00160 TGNumberFormat::kNEANonNegative,
00161 TGNumberFormat::kNELLimitMinMax,
00162 2, 20);
00163 hframe3->AddFrame(fNHistoButton, new TGLayoutHints(kLHintsLeft, 5, 5, 5, 5));
00164
00165 fNHistoButton->Connect("ValueSet(Long_t)", "TRootanaDisplay", display, "UpdatePlotsAction()");
00166 fNHistoButton->GetNumberEntry()->Connect("ReturnPressed()", "TRootanaDisplay", display, "UpdatePlotsAction()");
00167 fNHistoButton->SetState(false);
00168
00169 labelNHisto = new TGLabel(hframe3, "# Histo in Canvas");
00170 hframe3->AddFrame(labelNHisto, new TGLayoutHints(kLHintsLeft, 5, 5, 5, 5));
00171
00172 }
00173
00174
00175
00176
00177 void TFancyHistogramCanvas::ResetCanvasHistograms(){
00178 for(unsigned int i = 0; i < fHistoArray->size(); i++)
00179 (*fHistoArray)[i]->Reset();
00180 }
00181
00182
00183 void TFancyHistogramCanvas::UpdateCanvasHistograms(TDataContainer& dataContainer){
00184
00185
00186
00187 if(fDisableAutoUpdate) return;
00188
00189 fHistoArray->UpdateHistograms(dataContainer);
00190 }
00191
00192
00193 void TFancyHistogramCanvas::PlotCanvas(TDataContainer& dataContainer, TRootEmbeddedCanvas *embedCanvas){
00194
00195
00196 TCanvas* c1 = embedCanvas->GetCanvas();
00197 c1->Clear();
00198
00199 int channel = fChannelCounterButton->GetNumberEntry()->GetIntNumber();
00200 if(fNumberChannelsInGroups > 1)
00201 channel = fGroupCounterButton->GetNumberEntry()->GetIntNumber() * fNumberChannelsInGroups
00202 + fChannelCounterButton->GetNumberEntry()->GetIntNumber();
00203
00204
00205
00206
00207 if(fMultiCanvasButton->IsOn()){
00208
00209 int ncanvas = 1;
00210 if(fNCanvasButtons[0]->IsOn()){
00211 c1->Divide(1,2);
00212 ncanvas = 2;
00213 }
00214 if(fNCanvasButtons[1]->IsOn()){
00215 c1->Divide(2,2);
00216 ncanvas = 4;
00217 }
00218 if(fNCanvasButtons[2]->IsOn()){
00219 c1->Divide(2,4);
00220 ncanvas = 8;
00221 }
00222 if(fNCanvasButtons[3]->IsOn()){
00223 c1->Divide(4,4);
00224 ncanvas = 16;
00225 }
00226
00227 for(int i = 0; i < ncanvas; i++){
00228 c1->cd(i+1);
00229 int index = i + channel;
00230 if(index >=0 && index < (int)fHistoArray->size() && (*fHistoArray)[index]){
00231 (*fHistoArray)[index]->Draw();
00232 (*fHistoArray)[index]->SetLineColor(1);
00233 }
00234 }
00235
00236 }else if(fOverlayHistoButton->IsOn()){
00237
00238 int nhisto = fNHistoButton->GetNumberEntry()->GetIntNumber();
00239
00240
00241
00242 int first_channel = channel;
00243 int last_channel = channel + nhisto;
00244 if(last_channel > (int)fHistoArray->size())
00245 last_channel = fHistoArray->size();
00246
00247
00248 TH1 *max_histo = 0;
00249 for(int ichan = first_channel; ichan < last_channel; ichan++){
00250 if(max_histo == 0)
00251 max_histo = (*fHistoArray)[ichan];
00252 else if((*fHistoArray)[ichan]->GetMaximum() > max_histo->GetMaximum())
00253 max_histo = (*fHistoArray)[ichan];
00254
00255 }
00256
00257
00258 max_histo->Draw();
00259 fNHistoLegend->Clear();
00260 char name[100];
00261 for(int ichan = first_channel; ichan < last_channel; ichan++){
00262
00263 (*fHistoArray)[ichan]->SetLineColor(ichan-channel+1);
00264 sprintf(name,"Histogram # %i",ichan);
00265 fNHistoLegend->AddEntry((*fHistoArray)[ichan],(*fHistoArray)[ichan]->GetTitle());
00266
00267 if((*fHistoArray)[ichan] == max_histo) continue;
00268 (*fHistoArray)[ichan]->Draw("SAME");
00269 }
00270
00271 fNHistoLegend->Draw("SAME");
00272
00273 }else{
00274
00275
00276 if(channel >=0 && channel < (int) fHistoArray->size() && (*fHistoArray)[channel]){
00277 (*fHistoArray)[channel]->Draw();
00278 (*fHistoArray)[channel]->SetLineColor(1);
00279 }
00280
00281 }
00282 c1->Modified();
00283 c1->Update();
00284
00285 }
00286
00287
00288
00289
00290 void TFancyHistogramCanvas::BeginRun(int transition,int run,int time){
00291 fHistoArray->BeginRun(transition, run, time);
00292 };
00293
00294
00295 void TFancyHistogramCanvas::EndRun(int transition,int run,int time){
00296 fHistoArray->EndRun(transition, run, time);
00297 };
00298
00299
00300 void TFancyHistogramCanvas::ActivateMultiCanvasButton(){
00301 if(fMultiCanvasButton->IsOn()){
00302 fOverlayHistoButton->SetDown(false);
00303 fNCanvasButtonGroup->SetState(true);
00304 fNHistoButton->SetState(false);
00305 }else{
00306 fNCanvasButtonGroup->SetState(false);
00307
00308 }
00309 }
00310 void TFancyHistogramCanvas::ActivateOverlayButton(){
00311 if(fOverlayHistoButton->IsOn()){
00312 fMultiCanvasButton->SetDown(false);
00313 fNCanvasButtonGroup->SetState(false);
00314 fNHistoButton->SetState(true);
00315 }else{
00316 fNHistoButton->SetState(false);
00317 }
00318
00319
00320
00321 }
00322
00323
00324 void TFancyHistogramCanvas::SetGroupName(std::string groupName){
00325
00326 fGroupName = groupName;
00327
00328 if(!fLabelGroup) return;
00329 int numberGroups = (int)(((double)fHistoArray->size())/((double)fNumberChannelsInGroups));
00330 char tlabel[100];
00331 sprintf(tlabel,"%s# (0-%i)",groupName.c_str(),(int)numberGroups-1);
00332
00333 fLabelGroup->SetText(tlabel);
00334 }
00335
00336 void TFancyHistogramCanvas::SetChannelName(std::string channelName){
00337
00338 fChannelName = channelName;
00339
00340 if(!fLabelChannels) return;
00341 int numberChannels = fHistoArray->size();
00342 if(fNumberChannelsInGroups > 1){
00343 numberChannels = fNumberChannelsInGroups;
00344 }
00345
00346 char tlabel[100];
00347 sprintf(tlabel,"%s# (0-%i)",channelName.c_str(),(int)numberChannels-1);
00348
00349 fLabelChannels->SetText(tlabel);
00350
00351
00352 }