# Calculate transformation Matrix of tileset/tile with respect to raw data

I have a pointcloud of points :
22761.087002 -44053.867001 5.962000
22812.406998 -44102.647003 3.102000
22788.186996 -44075.726997 4.282000
22798.046997 -44052.957001 3.722000
22848.367004 -44075.647003 3.252000
22760.997002 -44045.387001 3.842000
22751.637001 -44033.527000 3.762000

When I load the tileset using url, I get the tileset with root. If root has children then, I can calculate the combined matrix like this:

const computedMatrix = Matrix4.multiply(tileSet.root.computedTransform, tileSet.root.children.transform, new Matrix4);

And I can calculate inverse transformation matrix to transform any data I get from cesium to transform to original data space (local coordinate).

const inverseTransform = Matrix4.inverse(tileSetData.computedTransform, new Matrix4);

This is the result I get, after applying the inverse transform to the points of polygon that I draw in cesium. And this is in the local space of point cloud.

34381.958484849005, -117913.69902407628, 29.523734231479466
34390.443633324045, -117874.04395654955, 28.2258776454255
34432.90450144377, -117874.6362562456, 30.12187748309225
34454.30669785621, -117909.00864487159, 31.794888480566442
34421.19791117641, -117928.21807036008, 30.219753425568342

But if the root does not have children, then only option is to use the inverse of the transform of computedTransform of root, then the data gets transformed around the origin. This is the inverse-transformed polygon created in cesium.

-5.3141489599505025, 19.25405962415607, 3.2960915258154273
-21.74681983028069, -6.117180594945239, 7.200840308330953
-5.172211614684161, -27.57846768456875, 3.644615152850747
7.337120309690985, -4.773393628423946, 3.571008182130754

How can I calculate accurate combined transform?
And, these data are from the same file loaded in different cesium Ion account, When loading one has root with children and other does not. I was wondering, what determines the root to have children or not.

I found the answer by myself as well.
When pointcloud is uploaded using rest api or directly on cesium ion, the point cloud seems to have been transformed to origin. And after applying the transform of root tile, the point cloud is positioned to the desired location in cesium-earth.
When pointcloud is uploaded in cesium ion, one additional tile is added after root which has the transform equal to translation by (center_x, center_y, min_z). Using computedTransform (=T[root]T[this_tile]), I can easily transform my points directly to pointcloud local coordinate.
But since there is no additional tile with translation transform when uploaded through REST Api, I can use root transform to transform the cesium points around origin. And then calculate the center of pointcloud separately, to transform cesium points finally to pointcloud local coordinate.