From 726109e284c67946ee6c1bf49ef14fce9d4ee551 Mon Sep 17 00:00:00 2001 From: "Jack Y. Araz" Date: Wed, 19 Jul 2023 10:42:39 +0100 Subject: [PATCH 1/7] add fastjet flags for delphes --- madanalysis/IOinterface/job_writer.py | 2 ++ madanalysis/core/main.py | 3 +++ 2 files changed, 5 insertions(+) diff --git a/madanalysis/IOinterface/job_writer.py b/madanalysis/IOinterface/job_writer.py index 90051ac1..cd178ea7 100644 --- a/madanalysis/IOinterface/job_writer.py +++ b/madanalysis/IOinterface/job_writer.py @@ -751,6 +751,8 @@ def WriteMakefiles(self, option="", **kwargs): options.has_root_inc = self.main.archi_info.has_root options.has_root_lib = self.main.archi_info.has_root + # @jackaraz: to prevent seg-fault error with delphes + options.has_fastjet_tag = self.main.archi_info.has_root and self.main.archi_info.has_fastjet #options.has_userpackage = True toRemove=['Log/compilation.log','Log/linking.log','Log/cleanup.log','Log/mrproper.log'] diff --git a/madanalysis/core/main.py b/madanalysis/core/main.py index 09ae3c84..e454b8bd 100644 --- a/madanalysis/core/main.py +++ b/madanalysis/core/main.py @@ -602,6 +602,9 @@ def BuildLibrary(self,forced=False): # Delphes if self.archi_info.has_delphes: + # @jackaraz: activate fastjet flag + if self.archi_info.has_fastjet: + os.environ["FASTJET_FLAG"] = "-DMA5_FASTJET_MODE" libraries.append(['Delphes', 'interface to Delphes', 'delphes', self.archi_info.ma5dir + '/tools/SampleAnalyzer/Lib/libdelphes_for_ma5.so', self.archi_info.ma5dir + '/tools/SampleAnalyzer/Interfaces', False]) From ec3b390dc520a7b015bab0594c555bf97348bd43 Mon Sep 17 00:00:00 2001 From: "Jack Y. Araz" Date: Wed, 19 Jul 2023 10:48:21 +0100 Subject: [PATCH 2/7] update changelog --- doc/releases/changelog-v2.0.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/releases/changelog-v2.0.md b/doc/releases/changelog-v2.0.md index 31fd8b7c..f028a7ed 100644 --- a/doc/releases/changelog-v2.0.md +++ b/doc/releases/changelog-v2.0.md @@ -66,6 +66,9 @@ reader mentioned in issue [#136](https://github.com/MadAnalysis/madanalysis5/issues/136). ([#167](https://github.com/MadAnalysis/madanalysis5/pull/167)) +* Delphes crash fixed due to miscommunication between libraries see issue [#204](https://github.com/MadAnalysis/madanalysis5/issues/204). + ([#208](https://github.com/MadAnalysis/madanalysis5/pull/208)) + ## Contributors This release contains contributions from (in alphabetical order): From 2bdb4e3c52c333170bd56497edf9101ea436607f Mon Sep 17 00:00:00 2001 From: BFuks Date: Wed, 19 Jul 2023 14:28:26 +0200 Subject: [PATCH 3/7] real fix of the bug --- madanalysis/IOinterface/library_writer.py | 1 + tools/SampleAnalyzer/Commons/DataFormat/RecEventFormat.cpp | 4 ++-- tools/SampleAnalyzer/Commons/DataFormat/RecEventFormat.h | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/madanalysis/IOinterface/library_writer.py b/madanalysis/IOinterface/library_writer.py index 0024fed1..6dca5359 100644 --- a/madanalysis/IOinterface/library_writer.py +++ b/madanalysis/IOinterface/library_writer.py @@ -263,6 +263,7 @@ def WriteMakefileForInterfaces(self,package): options.has_root = True options.has_root_inc = True options.has_root_lib = True + options.ma5_fastjet_mode = self.main.archi_info.has_root and self.main.archi_info.has_fastjet toRemove.extend(['compilation_delphes.log','linking_delphes.log',\ 'cleanup_delphes.log','mrproper_delphes.log']) elif package=='test_delphes': diff --git a/tools/SampleAnalyzer/Commons/DataFormat/RecEventFormat.cpp b/tools/SampleAnalyzer/Commons/DataFormat/RecEventFormat.cpp index e001fce3..cbd021aa 100644 --- a/tools/SampleAnalyzer/Commons/DataFormat/RecEventFormat.cpp +++ b/tools/SampleAnalyzer/Commons/DataFormat/RecEventFormat.cpp @@ -42,7 +42,7 @@ namespace MA5 { emptyjet_.clear(); #ifdef MA5_FASTJET_MODE // pseudojet : only available when fastjet is in use (code efficiency) - input_hadrons_.clear(); + input_hadrons_.clear(); #endif towers_ok_=false; towers_.clear(); @@ -259,4 +259,4 @@ namespace MA5 { RecParticleFormat* RecEventFormat::GetNewMht() { return &MHT_; } -} \ No newline at end of file +} diff --git a/tools/SampleAnalyzer/Commons/DataFormat/RecEventFormat.h b/tools/SampleAnalyzer/Commons/DataFormat/RecEventFormat.h index cc5d3e23..4087d0ef 100644 --- a/tools/SampleAnalyzer/Commons/DataFormat/RecEventFormat.h +++ b/tools/SampleAnalyzer/Commons/DataFormat/RecEventFormat.h @@ -114,7 +114,7 @@ namespace MA5 std::vector input_hadrons_; #endif - /// Create an empty jet + /// Empty jet (useful temporary object) std::vector emptyjet_; /// Collection of reconstructed tracks @@ -177,7 +177,7 @@ namespace MA5 // ------------------------------------------------------------- public : - /// Constructor withtout arguments + /// Constructor without arguments RecEventFormat() { Reset(); } From d01257b1ae051304c5dd1d3b08782e624e5943f3 Mon Sep 17 00:00:00 2001 From: "Jack Y. Araz" Date: Fri, 21 Jul 2023 14:38:52 +0100 Subject: [PATCH 4/7] set fastjet flag by default --- madanalysis/build/setup_writer.py | 351 ++++++++++++++++-------------- 1 file changed, 187 insertions(+), 164 deletions(-) diff --git a/madanalysis/build/setup_writer.py b/madanalysis/build/setup_writer.py index 83ad094a..225b00b1 100644 --- a/madanalysis/build/setup_writer.py +++ b/madanalysis/build/setup_writer.py @@ -1,24 +1,24 @@ ################################################################################ -# +# # Copyright (C) 2012-2023 Jack Araz, Eric Conte & Benjamin Fuks # The MadAnalysis development team, email: -# +# # This file is part of MadAnalysis 5. # Official website: -# +# # MadAnalysis 5 is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. -# +# # MadAnalysis 5 is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -# +# # You should have received a copy of the GNU General Public License # along with MadAnalysis 5. If not, see -# +# ################################################################################ @@ -28,56 +28,56 @@ from six.moves import range -class SetupWriter(): - - +class SetupWriter: @staticmethod - def OrderPath(paths1,middle,paths2,ma5dir): - all=[] - allsh=[] - allcsh=[] + def OrderPath(paths1, middle, paths2, ma5dir): + all = [] + allsh = [] + allcsh = [] for item in paths1: - path=item.replace(ma5dir,'$MA5_BASE') + path = item.replace(ma5dir, "$MA5_BASE") all.append(path) allsh.append(path) allcsh.append(path) allsh.append(middle) - allcsh.append('"'+middle+'"') + allcsh.append('"' + middle + '"') for item in paths2: - path=item.replace(ma5dir,'$MA5_BASE') + path = item.replace(ma5dir, "$MA5_BASE") all.append(path) allsh.append(path) allcsh.append(path) return all, allsh, allcsh - @staticmethod - def WriteSetupFile(bash,path,archi_info): + def WriteSetupFile(bash, path, archi_info): # Variable to check at the end - toCheck=[] + toCheck = [] # Opening file in write-only mode import os + if bash: - filename = os.path.normpath(path+"/setup.sh") + filename = os.path.normpath(path + "/setup.sh") else: - filename = os.path.normpath(path+"/setup.csh") + filename = os.path.normpath(path + "/setup.csh") try: - file = open(filename,"w") + file = open(filename, "w") except: - logging.getLogger('MA5').error('Impossible to create the file "' + filename +'"') + logging.getLogger("MA5").error( + 'Impossible to create the file "' + filename + '"' + ) return False # Calling the good shell if bash: - file.write('#!/bin/sh\n') + file.write("#!/bin/sh\n") else: - file.write('#!/bin/csh -f\n') - file.write('\n') + file.write("#!/bin/csh -f\n") + file.write("\n") # Defining colours - file.write('# Defining colours for shell\n') + file.write("# Defining colours for shell\n") if bash: file.write('GREEN="\\\\033[1;32m"\n') file.write('RED="\\\\033[1;31m"\n') @@ -90,56 +90,58 @@ def WriteSetupFile(bash,path,archi_info): # but in this case, the colour code are interpreted # by the linux command 'more' - file.write('export WITH_FASTJET="0"\n') - file.write('export WITH_DELPHES="0"\n') - file.write('export FASTJET_FLAG=" "\n') - file.write('user=" "\n\n') + # @jackaraz: by default fastjet flag should be set otherwise recjetformat complains + + # file.write('export WITH_FASTJET="0"\n') + # file.write('export WITH_DELPHES="0"\n') + file.write('export FASTJET_FLAG="-DMA5_FASTJET_MODE"\n') + # file.write('user=" "\n\n') - file.write('function usage() {\n') - file.write(' echo -e "Usage: source setup.sh [options]"\n') - file.write(' echo -e " -h OR --help : Prints this very useful text."\n') - file.write(' echo -e " --with-fastjet : Enables the usage of FastJet interface within the analysis."\n') - file.write(' echo -e " --with-delphes : Enables the usage of Delphes interface within the analysis."\n') - file.write('}\n\n') + # file.write('function usage() {\n') + # file.write(' echo -e "Usage: source setup.sh [options]"\n') + # file.write(' echo -e " -h OR --help : Prints this very useful text."\n') + # file.write(' echo -e " --with-fastjet : Enables the usage of FastJet interface within the analysis."\n') + # file.write(' echo -e " --with-delphes : Enables the usage of Delphes interface within the analysis."\n') + # file.write('}\n\n') - file.write('for user in "$@"\n') - file.write('do\n') - file.write(' if [[ $user == "--with-fastjet" ]]\n') - file.write(' then\n') - file.write(' export WITH_FASTJET="1"\n') - file.write(' elif [[ $user == "--with-delphes" ]]\n') - file.write(' then\n') - file.write(' export WITH_DELPHES="1"\n') - file.write(' elif [[ $user == "-h" ]] || [[ $user == "--help" ]]\n') - file.write(' then\n') - file.write(' usage\n') - file.write(' return 0\n') - file.write(' else\n') - file.write(' echo -e $RED"ERROR: Invalid commandline option."\n') - file.write(' usage\n') - file.write(' echo -e $NORMAL\n') - file.write(' return 1\n') - file.write(' fi\n') - file.write('done\n\n') + # file.write('for user in "$@"\n') + # file.write('do\n') + # file.write(' if [[ $user == "--with-fastjet" ]]\n') + # file.write(' then\n') + # file.write(' export WITH_FASTJET="1"\n') + # file.write(' elif [[ $user == "--with-delphes" ]]\n') + # file.write(' then\n') + # file.write(' export WITH_DELPHES="1"\n') + # file.write(' elif [[ $user == "-h" ]] || [[ $user == "--help" ]]\n') + # file.write(' then\n') + # file.write(' usage\n') + # file.write(' return 0\n') + # file.write(' else\n') + # file.write(' echo -e $RED"ERROR: Invalid commandline option."\n') + # file.write(' usage\n') + # file.write(' echo -e $NORMAL\n') + # file.write(' return 1\n') + # file.write(' fi\n') + # file.write('done\n\n') - file.write('if [[ $WITH_FASTJET -eq "1" ]] && [[ $WITH_DELPHES -eq "1" ]]\n') - file.write('then\n') - file.write(' echo -e $RED"ERROR: FastJet and Delphes cannot be executed within the same analysis."$NORMAL\n') - file.write(' return 1\n') - file.write('fi\n\n') + # file.write('if [[ $WITH_FASTJET -eq "1" ]] && [[ $WITH_DELPHES -eq "1" ]]\n') + # file.write('then\n') + # file.write(' echo -e $RED"ERROR: FastJet and Delphes cannot be executed within the same analysis."$NORMAL\n') + # file.write(' return 1\n') + # file.write('fi\n\n') - file.write('if [[ $WITH_FASTJET -eq "1" ]]\n') - file.write('then\n') - file.write(' export FASTJET_FLAG="-DMA5_FASTJET_MODE"\n') - file.write(' echo -e $BLUE" * The SFS-FastJet mode has been initiated."$NORMAL\n') - file.write('fi\n\n') + # file.write('if [[ $WITH_FASTJET -eq "1" ]]\n') + # file.write('then\n') + # file.write(' export FASTJET_FLAG="-DMA5_FASTJET_MODE"\n') + # file.write(' echo -e $BLUE" * The SFS-FastJet mode has been initiated."$NORMAL\n') + # file.write('fi\n\n') - file.write('if [[ $WITH_DELPHES -eq "1" ]] || [[ $WITH_FASTJET -eq "0" ]]\n') - file.write('then\n') - file.write(' echo -e $BLUE" * Tge SFS-FastJet mode has been turned off."\n') - file.write(' usage\n') - file.write(' echo -e $NORMAL\n') - file.write('fi\n\n') + # file.write('if [[ $WITH_DELPHES -eq "1" ]] || [[ $WITH_FASTJET -eq "0" ]]\n') + # file.write('then\n') + # file.write(' echo -e $BLUE" * Tge SFS-FastJet mode has been turned off."\n') + # file.write(' usage\n') + # file.write(' echo -e $NORMAL\n') + # file.write('fi\n\n') else: file.write('set GREEN = "\\033[1;32m"\n') @@ -149,135 +151,156 @@ def WriteSetupFile(bash,path,archi_info): file.write('set YELLOW = "\\033[1;33m"\n') file.write('set CYAN = "\\033[1;36m"\n') file.write('set NORMAL = "\\033[0;39m"\n') - file.write('\n') + file.write("\n") # Treating ma5dir - ma5dir=archi_info.ma5dir - if ma5dir.endswith('/'): - ma5dir=ma5dir[:-1] + ma5dir = archi_info.ma5dir + if ma5dir.endswith("/"): + ma5dir = ma5dir[:-1] # Configuring PATH environment variable - file.write('# Configuring MA5 environment variable\n') + file.write("# Configuring MA5 environment variable\n") if bash: - file.write('export MA5_BASE=' + (ma5dir)+'\n') + file.write("export MA5_BASE=" + (ma5dir) + "\n") else: - file.write('setenv MA5_BASE ' + (ma5dir)+'\n') - toCheck.append('MA5_BASE') - file.write('\n') + file.write("setenv MA5_BASE " + (ma5dir) + "\n") + toCheck.append("MA5_BASE") + file.write("\n") # Treating PATH - toPATH, toPATHsh, toPATHcsh = SetupWriter.OrderPath(archi_info.toPATH1,\ - '$PATH',archi_info.toPATH2,\ - ma5dir) - toLDPATH, toLDPATHsh, toLDPATHcsh = SetupWriter.OrderPath(archi_info.toLDPATH1,\ - '$LD_LIBRARY_PATH',\ - archi_info.toLDPATH2,ma5dir) - toDYLDPATH, toDYLDPATHsh, toDYLDPATHcsh = SetupWriter.OrderPath(archi_info.toLDPATH1,\ - '$DYLD_LIBRARY_PATH',\ - archi_info.toLDPATH2,ma5dir) - + toPATH, toPATHsh, toPATHcsh = SetupWriter.OrderPath( + archi_info.toPATH1, "$PATH", archi_info.toPATH2, ma5dir + ) + toLDPATH, toLDPATHsh, toLDPATHcsh = SetupWriter.OrderPath( + archi_info.toLDPATH1, "$LD_LIBRARY_PATH", archi_info.toLDPATH2, ma5dir + ) + toDYLDPATH, toDYLDPATHsh, toDYLDPATHcsh = SetupWriter.OrderPath( + archi_info.toLDPATH1, "$DYLD_LIBRARY_PATH", archi_info.toLDPATH2, ma5dir + ) + # Configuring PATH environment variable - if len(toPATH)!=0: - file.write('# Configuring PATH environment variable\n') + if len(toPATH) != 0: + file.write("# Configuring PATH environment variable\n") if bash: - file.write('if [ $PATH ]; then\n') - file.write(' export PATH='+(':'.join(toPATHsh))+'\n') - file.write('else\n') - file.write(' export PATH='+(':'.join(toPATH))+'\n') - file.write('fi\n') + file.write("if [ $PATH ]; then\n") + file.write(" export PATH=" + (":".join(toPATHsh)) + "\n") + file.write("else\n") + file.write(" export PATH=" + (":".join(toPATH)) + "\n") + file.write("fi\n") else: - file.write('if ( $?PATH ) then\n') - file.write(' setenv PATH '+(':'.join(toPATHcsh))+'\n') - file.write('else\n') - file.write(' setenv PATH '+(':'.join(toPATH))+'\n') - file.write('endif\n') - toCheck.append('PATH') - file.write('\n') + file.write("if ( $?PATH ) then\n") + file.write(" setenv PATH " + (":".join(toPATHcsh)) + "\n") + file.write("else\n") + file.write(" setenv PATH " + (":".join(toPATH)) + "\n") + file.write("endif\n") + toCheck.append("PATH") + file.write("\n") + + if len(toLDPATH) != 0: - if len(toLDPATH)!=0: - # Configuring LD_LIBRARY_PATH environment variable - file.write('# Configuring LD_LIBRARY_PATH environment variable\n') + file.write("# Configuring LD_LIBRARY_PATH environment variable\n") if bash: - file.write('if [ $LD_LIBRARY_PATH ]; then\n') - file.write(' export LD_LIBRARY_PATH='+(':'.join(toLDPATHsh))+'\n') - file.write('else\n') - file.write(' export LD_LIBRARY_PATH='+(':'.join(toLDPATH))+'\n') - file.write('fi\n') + file.write("if [ $LD_LIBRARY_PATH ]; then\n") + file.write(" export LD_LIBRARY_PATH=" + (":".join(toLDPATHsh)) + "\n") + file.write("else\n") + file.write(" export LD_LIBRARY_PATH=" + (":".join(toLDPATH)) + "\n") + file.write("fi\n") else: - file.write('if ( $?LD_LIBRARY_PATH ) then\n') - file.write(' setenv LD_LIBRARY_PATH '+(':'.join(toLDPATHcsh))+'\n') - file.write('else\n') - file.write(' setenv LD_LIBRARY_PATH '+(':'.join(toLDPATH))+'\n') - file.write('endif\n') - toCheck.append('LD_LIBRARY_PATH') - file.write('\n') + file.write("if ( $?LD_LIBRARY_PATH ) then\n") + file.write(" setenv LD_LIBRARY_PATH " + (":".join(toLDPATHcsh)) + "\n") + file.write("else\n") + file.write(" setenv LD_LIBRARY_PATH " + (":".join(toLDPATH)) + "\n") + file.write("endif\n") + toCheck.append("LD_LIBRARY_PATH") + file.write("\n") # Configuring LIBRARY_PATH environment variable - #file.write('# Configuring LIBRARY_PATH environment variable\n') - #if bash: + # file.write('# Configuring LIBRARY_PATH environment variable\n') + # if bash: # file.write('export LIBRARY_PATH=' + (os.environ['LD_LIBRARY_PATH'])+'\n') - #else: + # else: # file.write('setenv LIBRARY_PATH ' + (os.environ['LD_LIBRARY_PATH'])+'\n') - #file.write('\n') + # file.write('\n') # Configuring DYLD_LIBRARY_PATH environment variable if archi_info.isMac: - file.write('# Configuring DYLD_LIBRARY_PATH environment variable\n') + file.write("# Configuring DYLD_LIBRARY_PATH environment variable\n") if bash: - file.write('if [ $DYLD_LIBRARY_PATH ]; then\n') - file.write(' export DYLD_LIBRARY_PATH='+ (':'.join(toDYLDPATHsh))+'\n') - file.write('else\n') - file.write(' export DYLD_LIBRARY_PATH='+ (':'.join(toLDPATH))+'\n') - file.write('fi\n') + file.write("if [ $DYLD_LIBRARY_PATH ]; then\n") + file.write( + " export DYLD_LIBRARY_PATH=" + (":".join(toDYLDPATHsh)) + "\n" + ) + file.write("else\n") + file.write( + " export DYLD_LIBRARY_PATH=" + (":".join(toLDPATH)) + "\n" + ) + file.write("fi\n") else: - file.write('if ( $?DYLD_LIBRARY_PATH ) then\n') - file.write(' setenv DYLD_LIBRARY_PATH '+(':'.join(toDYLDPATHcsh))+'\n') - file.write('else\n') - file.write(' setenv DYLD_LIBRARY_PATH '+(':'.join(toLDPATH))+'\n') - file.write('endif\n') - toCheck.append('DYLD_LIBRARY_PATH') - file.write('\n') + file.write("if ( $?DYLD_LIBRARY_PATH ) then\n") + file.write( + " setenv DYLD_LIBRARY_PATH " + (":".join(toDYLDPATHcsh)) + "\n" + ) + file.write("else\n") + file.write( + " setenv DYLD_LIBRARY_PATH " + (":".join(toLDPATH)) + "\n" + ) + file.write("endif\n") + toCheck.append("DYLD_LIBRARY_PATH") + file.write("\n") # Configuring CPLUS_INCLUDE_PATH environment variable - #file.write('# Configuring CPLUS_INCLUDE_PATH environment variable\n') - #if bash: + # file.write('# Configuring CPLUS_INCLUDE_PATH environment variable\n') + # if bash: # file.write('export CPLUS_INCLUDE_PATH=' + (os.environ['CPLUS_INCLUDE_PATH'])+'\n') - #else: + # else: # file.write('setenv CPLUS_INCLUDE_PATH ' + (os.environ['CPLUS_INCLUDE_PATH'])+'\n') - #file.write('\n') + # file.write('\n') # Checking that all environment variables are defined - file.write('# Checking that all environment variables are defined\n') + file.write("# Checking that all environment variables are defined\n") if bash: - file.write('if [[ ') - for ind in range(0,len(toCheck)): - if ind!=0: - file.write(' && ') - file.write('$'+toCheck[ind]) - file.write(' ]]; then\n') - file.write(' echo -e $YELLOW"'+StringTools.Fill('-',56)+'"\n') - file.write(' echo -e "'+StringTools.Center('Your environment is properly configured for MA5',56)+'"\n') - file.write(' echo -e "'+StringTools.Fill('-',56)+'"$NORMAL\n') - file.write('fi\n') + file.write("if [[ ") + for ind in range(0, len(toCheck)): + if ind != 0: + file.write(" && ") + file.write("$" + toCheck[ind]) + file.write(" ]]; then\n") + file.write(' echo -e $YELLOW"' + StringTools.Fill("-", 56) + '"\n') + file.write( + ' echo -e "' + + StringTools.Center( + "Your environment is properly configured for MA5", 56 + ) + + '"\n' + ) + file.write(' echo -e "' + StringTools.Fill("-", 56) + '"$NORMAL\n') + file.write("fi\n") else: - file.write('if ( ') - for ind in range(0,len(toCheck)): - if ind!=0: - file.write(' && ') - file.write('$?'+toCheck[ind]) - file.write(' ) then\n') - file.write(' printf $YELLOW"'+StringTools.Fill('-',56)+'\n$NORMAL"\n') - file.write(' printf $YELLOW"'+StringTools.Center('Your environment is properly configured for MA5',56)+'\n$NORMAL"\n') - file.write(' printf $YELLOW"'+StringTools.Fill('-',56)+'\n"$NORMAL\n') - file.write('endif\n') + file.write("if ( ") + for ind in range(0, len(toCheck)): + if ind != 0: + file.write(" && ") + file.write("$?" + toCheck[ind]) + file.write(" ) then\n") + file.write(' printf $YELLOW"' + StringTools.Fill("-", 56) + '\n$NORMAL"\n') + file.write( + ' printf $YELLOW"' + + StringTools.Center( + "Your environment is properly configured for MA5", 56 + ) + + '\n$NORMAL"\n' + ) + file.write(' printf $YELLOW"' + StringTools.Fill("-", 56) + '\n"$NORMAL\n') + file.write("endif\n") # Closing the file try: file.close() except: - logging.getLogger('MA5').error('Impossible to close the file "'+filename+'"') + logging.getLogger("MA5").error( + 'Impossible to close the file "' + filename + '"' + ) return False return True - From c719d936d11669f36a62270ac15f91f7ed084fda Mon Sep 17 00:00:00 2001 From: "Jack Y. Araz" Date: Fri, 21 Jul 2023 14:43:17 +0100 Subject: [PATCH 5/7] fix the wrong placement --- madanalysis/core/main.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/madanalysis/core/main.py b/madanalysis/core/main.py index e454b8bd..09ae3c84 100644 --- a/madanalysis/core/main.py +++ b/madanalysis/core/main.py @@ -602,9 +602,6 @@ def BuildLibrary(self,forced=False): # Delphes if self.archi_info.has_delphes: - # @jackaraz: activate fastjet flag - if self.archi_info.has_fastjet: - os.environ["FASTJET_FLAG"] = "-DMA5_FASTJET_MODE" libraries.append(['Delphes', 'interface to Delphes', 'delphes', self.archi_info.ma5dir + '/tools/SampleAnalyzer/Lib/libdelphes_for_ma5.so', self.archi_info.ma5dir + '/tools/SampleAnalyzer/Interfaces', False]) From 418c2eaa4e0b20a0f98e96f52f4b0c7f4885d502 Mon Sep 17 00:00:00 2001 From: "Jack Y. Araz" Date: Fri, 21 Jul 2023 14:51:10 +0100 Subject: [PATCH 6/7] add fastjet flag for the execution --- madanalysis/interpreter/cmd_submit.py | 394 +++++++++++++++----------- madanalysis/misc/run_recast.py | 5 +- 2 files changed, 229 insertions(+), 170 deletions(-) diff --git a/madanalysis/interpreter/cmd_submit.py b/madanalysis/interpreter/cmd_submit.py index f8817048..4d35beb6 100644 --- a/madanalysis/interpreter/cmd_submit.py +++ b/madanalysis/interpreter/cmd_submit.py @@ -1,84 +1,89 @@ ################################################################################ -# +# # Copyright (C) 2012-2023 Jack Araz, Eric Conte & Benjamin Fuks # The MadAnalysis development team, email: -# +# # This file is part of MadAnalysis 5. # Official website: -# +# # MadAnalysis 5 is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. -# +# # MadAnalysis 5 is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -# +# # You should have received a copy of the GNU General Public License # along with MadAnalysis 5. If not, see -# +# ################################################################################ from __future__ import absolute_import -from madanalysis.interpreter.cmd_base import CmdBase -from madanalysis.IOinterface.job_writer import JobWriter -from madanalysis.IOinterface.layout_writer import LayoutWriter -from madanalysis.IOinterface.job_reader import JobReader -from madanalysis.IOinterface.folder_writer import FolderWriter -from madanalysis.enumeration.report_format_type import ReportFormatType -from madanalysis.layout.layout import Layout -from madanalysis.install.install_manager import InstallManager -from madanalysis.install.detector_manager import DetectorManager -from madanalysis.misc.run_recast import RunRecast -from madanalysis.IOinterface.delphescard_checker import DelphesCardChecker - - -from chronometer import Chronometer -from string_tools import StringTools +from madanalysis.interpreter.cmd_base import CmdBase +from madanalysis.IOinterface.job_writer import JobWriter +from madanalysis.IOinterface.layout_writer import LayoutWriter +from madanalysis.IOinterface.job_reader import JobReader +from madanalysis.IOinterface.folder_writer import FolderWriter +from madanalysis.enumeration.report_format_type import ReportFormatType +from madanalysis.layout.layout import Layout +from madanalysis.install.install_manager import InstallManager +from madanalysis.install.detector_manager import DetectorManager +from madanalysis.misc.run_recast import RunRecast +from madanalysis.IOinterface.delphescard_checker import DelphesCardChecker + + +from chronometer import Chronometer +from string_tools import StringTools import logging import glob import os import shutil from six.moves import range + class CmdSubmit(CmdBase): """Command SUBMIT""" - def __init__(self,main,resubmit=False): - self.resubmit=resubmit + def __init__(self, main, resubmit=False): + self.resubmit = resubmit if not resubmit: - CmdBase.__init__(self,main,"submit") + CmdBase.__init__(self, main, "submit") else: - CmdBase.__init__(self,main,"resubmit") - self.forbiddenpaths=[] - self.forbiddenpaths.append(os.path.normpath(self.main.archi_info.ma5dir+'/lib')) - self.forbiddenpaths.append(os.path.normpath(self.main.archi_info.ma5dir+'/bin')) - self.forbiddenpaths.append(os.path.normpath(self.main.archi_info.ma5dir+'/madanalysis')) - - - def do(self,args,history): + CmdBase.__init__(self, main, "resubmit") + self.forbiddenpaths = [] + self.forbiddenpaths.append(os.path.normpath(self.main.archi_info.ma5dir + "/lib")) + self.forbiddenpaths.append(os.path.normpath(self.main.archi_info.ma5dir + "/bin")) + self.forbiddenpaths.append( + os.path.normpath(self.main.archi_info.ma5dir + "/madanalysis") + ) + + def do(self, args, history): if not self.resubmit: - return self.do_submit(args,history) + return self.do_submit(args, history) else: - return self.do_resubmit(args,history) - + return self.do_resubmit(args, history) - def do_resubmit(self,args,history): + def do_resubmit(self, args, history): # Start time chrono = Chronometer() chrono.Start() # Checking argument number - if len(args)!=0: - self.logger.warning("Command 'resubmit' takes no argument. Any argument will be skipped.") + if len(args) != 0: + self.logger.warning( + "Command 'resubmit' takes no argument. Any argument will be skipped." + ) # Checking presence of a valid job if self.main.lastjob_name == "": - self.logger.error("an analysis must be defined and ran before using the resubmit command.") + self.logger.error( + "an analysis must be defined and ran before using the resubmit command." + ) return False self.main.lastjob_status = False @@ -88,20 +93,28 @@ def do_resubmit(self,args,history): # Look for the last submit and resubmit last_submit_cmd = -1 - for i in range(len(history)-1): # Last history entry should be resubmit - if history[i].startswith('submit') or history[i].startswith('resubmit'): + for i in range(len(history) - 1): # Last history entry should be resubmit + if history[i].startswith("submit") or history[i].startswith("resubmit"): last_submit_cmd = i newhistory = [] - if last_submit_cmd==-1: + if last_submit_cmd == -1: ToReAnalyze = True else: - for i in range(last_submit_cmd+1,len(history)): + for i in range(last_submit_cmd + 1, len(history)): newhistory.append(history[i]) - ReAnalyzeCmdList = ['plot','select','reject','set main.clustering', - 'set main.merging', 'define', 'set main.recast', - 'import', 'set main.isolation'] + ReAnalyzeCmdList = [ + "plot", + "select", + "reject", + "set main.clustering", + "set main.merging", + "define", + "set main.recast", + "import", + "set main.isolation", + ] # Determining if we have to resubmit the job for cmd in newhistory: @@ -110,14 +123,14 @@ def do_resubmit(self,args,history): words = cmd.split() # Creating a line with one whitespace between each word - cmd2 = '' + cmd2 = "" for word in words: - if word!='': - cmd2+=word+' ' + if word != "": + cmd2 += word + " " # Looping over patterns for pattern in ReAnalyzeCmdList: - if cmd2.startswith(pattern): + if cmd2.startswith(pattern): ToReAnalyze = True break @@ -126,17 +139,21 @@ def do_resubmit(self,args,history): break if ToReAnalyze: - self.logger.info(" Creating the new histograms and/or applying the new cuts...") + self.logger.info( + " Creating the new histograms and/or applying the new cuts..." + ) # Submission - if not self.submit(self.main.lastjob_name,history): + if not self.submit(self.main.lastjob_name, history): return self.logger.info(" Updating the reports...") else: - self.logger.info(" No new histogram / cut to account for. Updating the reports...") + self.logger.info( + " No new histogram / cut to account for. Updating the reports..." + ) # Reading info from job output layout = Layout(self.main) - if not self.extract(self.main.lastjob_name,layout): + if not self.extract(self.main.lastjob_name, layout): return # Status = GOOD @@ -145,49 +162,55 @@ def do_resubmit(self,args,history): layout.Initialize() # Creating the reports - self.CreateReports([self.main.lastjob_name],history,layout) + self.CreateReports([self.main.lastjob_name], history, layout) - # End of time + # End of time chrono.Stop() - self.logger.info(" Well done! Elapsed time = "+chrono.Display()) + self.logger.info(" Well done! Elapsed time = " + chrono.Display()) - def do_submit(self,args,history): + def do_submit(self, args, history): # Start time chrono = Chronometer() chrono.Start() # No arguments - if len(args)==0: + if len(args) == 0: dirlist = os.listdir(self.main.currentdir) ii = 0 - while ('ANALYSIS_'+str(ii) in dirlist): - ii = ii+1 - args.append(self.main.currentdir+'/ANALYSIS_'+str(ii)) + while "ANALYSIS_" + str(ii) in dirlist: + ii = ii + 1 + args.append(self.main.currentdir + "/ANALYSIS_" + str(ii)) # Checking argument number - if len(args)>1: - self.logger.error("wrong number of arguments for the command 'submit'.") - self.help() - return + if len(args) > 1: + self.logger.error("wrong number of arguments for the command 'submit'.") + self.help() + return # Checking if a dataset has been defined - if len(self.main.datasets)==0: - self.logger.error("no dataset found; please define a dataset (via the command import).") + if len(self.main.datasets) == 0: + self.logger.error( + "no dataset found; please define a dataset (via the command import)." + ) self.logger.error("job submission aborted.") return # Treat the filename filename = os.path.expanduser(args[0]) - if not filename.startswith('/'): + if not filename.startswith("/"): filename = self.main.currentdir + "/" + filename filename = os.path.normpath(filename) # Checking folder if filename in self.forbiddenpaths: - self.logger.error("the folder '"+filename+"' is a MadAnalysis folder. " + \ - "You cannot overwrite it. Please choose another folder.") + self.logger.error( + "the folder '" + + filename + + "' is a MadAnalysis folder. " + + "You cannot overwrite it. Please choose another folder." + ) return # Saving job name as global variable @@ -195,14 +218,14 @@ def do_submit(self,args,history): self.main.lastjob_status = False # Submission - self.logger.debug('Launching SampleAnalyzer ...') - if not self.submit(filename,history): + self.logger.debug("Launching SampleAnalyzer ...") + if not self.submit(filename, history): return # Reading info from job output - self.logger.debug('Go back to the Python interface ...') + self.logger.debug("Go back to the Python interface ...") layout = Layout(self.main) - if not self.extract(filename,layout): + if not self.extract(filename, layout): return # Status = GOOD @@ -213,34 +236,35 @@ def do_submit(self,args,history): layout.Initialize() # Creating the reports - if not self.main.recasting.status=="on": - self.CreateReports(args,history,layout) + if not self.main.recasting.status == "on": + self.CreateReports(args, history, layout) - # End of time + # End of time chrono.Stop() - self.logger.info(" Well done! Elapsed time = "+chrono.Display()) - + self.logger.info(" Well done! Elapsed time = " + chrono.Display()) # Generating the reports - def CreateReports(self,args,history,layout): + def CreateReports(self, args, history, layout): output_paths = [] - modes = [] + modes = [] # Getting output filename for histo folder - i=0 - while(os.path.isdir(args[0]+"/Output/Histos/MadAnalysis5job_"+str(i))): - i+=1 - - histopath = os.path.expanduser(args[0]+'/Output/Histos/MadAnalysis5job_'+str(i)) - if not histopath.startswith('/'): + i = 0 + while os.path.isdir(args[0] + "/Output/Histos/MadAnalysis5job_" + str(i)): + i += 1 + + histopath = os.path.expanduser( + args[0] + "/Output/Histos/MadAnalysis5job_" + str(i) + ) + if not histopath.startswith("/"): histopath = self.main.currentdir + "/" + histopath histopath = os.path.normpath(histopath) # Getting output filename for HTML report - htmlpath = os.path.expanduser(args[0]+'/Output/HTML/MadAnalysis5job_'+str(i)) - if not htmlpath.startswith('/'): + htmlpath = os.path.expanduser(args[0] + "/Output/HTML/MadAnalysis5job_" + str(i)) + if not htmlpath.startswith("/"): htmlpath = self.main.currentdir + "/" + htmlpath htmlpath = os.path.normpath(htmlpath) output_paths.append(htmlpath) @@ -248,8 +272,10 @@ def CreateReports(self,args,history,layout): # Getting output filename for PDF report if self.main.session_info.has_pdflatex: - pdfpath = os.path.expanduser(args[0]+'/Output/PDF/MadAnalysis5job_'+str(i)) - if not pdfpath.startswith('/'): + pdfpath = os.path.expanduser( + args[0] + "/Output/PDF/MadAnalysis5job_" + str(i) + ) + if not pdfpath.startswith("/"): pdfpath = self.main.currentdir + "/" + pdfpath pdfpath = os.path.normpath(pdfpath) output_paths.append(pdfpath) @@ -257,25 +283,27 @@ def CreateReports(self,args,history,layout): # Getting output filename for DVI report if self.main.session_info.has_latex: - dvipath = os.path.expanduser(args[0]+'/Output/DVI/MadAnalysis5job_'+str(i)) - if not dvipath.startswith('/'): + dvipath = os.path.expanduser( + args[0] + "/Output/DVI/MadAnalysis5job_" + str(i) + ) + if not dvipath.startswith("/"): dvipath = self.main.currentdir + "/" + dvipath dvipath = os.path.normpath(dvipath) output_paths.append(dvipath) modes.append(ReportFormatType.LATEX) # Creating folders - if not layout.CreateFolders(histopath,output_paths,modes): + if not layout.CreateFolders(histopath, output_paths, modes): return # Draw plots self.logger.info(" Generating all plots ...") - if not layout.DoPlots(histopath,modes,output_paths): + if not layout.DoPlots(histopath, modes, output_paths): return # Generating the HTML report self.logger.info(" Generating the HMTL report ...") - layout.GenerateReport(history,htmlpath,ReportFormatType.HTML) + layout.GenerateReport(history, htmlpath, ReportFormatType.HTML) self.logger.info(" -> To open this HTML report, please type 'open'.") # PDF report @@ -283,15 +311,17 @@ def CreateReports(self,args,history,layout): # Generating the PDF report self.logger.info(" Generating the PDF report ...") - layout.GenerateReport(history,pdfpath,ReportFormatType.PDFLATEX) - layout.CompileReport(ReportFormatType.PDFLATEX,pdfpath) + layout.GenerateReport(history, pdfpath, ReportFormatType.PDFLATEX) + layout.CompileReport(ReportFormatType.PDFLATEX, pdfpath) # Displaying message for opening PDF if self.main.currentdir in pdfpath: - pdfpath = pdfpath[len(self.main.currentdir):] - if pdfpath[0]=='/': - pdfpath=pdfpath[1:] - self.logger.info(" -> To open this PDF report, please type 'open " + pdfpath + "'.") + pdfpath = pdfpath[len(self.main.currentdir) :] + if pdfpath[0] == "/": + pdfpath = pdfpath[1:] + self.logger.info( + " -> To open this PDF report, please type 'open " + pdfpath + "'." + ) else: self.logger.warning("pdflatex not installed -> no PDF report.") @@ -301,59 +331,69 @@ def CreateReports(self,args,history,layout): # Warning message for DVI -> PDF self.logger.info(" Generating the DVI report ...") -# if not self.main.session_info.has_dvipdf: -# self.logger.warning("dvipdf not installed -> the DVI report will not be converted to a PDF file.") + # if not self.main.session_info.has_dvipdf: + # self.logger.warning("dvipdf not installed -> the DVI report will not be converted to a PDF file.") # Generating the DVI report - layout.GenerateReport(history,dvipath,ReportFormatType.LATEX) - layout.CompileReport(ReportFormatType.LATEX,dvipath) + layout.GenerateReport(history, dvipath, ReportFormatType.LATEX) + layout.CompileReport(ReportFormatType.LATEX, dvipath) # Displaying message for opening DVI if self.main.session_info.has_dvipdf: - pdfpath = os.path.expanduser(args[0]+'/Output/DVI/MadAnalysis5job_'+str(i)) + pdfpath = os.path.expanduser( + args[0] + "/Output/DVI/MadAnalysis5job_" + str(i) + ) if self.main.currentdir in pdfpath: - pdfpath = pdfpath[len(self.main.currentdir):] - if pdfpath[0]=='/': - pdfpath=pdfpath[1:] - self.logger.info(" -> To open the corresponding Latex file, please type 'open " + pdfpath + "'.") + pdfpath = pdfpath[len(self.main.currentdir) :] + if pdfpath[0] == "/": + pdfpath = pdfpath[1:] + self.logger.info( + " -> To open the corresponding Latex file, please type 'open " + + pdfpath + + "'." + ) else: self.logger.warning("latex not installed -> no DVI/PDF report.") - - - def submit(self,dirname,history): + def submit(self, dirname, history): # checking if delphes is needed and installing/activating it if relevant detector_handler = DetectorManager(self.main) - if not detector_handler.manage('delphes'): - logging.getLogger('MA5').error('Problem with the handling of delphes/delphesMA5tune') + if not detector_handler.manage("delphes"): + logging.getLogger("MA5").error( + "Problem with the handling of delphes/delphesMA5tune" + ) return False - if not detector_handler.manage('delphesMA5tune'): - logging.getLogger('MA5').error('Problem with the handling of delphes/delphesMA5tune') + if not detector_handler.manage("delphesMA5tune"): + logging.getLogger("MA5").error( + "Problem with the handling of delphes/delphesMA5tune" + ) return False # Initializing the JobWriter - jobber = JobWriter(self.main,dirname,self.resubmit) + jobber = JobWriter(self.main, dirname, self.resubmit) # Writing process if not self.resubmit: - self.logger.info(" Creating folder '"+dirname.split('/')[-1] \ - +"'...") + self.logger.info(" Creating folder '" + dirname.split("/")[-1] + "'...") else: - self.logger.info(" Checking the structure of the folder '"+\ - dirname.split('/')[-1]+"'...") + self.logger.info( + " Checking the structure of the folder '" + + dirname.split("/")[-1] + + "'..." + ) if not jobber.Open(): self.logger.error("job submission aborted.") return False if not self.resubmit: - if self.main.recasting.status != 'on': + if self.main.recasting.status != "on": self.logger.info(" Copying 'SampleAnalyzer' source files...") if not jobber.CopyLHEAnalysis(): self.logger.error(" job submission aborted.") return False - if self.main.recasting.status != 'on' and not jobber.CreateBldDir(): + if self.main.recasting.status != "on" and not jobber.CreateBldDir(): self.logger.error(" job submission aborted.") return False @@ -383,26 +423,31 @@ def submit(self,dirname,history): jobber.WriteDatasetList(item) self.logger.info(" Writing the command line history...") - jobber.WriteHistory(history,self.main.firstdir) + jobber.WriteHistory(history, self.main.firstdir) if self.main.recasting.status == "on": - self.main.recasting.collect_outputs(dirname,self.main.datasets) - self.logger.info(' -> the results can be found in:') - self.logger.info(' '+ dirname + '/Output/SAF/CLs_output_summary.dat') + self.main.recasting.collect_outputs(dirname, self.main.datasets) + self.logger.info(" -> the results can be found in:") + self.logger.info(" " + dirname + "/Output/SAF/CLs_output_summary.dat") for item in self.main.datasets: - self.logger.info(' '+ dirname + '/Output/SAF/'+ item.name + '/CLs_output.dat') + self.logger.info( + " " + dirname + "/Output/SAF/" + item.name + "/CLs_output.dat" + ) else: layouter = LayoutWriter(self.main, dirname) layouter.WriteLayoutConfig() - if not self.main.recasting.status=='on' and not self.resubmit: + if not self.main.recasting.status == "on" and not self.resubmit: self.logger.info(" Creating Makefiles...") if not jobber.WriteMakefiles(): self.logger.error("job submission aborted.") return False # Edit & check the delphes or recasting cards - if self.main.fastsim.package in ["delphes","delphesMA5tune"] and not self.main.recasting.status=='on': - delphesCheck = DelphesCardChecker(dirname,self.main) + if ( + self.main.fastsim.package in ["delphes", "delphesMA5tune"] + and not self.main.recasting.status == "on" + ): + delphesCheck = DelphesCardChecker(dirname, self.main) if not delphesCheck.checkPresenceCard(): self.logger.error("job submission aborted.") return False @@ -427,23 +472,26 @@ def submit(self,dirname,history): root_dataset = True elif "lhco" in sample: lhco_dataset = True - if self.main.fastsim.package in ["delphes","delphesMA5tune"] or root_dataset: - os.environ["FASTJET_FLAG"] = "" - elif self.main.fastsim.package in ["fastjet"] and hepmc_dataset: + # if self.main.fastsim.package in ["delphes","delphesMA5tune"] or root_dataset: + # os.environ["FASTJET_FLAG"] = "" + if self.main.fastsim.package in ["fastjet"] and hepmc_dataset: if root_dataset and hepmc_dataset: - self.logger.error("ROOT input files not allowed for SFS-FastJet based analyses.") + self.logger.error( + "ROOT input files not allowed for SFS-FastJet based analyses." + ) return False - os.environ["FASTJET_FLAG"] = "-DMA5_FASTJET_MODE" - elif self.main.fastsim.package == 'none' and self.main.archi_info.has_fastjet and lhco_dataset: + # elif self.main.fastsim.package == 'none' and self.main.archi_info.has_fastjet and lhco_dataset: + # os.environ["FASTJET_FLAG"] = "-DMA5_FASTJET_MODE" + if self.main.archi_info.has_fastjet: os.environ["FASTJET_FLAG"] = "-DMA5_FASTJET_MODE" - if self.resubmit and not self.main.recasting.status=='on': + if self.resubmit and not self.main.recasting.status == "on": self.logger.info(" Cleaning 'SampleAnalyzer'...") if not jobber.MrproperJob(): self.logger.error("job submission aborted.") return False - if not self.main.recasting.status=='on': + if not self.main.recasting.status == "on": self.logger.info(" Compiling 'SampleAnalyzer'...") if not jobber.CompileJob(): self.logger.error("job submission aborted.") @@ -455,16 +503,20 @@ def submit(self,dirname,history): return False for item in self.main.datasets: - self.logger.info(" Running 'SampleAnalyzer' over dataset '" - +item.name+"'...") - self.logger.info(" *******************************************************") + self.logger.info( + " Running 'SampleAnalyzer' over dataset '" + item.name + "'..." + ) + self.logger.info( + " *******************************************************" + ) if not jobber.RunJob(item): - self.logger.error("run over '"+item.name+"' aborted.") - self.logger.info(" *******************************************************") + self.logger.error("run over '" + item.name + "' aborted.") + self.logger.info( + " *******************************************************" + ) return True - - def extract(self,dirname,layout): + def extract(self, dirname, layout): self.logger.info(" Checking SampleAnalyzer output...") jobber = JobReader(dirname) if not jobber.CheckDir(): @@ -472,54 +524,58 @@ def extract(self,dirname,layout): return False for item in self.main.datasets: - if self.main.recasting.status=='on': - if not self.main.recasting.CheckFile(dirname,item): + if self.main.recasting.status == "on": + if not self.main.recasting.CheckFile(dirname, item): return False elif not jobber.CheckFile(item): self.logger.error("errors have occured during the analysis.") return False - if self.main.recasting.status!='on': + if self.main.recasting.status != "on": self.logger.info(" Extracting data from the output files...") - for i in range(0,len(self.main.datasets)): + for i in range(0, len(self.main.datasets)): jobber.ExtractGeneral(self.main.datasets[i]) - jobber.ExtractHistos(self.main.datasets[i],layout.plotflow.detail[i]) - jobber.ExtractCuts(self.main.datasets[i],layout.cutflow.detail[i]) + jobber.ExtractHistos(self.main.datasets[i], layout.plotflow.detail[i]) + jobber.ExtractCuts(self.main.datasets[i], layout.cutflow.detail[i]) if self.main.merging.enable: - jobber.ExtractHistos(self.main.datasets[i],layout.merging.detail[i],merging=True) + jobber.ExtractHistos( + self.main.datasets[i], layout.merging.detail[i], merging=True + ) return True - def help(self): if not self.resubmit: self.logger.info(" Syntax: submit ") - self.logger.info(" Performs an analysis over a list of datasets. Output is stored into the directory .") - self.logger.info(" If the optional argument is omitted, MadAnalysis creates a fresh directory automatically.") + self.logger.info( + " Performs an analysis over a list of datasets. Output is stored into the directory ." + ) + self.logger.info( + " If the optional argument is omitted, MadAnalysis creates a fresh directory automatically." + ) self.logger.info(" HTML and PDF reports are automatically created.") else: self.logger.info(" Syntax: resubmit") self.logger.info(" Update of an analysis already performed, if relevant.") self.logger.info(" In all cases, the HTML and PDF reports are regenerated.") + def complete(self, text, line, begidx, endidx): - def complete(self,text,line,begidx,endidx): - - #Resubmission case + # Resubmission case if self.resubmit: - return + return - #Getting back arguments + # Getting back arguments args = line.split() nargs = len(args) if not text: nargs += 1 - #Checking number of arguments - if nargs==2: - output=[] - for file in glob.glob(text+"*"): + # Checking number of arguments + if nargs == 2: + output = [] + for file in glob.glob(text + "*"): if os.path.isdir(file): output.append(file) - return self.finalize_complete(text,output) + return self.finalize_complete(text, output) else: return [] diff --git a/madanalysis/misc/run_recast.py b/madanalysis/misc/run_recast.py index 0b7a999c..e1831a90 100644 --- a/madanalysis/misc/run_recast.py +++ b/madanalysis/misc/run_recast.py @@ -34,7 +34,7 @@ from shell_command import ShellCommand from string_tools import StringTools from six.moves import map, range, input -import copy, logging, math, os, shutil, time, sys, json +import copy, logging, math, os, shutil, time, sys, json, os class RunRecast(): @@ -56,6 +56,9 @@ def __init__(self, main, dirname): self.is_apriori = True self.cls_calculator = cls self.TACO_output = self.main.recasting.TACO_output + + # @jackaraz: activate fastjet flag + os.environ["FASTJET_FLAG"] = "-DMA5_FASTJET_MODE" def init(self): ### First, the analyses to take care off From 11083d74e83aab75bb4ca6884721b9d2c216230a Mon Sep 17 00:00:00 2001 From: "Jack Y. Araz" Date: Fri, 21 Jul 2023 15:09:34 +0100 Subject: [PATCH 7/7] add protection for recjetformat --- madanalysis/misc/run_recast.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/madanalysis/misc/run_recast.py b/madanalysis/misc/run_recast.py index e1831a90..c4d4d3c8 100644 --- a/madanalysis/misc/run_recast.py +++ b/madanalysis/misc/run_recast.py @@ -56,9 +56,6 @@ def __init__(self, main, dirname): self.is_apriori = True self.cls_calculator = cls self.TACO_output = self.main.recasting.TACO_output - - # @jackaraz: activate fastjet flag - os.environ["FASTJET_FLAG"] = "-DMA5_FASTJET_MODE" def init(self): ### First, the analyses to take care off @@ -266,11 +263,6 @@ def run_delphes(self,dataset,card): self.logger.debug(" Fixing the pileup path...") self.fix_pileup(self.dirname+'_RecastRun/Input/'+card) - # @Jack: new setup configuration. In order to run the code in SFS-FastJet mode analysis - # has to be compiled with `-DMA5_FASTJET_MODE` flag but this needs to be deactivated for - # Delphes-ROOT based analyses. - os.environ["FASTJET_FLAG"] = "" - # Creating executable self.logger.info(" Compiling 'SampleAnalyzer'...") if not jobber.CompileJob(): @@ -698,6 +690,8 @@ def make_pad(self): strcores='-j'+str(ncores) command.append(strcores) logfile = self.dirname+'_RecastRun/Build/Log/PADcompilation.log' + # @jackaraz: this is needed for the recjetformat + os.environ["FASTJET_FLAG"] = "-DMA5_FASTJET_MODE" result, out = ShellCommand.ExecuteWithLog(command,logfile,self.dirname+'_RecastRun/Build') time.sleep(1.); # Checks and exit