Skip to content

Commit

Permalink
Merge pull request #9550 from hroskes/improve-allinone-tool-74X
Browse files Browse the repository at this point in the history
Backport of #9532: More All-In-One tool improvements
  • Loading branch information
cmsbuild committed Jul 19, 2015
2 parents bf4797e + 0af8c7f commit 88e8135
Show file tree
Hide file tree
Showing 8 changed files with 313 additions and 79 deletions.
72 changes: 40 additions & 32 deletions Alignment/OfflineValidation/macros/trackSplitPlot.C
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ TCanvas *trackSplitPlot(Int_t nFiles,TString *files,TString *names,TString xvar,
if (nFiles < 1) nFiles = 1;

const Int_t n = nFiles;

setTDRStyle();
gStyle->SetOptStat(0); //for histograms, the mean and rms are included in the legend if nFiles >= 2
//if nFiles == 1, there is no legend, so they're in the statbox
Expand Down Expand Up @@ -212,7 +212,7 @@ TCanvas *trackSplitPlot(Int_t nFiles,TString *files,TString *names,TString xvar,
}
if (relative && pull)
tree->SetBranchAddress(sigmaorgvariable,&sigmaorg);

Int_t notincluded = 0; //this counts the number that aren't in the right run range.
//it's subtracted from lengths[i] in order to normalize the histograms

Expand Down Expand Up @@ -273,14 +273,14 @@ TCanvas *trackSplitPlot(Int_t nFiles,TString *files,TString *names,TString xvar,
}
}

if (lengths[i] < 10 ? true :
if (lengths[i] < 10 ? true :
(((j+1)/(int)(pow(10,(int)(log10(lengths[i]))-1)))*(int)(pow(10,(int)(log10(lengths[i]))-1)) == j + 1 || j + 1 == lengths[i]))
//print when j+1 is a multiple of 10^x, where 10^x has 1 less digit than lengths[i]
// and when it's finished
//For example, if lengths[i] = 123456, it will print this when j+1 = 10000, 20000, ..., 120000, 123456
//So it will print between 10 and 100 times: 10 when lengths[i] = 10^x and 100 when lengths[i] = 10^x - 1
{
cout << j + 1 << "/" << lengths[i] << ": ";
cout << j + 1 << "/" << lengths[i] << ": ";
if (type == Profile || type == ScatterPlot || type == Resolution)
cout << x << ", " << y << endl;
if (type == OrgHistogram)
Expand Down Expand Up @@ -466,7 +466,7 @@ TCanvas *trackSplitPlot(Int_t nFiles,TString *files,TString *names,TString xvar,
return 0;
}


c1->Update();
Double_t x1min = .98*gPad->GetUxmin() + .02*gPad->GetUxmax();
Double_t x2max = .02*gPad->GetUxmin() + .98*gPad->GetUxmax();
Expand All @@ -482,7 +482,7 @@ TCanvas *trackSplitPlot(Int_t nFiles,TString *files,TString *names,TString xvar,
}
Double_t newy2max = placeLegend(legend,width,height,x1min,y1min,x2max,y2max);
maxp->GetYaxis()->SetRangeUser(gPad->GetUymin(),(newy2max-.02*gPad->GetUymin())/.98);

legend->SetFillStyle(0);
legend->Draw();
}
Expand Down Expand Up @@ -556,23 +556,15 @@ void saveplot(TCanvas *c1,TString saveas)
if (saveas == "")
return;
TString saveas2 = saveas,
saveas3 = saveas,
saveas4;
saveas3 = saveas;
saveas2.ReplaceAll(".pngepsroot","");
saveas3.Remove(saveas3.Length()-11);
if (saveas2 == saveas3)
{
stringstream s1,s2,s3;
s1 << saveas2 << ".png";
s2 << saveas2 << ".eps";
s3 << saveas2 << ".root";
saveas2 = s1.str();
saveas3 = s2.str();
saveas4 = s3.str();
c1->SaveAs(saveas2);
c1->SaveAs(saveas3);
c1->SaveAs(saveas4);
return;
c1->SaveAs(saveas.ReplaceAll(".pngepsroot",".png"));
c1->SaveAs(saveas.ReplaceAll(".png",".eps"));
c1->SaveAs(saveas.ReplaceAll(".eps",".root"));
c1->SaveAs(saveas.ReplaceAll(".root",".pdf"));
}
else
{
Expand Down Expand Up @@ -704,7 +696,7 @@ void misalignmentDependence(TCanvas *c1old,
{
yaxislabel = axislabel(yvar,'y',relative,resolution,pull);
for (Int_t i = 0; i < nFiles; i++)
{
{
if (!used[i]) continue;
if (!resolution)
{
Expand Down Expand Up @@ -865,7 +857,7 @@ void misalignmentDependence(TCanvas *c1old,
stufftodelete->Add(g);
delete[] xvalues; //A TGraph2DErrors has its own copy of xvalues and yvalues, so it's ok to delete these copies.
delete[] yvalues;

TString xaxislabel = "#epsilon_{";
xaxislabel.Append(misalignment);
xaxislabel.Append("}cos(#delta)");
Expand Down Expand Up @@ -1127,7 +1119,7 @@ Bool_t misalignmentDependence(TCanvas *c1old,
functionname = "#Deltad_{xy}/#delta(#Deltad_{xy})=-Asin(2#phi_{org}+B)";
//functionname = "#Deltad_{xy}/#delta(#Deltad_{xy})=-Asin(2#phi_{org}+B)+C";
}

if (xvar == "theta" && yvar == "dz" && !resolution && !pull)
{
f = new TF1("line","-[0]*(x-[1])");
Expand Down Expand Up @@ -1280,7 +1272,7 @@ Bool_t misalignmentDependence(TCanvas *c1old,
f,parameter,parametername,functionname,relative,resolution,pull,saveas);
delete f;
return true;

}


Expand Down Expand Up @@ -1426,7 +1418,7 @@ void makePlots(Int_t nFiles,TString *files,TString *names,TString misalignment,D
for (Int_t i = 0; i < nPlots; i++)
{
stringstream ss;
ss << directory << slashstring << plotnames[i] << "." << pullstring
ss << directory << slashstring << plotnames[i] << "." << pullstring
<< xvarstring << yvarstring << relativestring << ".pngepsroot";
s.push_back(ss.str());
if (misalignment != "")
Expand Down Expand Up @@ -1745,17 +1737,33 @@ TString axislabel(TString variable, Char_t axis, Bool_t relative, Bool_t resolut
s << "#Delta";
s << fancyname(variable);
if (relative && axis == 'y')
s << " / " << fancyname(variable);
{
s << " / ";
if (!pull)
s << "(";
s << fancyname(variable);
}
Bool_t nHits = (variable[0] == 'n' && variable[1] == 'H' && variable[2] == 'i'
&& variable[3] == 't' && variable[4] == 's');
if (relative || (axis == 'x' && variable != "runNumber" && !nHits))
s << "_{org}";
if (pull && axis == 'y')
if (axis == 'y')
{
s << " / #delta(#Delta" << fancyname(variable);
if (relative)
s << " / " << fancyname(variable) << "_{org}";
s << ")";
if (pull)
{
s << " / #delta(#Delta" << fancyname(variable);
if (relative)
s << " / " << fancyname(variable) << "_{org}";
s << ")";
}
else
{
if (!relative)
s << " / ";
s << "#sqrt{2}";
if (relative)
s << ")";
}
}
if (resolution && axis == 'y')
s << ")";
Expand Down Expand Up @@ -2276,7 +2284,7 @@ void setTDRStyle() {
gStyle->SetEndErrorSize(2);
//gStyle->SetErrorMarker(20);
gStyle->SetErrorX(0.);

gStyle->SetMarkerStyle(7);

//For the fit/function:
Expand Down Expand Up @@ -2364,7 +2372,7 @@ void setTDRStyle() {
gStyle->SetOptLogz(0);

// Postscript options:

gStyle->SetPaperSize(20.,20.);
// gStyle->SetLineScalePS(Float_t scale = 3);
// gStyle->SetLineStyleString(Int_t i, const char* text);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,55 +1,62 @@
import ConfigParser
import os
import re
import copy
import collections
from TkAlExceptions import AllInOneError


class AdaptedDict(dict):
class AdaptedDict(collections.OrderedDict):
"""
Dictionary which handles updates of values for already existing keys
in a modified way.
Instead of replacing the old value, the new value is appended to the
value string separated by `self.getSep()`.
adapteddict[key] returns a list of all values associated with key
This dictionary is used in the class `BetterConfigParser` instead of the
default `dict_type` of the `ConfigParser` class.
"""

def getSep(self):
"""
This method returns the separator used to separate the values for
duplicate options in a config.
"""
return " |/| "
def __init__(self, *args, **kwargs):
self.validationslist = []
collections.OrderedDict.__init__(self, *args, **kwargs)

def __setitem__(self, key, value, dict_setitem=dict.__setitem__):
def __setitem__(self, key, value, dict_setitem=collections.OrderedDict.__setitem__):
"""
od.__setitem__(i, y) <==> od[i]=y
Updating an existing key appends the new value to the old value
separated by `self.getSep()` instead of replacing it.
instead of replacing it.
Arguments:
- `key`: key part of the key-value pair
- `value`: value part of the key-value pair
- `dict_item`: method which is used for finally setting the item
"""

if "__name__" in self and self["__name__"]=="validation" \
and key in self and value!=self[key][0]:
the_value = [self[key][0]+self.getSep()+value[0]]
if key != "__name__" and "__name__" in self and self["__name__"]=="validation":
if isinstance(value, (str, unicode)):
for index, item in enumerate(self.validationslist[:]):
if item == (key, value.split("\n")):
self.validationslist[index] = (key, value)
return
self.validationslist.append((key, value))
else:
the_value = value
dict_setitem(self, key, the_value)
dict_setitem(self, key, value)

def __getitem__(self, key):
if key != "__name__" and "__name__" in self and self["__name__"]=="validation":
return [validation[1] for validation in self.validationslist if validation[0] == key]
else:
return collections.OrderedDict.__getitem__(self, key)

def items(self):
if "__name__" in self and self["__name__"]=="validation":
return self.validationslist
else:
return collections.OrderedDict.items(self)

class BetterConfigParser(ConfigParser.ConfigParser):
def __init__(self):
ConfigParser.ConfigParser.__init__(self,dict_type=AdaptedDict)
dummyDict = AdaptedDict()
self._sep = dummyDict.getSep()
del dummyDict

def getSep(self):
return self._sep
self._optcre = self.OPTCRE_VALIDATION

def optionxform(self, optionstr):
return optionstr
Expand Down Expand Up @@ -172,3 +179,39 @@ def checkInput(self, section, knownSimpleOptions=[], knownKeywords=[],
%(option, section))
raise AllInOneError(msg)

def items(self, section, raw=False, vars=None):
if section == "validation":
if raw or vars:
raise NotImplementedError("'raw' and 'vars' do not work for betterConfigParser.items()!")
items = self._sections["validation"].items()
return items
else:
return ConfigParser.ConfigParser.items(self, section, raw, vars)

def write(self, fp):
"""Write an .ini-format representation of the configuration state."""
for section in self._sections:
fp.write("[%s]\n" % section)
for (key, value) in self._sections[section].items():
if key == "__name__" or not isinstance(value, (str, unicode)):
continue
if value is not None:
key = " = ".join((key, str(value).replace('\n', '\n\t')))
fp.write("%s\n" % (key))
fp.write("\n")


#Preexisting validations in the validation section have syntax:
# preexistingoffline myoffline
#with no = or :. This regex takes care of that.
OPTCRE_VALIDATION = re.compile(
r'(?P<option>'
r'(?P<preexisting>preexisting)?'
r'[^:=\s][^:=]*)' # very permissive!
r'\s*(?(preexisting)|' # IF preexisting does not exist:
r'(?P<vi>[:=])\s*' # any number of space/tab,
# followed by separator
# (either : or =), followed
# by any # space/tab
r'(?P<value>.*))$' # everything up to eol
)
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,7 @@
compareAlignmentsExecution="""
#merge for .oO[validationId]Oo. if it does not exist or is not up-to-date
echo -e "\n\nComparing validations"
cmsMkdir /store/caf/user/$USER/.oO[eosdir]Oo./
cp .oO[CMSSW_BASE]Oo./src/Alignment/OfflineValidation/scripts/compareFileAges.C .
root -x -q -b -l "compareFileAges.C(\\\"root://eoscms.cern.ch//eos/cms/store/caf/user/$USER/.oO[eosdir]Oo./.oO[validationId]Oo._result.root\\\", \\\".oO[compareStringsPlain]Oo.\\\")"
comparisonNeeded=${?}
Expand Down
Loading

0 comments on commit 88e8135

Please sign in to comment.