/* * makePadsHist divides a canvas into an array of pads so that when histograms * are drawn in them, their borders overlap. * * Developed by Stefan KNIEGE / IKF Frankfurt * * $Id: makePadsHists.C,v 1.1 2008/11/07 16:23:20 szuba Exp $ */ #if !defined(__CINT__) || defined(__MAKECINT__) #include #include #endif TObjArray *makePadsHists(const Int_t npx, const Int_t npy, const Float_t tm, const Float_t lm, TCanvas *canv = NULL, const Char_t *name = "") { const Int_t npads = npx * npy; // calc sizes in x and y for pads ___________ const Float_t topsize_y = 1 / (2 + (npy - 2) * (1 - tm)); const Float_t leftsize_x = 1 / (2 + (npx - 2) * (1 - lm)); const Float_t midsize_y = (1 - tm) * topsize_y; const Float_t midsize_x = (1 - lm) * leftsize_x; // create canvas if necessary ________________ TCanvas *c1 = canv; if (c1 == NULL) { Char_t canvname[256]; sprintf(canvname, "Canv_%s", name); c1 = new TCanvas(canvname, canvname, npx * 150, npy * 150); } // create padarray ____________________________ Char_t arrname[256]; sprintf(arrname, "Arr%s", name); TObjArray *padarr = new TObjArray(npads); padarr->SetName(arrname); Int_t xrow, yrow; c1->cd(); // create pads ________________________________ for (Int_t np = 0; np < npads; np++) { Float_t px1 = 0., px2 = 0., py1 = 0., py2 = 0.; // row and column xrow = np % npx; yrow = np / npx; // xpos if (npy > 1) { if (yrow == 0) { py1 = 0.0; py2 = topsize_y; } else if (yrow < npy - 1) { py1 = topsize_y + (yrow - 1) * midsize_y; py2 = topsize_y + (yrow) * midsize_y; } else if (yrow == npy - 1) { py1 = topsize_y + (yrow - 1) * midsize_y; py2 = 1.0; } } else { py1 = 0.0; py2 = 1.0; } // ypos if (npx > 1) { if (xrow == 0) { px1 = 0.0; px2 = leftsize_x; } else if (xrow < npx - 1) { px1 = leftsize_x + (xrow - 1) * midsize_x; px2 = leftsize_x + (xrow) * midsize_x; } else if (xrow == npx - 1) { px1 = leftsize_x + (xrow - 1) * midsize_x; px2 = 1.0; } } else { px1 = 0.0; px2 = 1.0; } Char_t namep[256]; sprintf(namep, "Pad_%s_%i", name, np); TPad *pad = new TPad(namep, namep, px1, py1, px2, py2, 0); padarr->AddAt(pad, np); } // Draw pads __________________________________ for (Int_t ipad = 0; ipad < npads; ipad++) { xrow = ipad % npx; yrow = ipad / npx; TPad *pad = dynamic_cast( padarr->At(ipad) ); pad->SetTicks(); // margins ____________ if (xrow == 0 && yrow == 0) { pad->SetBottomMargin(tm); pad->SetRightMargin(0.0); pad->SetTopMargin(0.0); pad->SetLeftMargin(lm); } else if (xrow == 0 && yrow == npy - 1.) { pad->SetBottomMargin(0.0); pad->SetRightMargin(0.0); pad->SetTopMargin(tm); pad->SetLeftMargin(lm); } else if (xrow == 0) { pad->SetBottomMargin(0.0); pad->SetRightMargin(0.0); pad->SetTopMargin(0.0); pad->SetLeftMargin(lm); } else if ((xrow > 0 && xrow < npx - 1.) && yrow == 0) { pad->SetBottomMargin(tm); pad->SetRightMargin(0.0); pad->SetTopMargin(0.0); pad->SetLeftMargin(0.0); } else if ((xrow > 0 && xrow < npx - 1.) && yrow == npy - 1.) { pad->SetBottomMargin(0.0); pad->SetRightMargin(0.0); pad->SetTopMargin(tm); pad->SetLeftMargin(0.0); } else if ((xrow > 0 && xrow < npx - 1.) && yrow == npy - 1.) { pad->SetBottomMargin(0.0); pad->SetRightMargin(0.0); pad->SetTopMargin(tm); pad->SetLeftMargin(0.0); } else if (xrow == npx - 1. && yrow == 0) { pad->SetBottomMargin(tm); pad->SetRightMargin(lm); pad->SetTopMargin(0.0); pad->SetLeftMargin(0.0); } else if (xrow == npx - 1. && yrow == npy - 1.) { pad->SetBottomMargin(0.0); pad->SetRightMargin(lm); pad->SetTopMargin(tm); pad->SetLeftMargin(0.0); } else if (xrow == npx - 1.) { pad->SetBottomMargin(0.0); pad->SetRightMargin(lm); pad->SetTopMargin(0.0); pad->SetLeftMargin(0.0); } else { pad->SetBottomMargin(0.0); pad->SetRightMargin(0.0); pad->SetTopMargin(0.0); pad->SetLeftMargin(0.0); } if (npx == 1) { pad->SetRightMargin(lm); } if (npy == 1) { pad->SetTopMargin(tm); } pad->Draw(); } return padarr; }