/home/cern/BDSIM_new/utils/display/BDSPad.C

00001 /* Display for BDSIM code     
00002 Author: Olivier Dadoun, Laboratoire de l'Accelerateur Lineaire (LAL-IN2P3), Orsay (France)
00003 <mailto:> dadoun@lal.in2p3.fr, 2005
00004 Last modified 24.11.2005
00005 */
00006 #include <iostream>
00007 #include "BDSPad.h"
00008 #include "BDSCanvas.h"
00009 #include "BDSAxis.h"
00010 #include "BDSConstant.h"
00011 #include "BDSBox.h"
00012 #include "BDSPopUp.h" 
00013 
00014 ClassImp(BDSPad)
00015 
00016 Double_t BDSPad::xmin_axis;
00017 Double_t BDSPad::xmax_axis;
00018 
00019 using namespace std;
00020 
00021 Double_t Bdsaxis2Bdspad(Double_t axis_position, Double_t min, Double_t max)
00022 {
00023         Double_t deltaxis = max-min;
00024         return min+deltaxis*(axis_position-xmin_axis_position)/(xmax_axis_position-xmin_axis_position);
00025 }
00026 
00027 BDSPad::~BDSPad()
00028 {
00029         //      if(browser != NULL) delete browser;
00030         if(axis != NULL) delete axis;
00031 }
00032 
00033 BDSPad::BDSPad(BDSCanvas *_browser,const char* name, const char* title, Double_t xlow, Double_t ylow,
00034                            Double_t xup, Double_t yup, Color_t color)
00035 :TPad(name, title, xlow, ylow, xup, yup, color), browser(_browser)
00036 {
00037         axis = new BDSAxis(xmin_axis_position,y_axis_position,xmax_axis_position,y_axis_position,
00038                                                 BDSPad::get_xmin_axis(),BDSPad::get_xmax_axis(),bin_axis);
00039         
00040         axis->SetLabelSize(0.1);
00041         //axis->SetTitle("m");
00042         //axis->SetTitleSize(0.1);
00043         //axis->SetTitleOffset(0.3);
00044         this->Draw();
00045         this->cd();
00046         axis->Draw();
00047         this->AddExec("ex","BDSPad::BoxClicked()");
00048         //Clear all the default pop-up function...
00049         cl_line = this->GetAxis()->IsA();
00050         li_line = cl_line->GetMenuList();
00051         li_line->Clear();
00052         n_line = new TClassMenuItem(TClassMenuItem::kPopupUserFunction,cl_line,"BDSPad UnZoom","UnZoom",this,"");
00053         li_line->AddFirst(n_line);
00054         
00055 }
00056 
00057 void BDSPad::BoxClicked()
00058 {
00059         int event = gPad->GetEvent();
00060         
00061         if (event != 11) return; //may be comment this line 
00062         TObject *select = gPad->GetSelected();
00063         if (!select) return;
00064         if (!select->InheritsFrom("BDSBox")){return;}
00065         BDSBox *element = (BDSBox*)select;
00066         
00067         TString name= element->GetBDSBoxName();
00068         short type= element->GetBDSType();
00069         Float_t len = element->GetBDSLen(); 
00070         Float_t s=element->GetBDSX2();
00071         Float_t k0=element->GetBDSK0();
00072         Float_t k1=element->GetBDSK1();
00073         Float_t k2=element->GetBDSK2();
00074         Float_t k3=element->GetBDSK3();
00075         Float_t angle=element->GetBDSAngle();
00076         Float_t aper_x=element->GetAperX();
00077         Float_t aper_y=element->GetAperY();
00078         BDSPopUp *echo = new BDSPopUp(name,type,len,s,k0,k1,k2,k3,angle,aper_x,aper_y);
00079 }
00080 void BDSPad::ExecuteEvent(Int_t event, Int_t px, Int_t py)
00081 {
00082         py=py; //Only to avoid a warning from ROOT (unused parameter 'Int_t py')
00083         
00084         //This Function implante zoom and unzoom 
00085         // Both Pads are here correlated
00086         if (event == kButton1Down)
00087         {
00088                 // Sets first value
00089                 xmin = AbsPixeltoX(px);
00090 
00091                 //Draw the virtual box (always this in ROOT when you ZOOM )
00092                 px1old = px;
00093                 py1old = this->YtoAbsPixel(gPad->GetUymin());
00094                 px2old = px1old;
00095                 py2old = this->YtoAbsPixel(gPad->GetUymax());
00096                 gVirtualX->DrawBox(px1old, py1old, px2old, py2old, TVirtualX::kHollow);
00097                 gVirtualX->DrawBox(px1old, 169, px2old, 471, TVirtualX::kHollow);
00098                 gVirtualX->SetLineColor(-1);
00099                 
00100         }
00101         
00102         if(event == kButton1Motion)
00103         {
00104                 gVirtualX->DrawBox(px1old, py1old, px2old, py2old, TVirtualX::kHollow);
00105                 gVirtualX->DrawBox(px1old, 169, px2old, 471, TVirtualX::kHollow);
00106                 px2old = px;
00107                 gVirtualX->DrawBox(px1old, py1old, px2old, py2old, TVirtualX::kHollow); 
00108                 gVirtualX->DrawBox(px1old, 169, px2old, 471, TVirtualX::kHollow);
00109         }
00110         
00111         if(event == kButton1Up)
00112         {
00113                 // Sets the second value
00114                 xmax = AbsPixeltoX(px);
00115                 if (xmin > xmax) 
00116                 {
00117                         Double_t temp = xmin;
00118                         xmin   = xmax;
00119                         xmax   = temp;
00120                 }
00121                 
00122                 if(xmax - xmin > zoom_min)
00123                 {
00124                         // Avoid zooming outside the axis
00125                         if(xmin > xmin_axis_position && xmax < xmax_axis_position && xmax > xmin_axis_position)
00126                         {
00127                                 Double_t dmin = axis->GetWmin();
00128                                 Double_t dmax = axis->GetWmax();
00129                                 
00130                                 xmax = Bdsaxis2Bdspad(xmax, dmin, dmax);
00131                                 xmin = Bdsaxis2Bdspad(xmin, dmin, dmax);
00132                                 
00133                                 UpdateLine(xmin,xmax);
00134                                 //Modified(kTRUE);
00135                                 
00136                                 TH1F *ax = browser->GetHisto();
00137                                 if(ax)
00138                                 {
00139                                         ax->SetAxisRange(xmin,xmax);                            
00140                                         browser->GetPlot()->Modified(kTRUE);
00141                                         cout << "histo " << ax->GetBinLowEdge(ax->GetMinimumBin()) << " " << ax->GetMaximumBin() << endl;
00142                                 }
00143                                 TH2F   *ax2 = (TH2F*)browser->GetPlot()->GetPrimitive("temp");
00144             if(ax2)
00145                            {
00146                                         cout << "ntuple " << endl;
00147                                         ax2->SetAxisRange(xmin,xmax);
00148                                    browser->GetPlot()->Modified(kTRUE);
00149                                 }
00150                         browser->GetPlot()->Update();   
00151                         // change the min max value of the line for precision pb
00152                         UpdateLine(browser->GetPlot()->GetUxmin(),browser->GetPlot()->GetUxmax());
00153                         Modified(kTRUE);
00154                         }
00155                 }       
00156         }
00157         
00158         //Double Click = Unzoom
00159         if(event == 61 || event == 62 || event == 63 )
00160         {
00161                 UpdateLine(BDSPad::get_xmin_axis(),BDSPad::get_xmax_axis());
00162                 TH1F *ax = ((BDSCanvas*)gPad->GetCanvas())->GetHisto();
00163                 if(ax)
00164                 {
00165                         ax->SetAxisRange(BDSPad::get_xmin_axis(),BDSPad::get_xmax_axis());
00166                         gPad->Modified(kTRUE);
00167                         browser->GetPlot()->Modified(kTRUE);
00168                 }
00169                 
00170                 TH2F   *ax2 = (TH2F*)((BDSPad*)gPad->GetPrimitive("temp"));
00171            if(ax2)
00172                 {
00173                  ax2->SetAxisRange(BDSPad::get_xmin_axis(),BDSPad::get_xmax_axis());
00174        gPad->Modified(kTRUE);
00175        browser->GetPlot()->Modified(kTRUE);
00176                 }
00177         }
00178 }
00179 
00180 
00181 void BDSPad::UnZoom()
00182 {
00183         UpdateLine(BDSPad::get_xmin_axis(),BDSPad::get_xmax_axis());
00184         TH1F *ax = browser->GetHisto();
00185         if(ax)
00186         {
00187                 ax->SetAxisRange(BDSPad::get_xmin_axis(),BDSPad::get_xmax_axis());
00188                 browser->GetPlot()->Modified(kTRUE);
00189         }
00190         
00191         TH2F   *ax2 = (TH2F*)browser->GetPlot()->GetPrimitive("temp");
00192         if(ax2)
00193         {
00194                 ax2->SetAxisRange(BDSPad::get_xmin_axis(),BDSPad::get_xmax_axis());
00195                 browser->GetPlot()->Modified(kTRUE);
00196         }
00197 }
00198 
00199 void BDSPad::Begin()
00200 {
00201         xmax_axis = 0;
00202 }
00203 
00204 void BDSPad::AddBDSBox(Element _item, Double_t s)
00205 {
00206         Double_t y1=0.3;
00207         Double_t y2=0.7;
00208         Int_t fillcolor=17;
00209         Int_t linecolor=1;
00210         if(_item.type==_QUAD)
00211         {
00212         if((_item.k1)>0)
00213                 {
00214                         y1=0.2;
00215                         y2=0.49;
00216                 }
00217         else
00218                 {
00219                         y1=0.51;
00220                         y2=0.8;
00221                 }
00222         }
00223         
00224         if(_item.type==_ECOL || _item.type==_RCOL)
00225         {
00226         y1=0.2;
00227         y2=0.8;
00228         fillcolor=2;
00229         }
00230         
00231         BDSBox* box = new BDSBox(_item,y1,y2);
00232         box->SetBDSX2(s);
00233         box->SetFillColor(fillcolor);
00234         box->SetLineColor(linecolor);
00235         box->Update(this,axis->GetWmin(),axis->GetWmax());
00236         box->SetUniqueID(i);
00237         box_list.Add(box);
00238         i++;
00239 }
00240 
00241 void BDSPad::End()
00242 {
00243         TIterator *iter = box_list.MakeIterator();
00244         if(iter == NULL) return ;
00245         
00246         BDSBox *box;
00247         while((box = (BDSBox*)iter->Next()) != NULL)
00248         {
00249                 if(box->GetBDSX2() >  xmax_axis)  xmax_axis = box->GetBDSX2();
00250         }
00251         UpdateLine(xmin_axis,xmax_axis);
00252         cout << "Axis max: "<< xmax_axis << " m "<< endl;
00253 }
00254 
00255 void BDSPad::UpdateLine(Double_t xmin, Double_t xmax)
00256 {
00257         axis->SetWmin(xmin);
00258         axis->SetWmax(xmax);
00259         TIterator *iter = box_list.MakeIterator();
00260         if(iter == NULL) return ;
00261         BDSBox *box;
00262         
00263         while((box = (BDSBox*)iter->Next()) != NULL)
00264         {
00265                 box->Update(this,xmin,xmax);
00266         }
00267 }

Generated on Wed Mar 5 17:25:25 2008 for BDSIM by  doxygen 1.5.3