I would actually suggest trying a simple Birth Script operator to create a new system with the desired order. All you need to do is
*Get the indices of all the source particles in one array, and their positions in another.
*Use qsort() to sort the Index array by the Position length relative to the “front” reference position or whatever logic you want (see example in MXS docs for indexed sort)
*Now run a for loop creating new particles based on the sorted Index array, reading any of their channels and giving birth to new particles and assigning them the same values.
The resulting system should have the IDs running front to back, while mimicking the look of the original system.
In fact, I created a test scene and it seems to work ok (except you need to toggle the copy system off and on again if you make changes to the original). It is in Max 2013 format and is attached.
In the example, I created a Cylinder, moved and rotated it to be in some arbitrary place and orientation. I then created a default PFlow on its surface, with random Speed and Rotation. Its particles are blue and shown as ticks. You can turn on the display of the IDs to see they are random.
I then created a second PFlow with Birth Script as described above. It uses the Pivot Point of the Cylinder as the reference position and sorts the source particles’ index array based on their distance to that point. Then it creates new particles that acquire the Transform (position, rotation and scale), the Speed, and the Shape of the original particles. These new particles are shown as Geometry in red and have the ID displayed so you can see it runs bottom to top along the Cylinder.