#!/usr/bin/perl -w
################################################################################
# ##
# MadGraph/MadEvent ##
# ##
# FILE : merge.pl ##
# VERSION : 1.2 ##
# DATE : 12 April 2007 ##
# AUTHOR : Michel Herquet (UCL-CP3) ##
# ##
# DESCRIPTION : script to merge to LHE events files ##
# USAGE : ##
# ./merge.pl eventfile1.lhe.gz eventfile2.lhe.gz ... result.lhe.gz banner.txt ##
# Note that result can be eventfile1, eventfile2, ... ##
# OUTPUT : merged file, banner ##
################################################################################
# Parse the command line arguments
if ( $#ARGV < 3 ) {
die "This script must be called with at least four filenames as arguments!\n";
}
# Start by copying the first input file as result
print "Copying first file on output file ... \n";
system("cp ".$ARGV[0]." ".$ARGV[$#ARGV-1]);
my $infile2=$ARGV[$#ARGV-1];
my $outfile=$ARGV[$#ARGV-1];
my $bannerfile=$ARGV[$#ARGV];
# Unzip and open the input files
print "Unzipping input files ... \n";
system("gunzip $infile2")==0 || die "Error while unzipping $infile2, stopping\n";
$infile2=~ s/\.gz//;
# Loop over files starting from the second one, and merge each time with the result (initially the first)
for($count=1;$count<=$#ARGV-2;$count++) {
my $infile1=$ARGV[$count];
system("gunzip $infile1")==0 || die "Error while unzipping $infile1, stopping\n";
$infile1=~ s/\.gz//;
print "Reading input files ... \n";
open(INFILE1,"$infile1") || die "Cannot open input file called $infile1, stopping\n";
open(INFILE2,"$infile2") || die "Cannot open input file called $infile2, stopping\n";
# Extract banner, init and events from event files
my $begin_tag='';
my $begin_init=''."\n";
my $end_init='';
my $begin_events=''."\n";
my $end_events='';
my $fulltext1;
my $fulltext2;
while()
{
$fulltext1 .= $_;
}
($banner1)= $fulltext1=~ m/$begin_tag(.*)$end_tag/s;
($init1)= $fulltext1=~ m/$begin_init(.*)$end_init/s;
($events1)= $fulltext1=~ m/$begin_events(.*)$end_events/s;
while()
{
$fulltext2 .= $_;
}
($banner2)= $fulltext2=~ m/$begin_tag(.*)$end_tag/s;
#($init2)= $fulltext1=~ m/$begin_init(.*)$end_init/s;
($events2)= $fulltext2=~ m/$begin_events(.*)$end_events/s;
# Close input files
close(INFILE1);
close(INFILE2);
# Scan banners to extract number of events and cross sections
($num_events1)= $banner1=~ m/# Number of Events\s*:(.*)\n/;
($xsec1)= $banner1=~ m/# Integrated weight \(pb\)\s*:(.*)\n/;
$num_events1 =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/;
$xsec1 =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/;
($num_events2)= $banner2=~ m/# Number of Events\s*:(.*)\n/;
($xsec2)= $banner2=~ m/# Integrated weight \(pb\)\s*:(.*)\n/;
$num_events2 =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/;
$xsec2 =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/;
print "File $infile1 read with $num_events1 events and $xsec1 xsec\n";
print "File $infile2 read with $num_events2 events and $xsec2 xsec\n";
# Check that cross sections do not differ too much
if( abs(($xsec1-$xsec2)/$xsec1) > 0.05 ) { print "\nWARNING Cross sections do not agree with a 5\% precision!\n";}
# Compute total number of events and new unit weight
$tot_events=$num_events1+$num_events2;
$xsec=($num_events1*$xsec1+$num_events2*$xsec2)/$tot_events;
$uwgt=sprintf('%0.5E',$xsec/$tot_events);
$disp_xsec=sprintf('%0.5E',$xsec);
# Print out the merged file
print "Creating the merged file with xsec=$disp_xsec, $tot_events events and $uwgt unit wgt ... \n";
my $banner=$banner1;
my $init=$init1;
$banner=~ s/# Integrated weight \(pb\)\s*:(.*)\n/# Integrated weight (pb) : $disp_xsec\n/;
$banner=~ s/# Number of Events\s*:(.*)\n/# Number of Events : $tot_events\n/;
$banner=~ s/# Unit wgt\s*:(.*)\n/# Unit wgt : $uwgt\n/;
$outfile=~ s/\.gz//;
open(OUTFILE,">$outfile") || die "Cannot open output file called $outfile for writing, stopping\n";
print OUTFILE "\n";
print OUTFILE "\n";
print OUTFILE "\n";
print OUTFILE $init;
print OUTFILE "\n";
print OUTFILE $events1;
print OUTFILE $events2;
print OUTFILE "\n";
close(OUTFILE);
open(BANNER,">$bannerfile") || die "Cannot open output file called $bannerfile for writing, stopping\n";
print BANNER $banner;
close(BANNER);
# Zip all remaining unzipped files
print "Zipping files ... \n";
if( (-e $infile1) && !($infile1 =~ m/\.gz/) ) { system("gzip $infile1")==0 || die "Error while zipping $infile1\n"; }
}
if( (-e $infile2) && !($infile2 =~ m/\.gz/) ) { system("gzip $infile2")==0 || die "Error while zipping $infile2\n"; }
if( (-e $outfile) && !($outfile =~ m/\.gz/) ) { system("gzip $outfile")==0 || die "Error while zipping $outfile\n"; }