Skip to content

Instantly share code, notes, and snippets.

@alexlib
Last active April 12, 2025 18:31
Show Gist options
  • Save alexlib/01324ae6f83d2bca5d1921b9e4783ad9 to your computer and use it in GitHub Desktop.
Save alexlib/01324ae6f83d2bca5d1921b9e4783ad9 to your computer and use it in GitHub Desktop.

Revisions

  1. alexlib revised this gist Apr 12, 2025. 1 changed file with 45 additions and 0 deletions.
    45 changes: 45 additions & 0 deletions trajectories_to_txt_for_Paraview.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,45 @@
    import pandas as pd
    from flowtracks.scene import Scene
    import numpy as np

    h5_name = r'../corner_51.h5'

    particles = Scene(h5_name)
    ids = particles.trajectory_ids()

    dataframes = []
    for id in particles.trajectory_ids()[:100]:
    traj = particles.trajectory_by_id(id)

    # or for traj in particles.iter_trajectories(): if you run for all trajectories
    dataframes.append(
    pd.DataFrame.from_records(
    traj, columns=["x", "y", "z", "dx", "dy", "dz", "frame", "particle"]
    )
    )

    df = pd.concat(dataframes, ignore_index=True)
    df["particle"] = df["particle"].astype(np.int32)
    df["frame"] = df["frame"].astype(np.int32)
    df.reset_index(inplace=True, drop=True)



    # Paraview does not recognize it as a set without _000001.txt, so we the first 10000
    # ptv_is.10001 is becoming ptv_00001.txt

    print(df.head())
    print('-------')
    print(df.tail())

    df_grouped = df.reset_index().groupby("frame")
    for index, group in df_grouped:
    group.to_csv(
    f"./res/ptv_{int(index):05d}.txt",
    mode="w",
    columns=["particle", "x", "y", "z", "dx", "dy", "dz"],
    index=False,
    )

    print("Saving trajectories to Paraview finished\n")

  2. alexlib created this gist Apr 12, 2025.
    101 changes: 101 additions & 0 deletions trajectories_to_vtk
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,101 @@
    import pandas as pd
    from flowtracks.scene import Scene
    import numpy as np

    h5_name = r'../corner_51.h5'

    particles = Scene(h5_name)
    ids = particles.trajectory_ids()

    dataframes = []
    for id in particles.trajectory_ids()[:100]:
    traj = particles.trajectory_by_id(id)

    # or for traj in particles.iter_trajectories(): if you run for all trajectories
    dataframes.append(
    pd.DataFrame.from_records(
    traj, columns=["x", "y", "z", "dx", "dy", "dz", "frame", "particle"]
    )
    )

    df = pd.concat(dataframes, ignore_index=True)
    df["particle"] = df["particle"].astype(np.int32)
    df["frame"] = df["frame"].astype(np.int32)
    df.reset_index(inplace=True, drop=True)



    # Paraview does not recognize it as a set without _000001.txt, so we the first 10000
    # ptv_is.10001 is becoming ptv_00001.txt

    print(df.head())
    print('-------')
    print(df.tail())

    df_grouped = df.reset_index().groupby("frame")
    for index, group in df_grouped:
    group.to_csv(
    f"./res/ptv_{int(index):05d}.txt",
    mode="w",
    columns=["particle", "x", "y", "z", "dx", "dy", "dz"],
    index=False,
    )

    print("Saving trajectories to Paraview finished\n")


    import pandas as pd
    import vtk
    from flowtracks.scene import Scene
    import numpy as np

    h5_name = r'../corner_51.h5'

    particles = Scene(h5_name)
    ids = particles.trajectory_ids()

    dataframes = []
    for id in particles.trajectory_ids()[:100]:
    traj = particles.trajectory_by_id(id)
    dataframes.append(
    pd.DataFrame.from_records(
    traj, columns=["x", "y", "z", "dx", "dy", "dz", "frame", "particle"]
    )
    )

    df = pd.concat(dataframes, ignore_index=True)
    df["particle"] = df["particle"].astype(np.int32)
    df["frame"] = df["frame"].astype(np.int32)
    df.reset_index(inplace=True, drop=True)

    # Group by frame to create separate VTK files for animation
    for frame_num, frame_data in df.groupby('frame'):
    # Create VTK points and point data
    points = vtk.vtkPoints()
    vectors = vtk.vtkFloatArray()
    vectors.SetNumberOfComponents(3)
    vectors.SetName("Velocity")

    particle_ids = vtk.vtkIntArray()
    particle_ids.SetName("ParticleID")

    # Add points and their associated data
    for _, row in frame_data.iterrows():
    points.InsertNextPoint(row['x'], row['y'], row['z'])
    vectors.InsertNextTuple3(row['dx'], row['dy'], row['dz'])
    particle_ids.InsertNextValue(row['particle'].astype(np.int32))

    # Create polydata
    polydata = vtk.vtkPolyData()
    polydata.SetPoints(points)
    polydata.GetPointData().AddArray(vectors)
    polydata.GetPointData().AddArray(particle_ids)

    # Write to VTK file
    writer = vtk.vtkXMLPolyDataWriter()
    filename = f"./vtk_output/particles_frame_{frame_num:05d}.vtp"
    writer.SetFileName(filename)
    writer.SetInputData(polydata)
    writer.Write()

    print("VTK files have been created. Load them in Paraview as a time series.")