[Rivet] [Rivet-svn] r4227 - branches/2012-06-aidarivet/bin branches/2012-06-aidarivet/doc trunk/bin trunk/doc

Frank Siegert frank.siegert at cern.ch
Mon Mar 18 15:03:41 GMT 2013


Hi Andy,

This has been in the script since the initial import (r1171). My
commit only fixes it for variable x-axis binning and makes the
EnvelopeRebin functionality (which is newer) available in a more
consistent manner.

Cheers,
Frank


On 18 March 2013 15:56, Andy Buckley <andy.buckley at ed.ac.uk> wrote:
> Hi Frank,
>
> I must have missed rebinning going in -- how is this possible in a
> purely plotting code, without more info about the weights in each bin,
> the histo type, etc.? Profiles, normalised histos, and unnormalised
> histos will presumably merge bins with different effects on the bin
> height and errors.
>
> Maybe I'm missing something, but I'm afraid of a) "blessing" approximate
> tricks -- that's why aidamerge is banished to contrib, and b) putting
> too much physics/stats-specific intelligence & heuristics into the
> plotting script...
>
> Andy
>
>
> On 18/03/13 15:49, blackhole at projects.hepforge.org wrote:
>> Author: fsiegert
>> Date: Mon Mar 18 14:49:01 2013
>> New Revision: 4227
>>
>> Log:
>> - make-plots: Make Rebin work for variable x-axis binning
>> - make-plots: Replace EnvelopeRebin option with ErrorType that is used in combination with the Rebin option. This allows to rebin different types of histograms (statistical errors, envelope errors) in the same plot.
>>
>> Modified:
>>    branches/2012-06-aidarivet/bin/make-plots
>>    branches/2012-06-aidarivet/doc/make-plots.txt
>>    trunk/bin/make-plots
>>    trunk/doc/make-plots.txt
>>
>> Modified: branches/2012-06-aidarivet/bin/make-plots
>> ==============================================================================
>> --- branches/2012-06-aidarivet/bin/make-plots Mon Mar 18 10:47:37 2013        (r4226)
>> +++ branches/2012-06-aidarivet/bin/make-plots Mon Mar 18 14:49:01 2013        (r4227)
>> @@ -123,9 +123,6 @@
>>          if self.description.has_key('Rebin'):
>>              for i in self.histos:
>>                  self.histos[i].description['Rebin'] = self.description['Rebin']
>> -        if self.description.has_key('EnvelopeRebin'):
>> -            for i in self.histos:
>> -                self.histos[i].description['EnvelopeRebin'] = self.description['EnvelopeRebin']
>>
>>          histoordermap = {}
>>          histolist = self.histos.keys()
>> @@ -1320,6 +1317,9 @@
>>                  self.data[i]['Error'][1] *= scale
>>          if self.description.has_key('Rebin') and self.description['Rebin']!='':
>>              rebin=int(self.description['Rebin'])
>> +            errortype = "stat"
>> +            if self.description.has_key('ErrorType') and self.description['ErrorType']!='':
>> +                errortype = self.description['ErrorType']
>>              newdata=[]
>>              if rebin>=2:
>>                  for i in range(0,(len(self.data)/rebin)*rebin,rebin):
>> @@ -1327,30 +1327,27 @@
>>                      barl=0.
>>                      baru=0.
>>                      for j in range(rebin):
>> -                        foo +=self.data[i+j]['Content']
>> -                        barl+=self.data[i+j]['Error'][0]**2
>> -                        baru+=self.data[i+j]['Error'][1]**2
>> -                    newdata.append({'LowEdge': self.data[i]['LowEdge'],
>> -                                    'UpEdge':  self.data[i+rebin-1]['UpEdge'],
>> -                                    'Content': foo/float(rebin),
>> -                                    'Error':   [sqrt(barl)/float(rebin),sqrt(baru)/float(rebin)]})
>> -                self.data=newdata
>> -        if self.description.has_key('EnvelopeRebin') and self.description['EnvelopeRebin']!='':
>> -            rebin=int(self.description['EnvelopeRebin'])
>> -            newdata=[]
>> -            if rebin>=2:
>> -                for i in range(0,(len(self.data)/rebin)*rebin,rebin):
>> -                    newcentral=0.
>> -                    newmax=0.
>> -                    newmin=0.
>> -                    for j in range(rebin):
>> -                        newcentral +=self.data[i+j]['Content']
>> -                        newmin +=self.data[i+j]['Content']-self.data[i+j]['Error'][0]
>> -                        newmax +=self.data[i+j]['Content']+self.data[i+j]['Error'][1]
>> +                        binwidth=self.data[i+j]['UpEdge']-self.data[i+j]['LowEdge']
>> +                        foo +=self.data[i+j]['Content']*binwidth
>> +                        if errortype=="stat":
>> +                            barl+=(binwidth*self.data[i+j]['Error'][0])**2
>> +                            baru+=(binwidth*self.data[i+j]['Error'][1])**2
>> +                        elif errortype=="env":
>> +                            barl+=(self.data[i+j]['Content']-self.data[i+j]['Error'][0])*binwidth
>> +                            baru+=(self.data[i+j]['Content']+self.data[i+j]['Error'][1])*binwidth
>> +                        else:
>> +                            logging.error("Rebinning for ErrorType not implemented.")
>> +                            sys.exit(1)
>> +                    newbinwidth=self.data[i+rebin-1]['UpEdge']-self.data[i]['LowEdge']
>> +                    newcentral=foo/newbinwidth
>> +                    if errortype=="stat":
>> +                        newerror=[sqrt(barl)/newbinwidth,sqrt(baru)/newbinwidth]
>> +                    elif errortype=="env":
>> +                        newerror=[(foo-barl)/newbinwidth,(baru-foo)/newbinwidth]
>>                      newdata.append({'LowEdge': self.data[i]['LowEdge'],
>>                                      'UpEdge':  self.data[i+rebin-1]['UpEdge'],
>> -                                    'Content': newcentral/float(rebin),
>> -                                    'Error':   [(newcentral-newmin)/float(rebin),(newmax-newcentral)/float(rebin)]})
>> +                                    'Content': newcentral,
>> +                                    'Error':   newerror})
>>                  self.data=newdata
>>
>>      def add(self,name):
>>
>> Modified: branches/2012-06-aidarivet/doc/make-plots.txt
>> ==============================================================================
>> --- branches/2012-06-aidarivet/doc/make-plots.txt     Mon Mar 18 10:47:37 2013        (r4226)
>> +++ branches/2012-06-aidarivet/doc/make-plots.txt     Mon Mar 18 14:49:01 2013        (r4227)
>> @@ -581,19 +581,17 @@
>>
>>  --------------------
>>  Rebin=<nbins>
>> +ErrorType=<stat|env>
>>  --------------------
>>  Rebin the histogram. Starting with the lowest bin <nbins> bins are combined
>>  into a new bin. If the number of bins in the histogram is not a multiple of
>>  <nbins>, the remaining bins at the upper histogram end are silently ignored
>>  (i.e. if the original histogram has 10 bins and <nbins> is 3, the plotted
>>  histogram shows three bins combining the bins 1--9 of the original histogram).
>> -
>> ---------------------
>> -EnvelopeRebin=<nbins>
>> ---------------------
>> -Rebin an envelope histogram where the error bars represent an envelope. Thus,
>> -they are combined linearly instead of as sum of squares. The functionality
>> -is the same as 'Rebin' otherwise.
>> +The treatment of the errors is determined by the given ErrorType:
>> +`stat` (default) assumes the errors are of statistical nature and combines
>> +them in quadrature sum, while `env` allows to treat errors as envelope of
>> +various uncertainty runs which are combined linearly.
>>
>>
>>  FUNCTION
>>
>> Modified: trunk/bin/make-plots
>> ==============================================================================
>> --- trunk/bin/make-plots      Mon Mar 18 10:47:37 2013        (r4226)
>> +++ trunk/bin/make-plots      Mon Mar 18 14:49:01 2013        (r4227)
>> @@ -133,9 +133,6 @@
>>          if self.description.has_key('Rebin'):
>>              for i in self.histos:
>>                  self.histos[i].description['Rebin'] = self.description['Rebin']
>> -        if self.description.has_key('EnvelopeRebin'):
>> -            for i in self.histos:
>> -                self.histos[i].description['EnvelopeRebin'] = self.description['EnvelopeRebin']
>>
>>          histoordermap = {}
>>          histolist = self.histos.keys()
>> @@ -1330,6 +1327,9 @@
>>                  self.data[i]['Error'][1] *= scale
>>          if self.description.has_key('Rebin') and self.description['Rebin']!='':
>>              rebin=int(self.description['Rebin'])
>> +            errortype = "stat"
>> +            if self.description.has_key('ErrorType') and self.description['ErrorType']!='':
>> +                errortype = self.description['ErrorType']
>>              newdata=[]
>>              if rebin>=2:
>>                  for i in range(0,(len(self.data)/rebin)*rebin,rebin):
>> @@ -1337,30 +1337,27 @@
>>                      barl=0.
>>                      baru=0.
>>                      for j in range(rebin):
>> -                        foo +=self.data[i+j]['Content']
>> -                        barl+=self.data[i+j]['Error'][0]**2
>> -                        baru+=self.data[i+j]['Error'][1]**2
>> -                    newdata.append({'LowEdge': self.data[i]['LowEdge'],
>> -                                    'UpEdge':  self.data[i+rebin-1]['UpEdge'],
>> -                                    'Content': foo/float(rebin),
>> -                                    'Error':   [sqrt(barl)/float(rebin),sqrt(baru)/float(rebin)]})
>> -                self.data=newdata
>> -        if self.description.has_key('EnvelopeRebin') and self.description['EnvelopeRebin']!='':
>> -            rebin=int(self.description['EnvelopeRebin'])
>> -            newdata=[]
>> -            if rebin>=2:
>> -                for i in range(0,(len(self.data)/rebin)*rebin,rebin):
>> -                    newcentral=0.
>> -                    newmax=0.
>> -                    newmin=0.
>> -                    for j in range(rebin):
>> -                        newcentral +=self.data[i+j]['Content']
>> -                        newmin +=self.data[i+j]['Content']-self.data[i+j]['Error'][0]
>> -                        newmax +=self.data[i+j]['Content']+self.data[i+j]['Error'][1]
>> +                        binwidth=self.data[i+j]['UpEdge']-self.data[i+j]['LowEdge']
>> +                        foo +=self.data[i+j]['Content']*binwidth
>> +                        if errortype=="stat":
>> +                            barl+=(binwidth*self.data[i+j]['Error'][0])**2
>> +                            baru+=(binwidth*self.data[i+j]['Error'][1])**2
>> +                        elif errortype=="env":
>> +                            barl+=(self.data[i+j]['Content']-self.data[i+j]['Error'][0])*binwidth
>> +                            baru+=(self.data[i+j]['Content']+self.data[i+j]['Error'][1])*binwidth
>> +                        else:
>> +                            logging.error("Rebinning for ErrorType not implemented.")
>> +                            sys.exit(1)
>> +                    newbinwidth=self.data[i+rebin-1]['UpEdge']-self.data[i]['LowEdge']
>> +                    newcentral=foo/newbinwidth
>> +                    if errortype=="stat":
>> +                        newerror=[sqrt(barl)/newbinwidth,sqrt(baru)/newbinwidth]
>> +                    elif errortype=="env":
>> +                        newerror=[(foo-barl)/newbinwidth,(baru-foo)/newbinwidth]
>>                      newdata.append({'LowEdge': self.data[i]['LowEdge'],
>>                                      'UpEdge':  self.data[i+rebin-1]['UpEdge'],
>> -                                    'Content': newcentral/float(rebin),
>> -                                    'Error':   [(newcentral-newmin)/float(rebin),(newmax-newcentral)/float(rebin)]})
>> +                                    'Content': newcentral,
>> +                                    'Error':   newerror})
>>                  self.data=newdata
>>
>>      def add(self,name):
>>
>> Modified: trunk/doc/make-plots.txt
>> ==============================================================================
>> --- trunk/doc/make-plots.txt  Mon Mar 18 10:47:37 2013        (r4226)
>> +++ trunk/doc/make-plots.txt  Mon Mar 18 14:49:01 2013        (r4227)
>> @@ -581,19 +581,17 @@
>>
>>  --------------------
>>  Rebin=<nbins>
>> +ErrorType=<stat|env>
>>  --------------------
>>  Rebin the histogram. Starting with the lowest bin <nbins> bins are combined
>>  into a new bin. If the number of bins in the histogram is not a multiple of
>>  <nbins>, the remaining bins at the upper histogram end are silently ignored
>>  (i.e. if the original histogram has 10 bins and <nbins> is 3, the plotted
>>  histogram shows three bins combining the bins 1--9 of the original histogram).
>> -
>> ---------------------
>> -EnvelopeRebin=<nbins>
>> ---------------------
>> -Rebin an envelope histogram where the error bars represent an envelope. Thus,
>> -they are combined linearly instead of as sum of squares. The functionality
>> -is the same as 'Rebin' otherwise.
>> +The treatment of the errors is determined by the given ErrorType:
>> +`stat` (default) assumes the errors are of statistical nature and combines
>> +them in quadrature sum, while `env` allows to treat errors as envelope of
>> +various uncertainty runs which are combined linearly.
>>
>>
>>  FUNCTION
>> _______________________________________________
>> Rivet-svn mailing list
>> Rivet-svn at projects.hepforge.org
>> http://www.hepforge.org/lists/listinfo/rivet-svn
>>
>
>
> --
> Dr Andy Buckley, Royal Society University Research Fellow
> Particle Physics Expt Group, University of Edinburgh
>
> The University of Edinburgh is a charitable body, registered in
> Scotland, with registration number SC005336.
>
> _______________________________________________
> Rivet mailing list
> Rivet at projects.hepforge.org
> http://www.hepforge.org/lists/listinfo/rivet


More information about the Rivet mailing list