18 #ifndef __itkMedialNodeTripletCorrespondenceProcess_txx
19 #define __itkMedialNodeTripletCorrespondenceProcess_txx
31 template<
typename TSourceImage >
35 itkDebugMacro(<<
"itkMedialNodeTripletCorrespondenceProcess::itkMedialNodeTripletCorrespondenceProcess() called");
37 m_NumberOfNodeBaseTriplets = 0;
38 m_NumberOfTriplets = 0;
40 m_CreateOutputFile =
false;
52 template<
typename TSourceImage >
57 return static_cast<DataObject*
>(OutputDataStructureType::New().GetPointer());
63 template<
typename TSourceImage >
68 if (this->GetNumberOfOutputs() < 1)
80 template<
typename TSourceImage >
85 itkDebugMacro(<<
"MedialNodeTripletCorrespondenceProcess: Setting first input");
87 SetNthInput(0, const_cast<InputDataStructureType *>( InputDataStructure ) );
93 template<
typename TSourceImage >
98 itkDebugMacro(<<
"MedialNodeTripletCorrespondenceProcess: Setting first distance matrix");
100 SetNthInput(1, const_cast<DistanceMatrixType *>( DistanceMatrixA ) );
106 template<
typename TSourceImage >
111 itkDebugMacro(<<
"MedialNodeTripletCorrespondenceProcess: Setting second distance matrix");
113 SetNthInput(2, const_cast<DistanceMatrixType *>( DistanceMatrixB ) );
119 template<
typename TSourceImage >
124 itkDebugMacro(<<
"MedialNodeTripletCorrespondenceProcess: Setting first core atom image");
126 SetNthInput(3, const_cast<TSourceImage *>( CoreAtomImageA ) );
132 template<
typename TSourceImage >
137 itkDebugMacro(<<
"MedialNodeTripletCorrespondenceProcess: Setting second core atom image");
139 SetNthInput(4, const_cast<TSourceImage *>( CoreAtomImageB ) );
145 template<
typename TSourceImage >
151 return const_cast<TSourceImage *
>(this->GetNthInput(3));
157 template<
typename TSourceImage >
163 return const_cast<TSourceImage *
>(this->GetNthInput(4));
169 template<
typename TSourceImage >
181 template<
typename TSourceImage >
193 template<
typename TSourceImage >
198 itkDebugMacro(<<
"itkMedialNodeTripletCorrespondenceProcess::GenerateData() called");
201 std::ofstream OutputFile;
202 if(m_CreateOutputFile)
203 OutputFile.open(
"triplet_creation_log.txt",std::ios::out);
217 double TemporaryDistanceA;
218 double TemporaryDistanceB;
222 typedef std::vector<PixelType*> NodePointerListType;
224 NodePointerListType NodePointerListA;
225 NodePointerListType NodePointerListB;
227 NodePointerListA = *(m_CoreAtomImageA->GetNodePointerList());
228 NodePointerListB = *(m_CoreAtomImageB->GetNodePointerList());
230 typename InputDataStructureType::NodeListType::iterator NodeListIterator = m_InputDataStructure->m_NodeList->begin();
232 typename InputDataStructureType::SecondaryNodeListType::iterator SecondaryListIterator1;
233 typename InputDataStructureType::SecondaryNodeListType::iterator SecondaryListIterator2;
234 typename InputDataStructureType::CorrespondingListType::iterator CorrespondingListIterator1;
235 typename InputDataStructureType::CorrespondingListType::iterator CorrespondingListIterator2;
239 while( NodeListIterator != m_InputDataStructure->m_NodeList->end() )
246 for(SecondaryListIterator1 = NodeListIterator->begin();SecondaryListIterator1 != NodeListIterator->end();SecondaryListIterator1++)
248 SecondaryListIterator2 = NodeListIterator->begin();
251 while( SecondaryListIterator2 != NodeListIterator->end() && counter3 < counter2)
253 if(m_CreateOutputFile)
255 OutputFile <<
"\n\n**NEW BASE TRIPLET**" <<
"\nTesting Triplet: (" << NodeListIterator->GetIndex() <<
","
256 << SecondaryListIterator1->GetIndex(0) <<
"," << SecondaryListIterator2->GetIndex(0) <<
") : ";
260 if(NodeListIterator->GetIndex() != SecondaryListIterator1->GetIndex(0) &&
261 SecondaryListIterator1->GetIndex(0) != SecondaryListIterator2->GetIndex(0) &&
262 NodeListIterator->GetIndex() != SecondaryListIterator2->GetIndex(0))
265 if(m_CreateOutputFile)
266 OutputFile <<
" no duplicate indices :)" << std::endl;
269 BaseTripAdded =
false;
277 typename OutputDataStructureType::CorrespondingListType::iterator CorrespondingTripletListIterator;
279 bool FoundCorrespondingTriplet =
false;
284 for(CorrespondingListIterator1 = SecondaryListIterator1->begin();CorrespondingListIterator1 != SecondaryListIterator1->end();CorrespondingListIterator1++)
287 for(CorrespondingListIterator2 = SecondaryListIterator2->begin();CorrespondingListIterator2 != SecondaryListIterator2->end();CorrespondingListIterator2++)
291 if(CorrespondingListIterator1->GetNodeIndex(0) == CorrespondingListIterator2->GetNodeIndex(0))
294 if(CorrespondingListIterator1->GetNodeIndex(0) != CorrespondingListIterator1->GetNodeIndex(1) &&
295 CorrespondingListIterator1->GetNodeIndex(0) != CorrespondingListIterator2->GetNodeIndex(1) &&
296 CorrespondingListIterator1->GetNodeIndex(1) != CorrespondingListIterator2->GetNodeIndex(1))
298 bool DuplicateCorrespondingTriplet =
false;
300 if(BaseTripAdded ==
true)
303 CorrespondingTripletListIterator = CorrespondingTripletListPointer->begin();
305 while( CorrespondingTripletListIterator != CorrespondingTripletListPointer->end() && DuplicateCorrespondingTriplet ==
false)
307 if( (CorrespondingListIterator1->GetNodeIndex(0) == CorrespondingTripletListIterator->GetNodeIndex(0) ||
308 CorrespondingListIterator1->GetNodeIndex(1) == CorrespondingTripletListIterator->GetNodeIndex(0) ||
309 CorrespondingListIterator2->GetNodeIndex(1) == CorrespondingTripletListIterator->GetNodeIndex(0)) &&
310 (CorrespondingListIterator1->GetNodeIndex(0) == CorrespondingTripletListIterator->GetNodeIndex(1) ||
311 CorrespondingListIterator1->GetNodeIndex(1) == CorrespondingTripletListIterator->GetNodeIndex(1) ||
312 CorrespondingListIterator2->GetNodeIndex(1) == CorrespondingTripletListIterator->GetNodeIndex(1)) &&
313 (CorrespondingListIterator1->GetNodeIndex(0) == CorrespondingTripletListIterator->GetNodeIndex(2) ||
314 CorrespondingListIterator1->GetNodeIndex(1) == CorrespondingTripletListIterator->GetNodeIndex(2) ||
315 CorrespondingListIterator2->GetNodeIndex(1) == CorrespondingTripletListIterator->GetNodeIndex(2)) )
317 DuplicateCorrespondingTriplet =
true;
319 CorrespondingTripletListIterator++;
323 if(m_CreateOutputFile)
325 OutputFile <<
" Checking Triplet: (" << CorrespondingListIterator1->GetNodeIndex(0) <<
","
326 << CorrespondingListIterator1->GetNodeIndex(1) <<
"," << CorrespondingListIterator2->GetNodeIndex(1)
327 <<
") for correspondence" << std::endl;
330 if(DuplicateCorrespondingTriplet ==
false)
333 TemporaryDistanceA = m_DistanceMatrixA->get(SecondaryListIterator1->GetIndex(0), SecondaryListIterator2->GetIndex(0));
334 TemporaryDistanceB = m_DistanceMatrixB->get(CorrespondingListIterator1->GetNodeIndex(1),CorrespondingListIterator2->GetNodeIndex(1));
336 if( TemporaryDistanceA <= (TemporaryDistanceB+0.1) && TemporaryDistanceA >= (TemporaryDistanceB-0.1) )
340 if(m_CreateOutputFile)
341 OutputFile <<
" Distance test passed...this is a corresponding triplet" << std::endl;
343 if(BaseTripAdded ==
false)
346 ++m_NumberOfNodeBaseTriplets;
349 TripletListPointer->
SetIndex(NodeListIterator->GetIndex() );
351 CorrespondingTripletListPointer->
SetIndex(0, SecondaryListIterator1->GetIndex(0) );
353 CorrespondingTripletListPointer->
SetIndex(1, SecondaryListIterator2->GetIndex(0) );
358 NewNode.
SetNodeIndex(0,CorrespondingListIterator1->GetNodeIndex(0));
359 NewNode.
SetNodeIndex(1,CorrespondingListIterator1->GetNodeIndex(1));
360 NewNode.
SetNodeIndex(2,CorrespondingListIterator2->GetNodeIndex(1));
362 if(m_CreateOutputFile)
364 OutputFile <<
" Created node for corresponding triplet: (" << NewNode.
GetNodeIndex(0)
369 CorrespondingTripletListPointer->push_back(NewNode);
371 if(m_CreateOutputFile)
372 OutputFile <<
" Added new node to CorrespondingTripletListPointer" << std::endl;
374 FoundCorrespondingTriplet =
true;
376 BaseTripAdded =
true;
380 if(m_CreateOutputFile)
382 OutputFile <<
" Base triplet " <<
"(" << NodeListIterator->
GetIndex()
383 <<
"," << SecondaryListIterator1->GetIndex(0) <<
"," << SecondaryListIterator2->GetIndex(0)
384 <<
")" <<
" is already in structure" << std::endl;
389 NewNode.
SetNodeIndex(0,CorrespondingListIterator1->GetNodeIndex(0));
390 NewNode.
SetNodeIndex(1,CorrespondingListIterator1->GetNodeIndex(1));
391 NewNode.
SetNodeIndex(2,CorrespondingListIterator2->GetNodeIndex(1));
393 if(m_CreateOutputFile)
395 OutputFile <<
" Created node for corresponding triplet: (" << NewNode.
GetNodeIndex(0)
400 CorrespondingTripletListPointer->push_back(NewNode);
401 FoundCorrespondingTriplet =
true;
403 if(m_CreateOutputFile)
404 OutputFile <<
" Added new node to CorrespondingTripletListPointer" << std::endl;
410 if(m_CreateOutputFile)
411 OutputFile <<
" DUPLICATE" << std::endl;
418 if(FoundCorrespondingTriplet ==
true)
420 TripletListPointer->push_back(*CorrespondingTripletListPointer);
424 SecondaryListIterator2++;
432 if(!TripletListPointer->empty())
434 m_OutputDataStructure->m_NodeList->push_back(*TripletListPointer);
436 if(m_CreateOutputFile)
437 OutputFile <<
"\n Added new list to m_NodeList" << std::endl;
441 if(m_CreateOutputFile)
442 OutputFile <<
"TripletListPointer is EMPTY, NOT adding new list to m_NodeList" << std::endl;
446 itkDebugMacro(<<
"End Initialize Triplets: " << m_NumberOfTriplets <<
" found!" << std::endl);
447 itkDebugMacro(<<
"Number of Base Triplets: " << m_NumberOfNodeBaseTriplets <<
" found!" << std::endl);
449 if(m_CreateOutputFile)
452 itkDebugMacro(<<
"Finished MedialNodeTripletCorrespondenceProcess\n");
458 template<
typename TSourceImage >
463 Superclass::PrintSelf(os,indent);