--- /dev/null
+#!/usr/bin/perl -w
+# runEMCALQA.pl v.0.5 A.SHABETAI alexandre.shabetai@cern.ch
+
+use Cwd 'abs_path';
+use File::Basename;
+use File::Path qw(mkpath );
+use File::Copy;
+use Getopt::Long;
+
+use strict;
+use warnings;
+
+##########################################################
+# What this script is doing and how to use it
+
+sub usage()
+{
+ print STDERR << "EOF";
+ This script runs the EMCAL QA macros on selected runs.
+
+ usage: $0 --period <PERIOD> --pass <PASS> [ --gridprefix <GRIDPREFIX> ] [--extraGridPath <EXTRAGRIDPATH> ] [ --runlist <runlist.txt> ] [ --col <pp||PbPb> ]
+
+ -h --help : shows this (help) messag
+
+The following parameters are mendatory:
+ --period : the running period to consider (ex: LHC1XX )
+ --pass : the production pass to use (use "simu" for simulated data) (ex: pass1 )
+
+ You may specify the following options if you want to change their default values:
+ --runlist : a text file with the list of runs to consider - one run by line (default: <period>-<pass>-runlist.txt ) (ex: MyLHC13arunlist.txt )
+ --extraGridPath : extra grid path to use (default: none ) (ex: ESDs/QA68 )
+ --localpath : path where the existing local QAresults files are stored (default: <period>/<pass> ) (ex: <a_prefix> )
+ --savePlots : save the plots as image files (0: no ; 1:png ; 2: png + pdf) (default: 1 (png) ) (ex: 0 )
+ --debug : debug flag (0 or 1) (default; 0 ) (ex: 1 )
+ --gridQAname : basename QA filename on the grid (without the .root suffix) (default: QAresults ) (ex: QAresults )
+ --gridTimeOut : timeOut for grid acces (default: 10 s ) (ex: 10 )
+ --gridprefix : the begining of the grid path to use (default: /alice/data/<year>/<period> - or .../sim/... if pass=simu) (ex: /alice/data/201X/LHC1XX )
+ --filter : filter the input file (default: 0 (no) ) (ex: 1 )
+ --treeSelections: filename of file containing additional cuts on the trending tree (default: none ) (ex: MySelection.C )
+ --trigger : force to use the specified trigger name (default: trigger names are automaticly read from the input files ) (ex: trigEMC )
+ --col : force the type of colisions pp or PbPb (default: pp - or PbPb if period ends with "h" ) (ex: PbPb )
+
+ NB: all switches can be abreviated ex: --period is valid as well as -pe
+
+ example: $0 --period LHC13a --pass pass1
+EOF
+
+exit;
+
+}
+
+#############################################################################
+# the values above should not be changed (please use the command lune options instead)
+
+my $help;
+my $period;
+my $pass;
+my $gridprefix;
+my $localpath;
+my $runlist;
+my $col;
+my $extragridPath;
+my $savePlots = 0;
+my $debug = 0;
+my $filter = 0;
+my $trigger = "";
+my $GridTimeOut = 10;
+my $gridQAname = "QAresults";
+my $treeSelections = "";
+
+#############################################################################
+# get options
+
+GetOptions (
+ "help!" => \$help,
+ "period=s" => \$period, # string
+ "pass=s" => \$pass, # string
+ "gridprefix=s" => \$gridprefix, #string
+ "localpath=s" => \$localpath, #string
+ "runlist=s" => \$runlist, #string
+ "col=s" => \$col, #string
+ "extraGridPath=s" => \$extragridPath, #string
+ "savePlots=i" => \$savePlots, #int
+ "debug=i" => \$debug, #int
+ "filter=i" => \$filter, #bool
+ "triggerForced=s" => \$trigger,
+ "gridTimeOut=i" => \$GridTimeOut, #int
+ "gridQAname=s" => \$gridQAname, #string
+ "treeSelections=s" => \$treeSelections) #string
+ or die("Error in command line arguments\n");
+ usage() if ($help);
+ die "Missing --period! (you can get help with $0 -h)" unless $period;
+ die "Missing --pass! (you can get help with $0 -h)" unless $pass;
+
+if ($pass eq "sim") {$pass= "simu";}
+if (!(defined($runlist))) {$runlist = "$period-$pass-runlist.txt";}
+if (!(defined($col)) && index($period, 'h') != -1) {$col = "PbPb";}
+if (!(defined($col))) {$col = "pp";}
+
+if (!(defined($gridprefix))) {
+ my $year=sprintf("20%s",substr($period, 3, 2));
+ if ($pass ne "simu") {$gridprefix = "/alice/data/$year/$period";} else {$gridprefix = "/alice/sim/$year/$period";}
+}
+if (!(defined($extragridPath))) {
+ if (($pass ne "simu") && (index($pass, 'c') != -1)) { $extragridPath = $pass;}
+ elsif ($pass ne "simu") { $extragridPath = "ESDs/$pass";}
+ else {$extragridPath = "";}
+ }
+
+##############################################################################
+# the values above should not be changed
+
+my $macroDir = abs_path(dirname($0));
+my $locDir = "$period/$pass";
+$ENV{QAPATH} = "$locDir/";
+my $processedrunlist = "$locDir/processed.txt";
+my $notprocessedrunlist = "$locDir/notprocessed.txt";
+my $exit_code = 0;
+
+my $calo = "EMCAL";
+my @gridsuffixes = qw(.root);
+if (index($pass, 'c') != -1) {@gridsuffixes = qw(_barrel.root _outer.root);}
+if (!(defined($localpath))) {$localpath = $locDir;} else {$localpath = $localpath."/";}
+
+###############################################################################
+# sanity checks
+
+if (! -e $locDir) {mkpath($locDir);}
+if ((defined(glob("$locDir/*data.txt")))) {unlink(glob("$locDir/*data.txt"));}
+my $includePath = qx{aliroot -b -l << EOF
+.include
+EOF
+};
+if (index($includePath,"$ENV{ALICE_ROOT}/include") == -1)
+ {print "Please add \$ALICE_ROOT/include to your include path using a rootlogon.C of .rootrc "; exit;}
+
+my $ALIEN_ROOT = $ENV{'ALIEN_ROOT'};
+if (!(defined($ALIEN_ROOT))) {die "ALIEN_ROOT not defined!";}
+my $proxyValidity = qx{$ALIEN_ROOT/api/bin/xrdgsiproxy info 2>&1 | grep "time left" | cut -d " " -f 6 | cut -d: -f1}; chomp($proxyValidity);
+if (!(defined($proxyValidity)) || $proxyValidity eq "0h") { die "No valid proxy found (or proxy valid for less that one hour). Nothing done!"};
+my $isValidToken = qx{$ALIEN_ROOT/api/bin/alien-token-info | grep -c "Token is still valid"};
+if ($isValidToken==0) { die "No valid token found. Nothing done!";}
+#############################################################################t
+# start working
+
+open(STDOUT, "| tee -i \"$locDir/$period\_$pass\_EMCALQA.log\"");
+open(STDERR, '>&STDOUT');
+open(FIN, $runlist) or die "Could not open $runlist: $! please specify --runlist of create $runlist";
+open(FOUT, ">$processedrunlist") or die "Could not open $processedrunlist: $!";
+open(FOUT2, ">$notprocessedrunlist") or die "Could not open $notprocessedrunlist: $!";
+
+print "\n Executing $0";
+ foreach (@ARGV) { print " $_";}
+print " ...\n";
+
+# read the run list
+my @runs;
+while( my $line = <FIN>) {
+ chomp($line);
+ my @fields = split(/,/, $line);
+ push @runs, @fields
+}
+ @runs = sort { $a <=> $b } @runs;
+
+# create the directory structure and copy the output of the QA train from the grid
+ foreach my $run (@runs) {
+ $run =~ tr/ //ds;
+ if($pass ne "simu") {$run = sprintf("%09d", $run);}
+ print "\nProcessing run $run...\n";
+ foreach my $suffix (@gridsuffixes) {
+ my $gridFile = "alien://$gridprefix/$run/$extragridPath/$gridQAname$suffix";
+ my $shortrun = $run; $shortrun =~ s/^0+//; $shortrun =~ s/ +$//;
+ my $locFileName = "$shortrun$suffix";
+
+ print "\n Processing file $locFileName...\n";
+
+ if (! -e "$locDir/$run") {mkdir("$locDir/$run");} #
+
+if ($localpath eq $locDir) {
+ for (my $trial = 1; $trial <= 2; $trial++)
+ {
+
+ system("root -b -l -q \'$macroDir/CopyQAFile.C+g\(\"$gridFile\",\"$localpath\",kFALSE,\"$locFileName\",$GridTimeOut\)\'");
+ $exit_code = $?>>8;
+
+ if (! $exit_code) { print "\nFile $gridQAname$suffix processed succesfully (run $shortrun, try $trial)\n";last} else { print "\nThe processing of file $gridQAname$suffix (run $shortrun) failed! (try $trial)\n";};
+ if ($exit_code eq 252 || $exit_code eq 253) {unlink("$localpath/$locFileName"); }
+ }
+ }
+# run the run level QA for the runs that were selected (i.e in the runlist and that do have a valid local QA output filie).
+
+ if (!$exit_code) {
+
+ if (-e "$localpath/$locFileName" ) {
+
+ system("aliroot -b -q \'$macroDir/CreateEMCALRunQA.C+g\(\"$localpath/$locFileName\",\"$run\",\"$period\",\"$pass\",$savePlots,$filter,\"$trigger\",\"$col\",\"$calo\"\)\'");
+ $exit_code = $?>>8;
+
+ if (! $exit_code) { print FOUT "$shortrun\n"; print "\nCreateEMCALRunQA() for file $gridQAname$suffix processed succesfully (run $shortrun)\n";} else { print FOUT2 "$shortrun\n" ; print "\nThe processing of CreateEMCALRunQA() for file $gridQAname$suffix failed! (run $shortrun)\n";};
+
+ if ($suffix ne ".root") { move("$locDir/$run/trending.root", "$locDir/$run/trending$suffix"); move("$locDir/$run/${period}_${pass}_${shortrun}_QAplots.root","$locDir/$run/${period}_${pass}_${shortrun}_QAplots$suffix");}
+
+ } else { print " File not found: $localpath/$locFileName";} }
+ }
+}
+
+close FIN;
+close FOUT;
+close FOUT2;
+$exit_code = 0;
+
+#################################################################################
+# merge the QA trees
+
+if ((! $exit_code) && defined(glob("$locDir/*/trendin*.root")) && (-e glob("$locDir/*/trendin*.root")))
+{
+
+ print "\nMerging....\n";
+
+ system("hadd -v 1 -f $locDir/trending.root $locDir/*/trendin*.root");
+ $exit_code = $?>>8;
+
+ if (! $debug) { system("rm $locDir/*/trendin*.root"); }
+
+}
+################################################################################
+# process and plot the period level QA
+
+print "\n";
+
+if ((! $exit_code) && (-e "$locDir/trending.root")) { system("root -b -l -q \'$macroDir/PlotEMCALQATrendingTree.C(\"$locDir/trending.root\",$savePlots,\"$treeSelections\",\"$trigger\"\)\'"); }
+
+$exit_code = $?>>8;
+if (! $exit_code) { print "\nPlotEMCALQATrendingTree() processed succesfully\n";} else { print "\nThe processing of PlotEMCALQATrendingTree() failed!\n";};
+
+################################################################################
+# cleanup
+
+move($processedrunlist,"$locDir/runlist.txt") or die "Cannot move the runlist to the correct local directory : $!";
+move("$locDir/trendingPlots.root","$locDir/$period"."_$pass"."_trendingPlots.root");
+
+################################################################################
+# final merging
+
+if ((! $exit_code) && defined(glob("$locDir/*/${period}_${pass}_*_QAplot*.root $locDir/${period}_${pass}_trendingPlots.root $locDir/trending.root")) && (-e glob("$locDir/*/${period}_${pass}_*_QAplot*.root $locDir/${period}_${pass}_trendingPlots.root $locDir/trending.root")))
+{
+
+ print "\n Final Merging....\n";
+
+ system("hadd -v 1 -f $locDir/${period}_${pass}_EMCALQA.root $locDir/*/${period}_${pass}_*_QAplot*.root $locDir/${period}_${pass}_trendingPlots.root $locDir/trending.root");
+
+ if (! $debug) {system("rm -f $locDir/*/${period}_${pass}_*_QAplot*.root $locDir/${period}_${pass}_trendingPlots.root"); }
+
+}
+
+###############################################################################
+# cleanup some files used for debugging
+
+if (! $debug && (defined(glob("$locDir/*/*.txt")))) {unlink(glob("$locDir/*/*.txt"));}
+if (! $debug && (defined(glob("$locDir/*.txt")))) {unlink(glob("$locDir/*.txt"));}
+if (! $debug && ! $savePlots && (defined(glob("$locDir/*/")))) {system("rmdir --ignore-fail-on-non-empty $locDir/*/");}
+
+
+##############################################################################
+#| make final pdf
+
+if ((! $exit_code) && -e "$locDir/${period}_${pass}_EMCALQA.root") { system("root -b -l -q \'$macroDir/MakeQAPdf.C+g(\"$locDir/${period}_${pass}_EMCALQA.root\"\)\'"); }
+
+
+##############################################################################
+# that's all falks
+
+print "\n Done! \n";
+
+