+++ /dev/null
-#if !defined(__CINT__) || defined(__MAKECINT__)
-
-#include <Riostream.h>
-
-// ROOT includes
-#include "TString.h"
-#include "TSystem.h"
-#include "TROOT.h"
-#include "TFile.h"
-#include "TEnv.h"
-#include "TObjArray.h"
-#include "TObjString.h"
-#include "TArrayI.h"
-#endif
-
-//_________________________________
-TString GetConvertedFilename ( TString filename )
-{
- TString convertedFilename = filename;
- convertedFilename.ReplaceAll(".pdf",".txt");
- return convertedFilename;
-}
-
-//_________________________________
-TString GetTriggerShort ( TString trigName )
-{
- TObjArray* arr = trigName.Tokenize("-");
- TString shortName = arr->At(0)->GetName();
- if ( arr->GetEntries() > 2 ) {
- shortName.Append(Form("-%s",arr->At(1)->GetName()));
- }
- delete arr;
- return shortName;
-}
-
-//_________________________________
-Int_t GetPage ( TString pattern, TString filename )
-{
- TString convertedFilename = GetConvertedFilename(filename);
-
- if ( gSystem->AccessPathName(convertedFilename.Data()) != 0 ) {
- gSystem->Exec(Form("gs -dBATCH -dNOPAUSE -sDEVICE=txtwrite -sOutputFile=- %s > %s",filename.Data(),convertedFilename.Data()));
- }
-
- ifstream inFile(convertedFilename.Data());
- if ( ! inFile.is_open() ) return -1;
-
- TObjArray* patternArr = pattern.Tokenize("&");
- TArrayI foundPages(patternArr->GetEntries());
- foundPages.Reset(-1);
-
- TString currLine = "";
- Int_t currPage = -1;
- Bool_t allOk = kFALSE;
- while ( ! inFile.eof() ) {
- currLine.ReadLine(inFile);
- if ( currLine.Contains("Page") ) {
- currLine.Remove(0,5);
- currPage = currLine.Atoi();
- foundPages.Reset(-1);
- }
- else {
- for ( Int_t ipat=0; ipat<patternArr->GetEntries(); ipat++ ) {
- TString currPattern = static_cast<TObjString*>(patternArr->At(ipat))->GetString();
- if ( currLine.Contains(currPattern.Data()) ) {
- foundPages[ipat] = currPage;
- Bool_t matchAll = kTRUE;
- for ( Int_t jpat=0; jpat<patternArr->GetEntries(); jpat++ ) {
- if ( foundPages[ipat] != foundPages[jpat] ) {
- matchAll = kFALSE;
- break;
- }
- }
- if ( matchAll ) {
- allOk = kTRUE;
- break;
- }
- }
- }
- if ( allOk ) break;
- }
- }
- inFile.close();
- delete patternArr;
- if ( ! allOk ) {
- printf("Warning: cannot find %s\n",pattern.Data());
- return -1;
- }
- return foundPages[0];
-}
-
-
-//_________________________________
-void EscapeSpecialChars ( TString& str )
-{
- str.ReplaceAll("\\","");
- TString specials = "_";
- TObjArray* specialList = specials.Tokenize(" ");
- for ( Int_t ichar=0; ichar<specialList->GetEntries(); ichar++ ) {
- TString currChar = static_cast<TObjString*>(specialList->At(ichar))->GetString();
- if ( str.Contains(currChar.Data()) ) str.ReplaceAll(currChar.Data(),Form("\\\%s",currChar.Data()));
- }
- delete specialList;
-}
-
-//_________________________________
-void BeginFrame ( TString title, ofstream& outFile )
-{
- outFile << endl;
- outFile << "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" << endl;
- outFile << "\\begin{frame}" << endl;
- outFile << " \\frametitle{" << title.Data() << "}" << endl;
-}
-
-//_________________________________
-void EndFrame ( ofstream& outFile )
-{
- outFile << "\\end{frame}" << endl;
-}
-
-//_________________________________
-void MakeDefaultItem ( ofstream& outFile, TString defaultItem = "" )
-{
- outFile << "\\begin{itemize}" << endl;
- outFile << " \\item " << defaultItem.Data() << endl;
- outFile << "\\end{itemize}" << endl;
-}
-
-//_________________________________
-Bool_t MakeSingleFigureSlide ( TString pattern, TString filename, TString title, ofstream &outFile )
-{
- Int_t pageNum = GetPage(pattern,filename);
- if ( pageNum<0 ) {
- return kFALSE;
- }
-
- BeginFrame(title,outFile);
- outFile << " \\begin{columns}[onlytextwidth]" << endl;
- outFile << " \\column{\\textwidth}" << endl;
- outFile << " \\centering" << endl;
- outFile << " \\includegraphics[width=0.98\\textwidth,height=0.92\\textheight,page=" << pageNum << "]{" << gSystem->BaseName(filename.Data()) << "}" <<endl;
- outFile << " \\end{columns}" << endl;
- EndFrame(outFile);
- return kTRUE;
-}
-
-//_________________________________
-Bool_t MakeTriggerSlide ( TString filename, ofstream &outFile )
-{
- BeginFrame("Trigger chamber efficiencies", outFile);
- outFile << " \\begin{columns}[onlytextwidth]" << endl;
- outFile << " \\column{0.66\\textwidth}" << endl;
- outFile << " \\centering" << endl;
- for ( Int_t ich=0; ich<4; ich++ ) {
- if ( ich%2 == 0 ) outFile << endl;
- Int_t ipage = GetPage(Form("Trigger chamber efficiency vs run for chamber %i",11+ich),filename);
- outFile << " \\includegraphics[width=0.48\\textwidth,page=" << ipage << "]{" << filename.Data() << "}" << endl;
- }
- outFile << " \\column{0.34\\textwidth}" << endl;
- outFile << " \\centering" << endl;
- Int_t ipage = GetPage("Multinomial probability",filename);
- outFile << " \\includegraphics[width=0.98\\textwidth,page=" << ipage << "]{" << filename.Data() << "}" << endl;
- outFile << " \\end{columns}" << endl;
- EndFrame(outFile);
- return kTRUE;
-}
-
-//_________________________________
-Bool_t MakeTriggerRPCslide ( TString filename, ofstream &outFile )
-{
- BeginFrame("Trigger chamber efficiencies per RPC",outFile);
- outFile << " \\begin{columns}[onlytextwidth]" << endl;
- outFile << " \\column{\\textwidth}" << endl;
- outFile << " \\centering" << endl;
- for ( Int_t ich=0; ich<4; ich++ ) {
- if ( ich%2 == 0 ) outFile << endl;
- Int_t ipage = GetPage(Form("Trigger chamber efficiency vs run for chamber %i&RPC",11+ich),filename);
- outFile << " \\includegraphics[width=0.37\\textwidth,page=" << ipage << "]{" << filename.Data() << "}" << endl;
- }
- outFile << " \\end{columns}" << endl;
- EndFrame(outFile);
- return kTRUE;
-}
-
-//_________________________________
-void MakeSummary ( TString period, ofstream &outFile )
-{
- BeginFrame("Summary I",outFile);
- outFile << "General informations" << endl;
- outFile << "\\begin{itemize}" << endl;
- outFile << " \\item Runs selected for MUON on ALICE logbook:" << endl;
- outFile << " \\begin{itemize}" << endl;
- outFile << " \\item Period: " << period.Data() << endl;
- outFile << " \\item Run Type: PHYSICS" << endl;
- outFile << " \\item Beam: STABLE" << endl;
- outFile << " \\item At least [ MUON\\_TRG \\& MUON\\_TRK \\& SPD ] as Readout" << endl;
- outFile << " \\item Quality: globaly GOOD and NOT BAD for readout Detectors" << endl;
- outFile << " \\item Duration: at least 10 min" << endl;
- outFile << " \\end{itemize}" << endl;
- outFile << "\\end{itemize}" << endl;
- outFile << endl;
- outFile << " \\vspace{5mm}" << endl;
- outFile << endl;
- outFile << "\\begin{columns}[onlytextwidth]" << endl;
- outFile << " \\column{\\textwidth}" << endl;
- outFile << " \\centering" << endl;
- outFile << " \\begin{tabular}{|l|lll|}" << endl;
- outFile << " \\hline" << endl;
- outFile << " & Total runs & CMUL & CMSL \\\\" << endl;
- outFile << " \\hline" << endl;
- outFile << " ALICE logbook & xx & xx & xx\\\\" << endl;
- outFile << " Good from QA & xx & xx & xx\\\\" << endl;
- outFile << " \\hline" << endl;
- outFile << " \\end{tabular}" << endl;
- outFile << "\\end{columns}" << endl;
- EndFrame(outFile);
-
- BeginFrame("Summary II",outFile);
- outFile << endl;
- outFile << "General:" << endl;
- MakeDefaultItem(outFile);
- outFile << endl;
- outFile << "MTR efficiency:" << endl;
- MakeDefaultItem(outFile,"More than xx\\% efficiency in trigger chambers, stable");
- outFile << endl;
- outFile << "MCH and MUON data quality:" << endl;
- MakeDefaultItem(outFile);
- EndFrame(outFile);
-
- BeginFrame("Run summary",outFile);
- outFile << " \\begin{columns}[onlytextwidth,T]" << endl;
- outFile << " \\footnotesize" << endl;
- outFile << " \\column{0.5\\textwidth}" << endl;
- outFile << " \\centering" << endl;
- outFile << " \\begin{tabular}{|cp{0.63\\textwidth}|}" << endl;
- outFile << " \\hline" << endl;
- outFile << " \\runTab[\\errorColor]{xxx}{xxx}" << endl;
- outFile << " \\hline" << endl;
- outFile << " \\end{tabular}" << endl;
- outFile << endl;
- outFile << " \\column{0.5\\textwidth}" << endl;
- outFile << " \\begin{tabular}{|cp{0.63\\textwidth}|}" << endl;
- outFile << " \\hline" << endl;
- outFile << " \\colorLegend" << endl;
- outFile << " \\hline" << endl;
- outFile << " \\end{tabular}" << endl;
- outFile << " \\end{columns}" << endl;
- EndFrame(outFile);
-}
-
-//_________________________________
-void MakePreamble ( ofstream &outFile )
-{
- outFile << "\\documentclass[9pt,table]{beamer}" << endl;
- outFile << "\\mode<presentation>" << endl;
- outFile << "\\usepackage[T1]{fontenc}" << endl;
- outFile << "\\usepackage{lmodern}" << endl;
- outFile << "\\usepackage{amsmath}" << endl;
- outFile << "\\usepackage{color,graphicx}" << endl;
- outFile << "\\usepackage{colortbl}" << endl;
- outFile << "\\usepackage{multirow}" << endl;
- outFile << "\\usepackage{pifont}" << endl;
- outFile << "\\usepackage{wasysym}" << endl;
- outFile << "\\usepackage{appendixnumberbeamer}" << endl;
- outFile << "\\usepackage[absolute,overlay]{textpos}" << endl;
- outFile << "\\usetheme{Madrid}" << endl;
- outFile << "\\useoutertheme{shadow}" << endl;
-
- outFile << "\\setbeamersize{text margin left=0.5cm, text margin right=0.5cm}" << endl;
- outFile << endl;
- outFile << "% Slightly change the template" << endl;
- outFile << "\\setbeamertemplate{navigation symbols}{} %suppress navigation symbols (bottom-right of frame)" << endl;
-
- outFile << "\\setbeamercolor*{author in head/foot}{parent=palette tertiary}" << endl;
- outFile << "\\setbeamercolor*{title in head/foot}{parent=palette secondary}" << endl;
- outFile << "\\setbeamercolor*{date in head/foot}{parent=palette primary}" << endl;
- outFile << "\\setbeamercolor*{section in head/foot}{parent=palette tertiary}" << endl;
- outFile << "\\setbeamercolor*{subsection in head/foot}{parent=palette primary}" << endl;
- outFile << "\\newcommand{\\changeFootline}[1]{" << endl;
- outFile << " \\setbeamertemplate{footline}{" << endl;
- outFile << " \\hbox{%" << endl;
- outFile << " \\begin{beamercolorbox}[wd=.2\\paperwidth,ht=2.25ex,dp=1ex,center]{author in head/foot}%" << endl;
- outFile << " \\insertshortauthor%~~(\\insertshortinstitute)" << endl;
- outFile << " \\end{beamercolorbox}%" << endl;
- outFile << " \\begin{beamercolorbox}[wd=.6\\paperwidth,ht=2.25ex,dp=1ex,center]{title in head/foot}%" << endl;
- outFile << " \\insertshorttitle" << endl;
- outFile << " \\hspace*{2em}\\insertshortdate{}" << endl;
- outFile << " \\end{beamercolorbox}%" << endl;
- outFile << " \\begin{beamercolorbox}[wd=.2\\paperwidth,ht=2.25ex,dp=1ex,right]{date in head/foot}%" << endl;
- outFile << " #1\\hspace*{2ex}" << endl;
- outFile << " \\end{beamercolorbox}}%" << endl;
- outFile << " }}" << endl;
- outFile << "\\changeFootline{\\insertframenumber{} / \\inserttotalframenumber}" << endl;
- outFile << "\\setbeamertemplate{headline}{}" << endl;
- outFile << endl;
- outFile << endl;
- outFile << "\\newcommand{\\errorColor}{red!50!white}" << endl;
- outFile << "\\newcommand{\\warningColor}{orange!50!white}" << endl;
- outFile << "\\newcommand{\\pendingColor}{yellow!50!white}" << endl;
- outFile << "\\newcommand{\\newColor}{blue!20!white}" << endl;
- outFile << "\\newcommand{\\colorLegend}{" << endl;
- outFile << " \\multicolumn{2}{|l|}{\\colorbox{\\newColor}{~~} = newly analyzed}\\\\" << endl;
- outFile << " \\multicolumn{2}{|l|}{\\colorbox{\\pendingColor}{~~} = pending statement}\\\\" << endl;
- outFile << " \\multicolumn{2}{|l|}{\\colorbox{\\warningColor}{~~} = possible problem}\\\\" << endl;
- outFile << " \\multicolumn{2}{|l|}{\\colorbox{\\errorColor}{~~} = problem spotted}\\\\}" << endl;
- outFile << "\\newcommand{\\runTab}[3][white]{\\cellcolor{#1} #2 & \\cellcolor{#1} #3\\\\}" << endl;
- outFile << endl;
- outFile << "\\newcommand{\\pik}{\\ensuremath{\\pi\\mathrm{/K}}}" << endl;
- outFile << "\\newcommand{\\mum}{\\mbox{$\\mu {\\rm m}$}}" << endl;
- outFile << "\\newcommand{\\mom}{\\mbox{GeV$\\kern-0.15em /\\kern-0.12em c$}}" << endl;
- outFile << "\\newcommand{\\pt}{\\ensuremath{p_{\\mathrm{T}}}}" << endl;
- outFile << "\\newcommand{\\dd}{\\text{d}}" << endl;
- outFile << "\\newcommand{\\raa}{\\ensuremath{R_{AA}}}" << endl;
-}
-
-//_________________________________
-void BeginSlides ( TString period, TString pass, TString authors, ofstream &outFile )
-{
- TString authorsShort = "";
- Bool_t previousIsLetter = kFALSE;
- for ( Int_t ichar=0; ichar<authors.Length(); ichar++ ) {
- TString currChar = authors[ichar];
- currChar.ToUpper();
- Int_t currentIsLetter = currChar.IsAlpha();
- if ( currentIsLetter && ! previousIsLetter ) authorsShort += currChar + ".";
- if ( currChar == "," ) authorsShort += ",";
- previousIsLetter = currentIsLetter;
- }
-
- outFile << "\\title{Muon QA: " << period.Data() << " " << pass.Data() << "}" << endl;
- outFile << "\\author[" << authorsShort.Data() << "]{" << authors.Data() << "}" << endl;
- outFile << "\\date{\\today}" << endl;
-
- outFile << "\\begin{document}" << endl;
- outFile << "\\setlength{\\TPHorizModule}{1bp}" << endl;
- outFile << "\\setlength{\\TPVertModule}{1bp}" << endl;
- outFile << "\\textblockorigin{0bp}{0bp}" << endl;
- outFile << endl;
- outFile << "\\graphicspath{{images/}}" << endl;
-
- outFile << endl;
- outFile << "\\begin{frame}" << endl;
- outFile << " \\titlepage" << endl;
- outFile << "\\end{frame}" << endl;
-}
-
-//_________________________________
-void EndSlides ( ofstream &outFile )
-{
- outFile << "\\end{document}" << endl;
- outFile.close();
-}
-
-//_________________________________
-void StartAppendix ( ofstream &outFile )
-{
- outFile << endl;
- outFile << endl;
- outFile << "\\AtBeginSection[] % Do nothing for \\section*" << endl;
- outFile << "{" << endl;
- outFile << " \\begin{frame}<beamer>" << endl;
- outFile << " \\begin{beamercolorbox}[sep=8pt,center,shadow=true,rounded=true]{title}" << endl;
- outFile << " \\usebeamerfont{title}\\insertsectionhead" << endl;
- outFile << " \\end{beamercolorbox}" << endl;
- outFile << " \\end{frame}" << endl;
- outFile << "}" << endl;
- outFile << endl;
- outFile << "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" << endl;
- outFile << "\\appendix" << endl;
- outFile <<"\\changeFootline{A.\\insertframenumber{}}" << endl;
- outFile << "\\section{\\huge Backup slides}" << endl;
-}
-
-//_________________________________
-void MakeSlides ( TString period, TString pass, TString triggerList, TString authors, TString trackerQA = "QA_muon_tracker.pdf", TString triggerQA = "QA_muon_trigger.pdf", TString texFilename = "muonQA.tex" )
-{
- if ( gSystem->AccessPathName(texFilename.Data()) == 0 ) {
- printf("Output file %s already exists\nPlease remove it!\n", texFilename.Data());
- return;
- }
-
- TString hasGs = gSystem->GetFromPipe("which gs");
- if ( hasGs.IsNull() ) {
- printf("The macro selects the pdf page with gs, but the program was not found on this machine. Sorry, but slides cannot be automatically generated on this machine.\n");
- return;
- }
-
- EscapeSpecialChars(period);
- EscapeSpecialChars(pass);
-
- TObjArray* trigList = triggerList.Tokenize(",");
-
- ofstream outFile(texFilename);
- MakePreamble(outFile);
- BeginSlides(period,pass,authors,outFile);
-
- MakeSummary(period,outFile);
-
- MakeSingleFigureSlide("Selections: RUN",trackerQA,"Number of events per trigger",outFile);
- MakeSingleFigureSlide("L2A from QA",triggerQA,"Reconstruction: reconstructed triggers in QA wrt L2A from OCDB scalers",outFile);
- MakeTriggerSlide(triggerQA,outFile);
-
- for ( Int_t itrig=0; itrig<trigList->GetEntries(); itrig++ ) {
- TString currTrig = trigList->At(itrig)->GetName();
- TString shortTrig = GetTriggerShort(currTrig);
- MakeSingleFigureSlide(Form("Number of Tracks /%s",currTrig.Data()),trackerQA,Form("Muon tracks / event in %s events",shortTrig.Data()),outFile);
- MakeSingleFigureSlide(Form("Sum of trigger tracks (matched + trigger-only) / # events in %s",currTrig.Data()),trackerQA,Form("Muon tracker-trigger tracks / event in %s events",shortTrig.Data()),outFile);
- MakeSingleFigureSlide(Form("Matched tracks charge asymmetry for %s with acc. cuts",currTrig.Data()),trackerQA,Form("Charge asymmetry in %s events",shortTrig.Data()),outFile);
- MakeSingleFigureSlide(Form("Identified beam-gas tracks (pxDCA cuts) in matched tracks for %s",currTrig.Data()),trackerQA,Form("Rel. num. of beam-gas tracks (id. by p$\\times$DCA cuts) in %s events",shortTrig.Data()),outFile);
- }
- MakeSingleFigureSlide("averaged number of associated clusters or of the number of chamber hit per track",trackerQA,"Average number of clusters per track and dispersion",outFile);
- MakeSingleFigureSlide("averaged number of clusters in chamber i per track",trackerQA,"Average number of clusters per chamber",outFile);
-
- StartAppendix(outFile);
- MakeSingleFigureSlide("Phys. Sel. for all selected triggers",trackerQA,"Physics selection effects",outFile);
- MakeSingleFigureSlide("<X> of clusters - associated to a track - in chamber i",trackerQA,"Average cluster position per chamber",outFile);
- MakeSingleFigureSlide("averaged normalized",trackerQA,"Tracking quality",outFile);
-
- MakeTriggerRPCslide(triggerQA,outFile);
- MakeSingleFigureSlide("Trigger Lpt cut per run",trackerQA,"Trigger \\pt\\ cut",outFile);
-
- BeginFrame("Hardware issues",outFile);
- outFile << "MUON Trigger" << endl;
- MakeDefaultItem(outFile);
- outFile << endl;
- outFile << "MUON tracker" << endl;
- MakeDefaultItem(outFile);
- EndFrame(outFile);
-
- EndSlides(outFile);
-
- delete trigList;
-
- // Clean converted txt files
- TString filenames[2] = {trackerQA, triggerQA};
- for ( Int_t ifile=0; ifile<2; ifile++ ) {
- TString convertedFilename = GetConvertedFilename(filenames[ifile]);
- if ( gSystem->AccessPathName(convertedFilename.Data()) == 0 ) gSystem->Exec(Form("rm %s",convertedFilename.Data()));
- }
-}