view annovar_yaml/annovar_yaml.pl @ 8:9d6e7d2ddbb7 draft

Uploaded new version of xml file containing dependency for perl 5.22
author niels
date Tue, 14 May 2019 05:08:45 -0400
parents
children 7f4fb56714e8
line wrap: on
line source

#/usr/bin/perl

#perl modules use
use YAML;
use YAML::Tiny;
use YAML::XS 'LoadFile';
use Data::Dumper;
#use Data::YAML::Writer;
use Getopt::Long;
use strict;

#input required
#two modes run and edit
#Basis Yaml file [default required]
#Yaml out file [required in edit mode]
#species [default required]
#build [default required]
#protocol [default required]
#protocolversion [default required]

#basic paramters
my $edit = "0";
my $run = "0";
my $application = "0";
my $parameter_yml = "YAML_arguments_annovar.yml";
my $inyml;
my $outyml;
my $invcf;
my $outvcf;
my $yml_hash_arguments;
my %yml_hash_arguments;
my $yml_hash;
my %yml_hash;
my $yml_hash_edit;
my %yml_hash_edit;
my $in;
my $in2;
my %in;
my %in2;
my $writer;

#parameter applications
my %annovarparameters_array;
my %annovarparameters_single;
my $annovarparameters_array;
my $annovarparameters_single;

#Strings used as input parameters
#my $input_general_location_database;
#my $input_general_dir_scripts;
#my $input_general_location_scripts_coding_annovar;
#my $input_general_location_scripts_table_annovar;
my $input_annovar_build;
my $input_annovar_species;
my $inprotocol;
my $inprotocolversion;
my @inprotocol;
my @inprotocolversion;

my $input_general_settings_dot2underline;
my $input_general_settings_nastring;
my $input_general_settings_otherinfo;
my $input_general_settings_polish;
my $input_general_settings_remove;
my $input_general_settings_thread;
my $input_general_settings_inputformat;

my $input_databases_available;
my $input_databases_required;

my $input_databases_colswanted;
my $input_databases_exonicsplic;
my $input_databases_hgvs;
my $input_databases_operation;
my $input_databases_splicing;
my @input_databases_colswanted;
my @input_databases_exonicsplic;
my @input_databases_hgvs;
my @input_databases_operation;
my @input_databases_splicing;

#other variables
my $script;
my $type;
my $count;
my $column_build;
my $column_species;
my @column_build;
my @column_species;
my $pattern;
my $pattern2;
my $match;
my $match_value;
my @match_value;
my @readonly;
my %editinyml;

#Fixed values for searching hashes
my $level5 = "DATABASES";

#parameters to build command
my $protocol;
my @protocol;
my $operation;
my $argument;

GetOptions (
	#Required input
	'protocol=s' => \$inprotocol,
	'protocolversion=s' => \$inprotocolversion,
	'script=s' => \$script,
	'invcf=s' => \$invcf,
	'outvcf=s' => \$outvcf,
	'application=s' => \$application,
        'inyml=s' => \$inyml,
        'outyml=s' => \$outyml,
        'build=s'       => \$input_annovar_build,
        'species=s'   => \$input_annovar_species,
	#Optional input
	'edit' => \$edit,
	'run' => \$run,
	#variables in GENERAL
	'dot2underline=s'   => \$input_general_settings_dot2underline,
	'nastring=s'   => \$input_general_settings_nastring,
	'otherinfo=s'   => \$input_general_settings_otherinfo,
	'polish=s'   => \$input_general_settings_polish,
	'remove=s'   => \$input_general_settings_remove,
	'thread=s'   => \$input_general_settings_thread,
	'inputformat=s'  => \$input_general_settings_inputformat,
	#variables in DATABASES
	'colswanted=s'   => \$input_databases_colswanted,
	'exonicsplic=s'   => \$input_databases_exonicsplic,
	'hgvs=s'   => \$input_databases_hgvs,
	'operation=s'   => \$input_databases_operation,
	'splicing=s'   => \$input_databases_splicing,
);


#inactive options
#       'drequired=s'   => \$input_databases_required,
#       'davail=s'   => \$input_databases_available,

#       'gpathdatabase=s'   => \$input_general_location_database,
#	'gpathscripts=s'   => \$input_general_dir_scripts,
#       'gpathcodannovar=s'   => \$input_general_location_scripts_coding_annovar,
#       'gpathtabannovar=s'   => \$input_general_location_scripts_table_annovar,

#Check input parameters
#Do some checks whether all required arguments are given

#some code

#arrays with all application specific parameters
#make sure keys are unique to allow for parsing of yml! 

%annovarparameters_array = (
	"COLSWANTED" => "$input_databases_colswanted",
	"EXONICSPLIC" => "$input_databases_exonicsplic",
	"HGVS" => "$input_databases_hgvs",
	"OPERATION" => "$input_databases_operation",
	"SPLICING" => "$input_databases_splicing",
);

%annovarparameters_single = (
	"DOT2UNDERLINE" => "$input_general_settings_dot2underline",
	"NASTRING" => "$input_general_settings_nastring",
	"OTHERINFO" => "$input_general_settings_otherinfo",
	"POLISH" => "$input_general_settings_polish",
	"REMOVE" => "$input_general_settings_remove",
	"THREAD" => "$input_general_settings_thread",
	"INPUTFORMAT" => "$input_general_settings_inputformat",
);

#parameter not allowed to be edited in yml
@readonly = ("hg19","human","mouse","mm10","annovar","VERSION","TABLE_ANNOVAR","refgene","cosmic");


#converting string into arrays
@inprotocol = split (",", $inprotocol);
print "version $inprotocolversion\n";
@inprotocolversion = split (",", $inprotocolversion);
@input_databases_colswanted = split (",", $input_databases_colswanted);
@input_databases_exonicsplic = split (",", $input_databases_exonicsplic);
@input_databases_hgvs = split (",", $input_databases_hgvs );
@input_databases_operation = split (",", $input_databases_operation);
@input_databases_splicing = split (",", $input_databases_splicing);

#$in = $inyml;
#openyml_read($in);
#$in = $inyml;
#load($in);

#check if combination of application,species, build and protocol exists
#$count = "0";
#%in = $yml_hash;
#foreach (@inprotocol) {
#print "protocol $inprotocol[$count]\n";  
#$pattern = "$application:ANALYSIS:$input_annovar_species:$input_annovar_build:DATABASES:$inprotocol[$count]$inprotocolversion[$count]:NAME $inprotocol[$count]$inprotocolversion[$count]";
#@pattern = ("GENERAL:species", "GENERAL:build", "GENERAL:protocol");
#foreach @pattern {
#  parse($in, $_);
#  if ($match =~ /^1$/) { print "Present!\n"; };
#  $count++;
#  }
#}

#$in = $inyml;
#openyml_read($in);
#$in = $inyml;
#load_edit($in);

#Editing section first single values, next arrays
#print "Starting editing of strings...\n";
#foreach my $key (keys %annovarparameters_single) {
#    my $innermatch = "0";
    #print "Key: $key\n";
#    foreach my $innerkey (@readonly) {
#        if ($key =~ /^$innerkey$/) {
	    #print "Value not allowed to be changed!\n";  
#            $innermatch++; };
#        }
#    if ($innermatch >= 1) {
#	print "Skipping: $key\n";
	#Do nothing
#    } else { 
#    my $value = $annovarparameters_single{$key};
#    if ($value !~ /^$/) {
#        print "key:$key value:$value\n";
#        $pattern = "^($application:.{1,}:$key)";
#	print "pattern: $pattern\n";
#        %in = $yml_hash_edit; 
#        parse($in, $pattern);
#        print "editing value...: $match_value\n";
#        @match_value = split (':', $match_value);
# 	 my $max = scalar @match_value;
# 	 $count = "0";
#        foreach (@match_value) {
#	   if ($count == $max-1) {
#               print "$_\n";
#	       $_ =~ s/^.{1,}$/$value/g;
#	       print "after: $_ \n";
#	   }
#	   $count++;
#	}
#	print "max $max\n";
#        if ( $max == 4 ) {
#            $yml_hash_edit->{$match_value[0]}{$match_value[1]}{$match_value[2]} = $match_value[3]
#        }
#    }
#    } 
#}

#print "\n";
#my $checkkey;

#allow processing of arrays as well
#print "Starting editing of array values...\n";
#foreach my $key ( keys %annovarparameters_array) {
#    $count = "0";
    #print "COUNT: $count\n";
    #print "KEY: $key\n";
#    my @key = split (',', $key);
#    foreach my $innerkey (@key) {
#        my $innermatch = "0";
#        foreach $checkkey (@readonly) {
#            if ($innerkey =~ /^$checkkey$/) {
                #Do nothing
#                $innermatch++; };
#            }
#        if ($innermatch >= 1) {
#            print "innerkey: $innerkey skipped\n";

#       } else {
#        my $value = $annovarparameters_array{$key};
#	if ($value !~ /^$/ ) {
#	    print "Value: $value\n";
#	    my @value = split (',', $value);
#	    my $innercount = "0";
#            foreach my $innervalue (@value) {
#		if ( $innervalue !~ /^$/ ) {
#	            print "\nkey: $key innerkey: $innerkey check: $checkkey value: $innervalue\n";
#	            print "innercount: $innercount\n";
#	            $pattern = "^($application:.{1,}:$input_annovar_species:$input_annovar_build:.{1,}:@inprotocol[$innercount]$inprotocolversion[$innercount]:$key)";
#                    print "pattern: $pattern\n";
#	            %in = $yml_hash_edit;
#	            parse($in, $pattern);
#		    undef %in;
#	            print "editing value...: $match_value\n";
#	                if ($match =~ /^1$/) {
#                            @match_value = split (':', $match_value);
#                            my $max = scalar @match_value;
#                            #$count = "0";
#                            foreach (@match_value) { 
#				print "count: $count\n";
#		                if ($count == $max-1) {
#		                    print "empty_check: $_ \n";
#			            $_ =~ s/^.{1,}$/$value[$innercount]/g;
#			            print "empty_check_after: $_ \n";
#		                }                                   
#		                print "Max: $max\n";
#                                $count++;
#		            }
#			    print "change: $value[$innercount]\n";
#			    print "Max: $max\n";
#                            if ( $max == 9 ) {
#                                $yml_hash_edit->{$match_value[0]}{$match_value[1]}{$match_value[2]}{$match_value[3]}{$match_value[4]}{$match_value[5]}{$match_value[6]}{$match_value[7]} = $match_value[8]; 
#                           }
#	                } else {
#
#	                     if ($match =~ /^0$/) {   
#	                         $pattern = "^($application:.{1,}:$input_annovar_species:$input_annovar_build:.{1,}:@inprotocol[$innercount]:$inprotocolversion[$innercount])";
#                                 %in = $yml_hash_edit;
#				 parse($in, $pattern);          
#				 undef %in;
#	                         print "editing value...: $match_value\n";
#	                         if ($match > 1) {
#                                     @match_value = split (':', $match_value); 
#	                             my $max = scalar @match_value;
#				     $count = "0";
#                                     print "Max: $max\n";
#                                     if ( $max == 9 ) {
#                                         $yml_hash_edit->{$match_value[0]}{$match_value[1]}{$match_value[2]}{$match_value[3]}{$match_value[4]}{$match_value[5]}{$match_value[6]}{$innerkey} = "$innervalue";
#                                     }
# 	                         }    
#	                     }
#	                }          
#		} else {
#                #Do nothing no arugment supplied  
#		}
#	    $innercount++;
#	    }
#        } else {
#	#Do nothing no argument supplied
#        }
#	}
#    }
#$count++;
#print "\n";
#}

#print "\nFinished editing...\n";

#Create second yml file with change values originating from cli
#$in = $outyml;
#openyml_write($in);
#%in = $yml_hash_edit; 
#writeyml_edit($in);
#$in = $outyml;
#load($outyml);
#print "Finished loading second yml...\n";

#Load ymlhash with arguments
#$in = $parameter_yml;
#openyml_read($in);
#$in = $parameter_yml;
#load_arguments($in);
#print "Finished loading arguments...\n";

#Build command for application

################### stuff to replace with loop

#Starting with Annovar
#$count = "0";
#foreach (@inprotocol) {
#$protocol .= "$_$inprotocolversion[$count]";
#print "protocol $inprotocol\n";
#print "protocol_version $inprotocolversion\n";
#if ($count+1 >= scalar @inprotocol) { } else { $protocol .= "','"; };
#$count++; 
#}

#Make new array with protocol plus version
#@protocol = split (",", $protocol); 
#foreach (@protocol) {
#print "print value: $_\n";
#}

#Required as input value, not pickup from yaml file!
#$operation = $input_databases_operation;
#$operation =~ s/,/','/g;

#$count= "0";
#foreach (@inprotocol) {
#if ( $_ =~ /refgene/ ) {
#print "Entering refgene...\n";
#$argument .= "$yml_hash_arguments->{$application}{ANALYSIS}{$input_annovar_species}{$input_annovar_build}{DATABASES}{$protocol[$count]}{ARG}{HGVS}{$yml_hash_edit->{$application}{ANALYSIS}{$input_annovar_species}{$input_annovar_build}{DATABASES}{$protocol[$count]}{ARG}{HGVS}} ";
#$argument .= "--splicing $yml_hash_edit->{$application}{ANALYSIS}{$input_annovar_species}{$input_annovar_build}{DATABASES}{$protocol[$count]}{ARG}{SPLICING} "; 
#$argument .= "$yml_hash_arguments->{$application}{ANALYSIS}{$input_annovar_species}{$input_annovar_build}{DATABASES}{$protocol[$count]}{ARG}{EXONSPLIC}{$yml_hash_edit->{$application}{ANALYSIS}{$input_annovar_species}{$input_annovar_build}{DATABASES}{$protocol[$count]}{ARG}{EXONSPLIC}}";
#if ($count+1 >= scalar @inprotocol) { } else { $argument .= "','"; };
#} elsif ( $_ =~ /cosmic/ ) {
#print "Entering cosmic...\n";
#$argument .= "--colswanted $yml_hash_edit->{$application}{ANALYSIS}{$input_annovar_species}{$input_annovar_build}{DATABASES}{$protocol[$count]}{ARG}{COLSWANTED}";
#if ($count+1 >= scalar @inprotocol) { } else { $argument .= "','"; };
#} 
#$count++;
#}

#print "$argument\n";

#Put content to print in arrays
#my @protocol_values = ("$inprotocol","$operation","$argument");
#my @values = ("$yml_hash_edit->{$application}{GENERAL}{PATHSCRIPTS}","$yml_hash_edit->{$application}{GENERAL}{$script}","$yml_hash_edit->{$application}{GENERAL}{LOCATION_DATABASE}","$input_annovar_build","$yml_hash_arguments->{$application}{GENERAL}{REMOVE}{$yml_hash_edit->{$application}{GENERAL}{REMOVE}}","$yml_hash_arguments->{$application}{GENERAL}{DOT2UNDERLINE}{$yml_hash_edit->{$application}{GENERAL}{DOT2UNDERLINE}}","$yml_hash_arguments->{$application}{GENERAL}{OTHERINFO}{$yml_hash_edit->{$application}{GENERAL}{OTHERINFO}}","$yml_hash_edit->{$application}{GENERAL}{NASTRING}","$yml_hash_arguments->{$application}{GENERAL}{INPUTFORMAT}{$yml_hash_edit->{$application}{GENERAL}{INPUTFORMAT}}","$yml_hash_edit->{$application}{GENERAL}{THREAD}","$yml_hash_arguments->{$application}{GENERAL}{POLISH}{$yml_hash_edit->{$application}{GENERAL}{POLISH}}");

#foreach (@protocol_values) { print "line array1: $_\n" };
#foreach (@values) { print "line array2: $_\n" };

#Build actual command
#my $annovar_command = "perl $values[0]$values[1] $invcf $values[2] --buildver $values[3] $values[4] --protocol \'$protocol_values[0]\' --operation \'$protocol_values[1]\' $values[5] $values[6] --nasstring \'$values[7]\' $values[8] --arg \'$protocol_values[2]\' --thread $values[9] $values[10] --outfile $outvcf";

################### end of static code

#Printing/execting command!
#print "$annovar_command\n";

#Execute command
#Do some stuff to actual run the command...

#Build command

#my @parameters_test = $yml_hash->{ANALYSIS}{DATABASES};
#foreach (@parameters_test) {
#print "value: $_\n";
#}  
#my $test_hash = $yml_hash->{ }{map};

#print "value: $yml_hash->{ANALYSIS}{DATABASES}\n";

#Fill hashes with input yaml files
openyml_read ($parameter_yml);
openyml_read ($inyml);
load ($inyml, %yml_hash, $yml_hash);
load_arguments ($parameter_yml, %yml_hash_arguments, $yml_hash_arguments);

#Building annovar command:
my $application = 'annovar';

my $ncbiRefSeq = 'ncbiRefSeq';
my $cosmic = 'cosmic';
my $dbsnp = 'avsnp';
my $clinvar = 'clinvar';
my $class = 'class';

my $ncbiRefSeq_version = '_UMCU';
my $cosmic_version = '84';
my $dbsnp_version = '150';
my $clinvar_version = '_20180603';
my $class_version = '100519';

#species input fixed
my $input_annovar_species = "human";

#Defined in input
#my $invcf = "/hpc/cog_bioinf/pathologie/users/snouwens/Annovar_Moldia/input_vcfs/prepared_vcfs/PA-AI-201812-154T_norm_2.vcf ";
#my $outvcf = "/hpc/cog_bioinf/pathologie/users/snouwens/Annovar_Moldia/input_vcfs/prepared_vcfs/PA-AI-201812-154T_norm_2_out.vcf ";

my $language = 'perl ';

my $parse1 = 'parse1';
my $parse2 = 'parse2';

my $application_path = "$application,APPLICATION,GENERAL";

my $ncbiRefSeq_path = "$ncbiRefSeq$ncbiRefSeq_version,NAME,ANALYSIS,DATABASES";
my $cosmic_path = "$cosmic$cosmic_version,NAME,ANALYSIS,DATABASES";
my $dbsnp_path = "$dbsnp$dbsnp_version,NAME,ANALYSIS,DATABASES";
my $clinvar_path = "$clinvar$clinvar_version,NAME,ANALYSIS,DATABASES";
my $class_path = "$class$class_version,NAME,ANALYSIS,DATABASES";

#blocks to build command
my @command_building_blocks = ( 
"$language",
"$parse1,PATHSCRIPTS,$application_path",
"$parse1,TABLE_ANNOVAR,$application_path",
"$invcf",
"$parse1,LOCATION_DATABASE,$application_path",
"$parse1,SPECIES,$application_path",
"$parse1,BUILD,$application_path",
"$parse1,REMOVE,$application_path",
"--protocol \'",
"$parse2,NAME,$ncbiRefSeq_path",
"\,",
"$parse2,NAME,$cosmic_path",
"\,",
"$parse2,NAME,$dbsnp_path",
"\,",
"$parse2,NAME,$clinvar_path",
"\,",
"$parse2,NAME,$class_path",
"\' ",
"--operation \'",
"$parse2,OPERATION,$ncbiRefSeq_path",
"\'",
"\,",
"\'",
"$parse2,OPERATION,$cosmic_path",
#"\'\,\'",
"\'",
"\,",
"\'",
"$parse2,OPERATION,$dbsnp_path",
#"\'\,\'",
"\'",
"\,",
"\'",
"$parse2,OPERATION,$clinvar_path",
#"\'\,\'",
"\'",
"\,",
"\'",
"$parse2,OPERATION,$class_path",
"\' ",
"$parse1,DOT2UNDERLINE,$application_path",
"$parse1,OTHERINFO,$application_path",
"$parse1,NASTRING,$application_path",
"$parse1,INPUTFORMAT,$application_path",
"--arg \'",
"$parse2,HGVS,$ncbiRefSeq_path",
"$parse2,SPLICING,$ncbiRefSeq_path",
"$parse2,EXONSPLIC,$ncbiRefSeq_path",
#"\'\,\'",
"\'",
"\,",
"\'",
"$parse2,COLSWANTED,$cosmic_path",
#"\'\,\'",
"\'",
"\,",
"\'",
"$parse2,COLSWANTED,$dbsnp_path",
#"\'\,\'",
"\'",
"\,",
"\'",
"$parse2,COLSWANTED,$clinvar_path",
#"\'\,\'",
"\'",
"\,",
"\'",
"$parse2,COLSWANTED,$class_path",
"\' ",
"$parse1,THREAD,$application_path",
"$parse1,POLISH,$application_path",
"-outfile $outvcf "); 

print "\n";

#Setup variables for processing
my $lookup;
my %input;
my $input;
my $match1;
my $in_key;
my $in_value;
my $in_lookup;
my ($pattern1, $pattern2, $pattern3, $pattern4, $pattern5);

#Empty command
my $test_command = "";

foreach (@command_building_blocks) {
  $in = $inyml;
  $in2 = $parameter_yml;
  #print "loop1:$_\n";
  if ( $_ =~ /^,$/ ) {
    print "$_ is separator and does not require matching!\n\n";
    $test_command .= "$_";
    next;
  }
  my @values = split /\,/, $_;
  foreach (@values) {
    if ( $_ =~ /^parse1/ ) {
    #print "parse1: $in, $in2, $values[1], $values[2], $values[3], $values[4], %yml_hash, %yml_hash_arguments, $yml_hash, $yml_hash_arguments\n";
    parse1 ($in, $in2, $values[1], $values[2], $values[3], $values[4], %yml_hash, %yml_hash_arguments, $yml_hash, $yml_hash_arguments);
    print "parse1_out:$lookup...\n";
    $test_command .= "$lookup";
    $lookup = '';
    $input = '';
    %input = '';
    print "\n";
    last;
    }
    elsif ( $_ =~ /^parse2/ ) {
    #print "parse2: $in, $in2, $values[1], $values[2], $values[3], $values[4], $values[5], %yml_hash, %yml_hash_arguments, $yml_hash, $yml_hash_arguments\n";
    parse2 ($in, $in2, $values[1], $values[2], $values[3], $values[4], $values[5], %yml_hash, %yml_hash_arguments, $yml_hash, $yml_hash_arguments);
    print "parse2_out:$lookup...\n";
    $test_command .= "$lookup";
    $lookup = '';
    $input = '';
    %input = '';
    print "\n";
    last;
    }
    elsif ( $_ !~ /^parse1$/ && $_ !~ /^parse2$/ ) { print "$_ does not require matching!\n\n";
    $test_command .= "$_";
    last; 
    }
  }
}

print "\n";
print "Resulting in following command: $test_command\n";
system ($test_command);
print "Job done program stopping.\n";

#testing parse2
#%in = $inyml;
#$pattern1 = "PROTOCOL";
#$pattern2 = "$inprotocol$inprotocolversion";
#$pattern2 = "$inprotocol";
#$pattern3 = "NAME";
#$pattern4 = "ANALYSIS";
#$pattern5 = "DATABASES";
#parse2 ($in, $yml_hash_arguments, $pattern1, $pattern2, $pattern3, $pattern4, $pattern5);

#application is checked as well
#testing parse3
#%in = $inyml;
#$pattern1 = "OTHERINFO";
#$pattern2 = $application; #is value is which used for check
#patteern3 = "APPLICATION";
#$pattern4 = "GENERAL";
#parse1 ($in, $yml_hash_arguments, $pattern1, $pattern2, $pattern3, $pattern4);

exit;

#####################
#!!!END OF SCRIPT!!!#
####################

#############
#SUBROUTINES#
#############

sub check_lookup {
if ($in_lookup =~ /^$/) {
  #No argument found error, mismatch between arguments and inyml!
  print " mismatch between yml input and arguments yml!\n";
  print "Problem with following values: $in_key: $in_value!\n"; }  
elsif ($in_lookup !~ /^$/) {
  #argument found in arguments file!             
  print " found argument!\n";
  print "Following values used: $in_key:$in_value:$in_lookup!\n";
  $match1++; }
}

#############
#Subroutine to process parsing for 2-layered arrays in yamls
#############
sub parse2 { 

#presetting variables
$input = '';
%input = '';
$lookup = '';
my $find_parameter;
my $find_parameter_result;
my $count_key;
my $count_value;
my $count_inner_key;
my $count_inner_value;
my %test_value_ANALYSIS;
my %test_value_GENERAL;
my $pattern1 = $_[2];
my $pattern2 = $_[3];
my $pattern3 = $_[4];
my $pattern4 = $_[5];
my $pattern5 = $_[6];

print "Searching for matching parameter for: $pattern1...";

for my $test_value_ANALYSIS (@{$yml_hash->{$pattern4}{$pattern5}}) {
  $count_key = 0;
  foreach my $key (keys $test_value_ANALYSIS) {
    $count_key++;
    $count_value = 1;
    foreach my $value (values $test_value_ANALYSIS) {
      if ($count_value =~ /^$count_key$/) { 
        for my $test_value_ANALYSIS_arguments (@{$yml_hash_arguments->{$pattern4}{$pattern5}}) {
          $count_inner_key = 0;
          foreach my $inner_key (keys $test_value_ANALYSIS_arguments ) {
            if ( $key =~ /^$inner_key$/ ) { 
              $count_inner_key++;
              $count_inner_value = 1;
              foreach my $inner_value (values $test_value_ANALYSIS_arguments) {
                $match1 = 0;
                $lookup = "";
                if ( $test_value_ANALYSIS_arguments->{$pattern3} =~ /^$pattern2$/ && $test_value_ANALYSIS->{$pattern3} =~ /^$pattern2$/ ) {
                  if ( $count_inner_value =~ /^$count_inner_key$/ && $key =~ /^$pattern1$/) {
                    if ( $test_value_ANALYSIS_arguments->{$key} =~ /^HASH/ ) {
                      #print "\nIs hash! $key:$value:$inner_key:$inner_value:$pattern1\n";
                      $lookup = $test_value_ANALYSIS_arguments->{$key}{$value};
                      check_lookup ($in_key = $key,$in_value = $value, $in_lookup = $lookup, $match1);
                      $in_key = '';
                      $in_value = '';
                      $in_lookup = '';
                      return;
                    }
                    elsif ( $test_value_ANALYSIS_arguments->{$key} !~ /^HASH/ ) {
                      $lookup = $test_value_ANALYSIS_arguments->{$key};
                      check_lookup ($in_key = $key,$in_value = $value, $in_lookup = $lookup, $match1);
                      $in_key = '';
                      $in_value = '';
                      $in_lookup = '';
                      return; 
                    }
                  } 
                $count_inner_value++;
                }
              }
            }
          }    
        } 
      }
      $count_value++;
    }
  }
}

print " parameter not found!\n";
print "Problem with following value: $pattern1!\n";
print "Please check your yaml files for errors!\n";
print "Aborting...\n";

} 

#############
#Subroutine to process parsing of 1-layered array in yamls
#############
sub parse1 {

#presetting variables
%input = '';
$lookup = '';
my $find_parameter;
my $find_parameter_result;
my $count_key;
my $count_value;
my $count_inner_key;
my $count_inner_value;
my %test_value_ANALYSIS;
my %test_value_GENERAL;
my $pattern1 = $_[2];
my $pattern2 = $_[3];
my $pattern3 = $_[4];
my $pattern4 = $_[5];

print "Searching for matching parameter for: $pattern1...";

foreach my $find_parameter (@{$yml_hash->{$pattern4}}) {
  #print "hash: $find_parameter->{$pattern1}\n";
}

for my $test_value_ANALYSIS (@{$yml_hash->{$pattern4}}) {
  $count_key = 0;
  foreach my $key (keys $test_value_ANALYSIS) {
    $count_key++;
    $count_value = 0;
    foreach my $value (values $test_value_ANALYSIS) {
      $count_value++;
      if ($count_value =~ /^$count_key$/) {
        for my $test_value_ANALYSIS_arguments (@{$yml_hash_arguments->{$pattern4}}) {
          $count_inner_key = 0;
          foreach my $inner_key (keys $test_value_ANALYSIS_arguments ) {
            $count_inner_key++;
            $count_inner_value = 0;
            if ( $key =~ /^$inner_key$/ ) {
              foreach my $inner_value (values $test_value_ANALYSIS_arguments) {
                $count_inner_value++;
                #print "Innervalue: $inner_value $key:$value:$inner_key:$inner_value:$count_key:$count_value:$count_inner_key:$count_inner_value\n";
                $match1 = 0;
                $lookup = "";
                if ( $test_value_ANALYSIS_arguments->{$pattern3} =~ /^$pattern2$/ && $test_value_ANALYSIS->{$pattern3} =~ /^$pattern2$/ ) {
                  if ( $count_inner_value =~ /^$count_inner_key$/ && $key =~ /^$pattern1$/ ) {
                    if ( $test_value_ANALYSIS_arguments->{$key} =~ /^HASH/ ) {
                      #print "\nIs hash! $key:$value:$inner_key:$lookup:$match1\n";
                      $lookup = $test_value_ANALYSIS_arguments->{$key}{$value};
                      check_lookup ($in_key = $key,$in_value = $value, $in_lookup = $lookup, $match1);
                      $in_key = '';
                      $in_value = '';
                      $in_lookup = '';
                      return;
                    }
                    elsif ( $test_value_ANALYSIS_arguments->{$key} !~ /^HASH/ ) {
                      $lookup = $test_value_ANALYSIS_arguments->{$key};
                      #print "Is not a Hash! $lookup\n";
                      check_lookup ($in_key = $key,$in_value = $value, $in_lookup = $lookup, $match1);
                      $in_key = '';
                      $in_value = '';
                      $in_lookup = ''; 
                      return;
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

print " parameter not found!\n";
print "Problem with following value: $pattern1!\n";
print "Please check your yaml files for errors!\n";
print "Aborting...\n";

} 

#############
#subroutine parsing yaml hash
#############
sub openyml_write {
my $outyml = $in; 
#Create second yml file with change values originating from cli
open(OUT, '>', "$outyml") or die "Could not open file '$outyml' $!";
print "Done creating output file...\n";
}

#############
#
#############
sub openyml_read { 
$in = $_[0];
chomp $in;
my $inyml = $in;
open(FILE, '<', "$inyml") or die "Could not open file '$inyml' $!";
close FILE;
print "Done reading\n";
}

#############
##
##############
sub load_arguments {
$in = $_[0];
$yml_hash_arguments = LoadFile($in);
return($yml_hash_arguments, %yml_hash_arguments);
}

#############
#pen(FILE, '<', "$inyml") or die "Could not open file '$inyml' $!";
##
##############
sub load {
$in = $_[0];
$yml_hash = LoadFile($in);
return($yml_hash, %yml_hash);
}

#############
##
##############
sub load_edit {
$in = $_[0];
$yml_hash_edit = LoadFile($in);
}

#############
##
##############
sub writeyml {
my $yml_hash = $in;
$writer = sub {
    my $line = shift;
    print FILE "$line\n";
};
my $file = Data::YAML::Writer->new;
$file->write( $yml_hash, $writer );
}

#############
##
##############
sub writeyml_edit {
my $yml_hash = $in;
$writer = sub {
    my $line = shift;
    print OUT "$line\n";
};
my $file = Data::YAML::Writer->new;
$file->write( $yml_hash_edit, $writer );
close OUT;
}

#############
##
##############
sub parse {
my $ymlhash = $in;

print "searching for: $pattern\n";

$match = "0";
$match_value = '';

for my $key1 (keys %{$yml_hash}) {
#print "Key1: $key1\n";
$type = '';
$type = ref(${$yml_hash}{$key1});
    if (exists $yml_hash->{$key1} || $type =~ /HASH/) {
        for my $key2 (keys %{$yml_hash->{$key1}}) {
        #print "Key2: $key2\n";
        $type = '';
        $type = ref(${$yml_hash}{$key1}{$key2});
            if (exists $yml_hash->{$key2} || $type =~ /HASH/) {
                for my $key3 (keys %{$yml_hash->{$key1}{$key2}}) {
                #print "Key3: $key3\n";
                $type = '';
                $type = ref(${$yml_hash}{$key1}{$key2}{$key3});
                    if (exists $yml_hash->{$key3} || $type =~ /HASH/) {
                        for my $key4 (keys %{$yml_hash->{$key1}{$key2}{$key3}}) {
                        #print "Key4: $key4\n";
                        $type = '';
                        $type = ref(${$yml_hash}{$key1}{$key2}{$key3}{$key4});
                            if (exists $yml_hash->{$key4} || $type =~ /HASH/) {
                                for my $key5 (keys %{$yml_hash->{$key1}{$key2}{$key3}{$key4}}) {
                                #print "Key5: $key5\n";
                                $type = '';
                                $type = ref(${$yml_hash}{$key1}{$key2}{$key3}{$key4}{$key5});
                                    if (exists $yml_hash->{$key5} || $type =~ /HASH/) {
                                        for my $key6 (keys %{$yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}}) {
                                        #print "Key6: $key6\n";
                                        $type = '';
                                        $type = ref(${$yml_hash}{$key1}{$key2}{$key3}{$key4}{$key5}{$key6});
                                            if (exists $yml_hash->{$key6} || $type =~ /HASH/) {
                                                for my $key7 (keys %{$yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}{$key6}}) {
                                                #print "Key7: $key7\n";
                                                $type = '';
                                                $type = ref(${$yml_hash}{$key1}{$key2}{$key3}{$key4}{$key5}{$key6}{$key7});
                                                    if (exists $yml_hash->{$key7} || $type =~ /HASH/) {
                                                        for my $key8 (keys %{$yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}{$key6}{$key7}}) {
                                                        #print "Key8: $key8\n";
							$type = '';
							$type = ref(${$yml_hash}{$key1}{$key2}{$key3}{$key4}{$key5}{$key6}{$key7}{$key8});
							    if (exists $yml_hash->{$key8} || $type =~ /HASH/) {
							        for my $key9 (keys %{$yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}{$key6}{$key7}{$key8}}) {
								#print "Key9: $key9\n";
								$type = '';
								$type = ref(${$yml_hash}{$key1}{$key2}{$key3}{$key4}{$key5}{$key6}{$key7}{$key8}{$key9});
                                                                    if (exists $yml_hash->{$key9} || $type =~ /HASH/) {
									for my $key10 (keys %{$yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}{$key6}{$key7}{$key8}{$key9}}) {
									my $value = "$key1:$key2:$key3:$key4:$key5:$key6:$key7:$key8:$key9 $yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}{$key6}{$key7}{$key8}{$key9}{$key10}";
									if ( $value =~ /$pattern/ ) {
									    $match++;
									    $match_value = "$key1:$key2:$key3:$key4:$key5:$key6:$key7:$key8:$key9:$yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}{$key6}{$key7}{$key8}{$key9}{$key10}";
									    #print "value $key1:$key2:$key3:$key4:$key5:$key6:$key7:$key8:$key9 $yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}{$key6}{$key7}{$key8}{$key9}{$key10}\n";
									}
									#print "$key1:$key2:$key3:$key4:$key5:$key6:$key7:$key8:$key9 $yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}{$key6}{$key7}{$key8}{$key9}{$key10}";
								    }		
								} else {	
								my $value = "$key1:$key2:$key3:$key4:$key5:$key6:$key7:$key8:$key9 $yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}{$key6}{$key7}{$key8}{$key9}";
							        if ( $value =~ /$pattern/ ) {
								    $match++;
								    $match_value = "$key1:$key2:$key3:$key4:$key5:$key6:$key7:$key8:$key9:$yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}{$key6}{$key7}{$key8}{$key9}";
								    #print "value: $key1:$key2:$key3:$key4:$key5:$key6:$key7:$key8:$key9 $yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}{$key6}{$key7}{$key8}{$key9}\n";
								} 
								#print "value: $key1:$key2:$key3:$key4:$key5:$key6:$key7:$key8:$key9 $yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}{$key6}{$key7}{$key8}{$key9}\n";
								}
							    }
							} else {
							my $value = "$key1:$key2:$key3:$key4:$key5:$key6:$key7:$key8 $yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}{$key6}{$key7}{$key8}";
							if ( $value =~ /$pattern/ ) {
                                                            $match++;
							    $match_value =  "$key1:$key2:$key3:$key4:$key5:$key6:$key7:$key8:$yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}{$key6}{$key7}{$key8}";
                                                            #print "value: $key1:$key2:$key3:$key4:$key5:$key6:$key7:$key8 $yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}{$key6}{$key7}{$key8}\n";
							}
							#print "value: $key1:$key2:$key3:$key4:$key5:$key6:$key7:$key8 $yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}{$key6}{$key7}{$key8}\n";
                                                        }
						    }
                                                } else {
						my $value = "$key1:$key2:$key3:$key4:$key5:$key6:$key7 $yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}{$key6}{$key7}";
						if ( $value =~ /$pattern/ ) {
						    $match++;
						    $match_value = "$key1:$key2:$key3:$key4:$key5:$key6:$key7:$yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}{$key6}{$key7}";
                                                    #print "value: $key1:$key2:$key3:$key4:$key5:$key6:$key7 $yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}{$key6}{$key7}\n";
						}
						#print "value: $key1:$key2:$key3:$key4:$key5:$key6:$key7 $yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}{$key6}{$key7}\n";
                                                }
                                             }
                                         } else {
					 my $value = "$key1:$key2:$key3:$key4:$key5:$key6 $yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}{$key6}";
					 if ( $value =~ /$pattern/ ) {
					     $match++;
					     $match_value = "$key1:$key2:$key3:$key4:$key5:$key6:$yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}{$key6}";
                                             #print "value: $key1:$key2:$key3:$key4:$key5:$key6 $yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}{$key6}\n";
					 }
					 #print "value: $key1:$key2:$key3:$key4:$key5:$key6 $yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}{$key6}\n";
                                         }
                                      }
                                  } else {
				  my $value = "$key1:$key2:$key3:$key4:$key5 $yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}";
				  if ( $value =~ /$pattern/ ) {
				      $match++;
				      $match_value = "$key1:$key2:$key3:$key4:$key5:$yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}";
                                      #print "value: $key1:$key2:$key3:$key4:$key5 $yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}\n";
				  }
				  #print "value: $key1:$key2:$key3:$key4:$key5 $yml_hash->{$key1}{$key2}{$key3}{$key4}{$key5}\n";
                                  }
                               }
                           } else {
			   my $value = "$key1:$key2:$key3:$key4 $yml_hash->{$key1}{$key2}{$key3}{$key4}";
			   if ( $value =~ /$pattern/ ) {
			       $match++;
			       $match_value = "$key1:$key2:$key3:$key4:$yml_hash->{$key1}{$key2}{$key3}{$key4}";
                               #print "value: $key1:$key2:$key3:$key4 $yml_hash->{$key1}{$key2}{$key3}{$key4}\n";
			   }
			   #print "value: $key1:$key2:$key3:$key4 $yml_hash->{$key1}{$key2}{$key3}{$key4}\n";
                           }
                        }
                    } else {
		    my $value = "$key1:$key2:$key3 $yml_hash->{$key1}{$key2}{$key3}";
		    if ( $value =~ /$pattern/ ) {
			$match++;
			$match_value = "$key1:$key2:$key3:$yml_hash->{$key1}{$key2}{$key3}";
                        #print "value: $key1:$key2:$key3 $yml_hash->{$key1}{$key2}{$key3}\n";
		    }
		    #print "value: $key1:$key2:$key3 $yml_hash->{$key1}{$key2}{$key3}\n";
                    }
                }
            } else {
	    my $value = "$key1:$key2 $yml_hash->{$key1}{$key2}";
	    if ( $value =~ /$pattern/ ) {
		$match++;
		$match_value = "$key1:$key2:$yml_hash->{$key1}{$key2}";
                #print "value: $key1:$key2 $yml_hash->{$key1}{$key2}\n";
	    }
	    #print "value: $key1:$key2 $yml_hash->{$key1}{$key2}\n";
            }
        }
    } else {
    my $value = "$key1 $yml_hash->{$key1}";
    if ( $value =~ /$pattern/ ) {
	$match++;
	$match_value = "$key1:$yml_hash->{$key1}";
        #print "value: $key1 $yml_hash->{$key1}\n";
    }
    #print "value: $key1 $yml_hash->{$key1}\n";
    }
}

print "Match: $match\n";

return $match;
return $match_value;
}