Files
2016-06-09 16:25:56 +02:00

115 lines
2.2 KiB
Perl
Executable File

#!/usr/bin/perl
# Designed to read output of 'cexmc ...-orun...' program
# Usage: ./mkacchist [-real] [macroName]
my $floatregexp = qr/-?\d+\.\d+/o;
my $col1regexp = qr/\s*(\d+)\s*\[\s*($floatregexp),\s*($floatregexp)\)\s*/o;
my $col2regexp = qr/\s*($floatregexp)\s*\(\s*(\d+)\s*\/\s*(\d+)\s*\)\s*/o;
my $col3regexp = qr/\s*($floatregexp)\s*\(\s*(\d+)\s*\/\s*\d+\s*\/\s*\d+\s*\)/o;
my $accregexp = qr/^$col1regexp\|$col2regexp\|$col3regexp/o;
my $xMin = 1.5;
my $xMax = -1.5;
my $nOfBins = 0;
my $binWidth = 0;
# 0 - real range, 1 - reconstructed range
my $histoType = shift;
my $macroName = shift;
$macroName = "" if $macroName eq undef;
if ( $histoType ne undef )
{
if ( $histoType eq "-real" )
{
$histoType = 0;
}
else
{
$macroName = $histoType;
$histoType = 1;
}
}
else
{
$histoType = 1;
}
my @histoData;
my @histoErrors;
$histoData[ 0 ] = 0;
$histoErrors[ 0 ] = 0;
sub calculateError
{
my ( $a, $b ) = @_;
return 0 if $a == 0 || $b == 0;
return sqrt( 1 / $a + 1 / $b ) * $a / $b;
}
while ( <> )
{
next unless /$accregexp/;
$xMin = $3 if $3 < $xMin;
$xMax = $2 if $2 > $xMax;
++$nOfBins;
if ( $binWidth == 0 )
{
$binWidth = $2 - $3;
}
else
{
my $newBinWidth = $2 - $3;
my $epsilon = 0.00001;
warn "Current bin width is $binWidth, new is $newBinWidth"
if abs( $newBinWidth - $binWidth ) > $epsilon;
}
if ( $histoType == 0 )
{
push @histoData, $4;
push @histoErrors, calculateError( $5, $6 );
}
else
{
push @histoData, $7;
push @histoErrors, calculateError( $8, $6 );
}
}
die "Corrupted input" if $nOfBins == 0;
push @histoData, 0;
push @histoErrors, 0;
my @histoDataReversed = reverse @histoData;
my @histoErrorsReversed = reverse @histoErrors;
$" = ",";
print << "MACRO";
TH1 * mkacchist$macroName()
{
Double_t histoData[] = { @histoDataReversed };
Double_t histoErrors[] = { @histoErrorsReversed };
TH1 * result = new TH1F( "acc$macroName", "Setup acceptances $macroName",
$nOfBins, $xMin, $xMax );
result->SetContent( histoData );
result->SetError( histoErrors );
return result;
}
MACRO