ROOT logo
//---- Root includes
#include "TCanvas.h"
#include "TColor.h"
#include "TDatime.h"
#include "TFile.h"
#include "TH2.h"
#include "TPaveText.h"
#include "TPostScript.h"
#include "TProfile.h"
#include "TROOT.h"
#include "TString.h"
#include "TStyle.h"
#include "TDirectory.h"
#include "TSystem.h"
//---- Hydra includes
#include "hades.h"
#include "hqaoutputps.h"
#include "hqascalers.h"
#include "htool.h"

#include <iostream>
#include <iomanip>
#include <math.h>

using namespace std;

//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-//
//*-- Author : Dan Magestro (magestro@gsi.de)
//*-- Modified : 24/01/2002
//*-- Modified : 24/10/2002 A.Sadovski (A.Sadovski@fz-rossendorf.de)
//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-//

//_HADES_CLASS_DESCRIPTION
//////////////////////////////////////////////////////////////////////////////
//
// HQAOutputPS
//
// This class creates a postscript file using TPostScript, and histograms are
// added by iterating over TList(s) of active histograms.
// Histograms must be of type TH1F, TH2F, or TProfile.
//
// Scalers are added with a TList of HQAScaler and HQAScaler6 objects.
//
// BEGIN_HTML<b><font color="maroon">For more information, see the <a href="http://www-hades.gsi.de/computing/qa/">QA home page</a>.</font></b> END_HTML
//
//////////////////////////////////////////////////////////////////////////////

ClassImp(HQAOutputPS)

HQAOutputPS::HQAOutputPS(TString fname)
{
// Default constructor, filename must be supplied
   fnamePS      = fname;
   fCanvas      = 0;
   fHistPad     = 0;
   histCount    = 0;
   pageCount    = 0;
   nEvent       = 0; //Be carefull this is not an initialisation, in reality,
   nProcessed   = 0; //as "nEvent","nProcessed" assigned here using setStats function from hqaoutputps.h
   nHistPerPage = 6;
   kFIRST       = kTRUE;
   kPDF         = kTRUE;
   fdevice      = 111;

   pageTitle = "firstpage";

}

HQAOutputPS::~HQAOutputPS()
{
// Default destructor
   if (fCanvas) closePS();
}

void HQAOutputPS::writeHist(TList *histList)
{
   // Output histograms to Root file (just a simple version)

   TFile *ff = new TFile("ff.root", "RECREATE");
   ff->cd();

   TIter next(histList);
   while (TH1 *h = (TH1*) next()) {
      if (!strcmp(h->ClassName(), "TH1F"))
         ((TH1F*)h)->Write();
      else if (!strcmp(h->ClassName(), "TH1I"))
            ((TH1I*)h)->Write();
      else if (!strcmp(h->ClassName(), "TH2F"))
         ((TH2F*)h)->Write();
      else if (!strcmp(h->ClassName(), "TProfile"))
         ((TProfile*)h)->Write();
   }
   cout << "-----------------------------------------" << endl;
   cout << "|  Before the closing the file ff.root  |" << endl;
   cout << "-----------------------------------------" << endl;
   ff->Close();
}

void HQAOutputPS::writeHist(TList *histList1, TList *histList2, TString fnamePS)
{
   // Output histograms to Root file (not really implemented yet)
   // modified for 2 TLists to be plotted at ones

   TString histDirName;
   TDirectory *histDir = NULL;

   TString histFile = fnamePS(0, fnamePS.Last('.')) + "_hist.root";
   //FILE*  fSC = fopen( histFile, "w");
   //TFile *ff = new TFile("ff.root","RECREATE");
   TFile *ff = new TFile(histFile, "RECREATE");
   ff->cd();

   TIter* it = new TIter(histList1);
   while (TH1 *h = (TH1*) it->Next()) {
      // go to the appropriate directory, create new if does not exist
      TString opt = it->GetOption();
      opt.ToLower();
      if (opt.Index("--") > 0) {
         histDirName =  opt(0, opt.Index("--"));
         histDir = (TDirectory *)ff->FindObject(histDirName);

         if (histDir  && !(strcmp(histDir->ClassName(), "TDirectory"))) {
            ff->cd(histDirName);
         } else { // try to create new directory

            ff->cd();
            TDirectory* dir = HTool::changeToDir(histDirName);
            if (!dir) {
               histDirName = "";
            }

         }
         if (!strcmp(h->ClassName(), "TH1F"))
            ((TH1F*)h)->Write();
         else if (!strcmp(h->ClassName(), "TH1I"))
            ((TH1I*)h)->Write();
         else if (!strcmp(h->ClassName(), "TH2F"))
            ((TH2F*)h)->Write();
         else if (!strcmp(h->ClassName(), "TProfile"))
            ((TProfile*)h)->Write();
      }
   }
   if (it) delete it;

   ff->cd();

   it = new TIter(histList2);
   while (TH1 *h = (TH1*) it->Next()) {
      // go to the appropriate directory, create new if does not exist
      TString opt = it->GetOption();
      opt.ToLower();
      if (opt.Index("--") > 0) {
         histDirName =  opt(0, opt.Index("--"));
         histDir = (TDirectory *)ff->FindObject(histDirName);

         if (histDir  && !(strcmp(histDir->ClassName(), "TDirectory"))) {
            ff->cd(histDirName);
         } else { // try to create new directory

            ff->cd();
            TDirectory* dir = HTool::changeToDir(histDirName);
            if (!dir) {
               histDirName = "";
            }
         }
      }


      if (!strcmp(h->ClassName(), "TH1F"))
         ((TH1F*)h)->Write();
      else if (!strcmp(h->ClassName(), "TH1I"))
            ((TH1I*)h)->Write();
      else if (!strcmp(h->ClassName(), "TH2F"))
         ((TH2F*)h)->Write();
      else if (!strcmp(h->ClassName(), "TProfile"))
         ((TProfile*)h)->Write();
   }
   if (it) delete it;

   ff->Close();
}





void HQAOutputPS::makeHist(TList *histList)
{
// This is the class's main function.  The canvas is defined, and the TList of
// histograms is iterated.  Each histogram is drawn according to its type.

   TString type, typeKeep;

   // Open file if this is the first call to make()
   if (kFIRST) {
      setStyle();
      fCanvas = new TCanvas("canvas", "HADES diagnostics", 200, 320);
   }

   setStyle();
   // QA histograms
   TIter next(histList);
   while (TH1 *h = (TH1*) next()) {
      TString opt = next.GetOption();
      opt.ToLower();
      //cout<<"--MakeHists: "<<h->GetName()<<endl;
      if (opt.Contains("notshown")) continue; // If you want to have histogram in root file but not in
      // pdf file use option "notshown"

      //////////////////////////////////////////////////////////////////////
      //cheeck one step forward if it is not an overlayed histogramm will be
      //
      //Basically it is done to prevent situation when
      //we plot severall histograms on top of the firtst one
      //which may happen to be empty, then all the following
      //by "same" mode will simply owerflow up, and information
      //will be lost.
      //So, we analyse instead for each normal historgam if there are
      //any number of same behind it, and if so we compare h->GetMaximum
      //for the "first" one and all the subsequent "same" ones and
      //assign for the "first" histogram maximal y-axis range, and
      //this prevents the overflow...
      //
      TIter nex2(histList);
      while (TH1 *h2 = (TH1*) nex2()) {
         if (h2 == h) {
            if (TH1 *h2 = (TH1*) nex2()) {
               TString opt2 = nex2.GetOption();
               opt2.ToLower();
               if (opt2.Contains("same")) {
                  Double_t m1 = h->GetMaximum();
                  Double_t m2 = h2->GetMaximum();
                  //cout <<"m1,m2" <<m1<<m2<<endl;
                  if (m1 > m2) {
                  } else {
                     m1 = m2;
                  }
                  h->SetMaximum(m1 * 1.2);
                  //cout << "m1="<<m1<<endl;

                  Int_t iSame = 1; //first time we should try anyway (we do not know that is the next option, may be it is "same" again)
                  while (iSame) {
                     //One more time for the next "same" if so... (previous "same" is meant by if see upstream^)
                     if (TH1 *h2 = (TH1*) nex2()) {
                        TString opt2 = nex2.GetOption();
                        opt2.ToLower();
                        if (opt2.Contains("same")) {
                           m2 = h2->GetMaximum();
                           //cout <<"m1,m2" <<m1<<m2<<endl;
                           if (m1 > m2) {
                           } else {
                              m1 = m2;
                           }
                           h->SetMaximum(m1 * 1.2);
                           //cout << "m1="<<m1<<endl;
                        } else {
                           //indicate that we shoud drop this "same" procedure
                           iSame = 0;
                        }
                     }
                  }
               }
            }
	 }
      }
      //////////////////////////////////////////////////////////////////////


      //°check in wich pad we have to draw our histogram
      if (opt.Contains("same")) {
         //do not ask for a new panel
      } else {
         //ask for a new panel
         histCount++;
      }

      if (opt.Index("--") > 0) {
         type = opt(0, opt.Index("--"));
         if ((type.CompareTo(typeKeep))) {
            if (!kFIRST) fCanvas->Update();
            histCount = 1;
            pageCount = 0;
            makeNewPage(type);
            typeKeep = type;
         }
      }

      //°°°Start to set up the PAGE°°°


      //° ° ° ° ° ° ° ° ° ° ° ° ° ° °
      //° ° ° OPTION =  newpage ° ° °
      //° ° ° ° ° ° ° ° ° ° ° ° ° ° °
      if (histCount > nHistPerPage || opt.Contains("newpage")) {
         //cout<<"--nb of hist: "<<histCount<<"  maxPerPage: "<<nHistPerPage<<" det Type: "<<type<<endl;
         fCanvas->Update();
         makeNewPage(type);
         histCount = 1;
      }

      fHistPad->cd(histCount);

      //° ° ° ° ° ° ° ° ° ° ° ° ° ° °
      //° ° ° PICTURES ON PAGE = 3  °
      //° ° ° ° ° ° ° ° ° ° ° ° ° ° °
      // Adjust left,right margins for (1,3) division
      if (fHistPad->GetListOfPrimitives()->GetSize() == 3) {
	      gPad->SetLeftMargin(0.15);
          gPad->SetRightMargin(0.05);
      }

      //°°°Start to set up the PAD°°°

      //° ° ° ° ° ° ° ° ° ° ° ° ° ° °
      //° ° ° OPTION =  log ..  ° ° °
      //° ° ° ° ° ° ° ° ° ° ° ° ° ° °
      // Set log scale, if histogram isn't empty and option is set
      if (h->GetEntries()) {
         if (opt.Contains("logx"))  gPad->SetLogx(1);
         if (opt.Contains("logy"))  gPad->SetLogy(1);
         if (opt.Contains("logz"))  gPad->SetLogz(1);
      }

      //° ° ° ° ° ° ° ° ° ° ° ° ° ° °
      //° ° ° OPTION =  grid .. ° ° °
      //° ° ° ° ° ° ° ° ° ° ° ° ° ° °
      // Set grid X,Y
      if (opt.Contains("gridx"))   gPad->SetGridx();
      if (opt.Contains("gridy"))   gPad->SetGridy();

      //°°°Start to set up the HISTOGRAM°°°

      //° ° ° ° ° ° ° ° ° ° ° ° ° ° °
      //° ° ° OPTION = same ..  ° ° °
      //° ° ° ° ° ° ° ° ° ° ° ° ° ° °
      // Format histograms
      if (opt.Contains("same")) {
         //do not assign any color, it must be specified in the histogramm definition
      } else {
         if (!strcmp(h->ClassName(), "TProfile"))
            h->SetLineColor(1);
         else if (0==strcmp(h->ClassName(), "TH1F"))
            h->SetLineColor(4);
      }
      h->SetLineWidth(2);

      // Format axis titles
      h->SetStats(0);
      h->GetXaxis()->CenterTitle();
      h->GetYaxis()->CenterTitle();
      h->SetTitleOffset(1.1, "X");
      h->SetTitleOffset(1.1, "Y");
      h->SetTitleSize(.05, "X");
      h->SetTitleSize(.05, "Y");
      h->SetNdivisions(208, "X");
      h->SetNdivisions(208, "Y");

      //° ° ° ° ° ° ° ° ° ° ° ° ° ° °
      //° ° ° OPTION = var .. ° ° ° °
      //° ° ° ° ° ° ° ° ° ° ° ° ° ° °
      // Set axis ranges so that variation histogram is full and looks nice
      if (opt.Contains("var")) {
         Int_t binMax = h->FindBin(nEvent);
         TProfile *prof = (TProfile*) h;
         if (binMax < 200) {
            Float_t xMax = h->GetBinCenter(binMax + 1);
            h->SetAxisRange(0, xMax);
         }
         Float_t min = 10000, max = 0;
         Float_t cont = 0, err = 0;
         for (Int_t i = 1; i <= binMax; i++) {
            cont = prof->GetBinContent(i);
            err = prof->GetBinError(i);
            if ((cont + err) > max) max = cont + err;
            if ((cont - err) < min) min = cont - err;
         }
         prof->SetMaximum(max + (max - min));
         prof->SetMinimum(min - (max - min));
         if ((min - (max - min)) < 0) prof->SetMinimum(0);
      }

      //° ° ° ° ° ° ° ° ° ° ° ° ° ° °
      //° ° ° TYPE = TH2F -->colz ° °
      //° ° ° ° ° ° ° ° ° ° ° ° ° ° °
      // Set options depending on histogram type
      if (!strcmp(h->ClassName(), "TH2F")) h->SetOption("colz");

      //° ° ° ° ° ° ° ° ° ° ° ° ° ° °
      //° ° ° OPTION = lego ° ° ° ° °
      //° ° ° ° ° ° ° ° ° ° ° ° ° ° °
      if (opt.Contains("lego2"))h->SetOption("lego2");

      // Overlay options are quiet usefull.
      //if( opt.Contains("same") ) h->SetOption("same");

      //° ° ° ° ° ° ° ° ° ° ° ° ° ° °
      //° ° ° OPTION = same ° ° ° ° °
      //° ° ° ° ° ° ° ° ° ° ° ° ° ° °
      // Draw histograms
      if (opt.Contains("same")) {
	  h->DrawCopy("same");
      } else {
	  h->DrawCopy("");
      }

      //° ° ° ° ° ° ° ° ° ° ° ° ° ° °
      //° ° ° OPTION = 6sec ° ° ° ° °
      //° ° ° ° ° ° ° ° ° ° ° ° ° ° °
      // Add some color text markers for
      // 6-th sectored histograms: this part is responsible for the color rose
      // in case of 6-th sectors interlayed histograms
      if (opt.Contains("6sec")) {
#include "QAsectioncolors.h"
         Float_t x0 = 0.76;
         Float_t y0 = 0.76;
         Float_t a  = 0.06;
         TText s6txt[6];
         for (Int_t i = 0; i < 6; i++) {
            s6txt[i].SetTextSize(0.06);
            s6txt[i].SetTextColor(SectColor[i]);
         }
         s6txt[0].DrawTextNDC(x0       , y0 + a     , "s1"); //s1
         s6txt[1].DrawTextNDC(x0 + 0.87 * a, y0 + a * 0.5 , "s2"); //s2
         s6txt[2].DrawTextNDC(x0 + 0.87 * a, y0 - a * 0.5 , "s3"); //s3
         s6txt[3].DrawTextNDC(x0       , y0 - a     , "s4"); //s4
         s6txt[4].DrawTextNDC(x0 - 0.87 * a, y0 - a * 0.5 , "s5"); //s5
         s6txt[5].DrawTextNDC(x0 - 0.87 * a, y0 + a * 0.5 , "s6"); //s6
      }
      //° ° ° ° ° ° ° ° ° ° ° ° ° ° °
      //° ° ° OPTION = 3mod ° ° ° ° °
      //° ° ° ° ° ° ° ° ° ° ° ° ° ° °
      if (opt.Contains("3mod")) {
#include "QAsectioncolors.h"
         Float_t x0 = 0.7;
         Float_t y0 = 0.76;
         Float_t a  = 0.06;
         TText s3txt[3];
         for (Int_t i = 0; i < 3; i++) {
            s3txt[i].SetTextSize(0.06);
            s3txt[i].SetTextColor(ModColor[i]);
         }
         s3txt[0].DrawTextNDC(x0       , y0 + a     , "Pre"); //s1
         s3txt[1].DrawTextNDC(x0, y0 , "Post1");   //s2
         s3txt[2].DrawTextNDC(x0, y0 - a , "Post2"); //s3
      }


      // Draw the mean on the profile histogram plots as a horiz. line
      if (!strcmp(h->ClassName(), "TProfile")) {
         TProfile *prof = (TProfile*) h->Rebin(500, "prof");
         Float_t mean = prof->GetBinContent(1);
        //old - tis line goes over the border TLine *l = new TLine(0., mean, nEvent, mean);
         TLine *l = new TLine(0., mean,h->GetBinCenter(h->GetNbinsX()), mean);
         l->SetLineWidth(2);
         l->SetLineColor(4);
         l->Draw();
      }

      if (kFIRST) kFIRST = kFALSE;
   }

}

void HQAOutputPS::makeText(TList *scalerList)
{
// Method for generating output for scalers

   TString type, typeKeep;
   Char_t out[200];

   if (fCanvas) fCanvas->Update();

   // Open file if this is the first call to make()
   if (kFIRST) {
      setStyle();
      fCanvas = new TCanvas("canvas", "HADES diagnostics", 200, 320);
      fCanvas->Print(Form("%s(",fnamePS.Data()));
   }

   pageCount = 0;
   nHistPerPage = 1;
   makeNewPage("Scalers");
   fHistPad->cd(1);

   //---- Sectorwise scalers
   Int_t nLines = 0;

   TIter next(scalerList);
   next.Reset();
   TNamed *t = 0;
   while ((t = (TNamed*) next.Next())) {
      TString opt = next.GetOption();
      opt.ToLower();
      if (opt.Contains("sectorwise")) {
         nLines++;
         if (opt.Index("--") > 0) {
            type = opt(0, opt.Index("--"));
            if ((type.CompareTo(typeKeep))) {   // Add line between detector types
               typeKeep = type;
               nLines++;
            }
         }
      }
   }
   typeKeep = "";

   // Define text box
   TPaveText *pt = new TPaveText(0.01, 0.98 - 0.02 * nLines, 0.96, 0.98, "b1NDC");
   pt->SetBorderSize(0);
   pt->SetFillColor(10);
   pt->SetTextAlign(13);
   pt->SetTextSize(0.018);
   pt->SetMargin(0.01);
   pt->SetTextFont(102);

   next.Reset();
   while (TNamed *h = (TNamed*) next()) {
      TString opt = next.GetOption();
      opt.ToLower();

      if (opt.Contains("sectorwise")) {

         HQAScaler6 &scal = *((HQAScaler6*) h);

         if (opt.Index("--") > 0) {
            type = opt(0, opt.Index("--"));
            if ((type.CompareTo(typeKeep))) {
               sprintf(out, "                                           Sec.0   Sec.1   Sec.2   Sec.3   Sec.4   Sec.5");
               nLines++;
               TText *t = pt->AddText(out);
               t->SetTextColor(4);
               typeKeep = type;
            }
         }

         sprintf(out, "%40s %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f",
                 scal.GetTitle(), scal[0], scal[1], scal[2], scal[3], scal[4], scal[5]);
         pt->AddText(out);
      }

      if (kFIRST) kFIRST = kFALSE;
   }
   pt->Draw();

}


void HQAOutputPS::saveScal(TList *scalerList, TString fnamePS)
{
// Derived from //Method for generating output for scalers
// Used to save scalers into txt-file

   TString type, typeKeep;
   //Char_t out[200];

   TString txtFile = fnamePS(0, fnamePS.Last('.')) + ".txt";
   FILE*  fSC = fopen(txtFile, "w");

   //---- Sectorwise scalers
   Int_t nLines = 0;

   TIter next(scalerList);
   next.Reset();
   TNamed *t = 0;
   while ((t = (TNamed*) next.Next())) {
      TString opt = next.GetOption();
      opt.ToLower();
      if (opt.Contains("sectorwise")) {
         nLines++;
         if (opt.Index("--") > 0) {
            type = opt(0, opt.Index("--"));
            if ((type.CompareTo(typeKeep))) {   // Add line between detector types
               typeKeep = type;
               nLines++;
            }
         }
      }
   }
   typeKeep = "";

   //cout <<          "                                           Sec.0   Sec.1   Sec.2   Sec.3   Sec.4   Sec.5" << endl;
   fprintf(fSC, "%s", "                                           Sec.0   Sec.1   Sec.2   Sec.3   Sec.4   Sec.5\n");


   next.Reset();
   while (TNamed *h = (TNamed*) next()) {
      TString opt = next.GetOption();
      opt.ToLower();

      if (opt.Contains("sectorwise")) {

         HQAScaler6 &scal = *((HQAScaler6*) h);

         //sprintf(out,"%40s %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f",
         //   scal.GetTitle(),scal[0],scal[1],scal[2],scal[3],scal[4],scal[5]);
         //cout << out << endl;
         fprintf(fSC, "%40s %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f \n",
                 scal.GetTitle(), scal[0], scal[1], scal[2], scal[3], scal[4], scal[5]);
      }

   }
   fclose(fSC);

}


void HQAOutputPS::closePS()
{
// Closes files and deletes the canvas
   fCanvas->Update();

   fCanvas->Print(Form("%s)",fnamePS.Data()));

   delete fCanvas;
}

void HQAOutputPS::makeNewPage(TString type)
{
// In addition to making a new page in the PS file, this function writes the
// header at the top of each page and defines the histogram pad.

  Char_t fileTitle[120], dateTitle[120], eventTitle[120], procTitle[120];
  static Int_t ct = 0;

   //NewPage();

   if(pageTitle!="firstpage" && ct==0) fCanvas->Print(Form("%s(",fnamePS.Data()),Form("Title:%s",pageTitle.Data()));
   else                                fCanvas->Print(fnamePS.Data(),Form("Title:%s",pageTitle.Data()));
   if(pageTitle!="firstpage") ct++;

   pageCount++;

   fCanvas->Clear();

   type.ToUpper();

   if (fnameDST.Contains("/"))
       fnameDST = fnameDST(fnameDST.Last('/') + 1, fnameDST.Length());

   if (type.Contains("SCALER") && !type.Contains("DAQ")) pageTitle = Form("Scalers (page %i)", pageCount);
   else pageTitle = Form("%s histograms (page %i)", type.Data(), pageCount);

   //cout<<"---page type= "<<type<<endl;
   //cout<<"----PageTitle= "<<pageTitle<<endl;


   sprintf(fileTitle, "%s%s", "DST file = ", fnameDST.Data());
   sprintf(eventTitle, "%s%i", "Number of events in file= ", (int)nEvent);
   sprintf(procTitle, "Number of QA'd events = %i (%.0f%% sampled)", nProcessed,
           (float) nProcessed / nEvent * 100.);

   Char_t dt[25];
   TDatime tt;
   strcpy(dt, tt.AsString());
   sprintf(dateTitle, "%s%s", "This page generated ", dt);

   TPaveText *pt = new TPaveText(0.01, 0.975, 0.99, 0.999, "blNDC");
   pt->SetBorderSize(0);
   pt->SetFillColor(10);
   pt->AddText("HADES QA Report");
   pt->Draw();

   TPaveText *pt1 = new TPaveText(0.01, 0.926, 0.49, 0.975, "blNDC");
   pt1->SetBorderSize(0);
   pt1->SetFillColor(10);
   pt1->SetTextAlign(13);
   pt1->SetTextSize(.02);
   pt1->AddText(fileTitle);
   pt1->AddText(eventTitle);
   pt1->AddText(procTitle);
   pt1->Draw();

   TPaveText *pt2 = new TPaveText(0.51, 0.926, 0.99, 0.975, "blNDC");
   pt2->SetBorderSize(0);
   pt2->SetFillColor(10);
   pt2->SetTextAlign(13);
   pt2->SetTextSize(.02);
   pt2->AddText(dateTitle);
   TText *text = pt2->AddText(pageTitle);
   text->SetTextSize(.025);
   pt2->Draw();

   // Divide remaining area of canvas into sub-pads

   fHistPad = new TPad("histPad", "Histogram pad", .001, .001, .999, .925);
   if (nHistPerPage == 1) fHistPad->Divide(1, 1);
   if (nHistPerPage == 3) fHistPad->Divide(1, 3);
   if (nHistPerPage == 4) fHistPad->Divide(2, 2);
   if (nHistPerPage == 6) fHistPad->Divide(2, 3);
   if (nHistPerPage == 8) fHistPad->Divide(2, 4);
   fHistPad->Draw();

}


void HQAOutputPS::setStyle()
{
// Set drawing styles for histograms and PostScript file

   //gStyle->SetOptStat(0);

   TColor *col = gROOT->GetColor(51);
   if (col) col->SetRGB(.636666, .35, .85);

   // Optimized "pretty palette" to distribute colors better
   //Int_t colorArray[30] = {10,19,18,17,16,
   //                        51,52,54,57,60,
   //                        62,64,66,67,68,
   //                        70,72,74,80,86,
   //                        88,89,90,91,92,
   //                        93,94,96,98,100};

   //gStyle->SetPalette(30,colorArray);
   gStyle->SetPalette(1);

   // Histogram title formatting
   gStyle->SetTitleTextColor(4);
   gStyle->SetTitleColor(10);
   gStyle->SetTitleBorderSize(0);
//  gStyle->SetTitleX(.2);
//  gStyle->SetTitleY(.97);
   gStyle->SetTitleH(.065);
   gStyle->SetTitleW(1);
   gStyle->SetHistMinimumZero();

   // Canvas and pad formatting
   gStyle->SetPadColor(10);
   gStyle->SetPadBorderMode(0);
   gStyle->SetCanvasColor(10);
   gStyle->SetCanvasBorderMode(0);
   //gStyle->SetPadLeftMargin(0.10); //## alt
   gStyle->SetPadLeftMargin(0.15);   //## new - good nothing cutted away !!!!

   gStyle->SetPadTopMargin(0.15);    //## alt
   //gStyle->SetPadBottomMargin(0.12); //## neu
   gStyle->SetPadBottomMargin(0.11); //## neu
   gStyle->SetFrameBorderMode(0);
   gStyle->SetStatBorderSize(1);
   gStyle->SetFrameFillColor(10);
   gStyle->SetPaperSize(20., 27.);   // A4 20,26
}
 hqaoutputps.cc:1
 hqaoutputps.cc:2
 hqaoutputps.cc:3
 hqaoutputps.cc:4
 hqaoutputps.cc:5
 hqaoutputps.cc:6
 hqaoutputps.cc:7
 hqaoutputps.cc:8
 hqaoutputps.cc:9
 hqaoutputps.cc:10
 hqaoutputps.cc:11
 hqaoutputps.cc:12
 hqaoutputps.cc:13
 hqaoutputps.cc:14
 hqaoutputps.cc:15
 hqaoutputps.cc:16
 hqaoutputps.cc:17
 hqaoutputps.cc:18
 hqaoutputps.cc:19
 hqaoutputps.cc:20
 hqaoutputps.cc:21
 hqaoutputps.cc:22
 hqaoutputps.cc:23
 hqaoutputps.cc:24
 hqaoutputps.cc:25
 hqaoutputps.cc:26
 hqaoutputps.cc:27
 hqaoutputps.cc:28
 hqaoutputps.cc:29
 hqaoutputps.cc:30
 hqaoutputps.cc:31
 hqaoutputps.cc:32
 hqaoutputps.cc:33
 hqaoutputps.cc:34
 hqaoutputps.cc:35
 hqaoutputps.cc:36
 hqaoutputps.cc:37
 hqaoutputps.cc:38
 hqaoutputps.cc:39
 hqaoutputps.cc:40
 hqaoutputps.cc:41
 hqaoutputps.cc:42
 hqaoutputps.cc:43
 hqaoutputps.cc:44
 hqaoutputps.cc:45
 hqaoutputps.cc:46
 hqaoutputps.cc:47
 hqaoutputps.cc:48
 hqaoutputps.cc:49
 hqaoutputps.cc:50
 hqaoutputps.cc:51
 hqaoutputps.cc:52
 hqaoutputps.cc:53
 hqaoutputps.cc:54
 hqaoutputps.cc:55
 hqaoutputps.cc:56
 hqaoutputps.cc:57
 hqaoutputps.cc:58
 hqaoutputps.cc:59
 hqaoutputps.cc:60
 hqaoutputps.cc:61
 hqaoutputps.cc:62
 hqaoutputps.cc:63
 hqaoutputps.cc:64
 hqaoutputps.cc:65
 hqaoutputps.cc:66
 hqaoutputps.cc:67
 hqaoutputps.cc:68
 hqaoutputps.cc:69
 hqaoutputps.cc:70
 hqaoutputps.cc:71
 hqaoutputps.cc:72
 hqaoutputps.cc:73
 hqaoutputps.cc:74
 hqaoutputps.cc:75
 hqaoutputps.cc:76
 hqaoutputps.cc:77
 hqaoutputps.cc:78
 hqaoutputps.cc:79
 hqaoutputps.cc:80
 hqaoutputps.cc:81
 hqaoutputps.cc:82
 hqaoutputps.cc:83
 hqaoutputps.cc:84
 hqaoutputps.cc:85
 hqaoutputps.cc:86
 hqaoutputps.cc:87
 hqaoutputps.cc:88
 hqaoutputps.cc:89
 hqaoutputps.cc:90
 hqaoutputps.cc:91
 hqaoutputps.cc:92
 hqaoutputps.cc:93
 hqaoutputps.cc:94
 hqaoutputps.cc:95
 hqaoutputps.cc:96
 hqaoutputps.cc:97
 hqaoutputps.cc:98
 hqaoutputps.cc:99
 hqaoutputps.cc:100
 hqaoutputps.cc:101
 hqaoutputps.cc:102
 hqaoutputps.cc:103
 hqaoutputps.cc:104
 hqaoutputps.cc:105
 hqaoutputps.cc:106
 hqaoutputps.cc:107
 hqaoutputps.cc:108
 hqaoutputps.cc:109
 hqaoutputps.cc:110
 hqaoutputps.cc:111
 hqaoutputps.cc:112
 hqaoutputps.cc:113
 hqaoutputps.cc:114
 hqaoutputps.cc:115
 hqaoutputps.cc:116
 hqaoutputps.cc:117
 hqaoutputps.cc:118
 hqaoutputps.cc:119
 hqaoutputps.cc:120
 hqaoutputps.cc:121
 hqaoutputps.cc:122
 hqaoutputps.cc:123
 hqaoutputps.cc:124
 hqaoutputps.cc:125
 hqaoutputps.cc:126
 hqaoutputps.cc:127
 hqaoutputps.cc:128
 hqaoutputps.cc:129
 hqaoutputps.cc:130
 hqaoutputps.cc:131
 hqaoutputps.cc:132
 hqaoutputps.cc:133
 hqaoutputps.cc:134
 hqaoutputps.cc:135
 hqaoutputps.cc:136
 hqaoutputps.cc:137
 hqaoutputps.cc:138
 hqaoutputps.cc:139
 hqaoutputps.cc:140
 hqaoutputps.cc:141
 hqaoutputps.cc:142
 hqaoutputps.cc:143
 hqaoutputps.cc:144
 hqaoutputps.cc:145
 hqaoutputps.cc:146
 hqaoutputps.cc:147
 hqaoutputps.cc:148
 hqaoutputps.cc:149
 hqaoutputps.cc:150
 hqaoutputps.cc:151
 hqaoutputps.cc:152
 hqaoutputps.cc:153
 hqaoutputps.cc:154
 hqaoutputps.cc:155
 hqaoutputps.cc:156
 hqaoutputps.cc:157
 hqaoutputps.cc:158
 hqaoutputps.cc:159
 hqaoutputps.cc:160
 hqaoutputps.cc:161
 hqaoutputps.cc:162
 hqaoutputps.cc:163
 hqaoutputps.cc:164
 hqaoutputps.cc:165
 hqaoutputps.cc:166
 hqaoutputps.cc:167
 hqaoutputps.cc:168
 hqaoutputps.cc:169
 hqaoutputps.cc:170
 hqaoutputps.cc:171
 hqaoutputps.cc:172
 hqaoutputps.cc:173
 hqaoutputps.cc:174
 hqaoutputps.cc:175
 hqaoutputps.cc:176
 hqaoutputps.cc:177
 hqaoutputps.cc:178
 hqaoutputps.cc:179
 hqaoutputps.cc:180
 hqaoutputps.cc:181
 hqaoutputps.cc:182
 hqaoutputps.cc:183
 hqaoutputps.cc:184
 hqaoutputps.cc:185
 hqaoutputps.cc:186
 hqaoutputps.cc:187
 hqaoutputps.cc:188
 hqaoutputps.cc:189
 hqaoutputps.cc:190
 hqaoutputps.cc:191
 hqaoutputps.cc:192
 hqaoutputps.cc:193
 hqaoutputps.cc:194
 hqaoutputps.cc:195
 hqaoutputps.cc:196
 hqaoutputps.cc:197
 hqaoutputps.cc:198
 hqaoutputps.cc:199
 hqaoutputps.cc:200
 hqaoutputps.cc:201
 hqaoutputps.cc:202
 hqaoutputps.cc:203
 hqaoutputps.cc:204
 hqaoutputps.cc:205
 hqaoutputps.cc:206
 hqaoutputps.cc:207
 hqaoutputps.cc:208
 hqaoutputps.cc:209
 hqaoutputps.cc:210
 hqaoutputps.cc:211
 hqaoutputps.cc:212
 hqaoutputps.cc:213
 hqaoutputps.cc:214
 hqaoutputps.cc:215
 hqaoutputps.cc:216
 hqaoutputps.cc:217
 hqaoutputps.cc:218
 hqaoutputps.cc:219
 hqaoutputps.cc:220
 hqaoutputps.cc:221
 hqaoutputps.cc:222
 hqaoutputps.cc:223
 hqaoutputps.cc:224
 hqaoutputps.cc:225
 hqaoutputps.cc:226
 hqaoutputps.cc:227
 hqaoutputps.cc:228
 hqaoutputps.cc:229
 hqaoutputps.cc:230
 hqaoutputps.cc:231
 hqaoutputps.cc:232
 hqaoutputps.cc:233
 hqaoutputps.cc:234
 hqaoutputps.cc:235
 hqaoutputps.cc:236
 hqaoutputps.cc:237
 hqaoutputps.cc:238
 hqaoutputps.cc:239
 hqaoutputps.cc:240
 hqaoutputps.cc:241
 hqaoutputps.cc:242
 hqaoutputps.cc:243
 hqaoutputps.cc:244
 hqaoutputps.cc:245
 hqaoutputps.cc:246
 hqaoutputps.cc:247
 hqaoutputps.cc:248
 hqaoutputps.cc:249
 hqaoutputps.cc:250
 hqaoutputps.cc:251
 hqaoutputps.cc:252
 hqaoutputps.cc:253
 hqaoutputps.cc:254
 hqaoutputps.cc:255
 hqaoutputps.cc:256
 hqaoutputps.cc:257
 hqaoutputps.cc:258
 hqaoutputps.cc:259
 hqaoutputps.cc:260
 hqaoutputps.cc:261
 hqaoutputps.cc:262
 hqaoutputps.cc:263
 hqaoutputps.cc:264
 hqaoutputps.cc:265
 hqaoutputps.cc:266
 hqaoutputps.cc:267
 hqaoutputps.cc:268
 hqaoutputps.cc:269
 hqaoutputps.cc:270
 hqaoutputps.cc:271
 hqaoutputps.cc:272
 hqaoutputps.cc:273
 hqaoutputps.cc:274
 hqaoutputps.cc:275
 hqaoutputps.cc:276
 hqaoutputps.cc:277
 hqaoutputps.cc:278
 hqaoutputps.cc:279
 hqaoutputps.cc:280
 hqaoutputps.cc:281
 hqaoutputps.cc:282
 hqaoutputps.cc:283
 hqaoutputps.cc:284
 hqaoutputps.cc:285
 hqaoutputps.cc:286
 hqaoutputps.cc:287
 hqaoutputps.cc:288
 hqaoutputps.cc:289
 hqaoutputps.cc:290
 hqaoutputps.cc:291
 hqaoutputps.cc:292
 hqaoutputps.cc:293
 hqaoutputps.cc:294
 hqaoutputps.cc:295
 hqaoutputps.cc:296
 hqaoutputps.cc:297
 hqaoutputps.cc:298
 hqaoutputps.cc:299
 hqaoutputps.cc:300
 hqaoutputps.cc:301
 hqaoutputps.cc:302
 hqaoutputps.cc:303
 hqaoutputps.cc:304
 hqaoutputps.cc:305
 hqaoutputps.cc:306
 hqaoutputps.cc:307
 hqaoutputps.cc:308
 hqaoutputps.cc:309
 hqaoutputps.cc:310
 hqaoutputps.cc:311
 hqaoutputps.cc:312
 hqaoutputps.cc:313
 hqaoutputps.cc:314
 hqaoutputps.cc:315
 hqaoutputps.cc:316
 hqaoutputps.cc:317
 hqaoutputps.cc:318
 hqaoutputps.cc:319
 hqaoutputps.cc:320
 hqaoutputps.cc:321
 hqaoutputps.cc:322
 hqaoutputps.cc:323
 hqaoutputps.cc:324
 hqaoutputps.cc:325
 hqaoutputps.cc:326
 hqaoutputps.cc:327
 hqaoutputps.cc:328
 hqaoutputps.cc:329
 hqaoutputps.cc:330
 hqaoutputps.cc:331
 hqaoutputps.cc:332
 hqaoutputps.cc:333
 hqaoutputps.cc:334
 hqaoutputps.cc:335
 hqaoutputps.cc:336
 hqaoutputps.cc:337
 hqaoutputps.cc:338
 hqaoutputps.cc:339
 hqaoutputps.cc:340
 hqaoutputps.cc:341
 hqaoutputps.cc:342
 hqaoutputps.cc:343
 hqaoutputps.cc:344
 hqaoutputps.cc:345
 hqaoutputps.cc:346
 hqaoutputps.cc:347
 hqaoutputps.cc:348
 hqaoutputps.cc:349
 hqaoutputps.cc:350
 hqaoutputps.cc:351
 hqaoutputps.cc:352
 hqaoutputps.cc:353
 hqaoutputps.cc:354
 hqaoutputps.cc:355
 hqaoutputps.cc:356
 hqaoutputps.cc:357
 hqaoutputps.cc:358
 hqaoutputps.cc:359
 hqaoutputps.cc:360
 hqaoutputps.cc:361
 hqaoutputps.cc:362
 hqaoutputps.cc:363
 hqaoutputps.cc:364
 hqaoutputps.cc:365
 hqaoutputps.cc:366
 hqaoutputps.cc:367
 hqaoutputps.cc:368
 hqaoutputps.cc:369
 hqaoutputps.cc:370
 hqaoutputps.cc:371
 hqaoutputps.cc:372
 hqaoutputps.cc:373
 hqaoutputps.cc:374
 hqaoutputps.cc:375
 hqaoutputps.cc:376
 hqaoutputps.cc:377
 hqaoutputps.cc:378
 hqaoutputps.cc:379
 hqaoutputps.cc:380
 hqaoutputps.cc:381
 hqaoutputps.cc:382
 hqaoutputps.cc:383
 hqaoutputps.cc:384
 hqaoutputps.cc:385
 hqaoutputps.cc:386
 hqaoutputps.cc:387
 hqaoutputps.cc:388
 hqaoutputps.cc:389
 hqaoutputps.cc:390
 hqaoutputps.cc:391
 hqaoutputps.cc:392
 hqaoutputps.cc:393
 hqaoutputps.cc:394
 hqaoutputps.cc:395
 hqaoutputps.cc:396
 hqaoutputps.cc:397
 hqaoutputps.cc:398
 hqaoutputps.cc:399
 hqaoutputps.cc:400
 hqaoutputps.cc:401
 hqaoutputps.cc:402
 hqaoutputps.cc:403
 hqaoutputps.cc:404
 hqaoutputps.cc:405
 hqaoutputps.cc:406
 hqaoutputps.cc:407
 hqaoutputps.cc:408
 hqaoutputps.cc:409
 hqaoutputps.cc:410
 hqaoutputps.cc:411
 hqaoutputps.cc:412
 hqaoutputps.cc:413
 hqaoutputps.cc:414
 hqaoutputps.cc:415
 hqaoutputps.cc:416
 hqaoutputps.cc:417
 hqaoutputps.cc:418
 hqaoutputps.cc:419
 hqaoutputps.cc:420
 hqaoutputps.cc:421
 hqaoutputps.cc:422
 hqaoutputps.cc:423
 hqaoutputps.cc:424
 hqaoutputps.cc:425
 hqaoutputps.cc:426
 hqaoutputps.cc:427
 hqaoutputps.cc:428
 hqaoutputps.cc:429
 hqaoutputps.cc:430
 hqaoutputps.cc:431
 hqaoutputps.cc:432
 hqaoutputps.cc:433
 hqaoutputps.cc:434
 hqaoutputps.cc:435
 hqaoutputps.cc:436
 hqaoutputps.cc:437
 hqaoutputps.cc:438
 hqaoutputps.cc:439
 hqaoutputps.cc:440
 hqaoutputps.cc:441
 hqaoutputps.cc:442
 hqaoutputps.cc:443
 hqaoutputps.cc:444
 hqaoutputps.cc:445
 hqaoutputps.cc:446
 hqaoutputps.cc:447
 hqaoutputps.cc:448
 hqaoutputps.cc:449
 hqaoutputps.cc:450
 hqaoutputps.cc:451
 hqaoutputps.cc:452
 hqaoutputps.cc:453
 hqaoutputps.cc:454
 hqaoutputps.cc:455
 hqaoutputps.cc:456
 hqaoutputps.cc:457
 hqaoutputps.cc:458
 hqaoutputps.cc:459
 hqaoutputps.cc:460
 hqaoutputps.cc:461
 hqaoutputps.cc:462
 hqaoutputps.cc:463
 hqaoutputps.cc:464
 hqaoutputps.cc:465
 hqaoutputps.cc:466
 hqaoutputps.cc:467
 hqaoutputps.cc:468
 hqaoutputps.cc:469
 hqaoutputps.cc:470
 hqaoutputps.cc:471
 hqaoutputps.cc:472
 hqaoutputps.cc:473
 hqaoutputps.cc:474
 hqaoutputps.cc:475
 hqaoutputps.cc:476
 hqaoutputps.cc:477
 hqaoutputps.cc:478
 hqaoutputps.cc:479
 hqaoutputps.cc:480
 hqaoutputps.cc:481
 hqaoutputps.cc:482
 hqaoutputps.cc:483
 hqaoutputps.cc:484
 hqaoutputps.cc:485
 hqaoutputps.cc:486
 hqaoutputps.cc:487
 hqaoutputps.cc:488
 hqaoutputps.cc:489
 hqaoutputps.cc:490
 hqaoutputps.cc:491
 hqaoutputps.cc:492
 hqaoutputps.cc:493
 hqaoutputps.cc:494
 hqaoutputps.cc:495
 hqaoutputps.cc:496
 hqaoutputps.cc:497
 hqaoutputps.cc:498
 hqaoutputps.cc:499
 hqaoutputps.cc:500
 hqaoutputps.cc:501
 hqaoutputps.cc:502
 hqaoutputps.cc:503
 hqaoutputps.cc:504
 hqaoutputps.cc:505
 hqaoutputps.cc:506
 hqaoutputps.cc:507
 hqaoutputps.cc:508
 hqaoutputps.cc:509
 hqaoutputps.cc:510
 hqaoutputps.cc:511
 hqaoutputps.cc:512
 hqaoutputps.cc:513
 hqaoutputps.cc:514
 hqaoutputps.cc:515
 hqaoutputps.cc:516
 hqaoutputps.cc:517
 hqaoutputps.cc:518
 hqaoutputps.cc:519
 hqaoutputps.cc:520
 hqaoutputps.cc:521
 hqaoutputps.cc:522
 hqaoutputps.cc:523
 hqaoutputps.cc:524
 hqaoutputps.cc:525
 hqaoutputps.cc:526
 hqaoutputps.cc:527
 hqaoutputps.cc:528
 hqaoutputps.cc:529
 hqaoutputps.cc:530
 hqaoutputps.cc:531
 hqaoutputps.cc:532
 hqaoutputps.cc:533
 hqaoutputps.cc:534
 hqaoutputps.cc:535
 hqaoutputps.cc:536
 hqaoutputps.cc:537
 hqaoutputps.cc:538
 hqaoutputps.cc:539
 hqaoutputps.cc:540
 hqaoutputps.cc:541
 hqaoutputps.cc:542
 hqaoutputps.cc:543
 hqaoutputps.cc:544
 hqaoutputps.cc:545
 hqaoutputps.cc:546
 hqaoutputps.cc:547
 hqaoutputps.cc:548
 hqaoutputps.cc:549
 hqaoutputps.cc:550
 hqaoutputps.cc:551
 hqaoutputps.cc:552
 hqaoutputps.cc:553
 hqaoutputps.cc:554
 hqaoutputps.cc:555
 hqaoutputps.cc:556
 hqaoutputps.cc:557
 hqaoutputps.cc:558
 hqaoutputps.cc:559
 hqaoutputps.cc:560
 hqaoutputps.cc:561
 hqaoutputps.cc:562
 hqaoutputps.cc:563
 hqaoutputps.cc:564
 hqaoutputps.cc:565
 hqaoutputps.cc:566
 hqaoutputps.cc:567
 hqaoutputps.cc:568
 hqaoutputps.cc:569
 hqaoutputps.cc:570
 hqaoutputps.cc:571
 hqaoutputps.cc:572
 hqaoutputps.cc:573
 hqaoutputps.cc:574
 hqaoutputps.cc:575
 hqaoutputps.cc:576
 hqaoutputps.cc:577
 hqaoutputps.cc:578
 hqaoutputps.cc:579
 hqaoutputps.cc:580
 hqaoutputps.cc:581
 hqaoutputps.cc:582
 hqaoutputps.cc:583
 hqaoutputps.cc:584
 hqaoutputps.cc:585
 hqaoutputps.cc:586
 hqaoutputps.cc:587
 hqaoutputps.cc:588
 hqaoutputps.cc:589
 hqaoutputps.cc:590
 hqaoutputps.cc:591
 hqaoutputps.cc:592
 hqaoutputps.cc:593
 hqaoutputps.cc:594
 hqaoutputps.cc:595
 hqaoutputps.cc:596
 hqaoutputps.cc:597
 hqaoutputps.cc:598
 hqaoutputps.cc:599
 hqaoutputps.cc:600
 hqaoutputps.cc:601
 hqaoutputps.cc:602
 hqaoutputps.cc:603
 hqaoutputps.cc:604
 hqaoutputps.cc:605
 hqaoutputps.cc:606
 hqaoutputps.cc:607
 hqaoutputps.cc:608
 hqaoutputps.cc:609
 hqaoutputps.cc:610
 hqaoutputps.cc:611
 hqaoutputps.cc:612
 hqaoutputps.cc:613
 hqaoutputps.cc:614
 hqaoutputps.cc:615
 hqaoutputps.cc:616
 hqaoutputps.cc:617
 hqaoutputps.cc:618
 hqaoutputps.cc:619
 hqaoutputps.cc:620
 hqaoutputps.cc:621
 hqaoutputps.cc:622
 hqaoutputps.cc:623
 hqaoutputps.cc:624
 hqaoutputps.cc:625
 hqaoutputps.cc:626
 hqaoutputps.cc:627
 hqaoutputps.cc:628
 hqaoutputps.cc:629
 hqaoutputps.cc:630
 hqaoutputps.cc:631
 hqaoutputps.cc:632
 hqaoutputps.cc:633
 hqaoutputps.cc:634
 hqaoutputps.cc:635
 hqaoutputps.cc:636
 hqaoutputps.cc:637
 hqaoutputps.cc:638
 hqaoutputps.cc:639
 hqaoutputps.cc:640
 hqaoutputps.cc:641
 hqaoutputps.cc:642
 hqaoutputps.cc:643
 hqaoutputps.cc:644
 hqaoutputps.cc:645
 hqaoutputps.cc:646
 hqaoutputps.cc:647
 hqaoutputps.cc:648
 hqaoutputps.cc:649
 hqaoutputps.cc:650
 hqaoutputps.cc:651
 hqaoutputps.cc:652
 hqaoutputps.cc:653
 hqaoutputps.cc:654
 hqaoutputps.cc:655
 hqaoutputps.cc:656
 hqaoutputps.cc:657
 hqaoutputps.cc:658
 hqaoutputps.cc:659
 hqaoutputps.cc:660
 hqaoutputps.cc:661
 hqaoutputps.cc:662
 hqaoutputps.cc:663
 hqaoutputps.cc:664
 hqaoutputps.cc:665
 hqaoutputps.cc:666
 hqaoutputps.cc:667
 hqaoutputps.cc:668
 hqaoutputps.cc:669
 hqaoutputps.cc:670
 hqaoutputps.cc:671
 hqaoutputps.cc:672
 hqaoutputps.cc:673
 hqaoutputps.cc:674
 hqaoutputps.cc:675
 hqaoutputps.cc:676
 hqaoutputps.cc:677
 hqaoutputps.cc:678
 hqaoutputps.cc:679
 hqaoutputps.cc:680
 hqaoutputps.cc:681
 hqaoutputps.cc:682
 hqaoutputps.cc:683
 hqaoutputps.cc:684
 hqaoutputps.cc:685
 hqaoutputps.cc:686
 hqaoutputps.cc:687
 hqaoutputps.cc:688
 hqaoutputps.cc:689
 hqaoutputps.cc:690
 hqaoutputps.cc:691
 hqaoutputps.cc:692
 hqaoutputps.cc:693
 hqaoutputps.cc:694
 hqaoutputps.cc:695
 hqaoutputps.cc:696
 hqaoutputps.cc:697
 hqaoutputps.cc:698
 hqaoutputps.cc:699
 hqaoutputps.cc:700
 hqaoutputps.cc:701
 hqaoutputps.cc:702
 hqaoutputps.cc:703
 hqaoutputps.cc:704
 hqaoutputps.cc:705
 hqaoutputps.cc:706
 hqaoutputps.cc:707
 hqaoutputps.cc:708
 hqaoutputps.cc:709
 hqaoutputps.cc:710
 hqaoutputps.cc:711
 hqaoutputps.cc:712
 hqaoutputps.cc:713
 hqaoutputps.cc:714
 hqaoutputps.cc:715
 hqaoutputps.cc:716
 hqaoutputps.cc:717
 hqaoutputps.cc:718
 hqaoutputps.cc:719
 hqaoutputps.cc:720
 hqaoutputps.cc:721
 hqaoutputps.cc:722
 hqaoutputps.cc:723
 hqaoutputps.cc:724
 hqaoutputps.cc:725
 hqaoutputps.cc:726
 hqaoutputps.cc:727
 hqaoutputps.cc:728
 hqaoutputps.cc:729
 hqaoutputps.cc:730
 hqaoutputps.cc:731
 hqaoutputps.cc:732
 hqaoutputps.cc:733
 hqaoutputps.cc:734
 hqaoutputps.cc:735
 hqaoutputps.cc:736
 hqaoutputps.cc:737
 hqaoutputps.cc:738
 hqaoutputps.cc:739
 hqaoutputps.cc:740
 hqaoutputps.cc:741