How human-derived brain organoids are built differently from brain organoids derived from genetically-close relatives: a multi-scale hypothesis.
Paper
Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
Fortran · 857 lines · 19 KB · CC-BY-4.0
- ! Author: Sarthak Gupta
- ! Contact : [email hidden]
- ! This code takes equillibrated system
- ! Chromatin+Shell+Linkages+Crosslinkers
- ! and compress the system with parallel plates
- ! at tunable compression rates and strains
- ! Algorithim for compression
- ! 1) Read the coordinates from the files
- ! 2) Set the boundaries at the top most and bottom most particle
- ! 3)
- module combination
- implicit none
- integer,parameter :: NC=5000 ! No. of monomers in the polymer
- integer,parameter :: N_S=5000*2 ! No. of monomers in the shell
- integer,parameter :: Total=NC+N_S
- !integer,parameter :: NL=250 ! No. of Linkages
- !integer,parameter :: Num_C=2500 ! No. of Linkages
- Real*8,allocatable,dimension(:) :: R_O_Chromatin
- integer,allocatable,dimension(:) :: E1_CH,E2_CH
- Real*8,dimension(Total) :: X,Y,Z
- Real*8,dimension(Total) :: FX,FY,FZ
- Integer,dimension(Total,Total) :: Flag_Ignore
- integer :: N,NSE
- integer,allocatable,dimension(:) :: E1,E2
- integer,allocatable,dimension(:) :: E1_new,E2_new
- real*8,allocatable,dimension(:) :: R_O
- integer :: iset,seed,Total_Step,interval,step
- Real*8 :: del,mu,Diff
- Real*8 :: Temp_Seed,rrr
- Real*8 :: K_connect,sigma,Eq_length,K_Soft,sigma_Shell
- integer, parameter :: L=60 ! Length of one side cube box
- Real*8 :: Cell_Length,XCELL,YCELL,ZCELL
- integer :: NXCELL,NYCELL,NZCELL
- integer :: NCELL
- integer,dimension(:,:),allocatable :: neigh
- integer,dimension(:),allocatable :: HOC,LLIST
- integer :: HBOX
- Real*8 :: Upper_Plate_Ini,Upper_Plate_Final
- Real*8 :: Lower_Plate_Ini,Lower_Plate_Final
- Real*8 :: Upper_Plate_Move,Lower_Plate_Move
- Real*8 :: V_compress
- Real*8,dimension(Total) :: Fz_Compress_UP,Fz_Compress_Lower
- Real*8 :: Strain_rate,time
- integer :: NL,Num_C,F_M,Ens
- Character*20 :: NL_Ch,Num_C_Ch,F_M_Ch, Ens_Ch
- Character*50 :: filename1,filename2,filename3,filename4
- Character*50 :: filename5,filename6,filename7,filename8
- character(len=20), dimension(:), allocatable :: args
- integer :: num_args
- integer :: TC,NF
- Real*8 :: Strain,PIE,Energy_Shell,Energy_Chromatin,Energy_Linkage,Energy_CrossLinker,Energy_System
- Real*8 :: Plate_Diff_Ini
- end module combination
- program join
- use combination
- implicit none
- integer :: I,J
- real*8, external :: gauss
- real*8 :: ran2
- num_args = command_argument_count()
- allocate(args(num_args))
- do i = 1, num_args
- call get_command_argument(i,args(i))
- end do
- READ(args(1),*)NL
- READ(args(2),*)Num_C
- READ(args(3),*)Ens !then, convert them to REALs
- allocate(R_O_Chromatin(NL+Num_C),E1_CH(NL+Num_C),E2_CH(NL+Num_C))
- Call naming
- Call read_coordinates
- !_________________ Dynamics _________________________!
- !Strain_rate=5.d0/(10**(5)) ! Strain rate
- Strain=-0.20 ! Strain
- Total_Step=10000000
- del=0.0001 ! dt for the system
- mu=1.d0 ! Mobility Constant
- Diff=1.d0 ! Diffusion Constant
- NF=1000 ! Number of frames recorded
- interval=int(Total_Step/NF)
- PIE=4.D0*DATAN(1.D0) !Just pie, you know.
- !time= (5.d0/(10**(6)))/(Strain_rate)
- !TC=nint(time*10)
- ! print*,interval,TC
- !____________________________________________________!
- !________________ Seed ________________________!
- Call init_random_seed()
- Call Random_number(Temp_Seed)
- Seed=-987745878!Temp_Seed*(-10000)
- !____________________________________________________!
- !_________________ Spring ___________________________!
- K_connect=140.d0
- Eq_length=1.d0
- !____________________________________________________!
- !___________Soft_Repulsuion__________________________!
- K_Soft = K_connect*1.d0 ! No leak at this
- sigma =0.43089*2.d0
- sigma_Shell=0.43089*2.d0
- !____________________________________________________!
- !_______________Compression__________________________!
- Upper_Plate_Ini=maxval(Z)
- Lower_Plate_Ini=minval(Z)
- Plate_Diff_Ini=Upper_Plate_Ini-Lower_Plate_Ini
- Upper_Plate_Final=Upper_Plate_Ini + Strain*Plate_Diff_Ini
- Lower_Plate_Final=Lower_Plate_Ini - Strain*Plate_Diff_Ini
- V_compress=(Upper_Plate_Final-Upper_Plate_Ini)/Real(Total_Step)
- !print*,Upper_Plate_Ini,Upper_Plate_Final,Lower_Plate_Ini,Lower_Plate_Final
- !print*,(Upper_Plate_Ini-Upper_Plate_Final)/(Upper_Plate_Ini-Lower_Plate_Ini)
- !print*,(Lower_Plate_Final-Lower_Plate_Ini)/(Upper_Plate_Ini-Lower_Plate_Ini)
- Upper_Plate_Move=Upper_Plate_Ini
- Lower_Plate_Move=Lower_Plate_Ini
- !____________________________________________________!
- !_________________ Cell Linked Listing ___________________!
- Cell_Length=sigma
- XCELL=Cell_Length
- YCELL=Cell_Length
- ZCELL=Cell_Length
- NXCELL=nint(L/Cell_Length)
- NYCELL=NXCELL
- NZCELL=NYCELL
- NCELL=NXCELL*NYCELL*NZCELL
- HBOX=L/2.d0
- !_________________________________________________________!
- allocate(Neigh(0:NCELL-1,0:26))
- Do I=0,NCELL-1
- DO J=0,26
- Neigh(I,J)=0
- END Do
- END DO
- Call Neighbor
- allocate(HOC(0:NCELL-1),LLIST(Total))
- !print*,NCELL,Cell_Length,NXCELL
- !print*, NF,Upper_Plate_Ini,Lower_Plate_Ini,Upper_Plate_Ini-Lower_Plate_Ini
- iset=0 ! Initial flag setting for Gaussian random distribution function
- rrr=gauss(seed,iset) ! Calling function to set the flag
- Do step=1,Total_Step
- Call Sorting
- call Force_Calculation
- call update_position
- Upper_Plate_Move=Upper_Plate_Move + (V_compress)
- Lower_Plate_Move=Lower_Plate_Move - (V_compress)
- If(mod(step,interval)==0) then
- print*,step,Upper_Plate_Move,Lower_Plate_Move,1-((Upper_Plate_Move-Lower_Plate_Move)/(Upper_Plate_Ini-Lower_Plate_Ini))
- call Save_Pos
- end if
- End Do
- End Program join
- !********** finding out neighbours of cell ***********
- Subroutine Neighbor
- use combination
- implicit none
- integer :: icell
- integer :: ix,iy,iz
- integer :: ixx,iyy,izz
- integer :: j2,jcell
- !OPEN (102,file='neigh.dat')
- DO icell = 0,NCELL-1
- iz = int(dble(icell)/dble(NXCELL*NYCELL))
- iy = int(dble(icell-NXCELL*NYCELL*iz)/dble(NXCELL))
- ix = icell-NXCELL*NYCELL*iz-NXCELL*iy
- iz = iz-1 !- to find the neighbour
- iy = iy-1
- ix = ix-1
- DO izz = 0,2 ! neighbour cells form cube with (3*3*3)
- IF (iz .LT. 0) THEN ! 0,2 means 0,1,2
- iz = iz+NZCELL
- END IF
- IF ((iz+izz) .GT. (NZCELL-1)) THEN
- iz = iz-NZCELL
- END IF
- DO iyy = 0,2
- IF (iy .LT. 0) THEN
- iy = iy+NYCELL
- END IF
- IF ((iy+iyy) .GT. (NYCELL-1)) THEN
- iy = iy-NYCELL
- END IF
- DO ixx = 0,2
- IF (ix .LT. 0) THEN
- ix = ix+NXCELL
- END IF
- IF ((ix+ixx) .GT. (NXCELL-1)) THEN
- ix = ix-NXCELL
- END IF
- j2 = ixx+3*iyy+9*izz !bcz unit cell of 3 unit, so in z, pt should be multipd by 3**2 = 9
- jcell = (ix+ixx)+(iy+iyy)*NXCELL+(iz+izz)*NXCELL*NYCELL ! cell number, j2 is cell index
- neigh(icell,j2) = jcell
- ! WRITE(102,*)icell,j2,neigh(icell,j2)
- END DO !-ixx loop
- END DO !-iyy loop
- END DO !-izz loop
- End Do
- return
- end subroutine Neighbor
- !*******distribute the molecules to the cells***********!
- Subroutine Sorting
- use combination
- implicit none
- integer :: i
- integer :: ic
- integer :: icellx,icelly,icellz
- !IF(MOD(STEP,100).EQ.0)THEN
- DO I = 0,NCELL-1
- HOC(I) = 0
- END DO
- DO I = 1,Total
- !RXX(I) = RXX(I) - L*int((RXX(I)-HBOX)/HBOX)
- !RYY(I) = RYY(I) - L*int((RYY(I)-HBOX)/HBOX)
- !RZZ(I) = RZZ(I) - L*int((RZZ(I)-HBOX)/HBOX)
- icellx = int(X(I)/XCELL)!--x-index of cell
- icelly = int(Y(I)/YCELL)!--y-index of cell
- icellz = int(Z(I)/ZCELL)!--z-index of cell
- ic = icellx+icelly*NXCELL+icellz*NXCELL*NYCELL!--index of cell
- LLIST(I) = HOC(ic)
- HOC(ic) = I
- END DO
- !END IF
- return
- end subroutine Sorting
- subroutine Save_pos
- use combination
- implicit none
- integer :: I,J
- Do I=1,total
- Write(1000)X(I),Y(I),Z(I)
- IF(step==Total_Step) Write(2000)X(I),Y(I),Z(I)
- End Do
- return
- end subroutine Save_pos
- subroutine update_position
- use combination
- implicit none
- real*8, external :: gauss
- real*8 :: ran2
- integer :: I
- Do I=1,Total
- x(i)=x(i)+ mu*(FX(I))*del + ((sqrt(2.0*Diff*del))*gauss(seed,iset))
- y(i)=y(i)+ mu*(FY(I))*del + ((sqrt(2.0*Diff*del))*gauss(seed,iset))
- z(i)=z(i)+ mu*(FZ(I))*del + ((sqrt(2.0*Diff*del))*gauss(seed,iset))
- End Do
- return
- end subroutine update_position
- subroutine Force_Calculation
- use combination
- implicit none
- Real*8,dimension(Total) :: Fx_Har,Fy_Har,Fz_Har
- Real*8,dimension(Total) :: Fx_Rep,Fy_Rep,Fz_Rep
- integer :: i,j,Ed1,Ed2
- Real*8 :: xr,yr,zr,dis
- Real*8 :: r,const,ffx,ffy,ffz
- integer :: cellx,celly,cellz
- integer :: js,cell,jcell,M
- Real*8 :: X1,Y1,Z1,X2,Y2,Z2
- Energy_Shell=0.d0
- Energy_Chromatin=0.d0
- Energy_Linkage=0.d0
- Energy_CrossLinker=0.d0
- Do I=1,Total
- FX(I)=0.d0
- FY(I)=0.d0
- FZ(I)=0.d0
- Fx_Har(I)=0.d0
- Fy_Har(I)=0.d0
- Fz_Har(I)=0.d0
- Fz_Compress_UP(I)=0.d0
- Fz_Compress_Lower(I)=0.d0
- Fx_Rep(I)=0.d0
- Fy_Rep(I)=0.d0
- Fz_Rep(I)=0.d0
- End Do
- !___________ Chromatin Spring_______________!
- Do I=1,NC-1
- Ed1=E1_new(I)
- Ed2=E2_new(I)
- !print*,Ed1,Ed2,I
- Flag_Ignore(Ed1,Ed2)=1
- xr=x(Ed1)-x(Ed2)
- yr=y(Ed1)-y(Ed2)
- zr=z(Ed1)-z(Ed2)
- dis=sqrt(xr*xr + yr*yr + zr*zr)
- r=dis-Eq_length
- const=(-1.d0)*(K_Connect/(real(dis)))
- ffx=(const*r)*xr
- ffy=(const*r)*yr
- ffz=(const*r)*zr
- Fx_har(Ed1)=Fx_har(Ed1)+ffx
- Fx_har(Ed2)=Fx_har(Ed2)-ffx
- Fy_har(Ed1)=Fy_har(Ed1)+ffy
- Fy_har(Ed2)=Fy_har(Ed2)-ffy
- Fz_har(Ed1)=Fz_har(Ed1)+ffz
- Fz_har(Ed2)=Fz_har(Ed2)-ffz
- End Do
- !___________________________________________!
- !_________ Shell Spring ____________________!
- Do I=NC-1+1,NC-1+NSE
- Ed1=E1_new(I)
- Ed2=E2_new(I)
- !print*,Ed1,Ed2,I
- Flag_Ignore(Ed1,Ed2)=1
- xr=x(Ed1)-x(Ed2)
- yr=y(Ed1)-y(Ed2)
- zr=z(Ed1)-z(Ed2)
- dis=sqrt(xr*xr + yr*yr + zr*zr)
- r=dis-R_O(I)!r_knot
- const=(-1.d0)*(K_Connect/(real(dis)))
- ffx=(const*r)*xr
- ffy=(const*r)*yr
- ffz=(const*r)*zr
- Fx_har(Ed1)=Fx_har(Ed1)+ffx
- Fx_har(Ed2)=Fx_har(Ed2)-ffx
- Fy_har(Ed1)=Fy_har(Ed1)+ffy
- Fy_har(Ed2)=Fy_har(Ed2)-ffy
- Fz_har(Ed1)=Fz_har(Ed1)+ffz
- Fz_har(Ed2)=Fz_har(Ed2)-ffz
- End Do
- !___________________________________________!
- !_________ Linkage Spring ____________________!
- Do I=1,NL
- Ed1=E1_CH(I)
- Ed2=E2_CH(I)
- !print*,Ed1,Ed2,I
- Flag_Ignore(Ed1,Ed2)=1
- xr=x(Ed1)-x(Ed2)
- yr=y(Ed1)-y(Ed2)
- zr=z(Ed1)-z(Ed2)
- dis=sqrt(xr*xr + yr*yr + zr*zr)
- r=dis-R_O_Chromatin(I)!r_knot
- const=(-1.d0)*(K_Connect/(real(dis)))
- ffx=(const*r)*xr
- ffy=(const*r)*yr
- ffz=(const*r)*zr
- Fx_har(Ed1)=Fx_har(Ed1)+ffx
- Fx_har(Ed2)=Fx_har(Ed2)-ffx
- Fy_har(Ed1)=Fy_har(Ed1)+ffy
- Fy_har(Ed2)=Fy_har(Ed2)-ffy
- Fz_har(Ed1)=Fz_har(Ed1)+ffz
- Fz_har(Ed2)=Fz_har(Ed2)-ffz
- End Do
- !___________________________________________!
- !_________ Cross-Linker Spring ____________________!
- Do I=Nl+1,NL+Num_C
- Ed1=E1_CH(I)
- Ed2=E2_CH(I)
- !print*,Ed1,Ed2,I
- Flag_Ignore(Ed1,Ed2)=1
- xr=x(Ed1)-x(Ed2)
- yr=y(Ed1)-y(Ed2)
- zr=z(Ed1)-z(Ed2)
- dis=sqrt(xr*xr + yr*yr + zr*zr)
- r=dis-R_O_Chromatin(I)!r_knot
- const=(-1.d0)*(K_Connect/(real(dis)))
- ffx=(const*r)*xr
- ffy=(const*r)*yr
- ffz=(const*r)*zr
- Fx_har(Ed1)=Fx_har(Ed1)+ffx
- Fx_har(Ed2)=Fx_har(Ed2)-ffx
- Fy_har(Ed1)=Fy_har(Ed1)+ffy
- Fy_har(Ed2)=Fy_har(Ed2)-ffy
- Fz_har(Ed1)=Fz_har(Ed1)+ffz
- Fz_har(Ed2)=Fz_har(Ed2)-ffz
- Energy_CrossLinker=Energy_CrossLinker+(0.5*K_Connect*r*r)
- End Do
- !___________________________________________!
- !_________ Compression Force _______________!
- Do I=NC+1,Total
- IF(Z(I).GT.Upper_Plate_Move) Then
- zr=Z(I)-Upper_Plate_Move
- dis=sqrt(zr*zr)
- r=dis
- const=(-1.d0)*(K_Connect/(real(dis)))
- ffz=(const*r)*zr
- Fz_Compress_UP(I)=Fz_Compress_UP(I)+ffz
- End IF
- IF(Z(I).LT.Lower_Plate_Move) Then
- zr=Z(I)-Lower_Plate_Move
- dis=sqrt(zr*zr)
- r=dis
- const=(-1.d0)*(K_Connect/(real(dis)))
- ffz=(const*r)*zr
- Fz_Compress_Lower(I)=Fz_Compress_Lower(I)+ffz
- End IF
- End Do
- !___________________________________________!
- ! Purely repulsive soft potential for all the monomers which
- ! doesn't have any other interactions.
- DO I = 1,Total
- X1 = X(I)
- Y1 = Y(I)
- Z1 = Z(I)
- cellx = int(X(I)/XCELL) !--x-index of cell
- celly = int(Y(I)/YCELL) !--y-index of cell
- cellz = int(Z(I)/ZCELL) !--z-index of cell
- cell = cellx + celly*NXCELL + cellz*NXCELL*NYCELL!--index of cell having this catalytic particle
- !print*,step,I,CEll,X(I),Y(I),Z(I)
- DO M = 0,26
- jcell = neigh(cell,M)
- Js = HOC(jcell) !--Head particle of a cell
- DO WHILE (Js .NE. 0)
- IF(Flag_Ignore(i,js)==1) then ! Ignore this interaction, if there is another interaction
- Else
- X2 = X(js)
- Y2 = Y(js)
- Z2 = Z(js)
- xr=X1-X2
- yr=Y1-Y2
- zr=Z1-Z2
- xr=xr-(L*nint(xr/L))
- yr=yr-(L*nint(yr/L))
- zr=zr-(L*nint(yr/L))
- dis= sqrt(xr*xr + yr*yr + zr*zr)
- if((dis.lt.Sigma).and.(js.gt.i)) then
- r=dis-Sigma
- const=(-1.d0)*(K_Soft/(real(dis)))
- ffx=(const*r)*xr
- ffy=(const*r)*yr
- ffz=(const*r)*zr
- fx_Rep(i)=fx_Rep(i)+ffx
- fx_Rep(js)=fx_Rep(js)-ffx
- fy_Rep(i)=fy_Rep(i)+ffy
- fy_Rep(js)=fy_Rep(js)-ffy
- fz_Rep(i)=fz_Rep(i)+ffz
- fz_Rep(js)=fz_Rep(js)-ffz
- end if !--dd.lt.cutoffsq1
- End IF
- Js = LLIST(Js) !--goto next particle of the cells
- END DO !--do while j .ne.0 loop
- END DO !--m =0,26 loop
- End do
- !_______________________________________________________________________________________________!
- Do I=1,total
- FX(I)=FX(I)+Fx_Har(I)+Fx_Rep(I)
- FY(I)=FY(I)+Fy_Har(I)+Fy_Rep(I)
- FZ(I)=FZ(I)+Fz_Har(I)+Fz_Rep(I)+Fz_Compress_UP(I)+Fz_Compress_Lower(I)
- End Do
- return
- end subroutine Force_Calculation
- subroutine read_coordinates
- use combination
- implicit none
- integer :: I,J,K
- Real*8 :: xr,yr,zr,dis
- Integer :: Ed1,Ed2
- real*8 :: xcm_shell,ycm_shell,zcm_shell
- real*8 :: xcm_chromatin,ycm_chromatin,zcm_chromatin
- Do I=1,Total
- read(100) X(I),Y(I),Z(I)
- !print*,i,X(I),Y(I),Z(I)
- End Do
- xcm_shell=0.d0
- ycm_shell=0.d0
- zcm_shell=0.d0
- Do I=1,NC
- xcm_shell=xcm_shell+x(i)
- ycm_shell=ycm_shell+y(i)
- zcm_shell=zcm_shell+z(i)
- End Do
- xcm_shell=xcm_shell/real(NC)
- ycm_shell=ycm_shell/real(NC)
- zcm_shell=zcm_shell/real(NC)
- Do I=1,NC
- x(i)=x(i)-xcm_shell+(L/2.d0)
- y(i)=y(i)-ycm_shell+(L/2.d0)
- z(i)=z(i)-zcm_shell+(L/2.d0)
- End Do
- xcm_chromatin=0.d0
- ycm_chromatin=0.d0
- zcm_chromatin=0.d0
- Do I=NC+1,Total
- xcm_chromatin=xcm_chromatin+x(i)
- ycm_chromatin=ycm_chromatin+y(i)
- zcm_chromatin=zcm_chromatin+z(i)
- End Do
- xcm_chromatin=xcm_chromatin/real(N_S)
- ycm_chromatin=ycm_chromatin/real(N_S)
- zcm_chromatin=zcm_chromatin/real(N_S)
- Do I=NC+1,Total
- x(i)=x(i)-xcm_chromatin+(L/2.d0)
- y(i)=y(i)-ycm_chromatin+(L/2.d0)
- z(i)=z(i)-zcm_chromatin+(L/2.d0)
- End Do
- read(30) N,NSE
- allocate(E1(NSE),E2(NSE))
- allocate(E1_new(NSE+NC-1),E2_new(NSE+NC-1),R_O(NSE+NC-1))
- ! Chromatin Edges reading
- ! Since, its a chain of NC=5000 particles
- Do I=1,NC-1
- E1_new(I)=I
- E2_new(I)=I+1
- End do
- ! Shell Edges reading from the file
- ! Writting into the edge variables
- Do I=1,NSE
- Read(20) E1(I),E2(I)
- E1_new(I+NC-1)=E1(I)+NC
- E2_new(I+NC-1)=E2(I)+NC
- End do
- Do I=1,NSE+NC-1
- read(50) R_O(I)
- End do
- Do I=1,NL
- read(110) E1_CH(I),E2_CH(I),R_O_Chromatin(I)
- !if(i.le.nl) print*,i,E1_CH(I),E2_CH(I),R_O_Chromatin(I)
- End do
- Do I=1,Num_C
- read(120) E1_CH(NL+I),E2_CH(NL+I),R_O_Chromatin(NL+I)
- !if(i.le.nl) print*,i,E1_CH(I),E2_CH(I),R_O_Chromatin(I)
- End do
- Do I=1,total
- Do J=1,total
- Flag_Ignore(I,J)=0
- End do
- End Do
- return
- end subroutine read_coordinates
- subroutine naming
- use combination
- implicit none
- integer :: No_of_crosslinkers,No_of_linkers
- write(NL_Ch,'(i0)') NL
- write(Num_C_Ch,'(i0)') Num_C
- write(Ens_Ch,'(i0)') Ens
- filename1='Shell_Polymer_Equb_'//trim(adjustl(Ens_Ch))//'.dat'
- filename2='Shell_Edges_'//trim(adjustl(Ens_Ch))//'.dat'
- filename3='Shell_Info_'//trim(adjustl(Ens_Ch))//'.dat'
- filename5='Result_'//trim(adjustl(NL_Ch))//'_'//trim(adjustl(Num_C_Ch))//'_' &
- //trim(adjustl(Ens_Ch))//'.dat'
- filename6='Last_Frame_'//trim(adjustl(NL_Ch))//'_'//trim(adjustl(Num_C_Ch))//'_' &
- //trim(adjustl(Ens_Ch))//'.dat'
- filename7='Rest_Length_'//trim(adjustl(Ens_Ch))//'.dat'
- Open(unit=100,file=filename1,form="unformatted")
- Open(unit=20,file=filename2,form="unformatted")
- Open(unit=30,file=filename3,form="unformatted")
- Open(unit=1000,file=filename5,form="unformatted")
- Open(unit=2000,file=filename6,form="unformatted")
- Open(unit=50,file=filename7,form="unformatted")
- No_of_linkers=400
- write(NL_Ch,'(i0)') No_of_linkers
- No_of_crosslinkers=2500
- write(Num_C_Ch,'(i0)') No_of_crosslinkers
- filename4='Linker_'//trim(adjustl(NL_Ch))//'_'//trim(adjustl(Ens_Ch))//'.dat'
- filename8='Crosslinker_'//trim(adjustl(Num_C_Ch))//'_'//trim(adjustl(Ens_Ch))//'.dat'
- Open(unit=110,file=filename4,form="unformatted")
- Open(unit=120,file=filename8,form="unformatted")
- Return
- end subroutine naming
- FUNCTION gauss(seed,iset)
- implicit none
- integer :: seed,iset
- real*8 :: gauss,w_gfx
- real*8 :: x1,x2,ran2,fac
- save fac,x2
- w_gfx=2.0
- if (iset==0) then
- do while(w_gfx>=1.0)
- x1=(2.0*ran2(seed))-1.0
- x2=(2.0*ran2(seed))-1.0
- w_gfx=(x1*x1)+(x2*x2)
- end do
- fac=sqrt(-2.0*log(w_gfx)/w_gfx)
- gauss=x1*fac
- iset=1
- else
- gauss=x2*fac
- iset=0
- end if
- return
- end function gauss
- SUBROUTINE init_random_seed()
- INTEGER :: i, n, clock
- INTEGER, DIMENSION(:), ALLOCATABLE :: seed
- CALL RANDOM_SEED(size = n)
- ALLOCATE(seed(n))
- CALL SYSTEM_CLOCK(COUNT=clock)
- seed = clock + 37 * (/ (i - 1, i = 1, n) /)
- CALL RANDOM_SEED(PUT = seed)
- DEALLOCATE(seed)
- END SUBROUTINE
- FUNCTION ran2(idum)
- INTEGER idum,IM1,IM2,IMM1,IA1,IA2,IQ1,IQ2,IR1,IR2,NTAB,NDIV
- real*8 ran2,AM,EPS,RNMX
- PARAMETER (IM1=2147483563,IM2=2147483399,AM=1./IM1,IMM1=IM1-1, &
- IA1=40014,IA2=40692,IQ1=53668,IQ2=52774,IR1=12211,IR2=3791, &
- NTAB=32,NDIV=1+IMM1/NTAB,EPS=1.2e-7,RNMX=1.-EPS)
- INTEGER idum2,j,k,iv(NTAB),iy
- SAVE iv,iy,idum2
- DATA idum2/123456789/, iv/NTAB*0/, iy/0/
- if (idum.le.0) then
- idum=max(-idum,1)
- idum2=idum
- do 11 j=NTAB+8,1,-1
- k=idum/IQ1
- idum=IA1*(idum-k*IQ1)-k*IR1
- if (idum.lt.0) idum=idum+IM1
- if (j.le.NTAB) iv(j)=idum
- 11 continue
- iy=iv(1)
- endif
- k=idum/IQ1
- idum=IA1*(idum-k*IQ1)-k*IR1
- if (idum.lt.0) idum=idum+IM1
- k=idum2/IQ2
- idum2=IA2*(idum2-k*IQ2)-k*IR2
- if (idum2.lt.0) idum2=idum2+IM2
- j=1+iy/NDIV
- iy=iv(j)-idum2
- iv(j)=idum
- if(iy.lt.1)iy=iy+IMM1
- ran2=min(AM*iy,RNMX)
- return
- END
Compress.f90, under CC-BY-4.0 · at the source
Overview
- Department of Polymer Science and Engineering, School of Chemistry and Chemical Engineering, Shanghai Jiao Tong University Shanghai 200240 China
- Department of Physics, Syracuse University Syracuse NY 13244 USA
- MRC Laboratory of Molecular Biology, Cambridge Biomedical Campus Francis Crick Avenue Cambridge CB2 0QH UK
- Indian Creek Farm Ithaca NY 14850 USA
Abstract
How genes influence tissue-scale organization remains a longstanding biological puzzle. While experimental efforts quantify gene expression, chromatin, cellular, and tissue structure, computational models lag behind. To help accelerate multiscale modeling, we demonstrate how a tissue-scale, cellular-based model can be merged with a cell nuclear model incorporating a deformable lamina shell and chromatin to test hypotheses linking chromatin and tissue scales. Specifically, we propose a hypothesis to explain structural differences between human, chimpanzee, and gorilla-derived brain organoids. Recent experiments reveal that a cell fate transition from neuroepithelial to radial glial cells includes a new intermediate state that is delayed in human-derived organoids, leading to significantly narrowed and lengthened apical cells. Additional experiments also demonstrated that ZEB2, a transcription factor, plays a major role in the onset of the novel intermediate state. We hypothesize that this delay stems from chromatin reorganization triggered by mechanical strain as the respective brain organoids develop, with a higher critical threshold in human-derived cells. Here, we computationally test the feasibility of such a hypothesis by exploring how slightly different initial configurations of chromatin, as modeled by different numbers of chromatin crosslinkers, organize in response to mechanical strain with increasingly different initial configurations representing less genetically-close relatives. We find that even small differences in the number of chromatin crosslinkers (>0.01%) yield distinguishable chromatin displacement on average beyond 35% mechanical strain. At higher strains, we observe a new type of nonlinear chromatin scaling law with an exponent of 3.24(5). Finally, we show how differences in chromatin strain maps and more conventional contact maps can reveal structural distinctions between genetically-close species.
Reproduced under the paper's license (CC BY), from the paper cited above.
Repository
Its files are read in the Code ↔ Paper reader above.
Zenodo 17557600
Availability: 1 check, the latest on 30 September 2026: the link answers (HTTP 200)
- 30 September 2026: the link answers (HTTP 200)
1 file
- Compress.f90, Fortran, 857 lines
The paper's code and data availability statement is in the Data section.
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 1 script, each with its path and the digest of its content;
- no match between paragraphs and code yet;
- neither the text of the paper nor the code itself.
Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.
Data
No dataset and no data link were found in the paper.
Data availability
Data for this article, including codes and simulation raw data are available at Zenodo at https://
Reproduced under the paper's license (CC BY), from the paper cited above.
Versions
The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.
Version 1, 30 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 4 authors, 8 MeSH terms, 3 funders, 95 references.
Cite
This paper
Zhang, T., Gupta, S., Lancaster, M. A., & Schwarz, J. M. (2026). How human-derived brain organoids are built differently from brain organoids derived from genetically-close relatives: a multi-scale hypothesis. Soft matter, 22(9), 1979-1993. https://
BibTeX
@article{zhang2026how,
author = {Zhang, Tao and Gupta, Sarthak and Lancaster, Madeline A. and Schwarz, J. M.},
title = {{How human-derived brain organoids are built differently from brain organoids derived from genetically-close relatives: a multi-scale hypothesis}},
journal = {Soft matter},
year = {2026},
month = mar,
volume = {22},
number = {9},
pages = {1979--1993},
publisher = {Royal Society of Chemistry},
issn = {1744-683X},
doi = {10.1039/
url = {https://
pmid = {41586835},
pmcid = {PMC12834241}
}
RIS
TY - JOUR
AU - Zhang, Tao
AU - Gupta, Sarthak
AU - Lancaster, Madeline A.
AU - Schwarz, J. M.
TI - How human-derived brain organoids are built differently from brain organoids derived from genetically-close relatives: a multi-scale hypothesis
T2 - Soft matter
J2 - Soft Matter
PY - 2026
DA - 2026/
VL - 22
IS - 9
SP - 1979
EP - 1993
SN - 1744-683X
PB - Royal Society of Chemistry
DO - 10.1039/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1039/
"type": "article-journal",
"title": "How human-derived brain organoids are built differently from brain organoids derived from genetically-close relatives: a multi-scale hypothesis",
"container-title": "Soft matter",
"author": [
{
"family": "Zhang",
"given": "Tao"
},
{
"family": "Gupta",
"given": "Sarthak"
},
{
"family": "Lancaster",
"given": "Madeline A."
},
{
"family": "Schwarz",
"given": "J. M."
}
],
"container-title-short":
"volume": "22",
"issue": "9",
"page": "1979-1993",
"DOI": "10.1039/
"PMID": "41586835",
"PMCID": "PMC12834241",
"ISSN": "1744-683X",
"publisher": "Royal Society of Chemistry",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
4
]
]
}
}
The tracing map gets a citation of its own once an author has validated it and it has a DOI.
Similar papers
The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.
- [1] doi:10.1093/bib/bbag096 [code]
- scDIAGRAM: detecting chromatin compartments from individual single-cell Hi-C matrix without imputation or reference features.Journal: Briefings in bioinformaticsIn common: 5 references
- [2] doi:10.1038/s41467-026-71877-z [code]
- Hi-Compass: a depth-aware deep learning framework for predicting cell-type-specific 3D genome organization from single-cell to spatial resolution.Journal: Nature communicationsIn common: 4 references
- [3] doi:10.1007/s00401-026-03018-1
- Tau oligomerization induces nuclear lamina invagination and chromatin remodeling in Alzheimer's disease.Journal: Acta neuropathologicaIn common: 3 references
- [4] doi:10.3389/fcell.2026.1809251
- Pbx1 and Pbx3 cooperatively regulate intermediate progenitor genesis and corticogenesis in the mouse neocortex.Journal: Frontiers in cell and developmental biologyIn common: 3 references
- [5] doi:10.1371/journal.pgen.1012081
- ADNP regulates chromatin architecture and lineage fidelity during neural differentiation.Journal: PLoS geneticsIn common: 3 references
- [6] doi:10.1080/19491034.2026.2697135
- Elevation of the mechanically-sensitive e protein emerin links nuclear mechanotransduction to tau-induced cytoskeletal remodeling in neurons.Journal: Nucleus (Austin, Tex.)In common: 2 references
- [7] doi:10.1016/j.stemcr.2026.103012
- Identification of novel genes with enriched expression in human intermediate progenitors reveals a key role for CDKN3 in cortical development.Journal: Stem cell reportsIn common: 2 references
- [8] doi:10.1038/s41586-026-10832-w [code]
- Subnuclear genome compartmentalization controls bivalent chromatin activity.Journal: NatureIn common: 2 references
- [9] doi:10.1038/s41586-026-10648-8
- Confined migration induces non-lethal DNA damage in developing neurons.Journal: NatureIn common: 2 references
- [10] doi:10.1101/gad.352886.125
- Independent control of neurogenesis and dorsoventral patterning by NKX2-2.Journal: Genes & developmentIn common: 2 references
Contribute
The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.
Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 1 repository of the authors' code, each at its verified commit and with its license, 1 script, and 0 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:a601307bc62fbbb5…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[.
Discussion, reproductions, activity
Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.
Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
