TFancyHistogramCanvas.cxx

Go to the documentation of this file.
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   // Construct the legend here, so that user can modify position immediately.
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 /// This is the complicated part, where we create a bunch of buttons and widgets.
00058 void TFancyHistogramCanvas::SetUpCompositeFrame(TGCompositeFrame *compFrame, TRootanaDisplay *display){
00059 
00060   /// Cached pointer to rootana display; needed so that we can 
00061   /// create new buttons with correct callbacks.
00062   fDisplay = display;
00063   
00064   // Now create my embedded canvas, along with the various buttons for this canvas.  
00065   // Sub-frame, to reduce space used
00066   fLabelframe = new TGHorizontalFrame(compFrame,200,40);
00067   compFrame->AddFrame(fLabelframe, new TGLayoutHints(kLHintsCenterX,2,2,2,2));
00068   
00069   // ________________________________________________________________________________
00070   // Add a button for the groups, if we are using groups
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     // Add call-backs to update plots if widget is used
00084     fGroupCounterButton->Connect("ValueSet(Long_t)", "TRootanaDisplay", display, "UpdatePlotsAction()");
00085     fGroupCounterButton->GetNumberEntry()->Connect("ReturnPressed()", "TRootanaDisplay", display, "UpdatePlotsAction()");
00086     
00087     // Add a label for channel selector    
00088     fLabelGroup = new TGLabel(hframe1, "");
00089     hframe1->AddFrame(fLabelGroup, new TGLayoutHints(kLHintsLeft , 1, 1, 1, 1));
00090     SetGroupName(fGroupName);
00091   }
00092 
00093   // ________________________________________________________________________________
00094   // Create the default set of widgets used for all display options: namely a counter
00095   // that keeps track of which channel to start from.
00096 
00097   // Sub-frame, to reduce space used
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   // Add call-backs to update plots if widget is used
00111   fChannelCounterButton->Connect("ValueSet(Long_t)", "TRootanaDisplay", display, "UpdatePlotsAction()");
00112   fChannelCounterButton->GetNumberEntry()->Connect("ReturnPressed()", "TRootanaDisplay", display, "UpdatePlotsAction()");
00113 
00114   // Add a label for channel selector
00115   fLabelChannels = new TGLabel(hframe2, "");
00116   hframe2->AddFrame(fLabelChannels, new TGLayoutHints(kLHintsLeft, 5, 5, 5, 5));
00117   SetChannelName(fChannelName);
00118 
00119   // ________________________________________________________________________________
00120   // Create a button to control whether to use multiple canvases
00121   fMultiCanvasButton = new TGCheckButton(fLabelframe, new TGHotString("Multi-Canvas"));
00122   fLabelframe->AddFrame(fMultiCanvasButton, new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 5));
00123 
00124   // Add call-backs to update plots if button is used; ensure both not all modes are simultaneously active
00125   fMultiCanvasButton->Connect("Toggled(Bool_t)", "TFancyHistogramCanvas", this, "ActivateMultiCanvasButton()");
00126   fMultiCanvasButton->Connect("Toggled(Bool_t)", "TRootanaDisplay", display, "UpdatePlotsAction()");
00127 
00128   /// Add the button group to control how many sub-canvases to plot.
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   // Create a button to control whether to overlay histograms in a single canvas
00146   fOverlayHistoButton  = new TGCheckButton(fLabelframe, new TGHotString("Overlay-Histo"));
00147   fLabelframe->AddFrame(fOverlayHistoButton, new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 5));
00148 
00149   // Add call-backs to update plots if button is used; ensure both not all modes are simultaneously active
00150   fOverlayHistoButton->Connect("Toggled(Bool_t)", "TFancyHistogramCanvas", this, "ActivateOverlayButton()");
00151   fOverlayHistoButton->Connect("Toggled(Bool_t)", "TRootanaDisplay", display, "UpdatePlotsAction()");
00152 
00153   /// Add the button to control how many histograns to plot to plot.
00154   
00155   // Sub-frame, to reduce space used
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   // Add call-backs to update plots if widget is used
00165   fNHistoButton->Connect("ValueSet(Long_t)", "TRootanaDisplay", display, "UpdatePlotsAction()");
00166   fNHistoButton->GetNumberEntry()->Connect("ReturnPressed()", "TRootanaDisplay", display, "UpdatePlotsAction()");
00167   fNHistoButton->SetState(false);
00168   // Add a label
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 /// Reset the histograms in fHistoArray.
00177 void TFancyHistogramCanvas::ResetCanvasHistograms(){
00178   for(unsigned int i = 0; i < fHistoArray->size(); i++)
00179     (*fHistoArray)[i]->Reset();
00180 }
00181   
00182 /// Update the histograms for this canvas.
00183 void TFancyHistogramCanvas::UpdateCanvasHistograms(TDataContainer& dataContainer){
00184 
00185   // If this variable is set, then skip calling the histogram updating;
00186   // histogram updating will happen elsewhere.
00187   if(fDisableAutoUpdate) return;
00188 
00189   fHistoArray->UpdateHistograms(dataContainer);
00190 }
00191   
00192 /// Plot the histograms for this canvas
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   // Choose the display pattern based on which buttons have been pushed.
00205 
00206   // Multiple canvas option
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()){ // Show multiple histograms on same canvas.
00237 
00238     int nhisto = fNHistoButton->GetNumberEntry()->GetIntNumber();
00239 
00240     // Kind of annoying; need to do two loops through the data in order to check which is 
00241     // the maximum histogram.
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     // find the maximum histogram;
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     // New loop again and draw as we go.
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{ // Default: single canvas, single histogram.
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 /// Take actions at begin run
00290 void TFancyHistogramCanvas::BeginRun(int transition,int run,int time){
00291   fHistoArray->BeginRun(transition, run, time);
00292 };
00293 
00294 /// Take actions at end run  
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); // Deactivate overlay button
00303     fNCanvasButtonGroup->SetState(true); // Enable the set of Ncanvas buttons
00304     fNHistoButton->SetState(false);
00305   }else{
00306     fNCanvasButtonGroup->SetState(false);// Disable the set of Ncanvas buttons
00307 
00308   }
00309 }
00310 void TFancyHistogramCanvas::ActivateOverlayButton(){
00311   if(fOverlayHistoButton->IsOn()){
00312     fMultiCanvasButton->SetDown(false); // Deactivate multi-canvas button
00313     fNCanvasButtonGroup->SetState(false); // Disable the set of Ncanvas buttons
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);//TGLabel
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);//TGLabel
00350 
00351 
00352 }

Generated on 12 Feb 2016 for ROOT Analyzer by  doxygen 1.6.1