What does TPaveText->SetX1NDC do and how to solve my related problem?

Hi,
This question is strongly related to this one. I could not reply to @couet because I was busy these days and I arrived late, the topic is closed.

So I get everything working fine except for TGraph titles. This is mostly the code @couet shared (I modified titles to the ones I really want):

void CanvasPartition(TCanvas *C,const Int_t Nx = 2,const Int_t Ny = 2,
                     Float_t lMargin = 0.15, Float_t rMargin = 0.05,
                     Float_t bMargin = 0.15, Float_t tMargin = 0.05);

void test2()
{

   gStyle->SetOptStat(0);

   TCanvas *C = (TCanvas*) gROOT->FindObject("C");
   if (C) delete C;
   C = new TCanvas("C","canvas",1024,640);
   C->SetFillStyle(4000);

   // Number of PADS
   const Int_t Nx = 4;
   const Int_t Ny = 1;

   // Margins
   
   Float_t lMargin = 0.12;
   Float_t rMargin = 0.05;
   Float_t bMargin = 0.15;
   Float_t tMargin = 0.03;
   /*
   Float_t lMargin = 0.04;
   Float_t rMargin = 0.04;
   Float_t bMargin = 0.08;
   Float_t tMargin = 0.04;
   */
   // Canvas setup
   CanvasPartition(C,Nx,Ny,lMargin,rMargin,bMargin,tMargin);

   TPad *pad[Nx][Ny];

   for (Int_t i=0;i<Nx;i++) {
      for (Int_t j=0;j<Ny;j++) {

         auto gr = new TGraph();
         gr->AddPoint(1,1);
         gr->SetMinimum(0.6);
         gr->SetMaximum(2);
		 
        if (i == 0){
			gr->GetYaxis()->SetTitle("\\sigma/\\sigma_{SM}");
			gr->SetTitle("#splitline{m_{ll} #in [101.0, 117.96] GeV}{#sigma_{SM} = (1876 #pm 8) #times 10^{-6} pb}");
		}
		
        if (i == 1){
			gr->SetTitle("#splitline{m_{ll} #in [117.96, 140.9] GeV}{#sigma_{SM} = (662 #pm 3) #times 10^{-6} pb}");
		}
		
        if (i == 2){
			gr->SetTitle("#splitline{m_{ll} #in [140.9, 181.36] GeV}{#sigma_{SM} = (446.0 #pm 1.5) #times 10^{-6} pb}");
		}
		
        if (i == 3){
			gr->GetXaxis()->SetTitle("\\mathscr{O}");
			gr->SetTitle("#splitline{m_{ll} #in [181.36, +#infty] GeV}{#sigma_{SM} = (517.9 #pm 1.9) #times 10^{-6} pb}");
		}


         C->cd(0);

         // Get the pads previously created.
         char pname[16];
         sprintf(pname,"pad_%i_%i",i,j);
         pad[i][j] = (TPad*) gROOT->FindObject(pname);
         pad[i][j]->Draw();
         pad[i][j]->cd();

         // Size factors
         Float_t xFactor = pad[0][0]->GetAbsWNDC()/pad[i][j]->GetAbsWNDC();
         Float_t yFactor = pad[0][0]->GetAbsHNDC()/pad[i][j]->GetAbsHNDC();

         char hname[16];
         sprintf(hname,"h_%i_%i",i,j);
         TH1F *hFrame = (TH1F*) gr->GetHistogram()->Clone(hname);
         hFrame->Reset();
         hFrame->Draw();

         // y axis range
         hFrame->GetYaxis()->SetRangeUser(0.0001,1.2*gr->GetHistogram()->GetMaximum());

         // Format for y axis
         hFrame->GetYaxis()->SetLabelFont(43);
         hFrame->GetYaxis()->SetLabelSize(16);
         hFrame->GetYaxis()->SetLabelOffset(0.02);
         hFrame->GetYaxis()->SetTitleFont(43);
         hFrame->GetYaxis()->SetTitleSize(16);
         hFrame->GetYaxis()->SetTitleOffset(2);

         hFrame->GetYaxis()->SetNdivisions(505);

         // TICKS Y Axis
         hFrame->GetYaxis()->SetTickLength(xFactor*0.04/yFactor);

         // Format for x axis
         hFrame->GetXaxis()->SetLabelFont(43);
         hFrame->GetXaxis()->SetLabelSize(16);
         hFrame->GetXaxis()->SetLabelOffset(0.02);
         hFrame->GetXaxis()->SetTitleFont(43);
         hFrame->GetXaxis()->SetTitleSize(16);
         hFrame->GetXaxis()->SetTitleOffset(1);
         hFrame->GetXaxis()->SetNdivisions(505);

         // TICKS X Axis
         hFrame->GetXaxis()->SetTickLength(yFactor*0.06/xFactor);

         gr->Draw("P");
         gPad->Update();
         TPaveText* title = (TPaveText*)gPad->FindObject("title");
         if (i==0) {
            title->SetX1NDC(0.4);
            title->SetY1NDC(0.8);
            title->SetX2NDC(0.89);
            title->SetY2NDC(0.99);
         } else if (i==Nx-1) {
            title->SetX1NDC(0.1);
            title->SetY1NDC(0.8);
            title->SetX2NDC(0.75);
            title->SetY2NDC(0.99);
         } else {
            title->SetX1NDC(0.1);
            title->SetY1NDC(0.8);
            title->SetX2NDC(0.89);
            title->SetY2NDC(0.99);
         }
      }
   }

   gPad->Modified();
   gPad->Update();
   C->cd();
   C->Print("fig.png");
}



void CanvasPartition(TCanvas *C,const Int_t Nx,const Int_t Ny,
                     Float_t lMargin, Float_t rMargin,
                     Float_t bMargin, Float_t tMargin)
{
   if (!C) return;

   // Setup Pad layout:
   Float_t vSpacing = 0.0;
   Float_t vStep  = (1.- bMargin - tMargin - (Ny-1) * vSpacing) / Ny;

   Float_t hSpacing = 0.0;
   Float_t hStep  = (1.- lMargin - rMargin - (Nx-1) * hSpacing) / Nx;

   Float_t vposd,vposu,vmard,vmaru,vfactor;
   Float_t hposl,hposr,hmarl,hmarr,hfactor;

   for (Int_t i=0;i<Nx;i++) {

      if (i==0) {
         hposl = 0.0;
         hposr = lMargin + hStep;
         hfactor = hposr-hposl;
         hmarl = lMargin / hfactor;
         hmarr = 0.0;
      } else if (i == Nx-1) {
         hposl = hposr + hSpacing;
         hposr = hposl + hStep + rMargin;
         hfactor = hposr-hposl;
         hmarl = 0.0;
         hmarr = rMargin / (hposr-hposl);
      } else {
         hposl = hposr + hSpacing;
         hposr = hposl + hStep;
         hfactor = hposr-hposl;
         hmarl = 0.0;
         hmarr = 0.0;
      }

      for (Int_t j=0;j<Ny;j++) {

         if (j==0) {
            vposd = 0.0;
            vposu = bMargin + vStep;
            vfactor = vposu-vposd;
            vmard = bMargin / vfactor;
            vmaru = 0.0;
         } else if (j == Ny-1) {
            vposd = vposu + vSpacing;
            vposu = vposd + vStep + tMargin;
            vfactor = vposu-vposd;
            vmard = 0.0;
            vmaru = tMargin / (vposu-vposd);
         } else {
            vposd = vposu + vSpacing;
            vposu = vposd + vStep;
            vfactor = vposu-vposd;
            vmard = 0.0;
            vmaru = 0.0;
         }

         C->cd(0);

         char name[16];
         sprintf(name,"pad_%i_%i",i,j);
         TPad *pad = (TPad*) gROOT->FindObject(name);
         if (pad) delete pad;
         pad = new TPad(name,"",hposl,vposd,hposr,vposu);
         pad->SetLeftMargin(hmarl);
         pad->SetRightMargin(hmarr);
         pad->SetBottomMargin(vmard);
         pad->SetTopMargin(vmaru);

         pad->SetFrameBorderMode(0);
         pad->SetBorderMode(0);
         pad->SetBorderSize(0);

         pad->Draw();
      }
   }
}

The result is:

If I use the margins I really want:

   
   Float_t lMargin = 0.04;
   Float_t rMargin = 0.04;
   Float_t bMargin = 0.08;
   Float_t tMargin = 0.04;
   

Titles do not have same size. And for the first case (probably) there is a small difference, due to the different titles.

Also the title for the left pad is not centered.

After some experimenting, I suppose this is related to TPaveText->SetX1NDC and similars, but I do not find an explanation about this functions.


Please read tips for efficient and successful posting and posting code

ROOT Version: 6.24/06
Platform: linuxx8664gcc
Compiler: Not Provided


You need:

         if (i==0) {
            title->SetX1NDC(0.2);

as i sais the fit and last pad have different dimensions. You need to adjust the title position.

So I get what I wanted after many experimentation. What is the difference about the two methods?

SetX1NDC uses normalised coordinates.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.