00001
00002
00003
00004
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
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
00042
00043
00044 this->Draw();
00045 this->cd();
00046 axis->Draw();
00047 this->AddExec("ex","BDSPad::BoxClicked()");
00048
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;
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;
00083
00084
00085
00086 if (event == kButton1Down)
00087 {
00088
00089 xmin = AbsPixeltoX(px);
00090
00091
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
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
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
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
00152 UpdateLine(browser->GetPlot()->GetUxmin(),browser->GetPlot()->GetUxmax());
00153 Modified(kTRUE);
00154 }
00155 }
00156 }
00157
00158
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 }