private static Hdf5Container_LidarDaimler ReadContainer(string sFilePath_inp)
    {
        int status = 0;

        long file_id          = H5F.open(sFilePath_inp, H5F.ACC_RDWR);
        long testDataset_id   = H5D.open(file_id, "distance");
        long testDataspace_id = H5D.get_space(testDataset_id);

        ulong[] dims = new ulong[2];
        status = H5S.get_simple_extent_dims(testDataspace_id, dims, null);

        int rows = Convert.ToInt32(dims[0]);
        int cols = Convert.ToInt32(dims[1]);

        Hdf5Container_LidarDaimler outContainer = new Hdf5Container_LidarDaimler(rows, cols)
        {
            _distances          = Hdf5IO.GetFloatDataset(H5D.open(file_id, "distance"), rows, cols),
            _intensity          = Hdf5IO.GetFloatDataset(H5D.open(file_id, "intensity"), rows, cols),
            _labelProbabilities = Hdf5IO.GetFloatDataset(H5D.open(file_id, "labelProbabilities"), rows, cols),
            _labelWorkingSet    = Hdf5IO.GetLabelWorkingSet(H5G.open(file_id, "labelWorkingSet")),
            _labels             = Hdf5IO.GetUintDataset(H5D.open(file_id, "labels"), rows, cols),
            _pointValid         = Hdf5IO.GetIntDataset(H5D.open(file_id, "pointValid"), rows, cols),
            _sensorX            = Hdf5IO.GetFloatDataset(H5D.open(file_id, "sensorX"), rows, cols),
            _sensorY            = Hdf5IO.GetFloatDataset(H5D.open(file_id, "sensorY"), rows, cols),
            _sensorZ            = Hdf5IO.GetFloatDataset(H5D.open(file_id, "sensorZ"), rows, cols),
            _vehicleX           = Hdf5IO.GetFloatDataset(H5D.open(file_id, "vehicleX"), rows, cols),
            _vehicleY           = Hdf5IO.GetFloatDataset(H5D.open(file_id, "vehicleY"), rows, cols),
            _vehicleZ           = Hdf5IO.GetFloatDataset(H5D.open(file_id, "vehicleZ"), rows, cols)
        };

        status = H5F.close(file_id);

        return(outContainer);
    }
    private static InternalDataFormat CreateInternalDataFormat(Hdf5Container_LidarDaimler hdf5Container_input, int rowIndex_inp, int columIndex)
    {
        int     ID       = int.Parse(Convert.ToString(rowIndex_inp + 1) + Convert.ToString(columIndex + 1));
        Vector3 position = new Vector3(hdf5Container_input._vehicleX[rowIndex_inp, columIndex], hdf5Container_input._vehicleY[rowIndex_inp, columIndex], hdf5Container_input._vehicleZ[rowIndex_inp, columIndex]);
        uint    label    = hdf5Container_input._labels[rowIndex_inp, columIndex];

        return(new InternalDataFormat(ID, position, label, 2));
    }
 public Hdf5MetaData_LidarDaimler(int ID_inp, Hdf5Container_LidarDaimler container_inp, int rowIndex_inp, int columIndex_inp)
 {
     _ID               = ID_inp;
     _tableIndex       = new Tuple <int, int>(rowIndex_inp, columIndex_inp);
     _distance         = container_inp._distances[rowIndex_inp, columIndex_inp];
     _intensity        = container_inp._intensity[rowIndex_inp, columIndex_inp];
     _labelprobability = container_inp._labelProbabilities[rowIndex_inp, columIndex_inp];
     _pointvalid       = container_inp._pointValid[rowIndex_inp, columIndex_inp];
     _sensor           = new Vector3(container_inp._sensorX[rowIndex_inp, columIndex_inp],
                                     container_inp._sensorY[rowIndex_inp, columIndex_inp],
                                     container_inp._sensorZ[rowIndex_inp, columIndex_inp]);
     _vehicle = new Vector3(container_inp._vehicleX[rowIndex_inp, columIndex_inp],
                            container_inp._vehicleY[rowIndex_inp, columIndex_inp],
                            container_inp._vehicleZ[rowIndex_inp, columIndex_inp]);
 }
    public static List <List <InternalDataFormat> > ReadHdf5_DaimlerLidar(string loadPath_inp, ref List <string> paths_ref)
    {
        string[] filePaths;

        List <List <InternalDataFormat> > listOfDataLists_out = new List <List <InternalDataFormat> >();

        if (loadPath_inp.Substring(loadPath_inp.Length - 5) == ".hdf5")
        {
            //single file
            string[] temp = new string[1];
            temp[0]   = loadPath_inp;
            filePaths = temp;
            paths_ref.Add(loadPath_inp);
        }
        else
        {
            //directory
            filePaths = Directory.GetFiles(loadPath_inp + "\\", "*.hdf5");
            for (int i = 0; i < filePaths.Length; i++)
            {
                paths_ref.Add(filePaths[i]);
            }
        }

        Debug.Log("Loading FIles: ");
        Debug.Log(filePaths);

        for (int i = 0; i < filePaths.Length; i++)
        {
            Hdf5Container_LidarDaimler container  = ReadContainer(filePaths[i]);
            List <InternalDataFormat>  listOfData = Processhdf5Container_DaimlerLidar(i, container);

            Labeling.SetNewLabelClasses(container._labelWorkingSet);
            listOfDataLists_out.Add(listOfData);
        }

        return(listOfDataLists_out);
    }
    public static void OverwriteHdf5_DaimlerLidar(int fileIndex_inp, Dictionary <Tuple <int, int>, int> indexToID, Hdf5Container_LidarDaimler container, List <GameObject> pointList, string pathToFile_inp)
    {
        var previousTime = Time.realtimeSinceStartup;

        var duration = Time.realtimeSinceStartup - previousTime;

        previousTime = Time.realtimeSinceStartup;
        Debug.Log("Start: " + duration);

        int status = 0;

        long file_id = H5F.open(pathToFile_inp, H5F.ACC_RDWR);

        int rows = container._labels.GetLength(0);
        int cols = container._labels.GetLength(1);

        uint[,] labels = new uint[rows, cols];
        var pointValid = container._pointValid;

        labels = container._labels;

        pointList.OrderBy(x => x.GetComponent <CustomAttributes>()._ID);
        indexToID.OrderBy(x => x.Value);

        for (int i = 0; i < pointList.Count; i++)
        {
            var attr = pointList[i].GetComponent <CustomAttributes>();
            var key  = indexToID.ElementAt(i).Key;

            labels[key.Item1, key.Item2] = attr._label;
        }

        //for (int i = 0; i < pointList.Count; i++)
        //{
        //    var attr = pointList[i].GetComponent<CustomAttributes>();
        //    var index = indexToID.First(indx => indx.Value == attr._ID).Key;
        //    labels[index.Item1, index.Item2] = attr._label;
        //}

        Hdf5IO.WriteUIntDataset(file_id, "labels", labels, true);
        Hdf5IO.WriteLabelWorkingSet(file_id, true);

        status = H5F.close(file_id);
    }
    public static void CreateNewHdf5File_DaimlerLidar(int fileIndex_inp, Dictionary <Tuple <int, int>, int> indexToID, Hdf5Container_LidarDaimler container, List <GameObject> pointList, string exportDatapath)
    {
        int status = 0;

        long file_id = H5F.create(exportDatapath, H5F.ACC_TRUNC);

        int rows = container._labels.GetLength(0);
        int cols = container._labels.GetLength(1);

        uint[,] labels = container._labels;

        pointList.OrderBy(x => x.GetComponent <CustomAttributes>()._ID);
        indexToID.OrderBy(x => x.Value);
        for (int i = 0; i < pointList.Count; i++)
        {
            var attr = pointList[i].GetComponent <CustomAttributes>();
            labels[indexToID.ElementAt(i).Key.Item1, indexToID.ElementAt(i).Key.Item2] = attr._label;
        }

        //for (int i = 0; i < pointList.Count; i++)
        //{
        //    var attr = pointList[i].GetComponent<CustomAttributes>();
        //    var index = indexToID.First(indx => indx.Value == attr._ID).Key;
        //    labels[index.Item1, index.Item2] = attr._label;
        //}

        Hdf5IO.WriteUIntDataset(file_id, "labels", labels, false);
        Hdf5IO.WriteLabelWorkingSet(file_id, false);

        //write unchangenged datasets
        Hdf5IO.WriteFloatDataset(file_id, "distance", container._distances, false);
        Hdf5IO.WriteFloatDataset(file_id, "intensity", container._intensity, false);
        Hdf5IO.WriteFloatDataset(file_id, "labelProbabilities", container._labelProbabilities, false);
        Hdf5IO.WriteIntDataset(file_id, "pointValid", container._pointValid, false);
        Hdf5IO.WriteFloatDataset(file_id, "sensorX", container._sensorX, false);
        Hdf5IO.WriteFloatDataset(file_id, "sensorY", container._sensorY, false);
        Hdf5IO.WriteFloatDataset(file_id, "sensorZ", container._sensorZ, false);
        Hdf5IO.WriteFloatDataset(file_id, "vehicleX", container._vehicleX, false);
        Hdf5IO.WriteFloatDataset(file_id, "vehicleY", container._vehicleY, false);
        Hdf5IO.WriteFloatDataset(file_id, "vehicleZ", container._vehicleZ, false);

        status = H5F.close(file_id);
    }
    private static List <InternalDataFormat> Processhdf5Container_DaimlerLidar(int fileIndex, Hdf5Container_LidarDaimler hdf5Container_inp)
    {
        List <InternalDataFormat> listOfData_out = new List <InternalDataFormat>();

        MetaData.Hdf5_DaimlerLidar._importedContainers.Add(hdf5Container_inp);
        MetaData.Hdf5_DaimlerLidar._tableIndexToID.Add(new Dictionary <Tuple <int, int>, int>());


        int containerRows = hdf5Container_inp._distances.GetLength(0);
        int containerCols = hdf5Container_inp._distances.GetLength(1);

        for (int j = 0; j < containerRows; j++)
        {
            for (int k = 0; k < containerCols; k++)
            {
                InternalDataFormat data = CreateInternalDataFormat(hdf5Container_inp, j, k);
                MetaData.Hdf5_DaimlerLidar._tableIndexToID[fileIndex].Add(new Tuple <int, int>(j, k), data._ID);

                if (hdf5Container_inp._pointValid[j, k] == 1)
                {
                    listOfData_out.Add(data);
                }
            }
        }
        return(listOfData_out);
    }