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

Andy Buckley andy.buckley at ed.ac.uk
Mon Mar 18 14:56:22 GMT 2013


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.



More information about the Rivet mailing list