- }
-
-/*
-
- //Read the metadata informations in the mhd
- MetaObject tObj(3);
- tObj.AddUserField("NumberOfEnergyWindows", MET_STRING);
- tObj.AddUserField("NbOfHeads", MET_STRING);
- tObj.AddUserField("NbOfProjections", MET_STRING);
- tObj.Read(m_InputFileName.c_str());
- char *p_energyNumber, *p_headNumber, *p_rotationNumber;
- int energyNumber, headNumber, rotationNumber;
- p_energyNumber = static_cast<char*>(tObj.GetUserField("NumberOfEnergyWindows"));
- p_headNumber = static_cast<char*>(tObj.GetUserField("NbOfHeads"));
- p_rotationNumber = static_cast<char*>(tObj.GetUserField("NbOfProjections"));
- energyNumber = atoi(p_energyNumber);
- headNumber = atoi(p_headNumber);
- rotationNumber = atoi(p_rotationNumber);
- for (unsigned int i=0; i<energyNumber; ++i) {
- std::string tagEnergyName("EnergyWindow_");
- tagEnergyName += NumberToString(i).c_str();
- std::string tagEnergyThreshold(tagEnergyName), tagEnergyUphold(tagEnergyName);
- tagEnergyThreshold += "_threshold";
- tagEnergyUphold += "_uphold";
- tObj.AddUserField(tagEnergyName.c_str(), MET_STRING);
- tObj.AddUserField(tagEnergyThreshold.c_str(), MET_STRING);
- tObj.AddUserField(tagEnergyUphold.c_str(), MET_STRING);
- }
- tObj.Read(m_InputFileName.c_str());
- std::vector<char*> p_EnergyWindowName(energyNumber), p_EnergyWindowThreshold(energyNumber), p_EnergyWindowUphold(energyNumber);
- std::vector<int> energyWindowThreshold(energyNumber), energyWindowUphold(energyNumber);
- for (unsigned int i=0; i<energyNumber; ++i) {
- std::string tagEnergyName("EnergyWindow_");
- tagEnergyName += NumberToString(i).c_str();
- std::string tagEnergyThreshold(tagEnergyName), tagEnergyUphold(tagEnergyName);
- tagEnergyThreshold += "_threshold";
- tagEnergyUphold += "_uphold";
- p_EnergyWindowName[i] = static_cast<char*>(tObj.GetUserField(tagEnergyName.c_str()));
- p_EnergyWindowThreshold[i] = static_cast<char*>(tObj.GetUserField(tagEnergyThreshold.c_str()));
- p_EnergyWindowUphold[i] = static_cast<char*>(tObj.GetUserField(tagEnergyUphold.c_str()));
- energyWindowThreshold[i] = atoi(p_EnergyWindowThreshold[i]);
- energyWindowUphold[i] = atoi(p_EnergyWindowUphold[i]);
- }
-
-//TODO if the input size/spacing and dicom model ones are different
-
- // Create a new mhd image with the correct dicom order slices
- typename InputImageType::Pointer mhdCorrectOrder = InputImageType::New();
- mhdCorrectOrder->SetRegions(input->GetLargestPossibleRegion());
- mhdCorrectOrder->Allocate();
- unsigned int zAxis(0); //z value for the input mhd image
- for (unsigned int energy = 0; energy < energyNumber; ++energy) {
- for (unsigned int head = 0; head < headNumber; ++head) {
- for (unsigned int rotation = 0; rotation < rotationNumber; ++rotation) {
- std::cout << "Energy " << energy << " Head " << head << " Rotation " << rotation << std::endl;
-
- typename InputImageType::IndexType startIteratorIndexCorrectOrder; //pixel index of mhdCorrectOrder
- startIteratorIndexCorrectOrder[0] = 0;
- startIteratorIndexCorrectOrder[1] = 0;
- startIteratorIndexCorrectOrder[2] = rotation + head*rotationNumber + energy*headNumber;
-
- typename InputImageType::IndexType startIteratorIndexOriginalOrder; //pixel index of input mhd
- startIteratorIndexOriginalOrder[0] = 0;
- startIteratorIndexOriginalOrder[1] = 0;
- startIteratorIndexOriginalOrder[2] = head + energy*headNumber + rotation*energyNumber;
-
- typename InputImageType::SizeType regionSizeIterator;
- regionSizeIterator[0] = input->GetLargestPossibleRegion().GetSize()[0];
- regionSizeIterator[1] = input->GetLargestPossibleRegion().GetSize()[1];
- regionSizeIterator[2] = 1;
-
- typename InputImageType::RegionType regionIteratorCorrectOrder;
- regionIteratorCorrectOrder.SetSize(regionSizeIterator);
- regionIteratorCorrectOrder.SetIndex(startIteratorIndexCorrectOrder);
-
- typename InputImageType::RegionType regionIteratorOriginalOrder;
- regionIteratorOriginalOrder.SetSize(regionSizeIterator);
- regionIteratorOriginalOrder.SetIndex(startIteratorIndexOriginalOrder);
-
- itk::ImageRegionIterator<InputImageType> CorrectOrderIterator(mhdCorrectOrder,regionIteratorCorrectOrder);
- itk::ImageRegionIterator<InputImageType> OriginalOrderIterator(input,regionIteratorOriginalOrder);
- while(!CorrectOrderIterator.IsAtEnd()) {
- CorrectOrderIterator.Set(OriginalOrderIterator.Get());
- ++CorrectOrderIterator;
- ++OriginalOrderIterator;
- }
-
- ++zAxis;
- }
- }
- }
-
-
- // update output dicom keys/tags
- // string for distinguishing items inside sequence:
- const std::string ITEM_ENCAPSULATE_STRING("DICOM_ITEM_ENCAPSULATE");
- std::string tempString = ITEM_ENCAPSULATE_STRING + "01";
- typename ReaderSeriesType::DictionaryRawPointer inputDict = (*(readerSeries->GetMetaDataDictionaryArray()))[0];
- typename ReaderSeriesType::DictionaryArrayType outputArray;
- typename ReaderSeriesType::DictionaryRawPointer outputDict = new typename ReaderSeriesType::DictionaryType;
- CopyDictionary (*inputDict, *outputDict);
- itk::EncapsulateMetaData<std::string>(*outputDict, "0054|0011", NumberToString(energyNumber));
- itk::EncapsulateMetaData<std::string>(*outputDict, "0054|0021", NumberToString(headNumber));
- outputArray.push_back(outputDict);