!###############################################################################
!                                                                              #
!         CCCCCC  SSSSSS  IIIII  RRRRRR   OOOO          L      IIIII           #
!         C       S         I    R    R  O    O         L        I             #
!         C       SSSSSS    I    RRRRRR  O    O  =====  L        I             #
!         C            S    I    R RR    O    O         L        I             #
!         CCCCCC  SSSSSS  IIIII  R   RR   OOOO          LLLLL  IIIII           #
!                                                                              #
!         Queensland Bioscience Institute                                      #
!         306 Carmody Road                                                     #
!         St Lucia, QLD 4067                                                   #
!         AUSTRALIA                                                            #
!         Ph. (07) 3214 2392                                                   #
!         Fx. (07) 3214 2900                                                   #
!                                                                              #
!         Objective:      Permut the xyz coordinates for 12 organs             #
!         Author:         Toni Reverter (Tony.Reverter-Gomez@csiro.au)         #
!         Last Revision:  November 2004                                        #
!                                                                              #
!###############################################################################

PROGRAM permut

IMPLICIT NONE

INTEGER, PARAMETER :: nt = 12,       & ! Number of tissues
                      nd =  3,       & ! Number of dimensions
                      rounds = 100000  ! Number of iterations

INTEGER :: i,j,k,iter,pick,found(nt),dt(8)
CHARACTER(LEN=10) :: organ(nt), Porgan(nt),date,time,zone
REAL :: u, dist, mdist, &
        Nthreshold,     & ! Distance threshold for Normal against Visual
        Cthreshold,     & ! Distance threshold for Cancer against Visual
        NProb,          & ! Probability for Normal against Visual
        CProb             ! Probability for Cancer against Visual

REAL :: Vcoord(nt,nd), & ! xyz coordinates for the Visual human
        Ncoord(nt,nd), & ! xyz coordinates for the Normal human
        Ccoord(nt,nd), & ! xyz coordinates for the Cancer human
        Pcoord(nt,nd)    ! xyz coordinates for the Permuted human

!############################################################################

!###################
! Define coordinates
!###################

organ( 1)="Brain     "
organ( 2)="Retina    "
organ( 3)="Spinal    "
organ( 4)="Heart     "
organ( 5)="Thyroid   "
organ( 6)="Prostate  "
organ( 7)="Liver     "
organ( 8)="Lung      "
organ( 9)="Stomach   "
organ(10)="Kidney    "
organ(11)="Pancreas  "
organ(12)="Colon     "

Vcoord( 1,1)=-0.23501; Vcoord( 1,2)= 1.48011; Vcoord( 1,3)=-0.92301
Vcoord( 2,1)=-0.15101; Vcoord( 2,2)= 1.42561; Vcoord( 2,3)=-1.19865
Vcoord( 3,1)=-0.98480; Vcoord( 3,2)= 1.45067; Vcoord( 3,3)= 1.48487
Vcoord( 4,1)= 0.95690; Vcoord( 4,2)=-0.20214; Vcoord( 4,3)= 0.03758
Vcoord( 5,1)= 0.39504; Vcoord( 5,2)= 0.65444; Vcoord( 5,3)= 0.20600
Vcoord( 6,1)=-2.40108; Vcoord( 6,2)=-1.24321; Vcoord( 6,3)=-1.13930
Vcoord( 7,1)= 1.30564; Vcoord( 7,2)=-0.82269; Vcoord( 7,3)=-1.60043
Vcoord( 8,1)= 0.91660; Vcoord( 8,2)= 0.04441; Vcoord( 8,3)= 0.24036
Vcoord( 9,1)= 0.46454; Vcoord( 9,2)=-0.53634; Vcoord( 9,3)= 1.12142
Vcoord(10,1)=-0.23135; Vcoord(10,2)=-0.73816; Vcoord(10,3)= 0.73053
Vcoord(11,1)= 0.36985; Vcoord(11,2)=-0.72222; Vcoord(11,3)= 0.19418
Vcoord(12,1)=-0.40534; Vcoord(12,2)=-0.79046; Vcoord(12,3)= 0.84645

Ncoord( 1,1)=-0.14787; Ncoord( 1,2)= 1.63137; Ncoord( 1,3)=-1.19958
Ncoord( 2,1)=-0.50593; Ncoord( 2,2)= 1.45971; Ncoord( 2,3)=-0.14700
Ncoord( 3,1)=-0.80931; Ncoord( 3,2)= 1.03765; Ncoord( 3,3)=-0.70650
Ncoord( 4,1)=-1.20314; Ncoord( 4,2)=-0.38415; Ncoord( 4,3)= 0.37156
Ncoord( 5,1)=-1.19316; Ncoord( 5,2)=-0.49823; Ncoord( 5,3)= 1.17760
Ncoord( 6,1)=-0.83098; Ncoord( 6,2)=-1.39738; Ncoord( 6,3)=-0.77109
Ncoord( 7,1)=-0.06601; Ncoord( 7,2)= 0.01458; Ncoord( 7,3)= 1.55287
Ncoord( 8,1)=-0.18812; Ncoord( 8,2)=-1.56723; Ncoord( 8,3)=-1.17092
Ncoord( 9,1)= 0.81521; Ncoord( 9,2)= 0.28319; Ncoord( 9,3)= 1.36227
Ncoord(10,1)= 1.12408; Ncoord(10,2)= 0.08164; Ncoord(10,3)= 0.59354
Ncoord(11,1)= 1.39788; Ncoord(11,2)=-0.22852; Ncoord(11,3)=-0.95895
Ncoord(12,1)= 1.60735; Ncoord(12,2)=-0.43263; Ncoord(12,3)=-0.10379

Ccoord( 1,1)=-0.32523; Ccoord( 1,2)= 1.33988; Ccoord( 1,3)=-0.75547
Ccoord( 2,1)= 1.14042; Ccoord( 2,2)= 1.01933; Ccoord( 2,3)=-0.88480
Ccoord( 3,1)= 0.42334; Ccoord( 3,2)= 1.09754; Ccoord( 3,3)=-0.47714
Ccoord( 4,1)=-1.14836; Ccoord( 4,2)= 0.77966; Ccoord( 4,3)= 0.46228
Ccoord( 5,1)=-0.36707; Ccoord( 5,2)= 0.97532; Ccoord( 5,3)= 0.94816
Ccoord( 6,1)=-1.07255; Ccoord( 6,2)=-0.83913; Ccoord( 6,3)=-1.03467
Ccoord( 7,1)= 2.07913; Ccoord( 7,2)=-0.11686; Ccoord( 7,3)= 0.34343
Ccoord( 8,1)=-0.22001; Ccoord( 8,2)=-0.74904; Ccoord( 8,3)= 1.24134
Ccoord( 9,1)=-0.34594; Ccoord( 9,2)=-0.21915; Ccoord( 9,3)= 1.96492
Ccoord(10,1)=-1.26104; Ccoord(10,2)=-0.53464; Ccoord(10,3)=-0.95559
Ccoord(11,1)= 0.80114; Ccoord(11,2)=-1.37586; Ccoord(11,3)= 0.04238
Ccoord(12,1)= 0.29616; Ccoord(12,2)=-1.37705; Ccoord(12,3)=-0.89485

!################################
! Compute Within Tissue Distances
!################################

mdist = 0.0
DO i = 1, nt
   mdist = mdist + dist(Vcoord(i,:),Ncoord(i,:),nd)
ENDDO
mdist = mdist/(nt)
WRITE(*,*)'Within tissue: Visual to Normal',mdist
Nthreshold = mdist

mdist = 0.0
DO i = 1, nt
   mdist = mdist + dist(Vcoord(i,:),Ccoord(i,:),nd)
ENDDO
mdist = mdist/(nt)
WRITE(*,*)'Within tissue: Visual to Cancer',mdist
Cthreshold = mdist

!################################################
! Compute Across Tissue Distances
! NB: Only to test that they should be equivalent
!     to the average of all permutation
!################################################

mdist = 0.0
DO i = 1, nt
   DO j = 1, nt
      mdist = mdist + dist(Vcoord(i,:),Ncoord(j,:),nd)
   ENDDO
ENDDO
mdist = mdist/(nt*nt)
WRITE(*,*)'Across tissue: Visual to Normal',mdist

mdist = 0.0
DO i = 1, nt
   DO j = 1, nt
      mdist = mdist + dist(Vcoord(i,:),Ccoord(j,:),nd)
   ENDDO
ENDDO
mdist = mdist/(nt*nt)
WRITE(*,*)'Across tissue: Visual to Cancer',mdist

!###################
! Permut Coordinates
!###################

CALL date_and_time(date,time,zone,dt)
CALL RANDOM_SEED(PUT=dt(7:8))
CALL RANDOM_NUMBER(u)

! Permut Normal Coordinates 
!##########################
NProb = 0.0
DO iter = 1, rounds
   porgan = "          "
   Pcoord = 0.0
   found = 0
   DO i = 1,nt
      DO
         CALL RANDOM_NUMBER(u)
         pick = INT(u*nt)+1
         IF( found(pick) .EQ. 0 )THEN
            Porgan(i) = organ(pick)
            Pcoord(i,:) = Ncoord(pick,:)
            found(pick) = 1
            EXIT
         ENDIF
      ENDDO
   ENDDO
   mdist = 0.0
   DO i = 1, nt
      mdist = mdist + dist(Vcoord(i,:),Pcoord(i,:),nd)
   ENDDO
   mdist = mdist/(nt)
!  WRITE(*,*)'Within tissue: Visual to Permuted from Normal',mdist
!  WRITE(33,*)'Permuted Normal',mdist
   IF( mdist < Nthreshold )NProb = NProb + 1.0
ENDDO
Nprob = NProb/rounds

! Permut Cancer Coordinates
!##########################
CProb = 0.0
DO iter = 1, rounds
   porgan = "          "
   Pcoord = 0.0
   found = 0
   DO i = 1,nt
      DO
         CALL RANDOM_NUMBER(u)
         pick = INT(u*nt)+1
         IF( found(pick) .EQ. 0 )THEN
            Porgan(i) = organ(pick)
            Pcoord(i,:) = Ccoord(pick,:)
            found(pick) = 1
            EXIT
         ENDIF
      ENDDO
   ENDDO
   mdist = 0.0
   DO i = 1, nt
      mdist = mdist + dist(Vcoord(i,:),Pcoord(i,:),nd)
   ENDDO
   mdist = mdist/(nt)
!  WRITE(*,*)'Within tissue: Visual to Permuted from Normal',mdist
!  WRITE(33,*)'Permuted Cancer',mdist
   IF( mdist < Cthreshold )CProb = CProb + 1.0
ENDDO
Cprob = CProb/rounds

WRITE(*,*)
WRITE(*,*)
WRITE(*,*)'Permutation Probabilities (from',rounds,' permutations)'
WRITE(*,*)'=-=-=-=-=-=-=-=-=-=-=-=-='
WRITE(*,*)'Probability of getting coordinates so close'
WRITE(*,*)'to the Visual Human simply at random'
WRITE(*,*)
WRITE(*,*)'Gene Expression from Normal =',NProb*100.,' %'
WRITE(*,*)'Gene Expression from Cancer =',CProb*100.,' %'
WRITE(*,*)

END PROGRAM permut
!#########################################################################
!#########################################################################
! Compute the distance between 2 points
! in an n-dimensional coordinate system
!#######################################
FUNCTION dist(x,y,n) RESULT(f_val)
IMPLICIT NONE

INTEGER, INTENT(IN) :: n
REAL, INTENT(IN) :: x(n),y(n)
REAL :: f_val
INTEGER :: i,j

f_val= 0.0
DO i = 1, n
   f_val = f_val + (x(i)-y(i))**2
ENDDO
f_val = sqrt(f_val)

END FUNCTION dist

