35 #include <QTextStream>
39 #include <vtkImageChangeInformation.h>
40 #include <vtkImageData.h>
41 #include "vtkImageAppend.h"
42 #include "vtkMetaImageWriter.h"
62 mSessionDescription(sessionDescription)
72 return mReconstructData;
80 std::vector<double> imageTimestamps,
85 if(trackerRecordedData.empty())
86 reportWarning(
"No tracking data for writing to reconstruction file.");
94 for (TimedTransformMap::iterator it = trackerRecordedData.begin(); it != trackerRecordedData.end(); ++it)
97 current.
mTime = it->first;
98 current.
mPos = it->second;
102 std::vector<double> fts = imageTimestamps;
103 for (
unsigned i=0; i<fts.size(); ++i)
106 current.
mTime = fts[i];
107 current.
mPos = Transform3D::Identity();
109 retval.
mFrames.push_back(current);
112 if (tool && tool->getProbe())
120 this->fillFramePositions(&retval);
135 bool UsReconstructionFileMaker::writeTrackerTimestamps(QString reconstructionFolder, QString session, std::vector<TimedPosition> ts)
137 return this->writeTimestamps(reconstructionFolder+
"/"+session+
".tts",
138 ts,
"tracking timestamps");
141 bool UsReconstructionFileMaker::writeUSTimestamps(QString reconstructionFolder, QString session, std::vector<TimedPosition> ts)
143 return this->writeTimestamps(reconstructionFolder+
"/"+session+
".fts",
144 ts,
"frame timestamps");
147 bool UsReconstructionFileMaker::writeTimestamps(QString filename, std::vector<TimedPosition> ts, QString type)
149 bool success =
false;
151 QFile file(filename);
152 if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
157 QTextStream stream(&file);
159 for (
unsigned i=0; i<ts.size(); ++i)
167 QFileInfo info(file);
168 mReport << QString(
"%1, %2 bytes, %3 %4.")
169 .arg(info.fileName())
178 bool UsReconstructionFileMaker::writeUSTransforms(QString reconstructionFolder, QString session, std::vector<TimedPosition> ts)
180 return this->writeTransforms(reconstructionFolder+
"/"+session+
".fp", ts,
"frame transforms rMu");
183 bool UsReconstructionFileMaker::writeTrackerTransforms(QString reconstructionFolder, QString session, std::vector<TimedPosition> ts)
185 return this->writeTransforms(reconstructionFolder+
"/"+session+
".tp", ts,
"tracking transforms prMt");
188 bool UsReconstructionFileMaker::writeTransforms(QString filename, std::vector<TimedPosition> ts, QString type)
190 bool success =
false;
191 QFile file(filename);
192 if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
197 QTextStream stream(&file);
199 for (
unsigned i=0; i<ts.size(); ++i)
221 QFileInfo info(file);
230 void UsReconstructionFileMaker::writeProbeConfiguration(QString reconstructionFolder, QString session, ProbeDefinition data, QString uid)
232 XmlOptionFile file = XmlOptionFile(reconstructionFolder +
"/" + session +
".probedata.xml");
233 data.addXml(file.getElement(
"configuration"));
234 file.getElement(
"tool").toElement().setAttribute(
"toolID", uid);
241 QDir patientDir(patientFolder +
"/US_Acq");
243 QString subfolder = sessionDescription;
244 QString subfolderAbsolutePath = patientDir.absolutePath()+
"/"+subfolder;
245 QString newPathName = subfolderAbsolutePath;
247 while(!findNewSubfolder(newPathName))
249 newPathName = subfolderAbsolutePath+
"_"+QString::number(i++);
251 patientDir.mkpath(newPathName);
252 patientDir.cd(newPathName);
254 retval = patientDir.absolutePath();
261 QDir patientDir(patientFolder +
"/US_Acq");
263 QString subfolder = sessionDescription;
264 QString subfolderAbsolutePath = patientDir.absolutePath()+
"/"+subfolder;
265 QString newPathName = subfolderAbsolutePath;
266 patientDir.mkpath(newPathName);
267 patientDir.cd(newPathName);
269 retval = patientDir.absolutePath();
273 bool UsReconstructionFileMaker::findNewSubfolder(QString subfolderAbsolutePath)
276 if(dir.exists(subfolderAbsolutePath))
282 void UsReconstructionFileMaker::report()
284 foreach(QString
string, mReport)
290 void UsReconstructionFileMaker::writeUSImages(QString path,
ImageDataContainerPtr images,
bool compression, std::vector<TimedPosition> pos)
295 for (
unsigned i=0; i<images->size(); ++i)
298 QString filename = QString(
"%1/%2_%3.mhd").arg(path).arg(mSessionDescription).arg(i);
300 writer->SetInputData(currentImage);
302 writer->SetCompression(compression);
304 StaticMutexVtkLocker lock;
309 customReader->setTransform(pos[i].mPos);
310 customReader->setModality(
"US");
311 customReader->setImageType(mSessionDescription);
315 void UsReconstructionFileMaker::writeMask(QString path, QString session,
vtkImageDataPtr mask)
317 QString filename = QString(
"%1/%2.mask.mhd").arg(path).arg(session);
320 reportWarning(QString(
"No mask found, ignoring write to %1").arg(filename));
325 writer->SetInputData(mask);
327 writer->SetCompression(
false);
332 void UsReconstructionFileMaker::writeREADMEFile(QString reconstructionFolder, QString session)
335 "* ==== Format description \n"
337 "* http://custusx.org/uploads/developer_doc/nightly/org_custusx_acquisition.html \n"
338 "* for a description of the files. \n"
341 QFile file(reconstructionFolder+
"/"+session+
".README.txt");
342 if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
347 QTextStream stream(&file);
355 mReconstructData.
mFilename = path+
"/"+mSessionDescription+
".fts";
358 mReport <<
"Made reconstruction folder: " + path;
359 QString session = mSessionDescription;
361 this->writeTrackerTimestamps(path, session, mReconstructData.
mPositions);
362 this->writeTrackerTransforms(path, session, mReconstructData.
mPositions);
363 this->writeUSTimestamps(path, session, mReconstructData.
mFrames);
364 this->writeUSTransforms(path, session, mReconstructData.
mFrames);
366 this->writeMask(path, session, mReconstructData.
getMask());
367 this->writeREADMEFile(path, session);
371 this->writeUSImages(path, imageData, compression, mReconstructData.
mFrames);
373 mReport <<
"failed to find frame data, save failed.";
376 mReport << QString(
"Completed save to %1. Spent %2s, %3fps").arg(mSessionDescription).arg(time/1000).arg(imageData->size()*1000/time);
QString qstring_cast(const T &val)
DoubleBoundingBox3D transform(const Transform3D &m, const DoubleBoundingBox3D &bb)
void reportError(QString msg)
~UsReconstructionFileMaker()
UsReconstructionFileMaker(QString sessionDescription)
#define CX_ASSERT(statement)
One position with timestamp.
Transform3D Transform3D
Transform3D is a representation of an affine 3D transform.
vtkSmartPointer< vtkImageAppend > vtkImageAppendPtr
cstring_cast_Placeholder cstring_cast(const T &val)
QString writeToNewFolder(QString path, bool compression)
boost::shared_ptr< class CustomMetaImage > CustomMetaImagePtr
void reportWarning(QString msg)
vtkSmartPointer< class vtkMetaImageWriter > vtkMetaImageWriterPtr
static QString createFolder(QString patientFolder, QString sessionDescription)
void reportSuccess(QString msg)
USReconstructInputData getReconstructData()
static USFrameDataPtr create(ImagePtr inputFrameData)
static QString createUniqueFolder(QString patientFolder, QString sessionDescription)
std::map< double, Transform3D > TimedTransformMap
void setData(ProbeDefinition data)
boost::shared_ptr< class ImageDataContainer > ImageDataContainerPtr
boost::shared_ptr< class Tool > ToolPtr