From 7c621b48031a843453cdada987145d041cdb81ab Mon Sep 17 00:00:00 2001
From: Vincent Danjean <Vincent.Danjean@ens-lyon.org>
Date: Thu, 23 Mar 2006 17:31:57 +0000
Subject: [PATCH] Youhou! Ca tourne en quanto anova 1 facteur

git-svn-id: svn+ssh://imag/users/huron/danjean/svnroot/claire/altree/trunk@150 cf695345-040a-0410-a956-b889e835fe2e
---
 altree | 140 ++++++++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 109 insertions(+), 31 deletions(-)

diff --git a/altree b/altree
index 3a467a2..fa0f092 100755
--- a/altree
+++ b/altree
@@ -449,11 +449,11 @@ sub FillQuanti
 	my $moy=Moyenne($present_node->{"quanti"});
 	$present_node->{"moyenne"}=$moy;
 	
-	print STDERR $present_node->{"id"}, " " ;
-	for (my $i=0; $i< scalar (@{$present_node->{"quanti"}}); $i++) {
-	    print STDERR $present_node->{"quanti"}->[$i]->[0], " (" ,$present_node->{"quanti"}->[$i]->[1], ") ";
-	}
-	print STDERR "\n";
+#DEBUG	print STDERR $present_node->{"id"}, " " ;
+#DEBUG	for (my $i=0; $i< scalar (@{$present_node->{"quanti"}}); $i++) {
+#DEBUG	    print STDERR $present_node->{"quanti"}->[$i]->[0], " (" ,$present_node->{"quanti"}->[$i]->[1], ") ";
+#DEBUG	}
+#DEBUG	print STDERR "\n";
     } else {
 	my($child);
 	for $child ($present_node->GetChildrenList()) { 
@@ -463,11 +463,11 @@ sub FillQuanti
 	my $moy=Moyenne($present_node->{"quanti"});
 	$present_node->{"moyenne"}=$moy;
 	
-	print STDERR $present_node->{"id"}, " " ;
-	for (my $i=0; $i< scalar (@{$present_node->{"quanti"}}); $i++) {
-	    print STDERR $present_node->{"quanti"}->[$i]->[0], " (" ,$present_node->{"quanti"}->[$i]->[1], ") ";
-	}
-	print STDERR "\n";
+#DEBUG	print STDERR $present_node->{"id"}, " " ;
+#DEBUG	for (my $i=0; $i< scalar (@{$present_node->{"quanti"}}); $i++) {
+#DEBUG	    print STDERR $present_node->{"quanti"}->[$i]->[0], " (" ,$present_node->{"quanti"}->[$i]->[1], ") ";
+#DEBUG	}
+#DEBUG	print STDERR "\n";
     }
     
 }
@@ -1094,11 +1094,11 @@ sub Correspond2ResamplingQuanti
 	    push (@valeurs_tot, $valeurs->[0]);
 	}
     }
-#DEBUG    print STDERR" TOUTES VAL: ";
-#DEBUG    foreach my $val (@valeurs_tot) {
+#DEBUG  print STDERR" TOUTES VAL:\n";
+#DEBUG  foreach my $val (@valeurs_tot) {
 #DEBUG	print STDERR $val, " " ;
 #DEBUG	}
-#DEBUG    print STDERR"\n";
+#DEBUG  print STDERR"\n";
 #DEBUG    print STDERR " NB_VAL_PER_HAPLO ";
 #DEBUG    foreach $haploID (keys %{$nbval_per_haplo}) {
 #DEBUG	print STDERR $haploID, " " ,$nbval_per_haplo->{$haploID}, "\n";
@@ -1117,25 +1117,106 @@ sub ResamplingQuanti
 	for (my $i=0; $i<$nbval_per_haplo->{$haploID}; $i++) {
 	    my $nb= scalar (@{$valeurs_tot});
 	    my $alea = int(rand($nb)); # Je récupère bien un nb entre 0 et le dernier élément du tab
-	    print STDERR $alea , " ";
+	#DEBUG    print STDERR "ALEA$haploID ", $alea , " ";
 	    $new_correspondance->{$haploID}->[$i]->[0]=$valeurs_tot->[$alea];
 	    $new_correspondance->{$haploID}->[$i]->[1]=$num_haplo;
-	    delete($valeurs_tot->[$alea]);
+	    splice(@{$valeurs_tot}, $alea, 1);
 	}
     }
-    print "\n TEST\n";
+#DEBUG    print "\n TEST\n";
     
-    foreach my $haploID (keys(%{$new_correspondance})) {
-	print STDERR $haploID , " " ;
-	for (my $i=0; $i<scalar(@{$new_correspondance->{$haploID}}); $i++) {
-	    print STDERR $new_correspondance->{$haploID}->[$i]->[0], " "; 
+#DEBUG    foreach my $haploID (keys(%{$new_correspondance})) {
+#DEBUG	print STDERR $haploID , " " ;
+#DEBUG	for (my $i=0; $i<scalar(@{$new_correspondance->{$haploID}}); $i++) {
+#DEBUG	    print STDERR $new_correspondance->{$haploID}->[$i]->[0], " "; 
+#DEBUG	}
+#DEBUG	print STDERR "\n";
+#DEBUG    }
+    return ($new_correspondance);
+
+}
+sub StockeQuanti
+
+{
+    my($ligne_chi2)=shift;
+    my $racine=shift;
+    my $test_res;
+    foreach $test_res (@{$racine->{"res_test"}}) {
+	# Si on n'a qu'une seule branche, la p-value n'est pas définie
+	if ($test_res->{"nb_facteurs"} > 1) {
+	    push @{$ligne_chi2}, $test_res->{"F"};
 	}
-	print STDERR "\n";
     }
-    return ($new_correspondance);
+    # Fill a 2*n table: each line containig chi2 and each columns
+    # corresponding to one repetition
+    #push (@{$table_of_line}, \@ligne_chi2);
+}
 
+
+sub AssociationQuanti 
+{
+    my($racine)=shift;
+    my($correspondance)=shift;
+    my($prolonge)=shift;
+    my($sign_util)=shift;
+    my($valeur_tot, $nbval_per_haplo, $new_correspondance);
+    ($valeur_tot, $nbval_per_haplo)=Correspond2ResamplingQuanti($correspondance);
+    ($new_correspondance)=ResamplingQuanti($valeur_tot, $nbval_per_haplo);
+
+    # DEBUG  my($haploID);
+    #foreach $haploID (keys %{$new_correspondance}) {
+    #	print "Haplo: $haploID mal= ",$new_correspondance->{$haploID}->{"case"}, " tem=", $new_correspondance->{$haploID}->{"control"},"\n";
+    #}  
+    #print "\n";
+    
+    FillQuanti($racine,$new_correspondance);
+    ParcoursQuanti($racine->{"children"}, $prolonge, 
+			       SplitMode::NOSPLIT, $racine, $sign_util);
+} 
+
+sub RepeatAssociationQuanti
+{
+    my($tree)=shift;
+    my($correspondance)=shift;
+    my($prolonge)=shift;
+    my($nb_permutation)= shift;
+    my($sign_util)=shift;
+
+    my($racine)=$tree->GetRoot();
+
+    my($ligne_F)=[]; 
+    print "\n Number of permutation: $nb_permutation\n";
+    
+    my($value_per_line, $test_res);
+    foreach $test_res (@{$racine->{"res_test"}}) {
+	# Si on n'a qu'une seule branche, la p-value n'est pas définie
+	if ($test_res->{"nb_facteurs"} > 1) {
+	    $value_per_line++;
+	}
+    }
+
+    # !!! Est_ce que ça serait bien de passer value_per_mine en parametre de stocke_chi2 et de vérifier qu'on a bien le bon nb de valeur par ligne? !!!
+
+    
+    StockeQuanti($ligne_F, $racine); # F values corresponding to the real data are put to @{$ligne_F}
+    my($i, $j);
+    for ($i=0; $i<$nb_permutation; $i++) {
+	CleanQuanti($tree);
+	CleanChi2($tree); #marche aussi pour le F 
+	AssociationQuanti($racine, $correspondance, $prolonge, $sign_util);
+	StockeQuanti($ligne_F, $racine);
+    }
+    
+#DEBUG    for (my($i)=0; $i<scalar @{$ligne_F}; $i++) {
+#DEBUG	print STDERR $ligne_F->[$i], " ";
+#DEBUG	print "TOTO\n";
+#DEBUG    }
+
+    return($value_per_line, $ligne_F);
 }
 
+
+
 ##########################################################
 ################# LOCALISATION ###########################
 ##########################################################
@@ -1815,23 +1896,20 @@ sub main
 		    AffichageArbre($racine, \&InfosQuantiNoperm);
 		}
 	    } elsif ($permutation>0) {
+		my($value_per_line, $ligne_test);
 		if ($dataqual == DataQual::QUALI) {
 		    AffichageArbre($racine, \&AssociationInfos);
-		    my($value_per_line, $ligne_chi2);
-		    ($value_per_line, $ligne_chi2)=RepeatAssociation
+		    ($value_per_line, $ligne_test)=RepeatAssociation
 		  ($tree, $correspondance, $prolonge,$permutation, $sign_util);
 		} else {
 		    AffichageArbre($racine, \&InfosQuanti);
-		    my ($valeurs_tot, $nbval_per_haplo);
-		    ($valeurs_tot, $nbval_per_haplo)=Correspond2ResamplingQuanti ($correspondance);
-		    ResamplingQuanti($valeurs_tot, $nbval_per_haplo);
+		    ($value_per_line, $ligne_test)=RepeatAssociationQuanti
+		  ($tree, $correspondance, $prolonge,$permutation, $sign_util);
 		    }
-		my($value_per_line, $ligne_chi2); # TODO A modifier
-		
 		my($corrected_values);
 		$corrected_values=ALTree::CUtils::double_permutation
-		    ($permutation+1, $value_per_line, $ligne_chi2);
-		
+		    ($permutation+1, $value_per_line, $ligne_test);
+#DEBUG		print STDERR "perm= $permutation, val= $value_per_line, ligne= $ligne_test, corr=$corrected_values\n";
 		print "\n";
 		print "p_val for each level:\n";
 		my($i);
-- 
GitLab