diff --git a/tutorials/graphics/perceptualcolormap.C b/tutorials/graphics/perceptualcolormap.C new file mode 100644 index 0000000000000..574a297dedf6f --- /dev/null +++ b/tutorials/graphics/perceptualcolormap.C @@ -0,0 +1,63 @@ +/// \file +/// \ingroup tutorial_graphics +/// \notebook +/// A “Perceptual” colormap explicitly identifies a fixed value in the data +//// +/// On geographical plot this fixed point can be seen as the "sea level", and provides +/// monotonic luminance variations above and below this fixed value. Unlike the rainbow +/// colormap, this colormap provides a faithful representation of the structures in the +/// data. +/// +/// This macro demonstrates how to produce the perceptual colormap shown on the figure 2 +/// in [this article](https://root.cern/blog/rainbow-color-map/). +/// +/// The function `Perceptual_Colormap` take two parameters as input: +/// 1. `h`, the `TH2D` to be drawn +/// 2. `val_cut`, the Z value defining the "sea level" +/// +/// Having these parameters this function defines two color maps: one above `val_cut` and one +/// below. +//// +/// \macro_image +/// \macro_code +/// +/// \author Olivier Couet + +void Perceptual_Colormap(TH2D *h, Double_t val_cut) { + Double_t max = h->GetMaximum(); // Histogram's maximum + Double_t min = h->GetMinimum(); // Histogram's minimum + Double_t per_cut = (val_cut-min)/(max-min); // normalized value of val_cut + Double_t eps = (max-min)*0.00001; // epsilon + + // Definition of the two palettes below and above val_cut + const Int_t Number = 4; + Double_t Red[Number] = { 0.11, 0.19 , 0.30, 0.89}; + Double_t Green[Number] = { 0.03, 0.304, 0.60, 0.91}; + Double_t Blue[Number] = { 0.18, 0.827, 0.50, 0.70}; + Double_t Stops[Number] = { 0., per_cut, per_cut+eps, 1. }; + + Int_t nb= 256; + h->SetContour(nb); + + TColor::CreateGradientColorTable(Number,Stops,Red,Green,Blue,nb); + + // Histogram drawaing + h->Draw("colz"); +} + +void perceptualcolormap() { + TH2D *h = new TH2D("h","Perceptual Colormap",200,-4,4,200,-4,4); + h->SetStats(0); + + Double_t a,b,c; + for (Int_t i=0;i<1000000;i++) { + c = gRandom->Rndm(); + gRandom->Rannor(a,b); + h->Fill(a-1.5,b-1.5,0.1); + h->Fill(a+2.,b-3.,0.07); + h->Fill(a-3.,b+3.,0.05); + gRandom->Rannor(a,b); + h->Fill(a+1.5,b+1.5,-0.08); + } + Perceptual_Colormap(h, 0.); +}