20 Double_t TCandle::fWhiskerRange = 1.0;
21 Double_t TCandle::fBoxRange = 0.5;
22 Bool_t TCandle::fScaledCandle =
false;
23 Bool_t TCandle::fScaledViolin =
true;
73 TCandle::TCandle(
const char *opt)
103 strlcpy(myopt,opt,128);
113 TCandle::TCandle(
const Double_t candlePos,
const Double_t candleWidth, Long64_t n, Double_t * points)
114 : TAttLine(), TAttFill(), TAttMarker()
127 fPosCandleAxis = candlePos;
128 fCandleWidth = candleWidth;
129 fHistoWidth = candleWidth;
130 fDatapoints = points;
141 sprintf(fOptionStr,
" ");
147 TCandle::TCandle(
const Double_t candlePos,
const Double_t candleWidth, TH1D *proj)
148 : TAttLine(), TAttFill(), TAttMarker()
161 fPosCandleAxis = candlePos;
162 fCandleWidth = candleWidth;
163 fHistoWidth = candleWidth;
175 sprintf(fOptionStr,
" ");
181 TCandle::~TCandle() {
182 if (fIsRaw && fProj)
delete fProj;
185 Bool_t TCandle::IsCandleScaled()
187 return fScaledCandle;
190 Bool_t TCandle::IsViolinScaled()
192 return fScaledViolin;
203 void TCandle::SetWhiskerRange(
const Double_t wRange) {
204 if (wRange < 0) fWhiskerRange = 0;
205 else if (wRange > 1) fWhiskerRange = 1;
206 else fWhiskerRange = wRange;
217 void TCandle::SetBoxRange(
const Double_t bRange) {
218 if (bRange < 0) fBoxRange = 0;
219 else if (bRange > 1) fBoxRange = 1;
220 else fBoxRange = bRange;
227 void TCandle::SetScaledCandle(
const Bool_t cScale) {
228 fScaledCandle = cScale;
236 void TCandle::SetScaledViolin(
const Bool_t vScale) {
237 fScaledViolin = vScale;
244 int TCandle::ParseOption(
char * opt) {
248 l = strstr(opt,
"CANDLE");
250 const CandleOption fallbackCandle = (CandleOption)(kBox + kMedianLine + kMeanCircle + kWhiskerAll + kAnchor);
252 char direction =
' ';
257 if (l[6] >=
'A' && l[6] <=
'Z') direction = l[6];
258 if (l[6] >=
'1' && l[6] <=
'9') preset = l[6];
259 if (l[7] >=
'A' && l[7] <=
'Z' && preset !=
' ') direction = l[7];
260 if (l[7] >=
'1' && l[7] <=
'9' && direction !=
' ') preset = l[7];
262 if (direction ==
'X' || direction ==
'V') { }
263 if (direction ==
'Y' || direction ==
'H') { fOption = (CandleOption)(fOption + kHorizontal); }
265 fOption = (CandleOption)(fOption + fallbackCandle);
266 else if (preset ==
'2')
267 fOption = (CandleOption)(fOption + kBox + kMeanLine + kMedianLine + kWhisker15 + kAnchor + kPointsOutliers);
268 else if (preset ==
'3')
269 fOption = (CandleOption)(fOption + kBox + kMeanCircle + kMedianLine + kWhisker15 + kAnchor + kPointsOutliers);
270 else if (preset ==
'4')
271 fOption = (CandleOption)(fOption + kBox + kMeanCircle + kMedianNotched + kWhisker15 + kAnchor + kPointsOutliers);
272 else if (preset ==
'5')
273 fOption = (CandleOption)(fOption + kBox + kMeanLine + kMedianLine + kWhisker15 + kAnchor + kPointsAll);
274 else if (preset ==
'6')
275 fOption = (CandleOption)(fOption + kBox + kMeanCircle + kMedianLine + kWhisker15 + kAnchor + kPointsAllScat);
276 else if (preset !=
' ')
277 fOption = (CandleOption)(fOption + fallbackCandle);
279 if (preset !=
' ' && direction !=
' ')
281 else if (preset !=
' ' || direction !=
' ')
286 Bool_t useIndivOption =
false;
288 if (direction ==
' ') direction =
'X';
290 char *brOpen = strstr(opt,
"(");
291 char *brClose = strstr(opt,
")");
292 char indivOption[32];
293 if (brOpen && brClose) {
294 useIndivOption =
true;
295 bool isHorizontal = IsHorizontal();
296 strlcpy(indivOption, brOpen, brClose-brOpen+2);
297 sscanf(indivOption,
"(%d)", (
int*) &fOption);
298 if (isHorizontal) {fOption = (CandleOption)(fOption + kHorizontal);}
299 memcpy(brOpen,
" ",brClose-brOpen+1);
301 sprintf(fOptionStr,
"CANDLE%c(%ld)",direction,(
long)fOption);
304 fOption = (CandleOption)(fOption + fallbackCandle);
307 sprintf(fOptionStr,
"CANDLE%c%c",direction,preset);
310 if (!useIndivOption && !fOption ) {
311 fOption = fallbackCandle;
312 sprintf(fOptionStr,
"CANDLE%c2",direction);
316 l = strstr(opt,
"VIOLIN");
318 const CandleOption fallbackCandle = (CandleOption)(kMeanCircle + kWhiskerAll + kHistoViolin + kHistoZeroIndicator);
320 char direction =
' ';
323 if (l[6] >=
'A' && l[6] <=
'Z') direction = l[6];
324 if (l[6] >=
'1' && l[6] <=
'9') preset = l[6];
325 if (l[7] >=
'A' && l[7] <=
'Z' && preset !=
' ') direction = l[7];
326 if (l[7] >=
'1' && l[7] <=
'9' && direction !=
' ') preset = l[7];
328 if (direction ==
'X' || direction ==
'V') { }
329 if (direction ==
'Y' || direction ==
'H') { fOption = (CandleOption)(fOption + kHorizontal); }
331 fOption = (CandleOption)(fOption + fallbackCandle);
332 else if (preset ==
'2')
333 fOption = (CandleOption)(fOption + kMeanCircle + kWhisker15 + kHistoViolin + kHistoZeroIndicator + kPointsOutliers);
334 else if (preset !=
' ')
335 fOption = (CandleOption)(fOption + fallbackCandle);
337 if (preset !=
' ' && direction !=
' ')
339 else if (preset !=
' ' || direction !=
' ')
344 Bool_t useIndivOption =
false;
346 if (direction ==
' ') direction =
'X';
348 char *brOpen = strstr(opt,
"(");
349 char *brClose = strstr(opt,
")");
350 char indivOption[32];
351 if (brOpen && brClose) {
352 useIndivOption =
true;
353 bool isHorizontal = IsHorizontal();
354 strlcpy(indivOption, brOpen, brClose-brOpen +2);
355 sscanf(indivOption,
"(%d)", (
int*) &fOption);
356 if (isHorizontal) {fOption = (CandleOption)(fOption + kHorizontal);}
357 memcpy(brOpen,
" ",brClose-brOpen+1);
359 sprintf(fOptionStr,
"VIOLIN%c(%ld)",direction,(
long)fOption);
363 fOption = (CandleOption)(fOption + fallbackCandle);
366 sprintf(fOptionStr,
"VIOLIN%c%c",direction,preset);
369 if (!useIndivOption && !fOption ) {
370 fOption = fallbackCandle;
371 sprintf(fOptionStr,
"VIOLIN%c1",direction);
375 fIsCalculated =
false;
385 void TCandle::Calculate() {
390 Bool_t swapXY = IsOption(kHorizontal);
391 Bool_t doLogY = (!(swapXY) && fLogY) || (swapXY && fLogX);
392 Bool_t doLogX = (!(swapXY) && fLogX) || (swapXY && fLogY);
393 Bool_t doLogZ = fLogZ;
397 Double_t max = -1e15;
400 Double_t *prob =
new Double_t[5];
402 if (fWhiskerRange >= 1) {
406 prob[0] = 0.5 - fWhiskerRange/2.;
407 prob[4] = 0.5 + fWhiskerRange/2.;
411 if (fBoxRange >= 1) {
415 prob[1] = 0.5 - fBoxRange/2.;
416 prob[3] = 0.5 + fBoxRange/2.;
420 Double_t *quantiles =
new Double_t[5];
421 quantiles[0]=0.; quantiles[1]=0.; quantiles[2] = 0.; quantiles[3] = 0.; quantiles[4] = 0.;
422 if (!fIsRaw && fProj) {
423 if (((IsOption(kHistoLeft)) || (IsOption(kHistoRight)) || (IsOption(kHistoViolin))) && fProj->GetNbinsX() > 500) {
428 int divideBy = ((fProj->GetNbinsX() - 1)/((kNMAXPOINTS-10)/4))+1;
429 fProj->RebinX(divideBy);
431 fProj->GetQuantiles(5, quantiles, prob);
433 TMath::Quantiles(fNDatapoints,5,fDatapoints,quantiles,prob,kFALSE);
438 if (quantiles[0] >= quantiles[4] ||
439 quantiles[1] >= quantiles[3]) {
446 fBoxUp = quantiles[3];
447 fBoxDown = quantiles[1];
448 fWhiskerUp = quantiles[4];
449 fWhiskerDown = quantiles[0];
450 fMedian = quantiles[2];
451 Double_t iqr = fBoxUp-fBoxDown;
454 if (IsOption(kWhisker15)) {
455 if (!fIsRaw && fProj) {
456 int bin = fProj->FindBin(fBoxDown-1.5*iqr);
458 while (fProj->GetBinContent(bin) == 0 && bin <= fProj->GetNbinsX()) bin++;
459 fWhiskerDown = fProj->GetBinCenter(bin);
461 bin = fProj->FindBin(fBoxUp+1.5*iqr);
462 while (fProj->GetBinContent(bin) == 0 && bin >= 1) bin--;
463 fWhiskerUp = fProj->GetBinCenter(bin);
465 fWhiskerUp = fBoxDown;
466 fWhiskerDown = fBoxUp;
469 for (Long64_t i = 0; i < fNDatapoints; ++i) {
470 Double_t myData = fDatapoints[i];
471 if (myData > fWhiskerUp && myData <= fBoxUp + 1.5*iqr) fWhiskerUp = myData;
472 if (myData < fWhiskerDown && myData >= fBoxDown - 1.5*iqr) fWhiskerDown = myData;
477 if (!fIsRaw && fProj) {
478 fMean = fProj->GetMean();
479 fMedianErr = 1.57*iqr/sqrt(fProj->GetEntries());
480 fAxisMin = fProj->GetXaxis()->GetXmin();
481 fAxisMax = fProj->GetXaxis()->GetXmax();
485 for (Long64_t i = 0; i < fNDatapoints; ++i) {
486 fMean += fDatapoints[i];
487 if (fDatapoints[i] < min) min = fDatapoints[i];
488 if (fDatapoints[i] > max) max = fDatapoints[i];
489 if (fDatapoints[i] < fWhiskerDown || fDatapoints[i] > fWhiskerUp) nOutliers++;
491 fMean /= fNDatapoints;
492 fMedianErr = 1.57*iqr/sqrt(fNDatapoints);
499 if (GetCandleOption(5) > 0) {
501 const int maxOutliers = kNMAXPOINTS;
502 Double_t myScale = 1.;
503 if (!fIsRaw && fProj) {
504 if (fProj->GetEntries() > maxOutliers/2) myScale = fProj->GetEntries()/(maxOutliers/2.);
506 for (
int bin = 0; bin < fProj->GetNbinsX(); bin++) {
508 if (fProj->GetBinContent(bin) > 0 && (fProj->GetBinCenter(bin) < fWhiskerDown || fProj->GetBinCenter(bin) > fWhiskerUp || (GetCandleOption(5) > 1)) ) {
509 Double_t scaledBinContent = fProj->GetBinContent(bin)/myScale;
510 if (scaledBinContent >0 && scaledBinContent < 1) scaledBinContent = 1;
511 for (
int j=0; j < (int)scaledBinContent; j++) {
512 if (fNDrawPoints > maxOutliers)
break;
513 if (IsOption(kPointsAllScat)) {
514 fDrawPointsX[fNDrawPoints] = fPosCandleAxis - fCandleWidth/2. + fCandleWidth*random.Rndm();
515 fDrawPointsY[fNDrawPoints] = fProj->GetBinLowEdge(bin) + fProj->GetBinWidth(bin)*random.Rndm();
517 fDrawPointsX[fNDrawPoints] = fPosCandleAxis;
518 if ((
int)scaledBinContent == 1)
519 fDrawPointsY[fNDrawPoints] = fProj->GetBinCenter(bin);
521 fDrawPointsY[fNDrawPoints] = fProj->GetBinLowEdge(bin) + fProj->GetBinWidth(bin)*random.Rndm();
525 Double_t keepCurrently;
526 keepCurrently = fDrawPointsX[fNDrawPoints];
527 fDrawPointsX[fNDrawPoints] = fDrawPointsY[fNDrawPoints];
528 fDrawPointsY[fNDrawPoints] = keepCurrently;
532 if (fDrawPointsX[fNDrawPoints] > 0) fDrawPointsX[fNDrawPoints] = TMath::Log10(fDrawPointsX[fNDrawPoints]);
else continue;
535 if (fDrawPointsY[fNDrawPoints] > 0) fDrawPointsY[fNDrawPoints] = TMath::Log10(fDrawPointsY[fNDrawPoints]);
else continue;
540 if (fNDrawPoints > maxOutliers) {
541 Error (
"PaintCandlePlot",
"Not possible to draw all outliers.");
547 if (IsOption(kPointsOutliers) && nOutliers > maxOutliers/2) {
548 myScale = nOutliers/(maxOutliers/2.);
550 if (fNDatapoints > maxOutliers/2) myScale = fNDatapoints/(maxOutliers/2.);
553 for (
int i = 0; i < fNDatapoints; i++ ) {
554 Double_t myData = fDatapoints[i];
555 Double_t maxScatter = (fWhiskerUp-fWhiskerDown)/100;
556 if (!(i % (
int) myScale == 0 ))
continue;
558 if (myData < fWhiskerDown || myData > fWhiskerUp || (GetCandleOption(5) > 1)) {
559 if (IsOption(kPointsAllScat)) {
560 fDrawPointsX[fNDrawPoints] = fPosCandleAxis - fCandleWidth/2. + fCandleWidth*random.Rndm();
561 fDrawPointsY[fNDrawPoints] = myData + (random.Rndm() - 0.5)*maxScatter;
563 fDrawPointsX[fNDrawPoints] = fPosCandleAxis;
564 fDrawPointsY[fNDrawPoints] = myData + (random.Rndm() - 0.5)*maxScatter;
568 Double_t keepCurrently;
569 keepCurrently = fDrawPointsX[fNDrawPoints];
570 fDrawPointsX[fNDrawPoints] = fDrawPointsY[fNDrawPoints];
571 fDrawPointsY[fNDrawPoints] = keepCurrently;
575 if (fDrawPointsX[fNDrawPoints] > 0) fDrawPointsX[fNDrawPoints] = TMath::Log10(fDrawPointsX[fNDrawPoints]);
579 if (fDrawPointsY[fNDrawPoints] > 0) fDrawPointsY[fNDrawPoints] = TMath::Log10(fDrawPointsY[fNDrawPoints]);
583 if (fNDrawPoints > maxOutliers) {
584 Error (
"PaintCandlePlotRaw",
"Not possible to draw all outliers.");
591 if (IsOption(kHistoRight) || IsOption(kHistoLeft) || IsOption(kHistoViolin)) {
595 fProj =
new TH1D(
"hpa",
"hpa",100,min,max+0.0001*(max-min));
596 for (Long64_t i = 0; i < fNDatapoints; ++i) {
597 fProj->Fill(fDatapoints[i]);
603 Double_t maxContent = fProj->GetMaximum();
604 Double_t maxHistoHeight = fHistoWidth;
605 if (IsOption(kHistoViolin)) maxHistoHeight *= 0.5;
609 for (
int bin = 1; bin <= fProj->GetNbinsX(); bin++) {
611 if (fProj->GetBinContent(bin) > 0) {
612 fHistoPointsX[fNHistoPoints] = fPosCandleAxis;
613 fHistoPointsY[fNHistoPoints] = fProj->GetBinLowEdge(bin);
615 if (fHistoPointsX[fNHistoPoints] > 0) fHistoPointsX[fNHistoPoints] = TMath::Log10(fHistoPointsX[fNHistoPoints]);
else continue;
618 if (fHistoPointsY[fNHistoPoints] > 0) fHistoPointsY[fNHistoPoints] = TMath::Log10(fHistoPointsY[fNHistoPoints]);
else continue;
627 Double_t myBinValue = fProj->GetBinContent(bin);
629 if (myBinValue > 0) myBinValue = TMath::Log10(myBinValue);
else myBinValue = 0;
631 fHistoPointsX[fNHistoPoints] = fPosCandleAxis + myBinValue/maxContent*maxHistoHeight;
632 fHistoPointsY[fNHistoPoints] = fProj->GetBinLowEdge(bin);
634 fHistoPointsX[fNHistoPoints] = fPosCandleAxis + myBinValue/maxContent*maxHistoHeight;
635 fHistoPointsY[fNHistoPoints] = fProj->GetBinLowEdge(bin)+fProj->GetBinWidth(bin);
637 if (fHistoPointsX[fNHistoPoints -1] > 0) fHistoPointsX[fNHistoPoints - 1] = TMath::Log10(fHistoPointsX[fNHistoPoints - 1]);
else continue;
638 if (fHistoPointsX[fNHistoPoints] > 0) fHistoPointsX[fNHistoPoints] = TMath::Log10(fHistoPointsX[fNHistoPoints]);
else continue;
641 if (fHistoPointsY[fNHistoPoints -1] > 0) fHistoPointsY[fNHistoPoints - 1] = TMath::Log10(fHistoPointsY[fNHistoPoints - 1]);
else continue;
642 if (fHistoPointsY[fNHistoPoints] > 0) fHistoPointsY[fNHistoPoints] = TMath::Log10(fHistoPointsY[fNHistoPoints]);
else continue;
646 if (fProj->GetBinContent(bin) > 0) lastNonZero = fNHistoPoints;
649 fHistoPointsX[fNHistoPoints] = fPosCandleAxis;
650 fHistoPointsY[fNHistoPoints] = fHistoPointsY[fNHistoPoints-1];
651 fNHistoPoints = lastNonZero+1;
653 if (IsOption(kHistoLeft)) {
654 for (
int i = 0; i < fNHistoPoints; i++) {
655 fHistoPointsX[i] = 2*fPosCandleAxis - fHistoPointsX[i];
658 if (IsOption(kHistoViolin)) {
659 for (
int i = 0; i < fNHistoPoints; i++) {
660 fHistoPointsX[fNHistoPoints + i] = 2*fPosCandleAxis - fHistoPointsX[fNHistoPoints -i-1];
661 fHistoPointsY[fNHistoPoints + i] = fHistoPointsY[fNHistoPoints -i-1];
668 fIsCalculated =
true;
674 void TCandle::Paint(Option_t *)
677 if (!fIsCalculated) Calculate();
680 Style_t saveLine = GetLineStyle();
681 Style_t saveMarker = GetMarkerStyle();
682 Style_t saveFillStyle = GetFillStyle();
683 Style_t saveFillColor = GetFillColor();
684 Style_t saveLineColor = GetLineColor();
686 Double_t dimLeft = fPosCandleAxis-0.5*fCandleWidth;
687 Double_t dimRight = fPosCandleAxis+0.5*fCandleWidth;
691 TAttMarker::Modify();
693 Bool_t swapXY = IsOption(kHorizontal);
694 Bool_t doLogY = (!(swapXY) && fLogY) || (swapXY && fLogX);
695 Bool_t doLogX = (!(swapXY) && fLogX) || (swapXY && fLogY);
699 if (IsOption(kHistoZeroIndicator)) {
700 SetLineColor(saveFillColor);
702 PaintLine(fPosCandleAxis, fAxisMin, fPosCandleAxis, fAxisMax, swapXY);
703 SetLineColor(saveLineColor);
708 if (IsOption(kHistoRight) || IsOption(kHistoLeft) || IsOption(kHistoViolin)) {
709 if (IsOption(kHistoZeroIndicator) && (saveFillStyle != 0)) {
710 SetLineColor(saveFillColor);
714 gPad->PaintFillArea(fNHistoPoints, fHistoPointsX, fHistoPointsY);
715 gPad->PaintPolyLine(fNHistoPoints, fHistoPointsX, fHistoPointsY);
717 gPad->PaintFillArea(fNHistoPoints, fHistoPointsY, fHistoPointsX);
718 gPad->PaintPolyLine(fNHistoPoints, fHistoPointsY, fHistoPointsX);
720 if (IsOption(kHistoZeroIndicator) && (saveFillStyle != 0)) {
721 SetLineColor(saveLineColor);
726 if (IsOption(kBox)) {
727 if (IsOption(kMedianNotched)) {
728 Double_t x[] = {dimLeft, dimLeft, dimLeft+fCandleWidth/3., dimLeft, dimLeft, dimRight,
729 dimRight, dimRight-fCandleWidth/3., dimRight, dimRight, dimLeft};
730 Double_t y[] = {fBoxDown, fMedian-fMedianErr, fMedian, fMedian+fMedianErr, fBoxUp, fBoxUp,
731 fMedian+fMedianErr, fMedian, fMedian-fMedianErr, fBoxDown, fBoxDown};
732 PaintBox(11, x, y, swapXY);
734 Double_t x[] = {dimLeft, dimLeft, dimRight, dimRight, dimLeft};
735 Double_t y[] = {fBoxDown, fBoxUp, fBoxUp, fBoxDown, fBoxDown};
736 PaintBox(5, x, y, swapXY);
740 if (IsOption(kAnchor)) {
741 PaintLine(dimLeft, fWhiskerUp, dimRight, fWhiskerUp, swapXY);
742 PaintLine(dimLeft, fWhiskerDown, dimRight, fWhiskerDown, swapXY);
745 if (IsOption(kWhiskerAll) && !IsOption(kHistoZeroIndicator)) {
748 PaintLine(fPosCandleAxis, fWhiskerUp, fPosCandleAxis, fBoxUp, swapXY);
749 PaintLine(fPosCandleAxis, fBoxDown, fPosCandleAxis, fWhiskerDown, swapXY);
750 SetLineStyle(saveLine);
752 }
else if ((IsOption(kWhiskerAll) && IsOption(kHistoZeroIndicator)) || IsOption(kWhisker15) ) {
753 PaintLine(fPosCandleAxis, fWhiskerUp, fPosCandleAxis, fBoxUp, swapXY);
754 PaintLine(fPosCandleAxis, fBoxDown, fPosCandleAxis, fWhiskerDown, swapXY);
757 if (IsOption(kMedianLine)) {
758 PaintLine(dimLeft, fMedian, dimRight, fMedian, swapXY);
759 }
else if (IsOption(kMedianNotched)) {
760 PaintLine(dimLeft+fCandleWidth/3, fMedian, dimRight-fCandleWidth/3., fMedian, swapXY);
761 }
else if (IsOption(kMedianCircle)) {
762 Double_t myMedianX[1], myMedianY[1];
764 myMedianX[0] = fPosCandleAxis;
765 myMedianY[0] = fMedian;
767 myMedianX[0] = fMedian;
768 myMedianY[0] = fPosCandleAxis;
771 Bool_t isValid =
true;
773 if (myMedianX[0] > 0) myMedianX[0] = TMath::Log10(myMedianX[0]);
else isValid =
false;
776 if (myMedianY[0] > 0) myMedianY[0] = TMath::Log10(myMedianY[0]);
else isValid =
false;
780 TAttMarker::Modify();
782 if (isValid) gPad->PaintPolyMarker(1,myMedianX,myMedianY);
784 SetMarkerStyle(saveMarker);
785 TAttMarker::Modify();
789 if (IsOption(kMeanCircle)) {
790 Double_t myMeanX[1], myMeanY[1];
792 myMeanX[0] = fPosCandleAxis;
796 myMeanY[0] = fPosCandleAxis;
799 Bool_t isValid =
true;
801 if (myMeanX[0] > 0) myMeanX[0] = TMath::Log10(myMeanX[0]);
else isValid =
false;
804 if (myMeanY[0] > 0) myMeanY[0] = TMath::Log10(myMeanY[0]);
else isValid =
false;
808 TAttMarker::Modify();
810 if (isValid) gPad->PaintPolyMarker(1,myMeanX,myMeanY);
812 SetMarkerStyle(saveMarker);
813 TAttMarker::Modify();
815 }
else if (IsOption(kMeanLine)) {
819 PaintLine(dimLeft, fMean, dimRight, fMean, swapXY);
820 SetLineStyle(saveLine);
825 if (IsOption(kAnchor)) {
826 PaintLine(dimLeft, fWhiskerDown, dimRight, fWhiskerDown, swapXY);
827 PaintLine(dimLeft, fWhiskerUp, dimRight, fWhiskerUp, swapXY);
835 if (GetCandleOption(5) > 0) {
836 if (IsOption(kPointsAllScat)) {
841 TAttMarker::Modify();
842 gPad->PaintPolyMarker(fNDrawPoints,fDrawPointsX, fDrawPointsY);
849 bool TCandle::IsOption(CandleOption opt) {
852 for (pos = 0; pos < 16; pos++) {
853 if (myOpt > opt)
break;
857 int thisOpt = GetCandleOption(pos);
859 return ((thisOpt * myOpt) == opt);
865 void TCandle::PaintBox(Int_t nPoints, Double_t *x, Double_t *y, Bool_t swapXY)
867 Bool_t doLogY = (!(swapXY) && fLogY) || (swapXY && fLogX);
868 Bool_t doLogX = (!(swapXY) && fLogX) || (swapXY && fLogY);
870 for (
int i=0; i<nPoints; i++) {
871 if (y[i] > 0) y[i] = TMath::Log10(y[i]);
876 for (
int i=0; i<nPoints; i++) {
877 if (x[i] > 0) x[i] = TMath::Log10(x[i]);
882 gPad->PaintFillArea(nPoints, x, y);
883 gPad->PaintPolyLine(nPoints, x, y);
885 gPad->PaintFillArea(nPoints, y, x);
886 gPad->PaintPolyLine(nPoints, y, x);
893 void TCandle::PaintLine(Double_t x1, Double_t y1, Double_t x2, Double_t y2, Bool_t swapXY)
895 Bool_t doLogY = (!(swapXY) && fLogY) || (swapXY && fLogX);
896 Bool_t doLogX = (!(swapXY) && fLogX) || (swapXY && fLogY);
898 if (y1 > 0) y1 = TMath::Log10(y1);
else return;
899 if (y2 > 0) y2 = TMath::Log10(y2);
else return;
902 if (x1 > 0) x1 = TMath::Log10(x1);
else return;
903 if (x2 > 0) x2 = TMath::Log10(x2);
else return;
906 gPad->PaintLine(x1, y1, x2, y2);
908 gPad->PaintLine(y1, x1, y2, x2);
915 void TCandle::Streamer(TBuffer &R__b)
917 if (R__b.IsReading()) {
919 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
921 R__b.ReadClassBuffer(TCandle::Class(),
this, R__v, R__s, R__c);
925 R__b.WriteClassBuffer(TCandle::Class(),
this);
932 void TCandle::ConvertToPadCoords(Double_t minAxis, Double_t maxAxis, Double_t axisMinCoord, Double_t axisMaxCoord)
934 if (!fIsCalculated) Calculate();
937 a = TMath::Log10(minAxis);
938 b = TMath::Log10(maxAxis/minAxis);
944 fMean = axisMinCoord + ((fMean-a)/b)*(axisMaxCoord-axisMinCoord);
945 fMedian = axisMinCoord + ((fMedian-a)/b)*(axisMaxCoord-axisMinCoord);
946 fMedianErr = axisMinCoord + ((fMedianErr-a)/b)*(axisMaxCoord-axisMinCoord);
947 fBoxUp = axisMinCoord + ((fBoxUp-a)/b)*(axisMaxCoord-axisMinCoord);
948 fBoxDown = axisMinCoord + ((fBoxDown-a)/b)*(axisMaxCoord-axisMinCoord);
949 fWhiskerUp = axisMinCoord + ((fWhiskerUp-a)/b)*(axisMaxCoord-axisMinCoord);
950 fWhiskerDown = axisMinCoord + ((fWhiskerDown-a)/b)*(axisMaxCoord-axisMinCoord);
952 for (
int i = 0; i < fNDrawPoints; i++) {
953 fDrawPointsY[i] = axisMinCoord + ((fDrawPointsY[i]-a)/b)*(axisMaxCoord-axisMinCoord);
955 for (
int i = 0; i < fNHistoPoints; i++) {
956 fHistoPointsY[i] = axisMinCoord + ((fHistoPointsY[i]-a)/b)*(axisMaxCoord-axisMinCoord);