#! /bin/sh
#!perl -w # --*- Perl -*--

eval 'exec perl -x $0 ${1+"$@"}'
    if 0;

use strict;

## print "La\n";
my $charged_elements=[]; # charged
my $elements=[]; # uncharged
my %record_data_by_symbol;
while( <> ) {
    ## print "$_";
    chomp( $_ );
    my($cif_file, $element, $a1, $a2, $a3, $a4, 
       $b1, $b2, $b3, $b4, $c1, $source) = split("\t", $_);
    my @data = ($cif_file, $element, $a1, $a2, $a3, $a4, 
                $b1, $b2, $b3, $b4, $c1, $source);
    ## print "$cif_file $element, $a1, $a2, $a3, $a4, $b1, ".
    ## "$b2, $b3, $b4, $c1, $source\n";
    my $carged_element;
    if( $element=~ /^[A-Za-z]+$/) { # without charge f.e. O,K, Zn
        unless( compare_symbol( $elements, $element ) ) { # first
# case; put unical element symbol(Zn, Zn2+, ..) to array and creating hash which 
# contains Cromer Mann coefficients and other information related with element 
# symbol;
            push( @{$elements}, $element );
            $record_data_by_symbol{$element} = [\@data];           
        } elsif( compare_symbol( $elements, $element ) ) {
# adding new cases;
            push( @{$record_data_by_symbol{$element}}, \@data );
        }
        ## print "$element\n";
    } elsif( $element=~ /^[A-Za-z]+[\+\-]\d/ ) { # f.e. Ca+2        
        ## print "$element\n";
        $element=~ /^([A-Za-z]+)([\+\-])(\d)/;
        $carged_element = $1.$3.$2;
        unless( compare_symbol( $charged_elements, $carged_element ) ) { 
            # element, number, charge;
            push( @{$charged_elements}, $carged_element ); 
            $record_data_by_symbol{$carged_element} = [\@data];
        } elsif( compare_symbol( $charged_elements, $carged_element ) ) {
            push( @{$record_data_by_symbol{$carged_element}}, \@data );
        }
        
    } elsif( $element=~ /^[A-Za-z]+\d[\+\-]/ ) { # f.e. Ca2+
        
        $element=~ /^([A-Za-z]+)(\d)([\+\-])/;
        $carged_element = $1.$2.$3;
        unless( compare_symbol( $charged_elements, $carged_element ) ) {
            push( @{$charged_elements}, $carged_element );
            $record_data_by_symbol{$carged_element} = [\@data];
        } elsif( compare_symbol( $charged_elements, $carged_element ) ) {
            push( @{$record_data_by_symbol{$carged_element}}, \@data );
        }
        
    } elsif( $element=~ /^[A-Za-z]+\d[p,m]/ ) { # f.e. Cap2

        $element=~ /^([A-Za-z]+)(\d)([p,m])/;
        if( $3 eq "p" ) {           
            $carged_element = $1.$2."+";
            unless( compare_symbol( $charged_elements, $carged_element ) ) {
                push( @{$charged_elements}, $carged_element );
                $record_data_by_symbol{$carged_element} = [\@data];
            } elsif( compare_symbol( $charged_elements, $carged_element ) ) {
                push( @{$record_data_by_symbol{$carged_element}}, \@data );
            }
            ## print "$1.$2."+"\n";          
        } elsif( $3 eq "m") {
            $carged_element = $1.$2."-";
            unless( compare_symbol( $charged_elements, $carged_element ) ) {
                push( @{$charged_elements}, $carged_element );
                $record_data_by_symbol{$carged_element} = [\@data];
            } elsif( compare_symbol( $charged_elements, $carged_element ) ) {
                push( @{$record_data_by_symbol{$carged_element}}, \@data );
            }            
            ## print "yra\n";
        }
        
    } elsif( $element=~ /^[A-Za-z]+[p,m]\d/ && 
             $element !~ /^(Np|Pm|Sm|Tm|AM|Cm|Fm)/) { # f.e. Ca2p
        
        $element=~ /^([A-Za-z]+)([p,m])(\d)/;     
        if( $2 eq "p" ) {
            $carged_element = $1.$3."+";
            unless( compare_symbol( $charged_elements, $carged_element ) ) {
                push( @{$charged_elements}, $carged_element );
                $record_data_by_symbol{$carged_element} = [\@data];
            } elsif( compare_symbol( $charged_elements, $carged_element ) ) {
                push( @{$record_data_by_symbol{$carged_element}}, \@data );
            }  
            ##  print "$1$3+\n";
            ##  print "$element\n"
        } elsif( $2 eq "m") {
            $carged_element = $1.$3."-";
            unless( compare_symbol( $charged_elements, $carged_element ) ) {
                push( @{$charged_elements}, $carged_element );
                $record_data_by_symbol{$carged_element} = [\@data];
                ## print "$1$3-\n";
            } elsif( compare_symbol( $charged_elements, $carged_element ) ) {
                push( @{$record_data_by_symbol{$carged_element}}, \@data );
            } 
        }
        
    } else { # other cases
        print "Unknown symbol $element: CIF $cif_file\n";
    }
    
}

# adding carged elements names to $elements;
push( @{$elements}, @{$charged_elements} );
print "These symbols were detected: @{$elements} \n";
print "Total number of elements:  $#{$elements} \n";
print "======================================================================\n";
print "\n";


foreach my $key (keys %record_data_by_symbol) {
    
    my @CM_of_element_synonyms; # 
    my $symbol = $key;
    print "Cromer Mann coefficients of $key element \n";
    print "Total  number of ".($#{$record_data_by_symbol{$key}} + 1),"\n";
    foreach (@{$record_data_by_symbol{$key}}) {
        
        if(!defined $CM_of_element_synonyms[0]) {
            push( @CM_of_element_synonyms, $_ ); # adding first element in
            # array which contains unical Crommer Mann coefficients coefficients; 
            ## print "C @{$_}\n";
        } else {
            
            my $finish = $#CM_of_element_synonyms; 
            my $new_addtion_flag = 1;
            for my $k (0..$finish) { # comparison of every new element with elements 
                # of @CM_of_element_synonyms against Cromer Mann coef., if unical 
                # case, then adding to @CM_of_element_synonyms;
                ## print "Sablonas @{$CM_of_element_synonyms[$k]}\n";
                my $condition = 1; # if CM_of_element_synonyms contains yet element,
                # then $condition = 1 after for loop;
                for my $i (2..10) {
                    $condition = $condition && 
                        ((sprintf "%.4f", $CM_of_element_synonyms[$k]->[$i]) == 
                     (sprintf "%.4f", $_->[$i]));
                    ## print "salyga $condition\n";
                }
                
                if( $condition ) { # and if (1) then flag is False;
                    $new_addtion_flag = $new_addtion_flag && 0;                    
                    last;
                    ## print "pagavau\n";
                    
                } 
                
            } # end for k
            push( @CM_of_element_synonyms, $_ ) 
                if( $new_addtion_flag );
            ## print "Kiek ideta $#CM_of_element_synonyms \n";
        }
    } # end foreach data;
    #----------------------------------------------------------------------------
    # @CM_of_element_synonyms contains 
    # the cases of Crommer Mann coefficients synonyms of symbol.
    
    # frequency;
    my $total = $#{$record_data_by_symbol{$key}} + 1;
    ## print "$#CM_of_element_synonyms + 1\n";
    # unical 
    for my $unical_element_i (0..$#CM_of_element_synonyms) {
        ## print "$unical_element_i\n";
        my $unical_element_CM = 
            $CM_of_element_synonyms[$unical_element_i];
        # comparison of found unical CM coefficeints for element and all
        # CM coef. of element;
        my $frequency = 0;
        foreach my $all_cases_of_element (@{$record_data_by_symbol{$key}}) {
            my $condition = 1;
            for my $i (2..10) {
                $condition = $condition && 
                    ((sprintf "%.4f", $unical_element_CM->[$i]) == 
                     (sprintf "%.4f", $all_cases_of_element->[$i]));
                ## print "salyga $condition\n";
            }
            if( $condition ) {
                $frequency++;
            }
        }
        printf "Total: $frequency Frequency: %.4f Example: ", $frequency/$total;
        print "@{$unical_element_CM}\n";
        
    } # for end unical;
    print "=================================================================\n";
    print "\n";
}

    

#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
# Field of function;
#---------------------------------------------------------------------------
# Function for checking of elements in array
# Parameters: compare_symbol( \to_array, atom_elements )
# Return: 1 if array contains this element
#         0 if array does not contain 
sub compare_symbol {
    my( $reference_to_array, $template ) = @_;
    foreach my $symbol ( @{$reference_to_array} ) {
        return 1 if( $symbol eq $template ); 
    }
    return 0;
}
