77 fDisplayAverage=kFALSE;
97 fAngularLabels=kFALSE;
99 fSegmentDisplay=kFALSE;
103 fCurrentEntries = NULL;
113 TSpider::TSpider(TTree* tree ,
const char *varexp,
const char *selection,
114 Option_t *option, Long64_t nentries, Long64_t firstentry)
115 : TAttFill(2,3003), TAttLine(1,1,1)
121 fSelector=
new TSelectorDraw();
122 fFormulas=
new TList();
124 fInput->Add(
new TNamed(
"varexp",
""));
125 fInput->Add(
new TNamed(
"selection",
""));
126 fSelector->SetInputList(fInput);
127 gROOT->GetListOfCleanups()->Add(
this);
130 fDisplayAverage=kFALSE;
138 fAngularLabels=kTRUE;
141 fSegmentDisplay=kFALSE;
142 if (firstentry < 0 || firstentry > tree->GetEstimate()) firstentry = 0;
143 fFirstEntry = firstentry;
144 if (nentries>0) fNentries = nentries;
145 else fNentries = nentries = tree->GetEstimate()-firstentry;
147 fEntry = fFirstEntry;
152 fTree->SetScanField(fNx*fNy);
153 fCurrentEntries =
new Long64_t[fNx*fNy];
154 for(ui=0;ui<fNx*fNy;++ui) fCurrentEntries[ui]=0;
156 TString opt = option;
158 if (opt.Contains(
"average")) fDisplayAverage=kTRUE;
159 if (opt.Contains(
"showrange")) fShowRange=kTRUE;
160 if (opt.Contains(
"segment")) fSegmentDisplay=kTRUE;
164 SetVariablesExpression(varexp);
165 SetSelectionExpression(selection);
167 InitVariables(firstentry,nentries);
175 delete [] fCurrentEntries;
181 delete [] fAverageSlices;
186 if(fSelect)
delete fSelect;
187 if(fSelector)
delete fSelector;
192 if(fMax)
delete [] fMax;
193 if(fMin)
delete [] fMin;
194 if(fAve)
delete [] fAve;
196 fSuperposed->Delete();
199 if (fCanvas) fCanvas->cd(0);
205 void TSpider::AddSuperposed(TSpider* sp)
207 if(!fSuperposed) fSuperposed=
new TList();
208 fSuperposed->Add(sp);
214 void TSpider::AddVariable(
const char* varexp)
216 if(!varexp[0])
return;
217 TTreeFormula *fvar =
new TTreeFormula(
"Var1",varexp,fTree);
218 if(fvar->GetNdim() <= 0)
return;
220 fFormulas->AddAfter(fFormulas->At(fNcols-1),fvar);
222 InitArrays(fNcols + 1);
227 Long64_t notSkipped=0;
229 Long64_t entryNumber;
230 Long64_t entry = fFirstEntry;
231 Int_t entriesToDisplay = fNentries;
232 while(entriesToDisplay!=0){
233 entryNumber = fTree->GetEntryNumber(entry);
234 if(entryNumber < 0)
break;
235 Long64_t localEntry = fTree->LoadTree(entryNumber);
236 if(localEntry < 0)
break;
237 if(tnumber != fTree->GetTreeNumber()) {
238 tnumber = fTree->GetTreeNumber();
239 if(fManager) fManager->UpdateFormulaLeaves();
241 for(Int_t i=0;i<=fFormulas->LastIndex();++i)
242 ((TTreeFormula*)fFormulas->At(i))->UpdateFormulaLeaves();
248 ndata = fManager->GetNdata(kTRUE);
250 for(ui=0;ui<fNcols;++ui){
251 if(ndata<((TTreeFormula*)fFormulas->At(ui))->GetNdata())
252 ndata = ((TTreeFormula*)fFormulas->At(ui))->GetNdata();
254 if(fSelect && fSelect->GetNdata() == 0)
259 Bool_t loaded = kFALSE;
260 Bool_t skip = kFALSE;
262 for(Int_t inst=0;inst<ndata;++inst){
264 if(fSelect->EvalInstance(inst) == 0){
272 ((TTreeFormula*)fFormulas->At(fNcols-1))->EvalInstance(0);
274 }
else if (inst == 0) {
279 fTree->LoadTree(entryNumber);
280 TTreeFormula* var = (TTreeFormula*)fFormulas->At(fNcols-1);
281 if(var->EvalInstance()>fMax[fNcols-1]) fMax[fNcols-1]=var->EvalInstance();
282 if(var->EvalInstance()<fMin[fNcols-1]) fMin[fNcols-1]=var->EvalInstance();
283 fAve[fNcols-1]+=var->EvalInstance();
289 if (notSkipped) fAve[fNcols-1]/=notSkipped;
298 lc = fAverageSlices[0]->GetLineColor();
299 lt = fAverageSlices[0]->GetLineStyle();
300 lw = fAverageSlices[0]->GetLineWidth();
301 fc = fAverageSlices[0]->GetFillColor();
302 fs = fAverageSlices[0]->GetFillStyle();
304 lc = fAveragePoly->GetLineColor();
305 lt = fAveragePoly->GetLineStyle();
306 lw = fAveragePoly->GetLineWidth();
307 fc = fAveragePoly->GetFillColor();
308 fs = fAveragePoly->GetFillStyle();
315 for(ui=0;ui<fNx*fNy;++ui) ((TList*)fPolyList->At(ui))->Delete();
316 if (fAverageSlices)
for(ui=0;ui<fNcols-1;++ui)
delete fAverageSlices[ui];
321 delete [] fAverageSlices;
322 fAverageSlices = NULL;
328 fCanvas->Divide(fNx,fNy);
333 for(ui = 0;ui<fNcols;++ui){
334 fAverageSlices[ui]->SetLineColor(lc);
335 fAverageSlices[ui]->SetLineStyle(lt);
336 fAverageSlices[ui]->SetLineWidth(lw);
337 fAverageSlices[ui]->SetFillColor(fc);
338 fAverageSlices[ui]->SetFillStyle(fs);
341 fAveragePoly->SetLineColor(lc);
342 fAveragePoly->SetLineStyle(lt);
343 fAveragePoly->SetLineWidth(lw);
344 fAveragePoly->SetFillColor(fc);
345 fAveragePoly->SetFillStyle(fs);
352 void TSpider::DeleteVariable(
const char* varexp)
357 if(fNcols == 2)
return;
358 for(ui=0; ui<fNcols;++ui){
359 if(!strcmp(varexp,((TTreeFormula*)fFormulas->At(ui))->GetTitle())) var = ui;
363 fFormulas->Remove(fFormulas->At(var));
366 for(ui=var+1;ui<fNcols;++ui){
367 fMin[ui-1] = fMin[ui];
368 fMax[ui-1] = fMax[ui];
369 fAve[ui-1] = fAve[ui];
371 fMin[fNcols-1] = DBL_MAX;
372 fMax[fNcols-1] = -DBL_MAX;
383 lc = fAverageSlices[0]->GetLineColor();
384 lt = fAverageSlices[0]->GetLineStyle();
385 lw = fAverageSlices[0]->GetLineWidth();
386 fc = fAverageSlices[0]->GetFillColor();
387 fs = fAverageSlices[0]->GetFillStyle();
389 lc = fAveragePoly->GetLineColor();
390 lt = fAveragePoly->GetLineStyle();
391 lw = fAveragePoly->GetLineWidth();
392 fc = fAveragePoly->GetFillColor();
393 fs = fAveragePoly->GetFillStyle();
400 for(ui=0;ui<fNx*fNy;++ui) ((TList*)fPolyList->At(ui))->Delete();
401 if (fAverageSlices)
for(ui=0;ui<=fNcols;++ui)
delete fAverageSlices[ui];
406 delete [] fAverageSlices;
407 fAverageSlices = NULL;
413 fCanvas->Divide(fNx,fNy);
416 if(fNcols == 2) SetSegmentDisplay(kTRUE);
419 for(ui = 0;ui<fNcols;++ui){
420 fAverageSlices[ui]->SetLineColor(lc);
421 fAverageSlices[ui]->SetLineStyle(lt);
422 fAverageSlices[ui]->SetLineWidth(lw);
423 fAverageSlices[ui]->SetFillColor(fc);
424 fAverageSlices[ui]->SetFillStyle(fs);
427 fAveragePoly->SetLineColor(lc);
428 fAveragePoly->SetLineStyle(lt);
429 fAveragePoly->SetLineWidth(lw);
430 fAveragePoly->SetFillColor(fc);
431 fAveragePoly->SetFillStyle(fs);
438 Int_t TSpider::DistancetoPrimitive(Int_t px, Int_t py)
440 if(!gPad)
return 9999;
442 xx=gPad->AbsPixeltoX(px);
443 yy=gPad->AbsPixeltoY(py);
453 void TSpider::Draw(Option_t *options)
457 gEnv->SetValue(
"Canvas.ShowEditor",1);
458 if(!gPad && !fCanvas){
459 fCanvas =
new TCanvas(
"screen",
"Spider Plot",fNx*256,fNy*256);
460 if (fCanvas) fCanvas->Divide(fNx,fNy);
462 fCanvas = (TCanvas*)gPad;
463 if (fCanvas) fCanvas->Divide(fNx,fNy);
465 if(fPolargram)
delete fPolargram;
466 fPolargram=
new TGraphPolargram(
"fPolargram");
467 fPolargram->SetNdivPolar(fNcols);
468 fPolargram->SetNdivRadial(0);
469 if (fCanvas) fCanvas->cd();
472 for(ui=0;ui<fNx*fNy;++ui){
473 if (fCanvas) fCanvas->cd(ui+1);
474 fPolargram->Draw(
"pn");
475 fTree->LoadTree(fCurrentEntries[ui]);
477 if(fDisplayAverage) DrawSlicesAverage(
"");
480 if(fDisplayAverage) DrawPolyAverage(
"");
485 if (fCanvas) fCanvas->Selected(fCanvas,
this,1);
491 void TSpider::DrawPolyAverage(Option_t* )
495 Int_t fillcolor=linecolor;
500 Double_t slice = 2*TMath::Pi()/fNcols;
501 Double_t *x =
new Double_t[fNcols+1];
502 Double_t *y =
new Double_t[fNcols+1];
504 for(ui=0;ui<fNcols;++ui){
505 x[ui]=(fAve[ui]-fMin[ui])/(fMax[ui]-fMin[ui])*TMath::Cos(ui*slice);
506 y[ui]=(fAve[ui]-fMin[ui])/(fMax[ui]-fMin[ui])*TMath::Sin(ui*slice);
508 x[fNcols]=(fAve[0]-fMin[0])/(fMax[0]-fMin[0]);
512 fAveragePoly =
new TPolyLine(fNcols+1,x,y);
513 fAveragePoly->SetLineColor(linecolor);
514 fAveragePoly->SetLineWidth(linewidth);
515 fAveragePoly->SetLineStyle(linestyle);
516 fAveragePoly->SetFillStyle(fillstyle);
517 fAveragePoly->SetFillColor(fillcolor);
519 fAveragePoly->Draw();
520 fAveragePoly->Draw(
"f");
529 void TSpider::DrawPoly(Option_t* )
531 if(!fPolyList) fPolyList =
new TList();
532 Double_t *x =
new Double_t[fNcols+1];
533 Double_t *y =
new Double_t[fNcols+1];
535 Double_t slice = 2*TMath::Pi()/fNcols;
536 for(UInt_t i=0;i<fNcols;++i){
537 x[i]=(((TTreeFormula*)fFormulas->At(i))->EvalInstance()-fMin[i])/(fMax[i]-fMin[i])*TMath::Cos(i*slice);
538 y[i]=(((TTreeFormula*)fFormulas->At(i))->EvalInstance()-fMin[i])/(fMax[i]-fMin[i])*TMath::Sin(i*slice);
540 x[fNcols]=(((TTreeFormula*)fFormulas->At(0))->EvalInstance()-fMin[0])/(fMax[0]-fMin[0]);
543 TPolyLine* poly=
new TPolyLine(fNcols+1,x,y);
544 poly->SetFillColor(GetFillColor());
545 poly->SetFillStyle(GetFillStyle());
546 poly->SetLineWidth(GetLineWidth());
547 poly->SetLineColor(GetLineColor());
548 poly->SetLineStyle(GetLineStyle());
551 fPolyList->Add(poly);
559 void TSpider::DrawSlices(Option_t* options)
563 Double_t angle = 2*TMath::Pi()/fNcols;
564 Double_t conv = 180.0/TMath::Pi();
566 if(!fPolyList) fPolyList =
new TList;
567 TList* li =
new TList();
568 for(ui=0;ui<fNcols;++ui){
569 Double_t r = (((TTreeFormula*)fFormulas->At(ui))->EvalInstance()-fMin[ui])/(fMax[ui]-fMin[ui]);
570 TArc* slice =
new TArc(0,0,r,(ui-0.25)*angle*conv,(ui+0.25)*angle*conv);
571 slice->SetFillColor(GetFillColor());
572 slice->SetFillStyle(GetFillStyle());
573 slice->SetLineWidth(GetLineWidth());
574 slice->SetLineColor(GetLineColor());
575 slice->SetLineStyle(GetLineStyle());
577 slice->Draw(options);
585 void TSpider::DrawSlicesAverage(Option_t* )
589 Int_t fillstyle=3002;
591 Int_t fillcolor=linecolor;
595 Double_t angle = 2*TMath::Pi()/fNcols;
596 Double_t conv = 180.0/TMath::Pi();
599 fAverageSlices =
new TArc*[fNcols];
600 for(ui=0;ui<fNcols;++ui){
601 Double_t r = (fAve[ui]-fMin[ui])/(fMax[ui]-fMin[ui]);
602 fAverageSlices[ui] =
new TArc(0,0,r,(ui-0.5)*angle*conv,(ui+0.5)*angle*conv);
603 fAverageSlices[ui]->SetFillColor(fillcolor);
604 fAverageSlices[ui]->SetFillStyle(fillstyle);
605 fAverageSlices[ui]->SetLineWidth(linewidth);
606 fAverageSlices[ui]->SetLineColor(linecolor);
607 fAverageSlices[ui]->SetLineStyle(linestyle);
610 for(ui=0;ui<fNcols;++ui) fAverageSlices[ui]->Draw();
616 Style_t TSpider::GetAverageLineStyle()
const
618 if(fAverageSlices)
return fAverageSlices[0]->GetLineStyle();
619 else if(fAveragePoly)
return fAveragePoly->GetLineStyle();
626 Color_t TSpider::GetAverageLineColor()
const
628 if(fAverageSlices)
return fAverageSlices[0]->GetLineColor();
629 else if(fAveragePoly)
return fAveragePoly->GetLineColor();
636 Width_t TSpider::GetAverageLineWidth()
const
638 if(fAverageSlices)
return fAverageSlices[0]->GetLineWidth();
639 else if(fAveragePoly)
return fAveragePoly->GetLineWidth();
646 Color_t TSpider::GetAverageFillColor()
const
648 if(fAverageSlices)
return fAverageSlices[0]->GetFillColor();
649 else if(fAveragePoly)
return fAveragePoly->GetFillColor();
656 Style_t TSpider::GetAverageFillStyle()
const
658 if(fAverageSlices)
return fAverageSlices[0]->GetFillStyle();
659 else if(fAveragePoly)
return fAveragePoly->GetFillStyle();
666 void TSpider::ExecuteEvent(Int_t ,Int_t , Int_t )
669 gPad->SetCursor(kHand);
675 Int_t TSpider::FindTextAlign(Double_t angle)
677 Double_t pi = TMath::Pi();
679 while(angle < 0 || angle > 2*pi){
680 if(angle < 0) angle+=2*pi;
681 if(angle > 2*pi) angle-=2*pi;
684 if(angle > 0 && angle < pi/2)
return 11;
685 else if(angle > pi/2 && angle < pi)
return 31;
686 else if(angle > pi && angle < 3*pi/2)
return 33;
687 else if(angle > 3*pi/2 && angle < 2*pi)
return 13;
688 else if(angle == 0 || angle == 2*pi)
return 12;
689 else if(angle == pi/2)
return 21;
690 else if(angle == pi)
return 32;
691 else if(angle == 3*pi/2)
return 23;
695 if(angle >= 0 && angle < pi)
return 21;
696 else if(angle >=pi && angle <= 2*pi)
return 23;
704 Double_t TSpider::FindTextAngle(Double_t angle)
706 Double_t pi = TMath::Pi();
707 Double_t convraddeg = 180.0/pi;
709 while(angle < 0 || angle > 2*pi){
710 if(angle < 0) angle+=2*pi;
711 if(angle > 2*pi) angle-=2*pi;
714 if(angle >= 0 && angle <= pi/2)
return angle*convraddeg - 90;
715 else if(angle > pi/2 && angle <= pi)
return (angle + pi)*convraddeg + 90;
716 else if(angle > pi && angle <= 3*pi/2)
return (angle - pi)*convraddeg - 90;
717 else if(angle > 3*pi/2 && angle <= 2*pi)
return angle*convraddeg + 90;
726 Long64_t TSpider::GetEntriesToProcess(Long64_t firstentry, Long64_t nentries)
const
728 Long64_t lastentry = firstentry + nentries - 1;
729 if (lastentry > fTree->GetEntriesFriend()-1) {
730 lastentry = fTree->GetEntriesFriend() - 1;
731 nentries = lastentry - firstentry + 1;
735 TEntryList *elist = fTree->GetEntryList();
736 if (elist && elist->GetN() < nentries) nentries = elist->GetN();
743 void TSpider::GotoEntry(Long64_t e)
745 if(e<fFirstEntry || e+fTree->GetScanField()>=fFirstEntry + fNentries)
return;
753 void TSpider::GotoNext()
755 if(fEntry + 2*fTree->GetScanField() -1 >= fFirstEntry + fNentries) fEntry = fFirstEntry;
756 else fEntry=fCurrentEntries[fTree->GetScanField()-1]+1;
763 void TSpider::GotoPrevious()
765 if(fEntry-fTree->GetScanField() < fFirstEntry) fEntry = fFirstEntry + fNentries -1 - fTree->GetScanField();
766 else fEntry -= fTree->GetScanField();
773 void TSpider::GotoFollowing()
775 if(fEntry + fTree->GetScanField() >= fFirstEntry + fNentries)
return;
783 void TSpider::GotoPreceding()
785 if(fEntry - 1 < fFirstEntry)
return;
793 void TSpider::InitArrays(Int_t newsize)
795 if(newsize>fArraySize){
798 Int_t old = fArraySize;
800 while(fArraySize<newsize) fArraySize*=2;
802 Double_t *memmax =
new Double_t[fArraySize];
803 Double_t *memmin =
new Double_t[fArraySize];
804 Double_t *memave =
new Double_t[fArraySize];
806 for(i=0;i<fArraySize;++i){
812 memmax[i] = -DBL_MAX;
831 void TSpider::InitVariables(Long64_t firstentry, Long64_t nentries)
836 fMax =
new Double_t [fArraySize];
837 fMin=
new Double_t [fArraySize];
838 fAve=
new Double_t [fArraySize];
840 for(i=0;i<fArraySize;++i){
846 Long64_t notSkipped=0;
848 Long64_t entryNumber;
849 Long64_t entry = firstentry;
850 Int_t entriesToDisplay = nentries;
851 while(entriesToDisplay!=0){
852 entryNumber = fTree->GetEntryNumber(entry);
853 if(entryNumber < 0)
break;
854 Long64_t localEntry = fTree->LoadTree(entryNumber);
855 if(localEntry < 0)
break;
856 if(tnumber != fTree->GetTreeNumber()) {
857 tnumber = fTree->GetTreeNumber();
858 if(fManager) fManager->UpdateFormulaLeaves();
860 for(i=0;i<=fFormulas->LastIndex();++i)
861 ((TTreeFormula*)fFormulas->At(i))->UpdateFormulaLeaves();
867 ndata = fManager->GetNdata(kTRUE);
869 for(ui=0;ui<fNcols;++ui){
870 if(ndata<((TTreeFormula*)fFormulas->At(ui))->GetNdata())
871 ndata = ((TTreeFormula*)fFormulas->At(ui))->GetNdata();
873 if(fSelect && fSelect->GetNdata() == 0)
877 Bool_t loaded = kFALSE;
878 Bool_t skip = kFALSE;
880 for(Int_t inst=0;inst<ndata;++inst){
882 if(fSelect->EvalInstance(inst) == 0){
890 for (ui=0;ui<fNcols;ui++) {
891 ((TTreeFormula*)fFormulas->At(ui))->EvalInstance(0);
894 }
else if (inst == 0) {
899 fTree->LoadTree(entryNumber);
900 for(ui=0;ui<fNcols;++ui){
901 Double_t inst = ((TTreeFormula*)fFormulas->At(ui))->EvalInstance();
902 if(inst > fMax[ui]) fMax[ui] = inst;
903 if(inst < fMin[ui]) fMin[ui] = inst;
911 if (notSkipped) {
for(ui=0;ui<fNcols;++ui) fAve[ui]/=notSkipped;}
917 void TSpider::Paint(Option_t* options)
920 TString opt = options;
922 if(opt.Contains(
"n"))
return;
924 Double_t slice = 2*TMath::Pi()/fNcols;
925 Double_t offset(1.0);
927 if (gPad) fCanvas = gPad->GetCanvas();
931 TLatex *txt =
new TLatex();
932 for(ui=0;ui<fNx*fNy;++ui){
933 txt->SetTextAlign(13);
934 if (fCanvas) fCanvas->cd(ui+1);
935 if (fCurrentEntries) {
936 txt->PaintLatex(-1.2,1.2,0,0.08,Form(
"#%d",(
int)fCurrentEntries[ui]));
938 txt->SetTextSize(0.035);
939 for(UInt_t var=0;var<fNcols;++var){
941 txt->SetTextAlign(FindTextAlign(var*slice));
942 offset = 1.09 + txt->GetTextSize();
943 txt->PaintLatex(offset*TMath::Cos(var*slice),offset*TMath::Sin(var*slice),
944 FindTextAngle(var*slice),0.035,fFormulas->At(var)->GetTitle());
946 txt->PaintLatex(offset*TMath::Cos(var*slice),offset*TMath::Sin(var*slice),
947 FindTextAngle(var*slice),0.035,Form(
"[%5.3f,%5.3f]",fMin[var],fMax[var]));
950 txt->SetTextAlign(FindTextAlign(var*slice));
951 if(var*slice >=0 && var*slice <= TMath::Pi()) offset =1.13 + txt->GetTextSize();
952 else offset = 1.09 + txt->GetTextSize();
953 txt->PaintLatex(offset*TMath::Cos(var*slice),offset*TMath::Sin(var*slice),
954 FindTextAngle(var*slice),0.035,fFormulas->At(var)->GetTitle());
964 void TSpider::SetAverageLineStyle(Style_t sty)
969 for(ui=0;ui<fNcols;++ui) fAverageSlices[ui]->SetLineStyle(sty);
970 }
else if(fAveragePoly) fAveragePoly->SetLineStyle(sty);
976 void TSpider::SetAverageLineColor(Color_t col)
981 for(ui=0;ui<fNcols;++ui) fAverageSlices[ui]->SetLineColor(col);
982 }
else if(fAveragePoly) fAveragePoly->SetLineColor(col);
988 void TSpider::SetAverageLineWidth(Width_t wid)
993 for(ui=0;ui<fNcols;++ui) fAverageSlices[ui]->SetLineWidth(wid);
994 }
else if(fAveragePoly) fAveragePoly->SetLineWidth(wid);
1000 void TSpider::SetAverageFillColor(Color_t col)
1005 for(ui=0;ui<fNcols;++ui) fAverageSlices[ui]->SetFillColor(col);
1006 }
else if(fAveragePoly) fAveragePoly->SetFillColor(col);
1012 void TSpider::SetAverageFillStyle(Style_t sty)
1017 for(ui=0;ui<fNcols;++ui) fAverageSlices[ui]->SetFillStyle(sty);
1018 }
else if(fAveragePoly) fAveragePoly->SetFillStyle(sty);
1024 void TSpider::SetDisplayAverage(Bool_t disp)
1026 if(disp == fDisplayAverage)
return;
1030 fDisplayAverage = disp;
1031 delete fAveragePoly;
1032 fAveragePoly = NULL;
1034 for(ui = 0;ui<fNcols;++ui)
delete fAverageSlices[ui];
1036 delete [] fAverageSlices;
1037 fAverageSlices = NULL;
1039 for(ui=0;ui<fNx*fNy;++ui){
1040 if (fCanvas) fCanvas->cd(ui+1);
1044 for(ui = 0; ui < fNx*fNy; ++ui){
1045 if (fCanvas) fCanvas->cd(ui+1);
1046 fPolargram->Draw(
"pn");
1047 fTree->LoadTree(fCurrentEntries[ui]);
1048 if(fSegmentDisplay){
1049 if(disp) DrawSlicesAverage(
"");
1052 if(disp) DrawPolyAverage(
"");
1058 fCanvas->Modified();
1066 void TSpider::SetCurrentEntries()
1071 Long64_t entryNumber;
1072 Long64_t entry = fEntry;
1073 Int_t entriesToDisplay = fTree->GetScanField();
1075 if(!fCurrentEntries) fCurrentEntries =
new Long64_t[fTree->GetScanField()];
1077 while(entriesToDisplay!=0){
1078 entryNumber = fTree->GetEntryNumber(entry);
1079 if(entryNumber < 0)
break;
1080 Long64_t localEntry = fTree->LoadTree(entryNumber);
1081 if(localEntry < 0)
break;
1082 if(tnumber != fTree->GetTreeNumber()) {
1083 tnumber = fTree->GetTreeNumber();
1084 if(fManager) fManager->UpdateFormulaLeaves();
1086 for(i=0;i<=fFormulas->LastIndex();++i)
1087 ((TTreeFormula*)fFormulas->At(i))->UpdateFormulaLeaves();
1093 ndata = fManager->GetNdata(kTRUE);
1095 for(ui=0;ui<fNcols;++ui){
1096 if(ndata < ((TTreeFormula*)fFormulas->At(ui))->GetNdata())
1097 ndata = ((TTreeFormula*)fFormulas->At(ui))->GetNdata();
1099 if(fSelect && fSelect->GetNdata() == 0)
1103 Bool_t loaded = kFALSE;
1104 Bool_t skip = kFALSE;
1106 for(Int_t inst=0;inst<ndata;++inst){
1108 if(fSelect->EvalInstance(inst) == 0){
1116 for (ui=0;ui<fNcols;ui++) {
1117 ((TTreeFormula*)fFormulas->At(ui))->EvalInstance(0);
1120 }
else if (inst == 0) {
1125 fCurrentEntries[fTree->GetScanField()-entriesToDisplay] = entryNumber;
1130 if(fPolyList) UpdateView();
1136 void TSpider::SetLineStyle(Style_t sty)
1140 TAttLine::SetLineStyle(sty);
1141 for(ui=0; ui<fNx*fNy;++ui){
1142 if(fSegmentDisplay){
1143 TList *li = (TList*)fPolyList->At(ui);
1144 for(UInt_t var=0;var<fNcols;++var) ((TArc*)li->At(var))->SetLineStyle(sty);
1145 }
else ((TPolyLine*)fPolyList->At(ui))->SetLineStyle(sty);
1152 void TSpider::SetLineColor(Color_t col)
1156 TAttLine::SetLineColor(col);
1157 for(ui=0; ui<fNx*fNy;++ui){
1158 if(fSegmentDisplay){
1159 TList *li = (TList*)fPolyList->At(ui);
1160 for(UInt_t var=0;var<fNcols;++var) ((TArc*)li->At(var))->SetLineColor(col);
1161 }
else ((TPolyLine*)fPolyList->At(ui))->SetLineColor(col);
1168 void TSpider::SetLineWidth(Width_t wid)
1172 TAttLine::SetLineWidth(wid);
1173 for(ui=0; ui<fNx*fNy;++ui){
1174 if(fSegmentDisplay){
1175 TList *li = (TList*)fPolyList->At(ui);
1176 for(UInt_t var=0;var<fNcols;++var) ((TArc*)li->At(var))->SetLineWidth(wid);
1177 }
else ((TPolyLine*)fPolyList->At(ui))->SetLineWidth(wid);
1184 void TSpider::SetFillColor(Color_t col)
1188 TAttFill::SetFillColor(col);
1189 for(ui=0; ui<fNx*fNy;++ui){
1190 if(fSegmentDisplay){
1191 TList *li = (TList*)fPolyList->At(ui);
1192 for(UInt_t var=0;var<fNcols;++var) ((TArc*)li->At(var))->SetFillColor(col);
1193 }
else ((TPolyLine*)fPolyList->At(ui))->SetFillColor(col);
1200 void TSpider::SetFillStyle(Style_t sty)
1204 TAttFill::SetFillStyle(sty);
1205 for(ui=0; ui<fNx*fNy;++ui){
1206 if(fSegmentDisplay){
1207 TList *li = (TList*)fPolyList->At(ui);
1208 for(UInt_t var=0;var<fNcols;++var) ((TArc*)li->At(var))->SetFillStyle(sty);
1209 }
else ((TPolyLine*)fPolyList->At(ui))->SetFillStyle(sty);
1216 void TSpider::SetNdivRadial(Int_t ndiv)
1218 if(fPolargram->GetNdivRadial() == ndiv)
return;
1219 fPolargram->SetNdivRadial(ndiv);
1225 void TSpider::SetNx(UInt_t nx)
1227 if(fNx == nx || nx <= 0)
return;
1228 fEntry = fCurrentEntries[0];
1237 lc = fAverageSlices[0]->GetLineColor();
1238 lt = fAverageSlices[0]->GetLineStyle();
1239 lw = fAverageSlices[0]->GetLineWidth();
1240 fc = fAverageSlices[0]->GetFillColor();
1241 fs = fAverageSlices[0]->GetFillStyle();
1243 lc = fAveragePoly->GetLineColor();
1244 lt = fAveragePoly->GetLineStyle();
1245 lw = fAveragePoly->GetLineWidth();
1246 fc = fAveragePoly->GetFillColor();
1247 fs = fAveragePoly->GetFillStyle();
1250 if(fSegmentDisplay){
1251 for(ui=0; ui<fNx*fNy;++ui) ((TList*)fPolyList->At(ui))->Delete();
1253 fPolyList->Delete();
1256 delete [] fCurrentEntries;
1257 fCurrentEntries = NULL;
1261 fTree->SetScanField(fNx*fNy);
1262 SetCurrentEntries();
1265 fCanvas->Divide(fNx,fNy);
1268 for(ui=0; ui < fNx*fNy;++ui){
1269 if (fCanvas) fCanvas->cd(ui+1);
1270 fPolargram->Draw(
"pn");
1271 fTree->LoadTree(fCurrentEntries[ui]);
1272 if(fSegmentDisplay){
1273 if(fDisplayAverage) DrawSlicesAverage(
"");
1276 if(fDisplayAverage) DrawPolyAverage(
"");
1283 for(ui = 0;ui<fNcols;++ui){
1284 fAverageSlices[ui]->SetLineColor(lc);
1285 fAverageSlices[ui]->SetLineStyle(lt);
1286 fAverageSlices[ui]->SetLineWidth(lw);
1287 fAverageSlices[ui]->SetFillColor(fc);
1288 fAverageSlices[ui]->SetFillStyle(fs);
1291 fAveragePoly->SetLineColor(lc);
1292 fAveragePoly->SetLineStyle(lt);
1293 fAveragePoly->SetLineWidth(lw);
1294 fAveragePoly->SetFillColor(fc);
1295 fAveragePoly->SetFillStyle(fs);
1302 void TSpider::SetNy(UInt_t ny)
1304 if(fNy == ny || ny <= 0)
return;
1305 fEntry = fCurrentEntries[0];
1314 lc = fAverageSlices[0]->GetLineColor();
1315 lt = fAverageSlices[0]->GetLineStyle();
1316 lw = fAverageSlices[0]->GetLineWidth();
1317 fc = fAverageSlices[0]->GetFillColor();
1318 fs = fAverageSlices[0]->GetFillStyle();
1320 lc = fAveragePoly->GetLineColor();
1321 lt = fAveragePoly->GetLineStyle();
1322 lw = fAveragePoly->GetLineWidth();
1323 fc = fAveragePoly->GetFillColor();
1324 fs = fAveragePoly->GetFillStyle();
1327 if(fSegmentDisplay){
1328 for(ui=0; ui<fNx*fNy;++ui) ((TList*)fPolyList->At(ui))->Delete();
1330 fPolyList->Delete();
1333 delete [] fCurrentEntries;
1334 fCurrentEntries = NULL;
1338 fTree->SetScanField(fNx*fNy);
1339 SetCurrentEntries();
1342 fCanvas->Divide(fNx,fNy);
1345 for(ui=0; ui < fNx*fNy;++ui){
1346 if (fCanvas) fCanvas->cd(ui+1);
1347 fPolargram->Draw(
"pn");
1348 fTree->LoadTree(fCurrentEntries[ui]);
1349 if(fSegmentDisplay){
1350 if(fDisplayAverage) DrawSlicesAverage(
"");
1353 if(fDisplayAverage) DrawPolyAverage(
"");
1360 for(ui = 0;ui<fNcols;++ui){
1361 fAverageSlices[ui]->SetLineColor(lc);
1362 fAverageSlices[ui]->SetLineStyle(lt);
1363 fAverageSlices[ui]->SetLineWidth(lw);
1364 fAverageSlices[ui]->SetFillColor(fc);
1365 fAverageSlices[ui]->SetFillStyle(fs);
1368 fAveragePoly->SetLineColor(lc);
1369 fAveragePoly->SetLineStyle(lt);
1370 fAveragePoly->SetLineWidth(lw);
1371 fAveragePoly->SetFillColor(fc);
1372 fAveragePoly->SetFillStyle(fs);
1379 void TSpider::SetSegmentDisplay(Bool_t seg)
1381 if(seg == fSegmentDisplay)
return;
1385 if(fSegmentDisplay){
1386 for(ui=0;ui<fNx*fNy;++ui){
1387 ((TList*)fPolyList->At(ui))->Delete();
1390 fPolyList->Delete();
1398 lc = fAverageSlices[0]->GetLineColor();
1399 lt = fAverageSlices[0]->GetLineStyle();
1400 lw = fAverageSlices[0]->GetLineWidth();
1401 fc = fAverageSlices[0]->GetFillColor();
1402 fs = fAverageSlices[0]->GetFillStyle();
1405 lc = fAveragePoly->GetLineColor();
1406 lt = fAveragePoly->GetLineStyle();
1407 lw = fAveragePoly->GetLineWidth();
1408 fc = fAveragePoly->GetFillColor();
1409 fs = fAveragePoly->GetFillStyle();
1416 for(ui=0;ui<fNcols;++ui)
delete fAverageSlices[ui];
1418 delete [] fAverageSlices;
1419 fAverageSlices = NULL;
1420 delete fAveragePoly;
1421 fAveragePoly = NULL;
1423 for(ui=0;ui<fNx*fNy;++ui){
1424 if (fCanvas) fCanvas->cd(ui+1);
1428 fSegmentDisplay = seg;
1430 for(ui=0; ui < fNx*fNy;++ui){
1431 if (fCanvas) fCanvas->cd(ui+1);
1432 fPolargram->Draw(
"pn");
1433 fTree->LoadTree(fCurrentEntries[ui]);
1434 if(fSegmentDisplay){
1435 if(fDisplayAverage) DrawSlicesAverage(
"");
1438 if(fDisplayAverage) DrawPolyAverage(
"");
1445 for(ui=0;ui<fNcols;++ui){
1446 fAverageSlices[ui]->SetLineColor(lc);
1447 fAverageSlices[ui]->SetLineStyle(lt);
1448 fAverageSlices[ui]->SetLineWidth(lw);
1449 fAverageSlices[ui]->SetFillColor(fc);
1450 fAverageSlices[ui]->SetFillStyle(fs);
1454 fAveragePoly->SetLineColor(lc);
1455 fAveragePoly->SetLineStyle(lt);
1456 fAveragePoly->SetLineWidth(lw);
1457 fAveragePoly->SetFillColor(fc);
1458 fAveragePoly->SetFillStyle(fs);
1462 fCanvas->Modified();
1470 void TSpider::SetSelectionExpression(
const char* selection)
1472 if (selection && strlen(selection)) {
1473 fSelect =
new TTreeFormula(
"Selection",selection,fTree);
1476 fFormulas->Add(fSelect);
1483 void TSpider::SetVariablesExpression(
const char* varexp)
1488 if (!varexp)
return;
1489 TObjArray *leaves = fTree->GetListOfLeaves();
1490 UInt_t nleaves = leaves->GetEntriesFast();
1491 if (nleaves < fNcols) fNcols = nleaves;
1492 nch = strlen(varexp);
1496 std::vector<TString> cnames;
1497 if (!strcmp(varexp,
"*")) { fNcols = nleaves; allvar = 1; }
1498 if (nch == 0 || allvar) {
1499 UInt_t ncs = fNcols;
1501 for (UInt_t ui=0;ui<ncs;++ui) {
1502 TLeaf *lf = (TLeaf*)leaves->At(ui);
1503 if (lf->GetBranch()->GetListOfBranches()->GetEntries() > 0)
continue;
1504 cnames.push_back(lf->GetName());
1509 fNcols = fSelector->SplitNames(varexp,cnames);
1513 for (UInt_t ui=0;ui<fNcols;ui++) {
1514 fFormulas->Add(
new TTreeFormula(
"Var1",cnames[ui].Data(),fTree));
1521 void TSpider::SyncFormulas()
1524 if (fFormulas->LastIndex()>=0) {
1526 if (fSelect->GetManager()->GetMultiplicity() > 0 ) {
1527 if(!fManager) fManager =
new TTreeFormulaManager;
1528 for(i=0;i<=fFormulas->LastIndex();i++) {
1529 fManager->Add((TTreeFormula*)fFormulas->At(i));
1534 for(i=0;i<=fFormulas->LastIndex();i++) {
1535 TTreeFormula *form = ((TTreeFormula*)fFormulas->At(i));
1536 switch( form->GetManager()->GetMultiplicity() ) {
1553 void TSpider::UpdateView()
1555 Double_t slice = 2*TMath::Pi()/fNcols;
1559 for(UInt_t pad=1;pad <= fNx*fNy;++pad){
1560 fTree->LoadTree(fCurrentEntries[pad-1]);
1561 for(UInt_t i=0;i<fNcols;++i){
1562 r = (((TTreeFormula*)fFormulas->At(i))->EvalInstance()-fMin[i])/(fMax[i]-fMin[i]);
1563 x=r*TMath::Cos(i*slice);
1564 y=r*TMath::Sin(i*slice);
1565 if(!fSegmentDisplay) ((TPolyLine*)fPolyList->At(pad-1))->SetPoint(i,x,y);
1567 ((TArc*)((TList*)fPolyList->At(pad-1))->At(i))->SetR1(r);
1568 ((TArc*)((TList*)fPolyList->At(pad-1))->At(i))->SetR2(r);
1571 x=(((TTreeFormula*)fFormulas->At(0))->EvalInstance()-fMin[0])/(fMax[0]-fMin[0]);
1573 if(!fSegmentDisplay) ((TPolyLine*)fPolyList->At(pad-1))->SetPoint(fNcols,x,y);