48 this->
SetInfo(iImgSessionID, iparent);
69 this->SetTracesInfoContainerForVisuTemplate< TrackContainer >(
92 vtkMySQLDatabase *iDatabaseConnector)
94 this->DisplayInfoForAllTracesTemplate< GoDBTWContainerForTrack >(
102 vtkMySQLDatabase *iDatabaseConnector,
const std::list<unsigned int> & iListTPs)
112 vtkMySQLDatabase *iDatabaseConnector)
114 this->DisplayInfoAndLoadVisuContainerWithAllTraces< GoDBTWContainerForTrack >
122 vtkMySQLDatabase *iDatabaseConnector)
124 this->DisplayInfoForLastCreatedTraceTemplate< GoDBTWContainerForTrack >(
132 vtkMySQLDatabase *iDatabaseConnector,
int iTraceID)
134 this->DisplayInfoForExistingTraceTemplate< GoDBTWContainerForTrack >(
142 vtkMySQLDatabase *iDatabaseConnector)
145 unsigned int NewTrackID =
153 NewTrackID, color,
true);
158 this->m_SelectedColorData->second);
167 vtkMySQLDatabase *iDatabaseConnector)
177 const std::vector< int > & iVectorImportedTraces,
178 vtkMySQLDatabase *iDatabaseConnector)
182 iVectorImportedTraces, iDatabaseConnector);
193 std::list<unsigned int> ListDivisionsToDelete =
196 std::list<unsigned int>::iterator iter = ListDivisionsToDelete.begin();
197 std::list<unsigned int> TrackIDsWithNoLineage = std::list<unsigned int>();
198 std::list<unsigned int> LineagesToDelete = std::list<unsigned int>();
199 while( iter != ListDivisionsToDelete.end() )
210 if (!TrackIDsWithNoLineage.empty() )
224 const std::list< unsigned int > & iListTraces)
226 this->DeleteTracesTemplate< TrackContainer >(iDatabaseConnector,
253 UpdateElementVisibilityWithGivenTraceID(iTraceID);
260 vtkMySQLDatabase *iDatabaseConnector,
261 std::list< unsigned int > iListTraceIDs)
263 this->GetTracesInfoFromDBAndModifyContainerForVisuTemplate< TrackContainer >(
271 vtkMySQLDatabase *iDatabaseConnector)
284 TrackID = TrackToSave.
SaveInDB(iDatabaseConnector);
314 unsigned int TrackID = iStructure->
TraceID;
323 TrackID = TrackToSave.
SaveInDB(iDatabaseConnector);
343 std::map< unsigned int, double * > iMeshesInfo,
344 vtkMySQLDatabase *iDatabaseConnector)
353 unsigned int iTrackID)
355 std::list< double * > ListCenters =
357 iDatabaseConnector, iTrackID);
366 vtkMySQLDatabase *iDatabaseConnector,
367 const std::list< unsigned int > & iListTracesIDs)
370 std::list< unsigned int >::const_iterator iter = iListTracesIDs.begin();
371 while ( iter != iListTracesIDs.end() )
381 this->SetColorCodingTemplate< TrackContainer >(
392 QMenu *SplitMergeMenu =
new QMenu(
tr(
"Split/Merge them"), iMenu);
417 std::list< unsigned int > HighlightedTrackIDs =
420 if ( HighlightedTrackIDs.size() != 1 )
424 tr(
"Please check one and only one Track to split") );
430 std::list<unsigned int> list_meshes =
432 HighlightedTrackIDs);
433 emit
TrackToSplit( HighlightedTrackIDs.front(), list_meshes );
443 std::list< unsigned int > HighlightedTrackIDs =
446 if ( HighlightedTrackIDs.size() == 0 )
450 tr(
"Please check at least one Track to be visualized in the widget") );
465 if ( iTrackAttributes != 0 )
469 assert( timeInterval != 0 );
471 std::vector< std::string > ColumnNames (9);
472 std::vector< std::string > Values (9);
474 ColumnNames.at(0) =
"Deplacement";
475 Values.at(0) = ConvertToString< double >(iTrackAttributes->
total_length);
476 ColumnNames.at(1) =
"Distance";
477 Values.at(1) = ConvertToString< double >(iTrackAttributes->
distance);
478 ColumnNames.at(2) =
"Theta";
479 Values.at(2) = ConvertToString< double >(iTrackAttributes->
theta);
480 ColumnNames.at(3) =
"Phi";
481 Values.at(3) = ConvertToString< double >(iTrackAttributes->
phi);
482 ColumnNames.at(4) =
"AvgSpeed";
483 Values.at(4) = ConvertToString< double >
484 (iTrackAttributes->
avg_speed /
static_cast< double >( timeInterval ));
485 ColumnNames.at(5) =
"MaxSpeed";
486 Values.at(5) = ConvertToString< double >
487 (iTrackAttributes->
max_speed /
static_cast< double >( timeInterval ));
488 ColumnNames.at(6) =
"AvgVolume";
489 Values.at(6) = ConvertToString< double >(iTrackAttributes->
avg_volume);
490 ColumnNames.at(7) =
"NumberOfMeshes";
491 Values.at(7) = ConvertToString< unsigned int >(iTrackAttributes->
number_meshes);
492 ColumnNames.at(8) =
"Tmax - Tmin";
493 Values.at(8) = ConvertToString< unsigned int >(iTrackAttributes->
temporal_extent);
505 std::list< unsigned int > CheckedTrack =
507 if ( CheckedTrack.size() != 2 )
511 tr(
"Please check two and only two tracks to be merged") );
517 unsigned int TrackIDToKeep = 0;
518 unsigned int TrackIDToDelete = 0;
524 tr(
"The two tracks are overlapping, it is not possible to merge them !!") );
538 tr(
"The first track is already a mother track !!") );
544 std::vector<unsigned int> family1 =
547 if(family1.size() > 0)
552 tr(
"The second track is already a daughter track !!") );
563 unsigned int oldMotherID = 0;
564 unsigned int oldDaughter = 0;
566 std::vector<unsigned int> family =
570 if(family.size() > 0)
572 oldMotherID = family[1];
573 if(family[2] == TrackIDToDelete)
575 oldDaughter = family[3];
579 oldDaughter = family[2];
583 std::list<unsigned int> oldList;
584 oldList.push_back(oldMotherID);
590 std::list< unsigned int > TraceIDToDelete;
591 TraceIDToDelete.push_back(TrackIDToDelete);
592 std::list< unsigned int > MeshesBelongingToTrackToDelete =
599 if(family.size() > 0)
602 std::list<unsigned int> newdaughter;
603 newdaughter.push_back(oldMotherID);
604 newdaughter.push_back(oldDaughter);
605 newdaughter.push_back(TrackIDToKeep);
617 std::list< unsigned int > iTrackIDs,
unsigned int & ioTraceIDToKeep,
618 unsigned int & ioTraceIDToDelete, vtkMySQLDatabase *iDatabaseConnector)
620 unsigned int TraceID1 = 0, TraceID2 = 0;
621 unsigned int TimePointMin1 = 0, TimePointMin2 = 0, TimePointMax1 = 0,
623 bool oTracksOverlapping =
true;
625 std::list< unsigned int >::iterator iter = iTrackIDs.begin();
626 if ( iter == iTrackIDs.end() )
628 std::cout <<
"Pb, there should have been 2 tracks instead of 0 in this method" << std::endl;
629 return oTracksOverlapping;
633 iDatabaseConnector, TraceID1,
true);
635 iDatabaseConnector, TraceID1,
false);
637 if ( iter == iTrackIDs.end() )
639 std::cout <<
"Pb, there should have been 2 tracks instead of 1 in this method" << std::endl;
640 return oTracksOverlapping;
645 iDatabaseConnector, TraceID2,
true);
647 iDatabaseConnector, TraceID2,
false);
649 if ( TimePointMin2 > TimePointMax1 )
651 oTracksOverlapping =
false;
652 ioTraceIDToKeep = TraceID2;
653 ioTraceIDToDelete = TraceID1;
656 if ( TimePointMin1 > TimePointMax2 )
658 oTracksOverlapping =
false;
659 ioTraceIDToKeep = TraceID1;
660 ioTraceIDToDelete = TraceID2;
663 return oTracksOverlapping;
671 std::list<unsigned int> DaughtersIDs = std::list<unsigned int>();
672 std::list<unsigned int> CheckedTracks;
674 if(iDivisions.size())
676 CheckedTracks = iDivisions;
684 if (CheckedTracks.size() != 3)
688 tr(
"Please select 3 tracks to add your division") );
694 CheckedTracks, MotherID, DaughtersIDs) )
697 MotherID, DaughtersIDs);
698 if (TrackFamilyID != -1)
701 std::list<unsigned int> TrackID;
702 TrackID.push_back(MotherID);
703 std::list<unsigned int> LineageIDToCheck =
706 std::list<unsigned int>::iterator iter = DaughtersIDs.begin();
707 while(iter != DaughtersIDs.end() )
710 *iter, TrackFamilyID);
715 std::list<unsigned int> PreviousLineagesToDelete =
717 if (!LineageIDToCheck.empty())
721 PreviousLineagesToDelete);
726 DaughtersIDs.push_back(MotherID);
738 vtkMySQLDatabase* iDatabaseConnector,
739 const std::list<unsigned int> & iListTracksID,
741 std::list<unsigned int> & ioDaughtersID)
745 iDatabaseConnector,iListTracksID);
746 if (ioMotherID == -1)
750 tr(
"Can not create the division as two of your selected tracks can be the mother") );
755 std::list<unsigned int>::const_iterator iter = iListTracksID.begin();
757 unsigned int ioTraceIDToKeep = 0;
758 unsigned int ioTraceIDToDelete = 0;
759 while(iter != iListTracksID.end())
761 if (*iter != static_cast<unsigned int>(ioMotherID) )
763 std::list<unsigned int> TracksOverlappingToCheck;
764 TracksOverlappingToCheck.push_back(ioMotherID);
765 TracksOverlappingToCheck.push_back(*iter);
767 ioTraceIDToKeep, ioTraceIDToDelete, iDatabaseConnector) )
771 tr(
"Can not create the division as one daughter is overlapping the mother") );
775 ioDaughtersID.push_back(*iter);
786 unsigned int iMotherTrackID,
const std::list<unsigned int> & iDaughtersID)
788 int oTrackFamilyID = -1;
791 TrackFamily.
SetField<
unsigned int>(
"TrackIDMother", iMotherTrackID);
796 tr(
"Can not create the division as the Mother track is already mother of other daugthers") );
798 return oTrackFamilyID;
800 if(iDaughtersID.size() != 2)
802 std::cout<<
"Pb, there is more than 2 daughters to create the division !!";
803 std::cout <<
"Debug: In " << __FILE__ <<
", line " << __LINE__;
804 std::cout << std::endl;
805 return oTrackFamilyID;
807 std::list<unsigned int>::const_iterator iter = iDaughtersID.begin();
808 unsigned int TrackIDDaughterOne = *iter;
810 unsigned int TrackIDDaughterTwo = *iter;
811 TrackFamily.
SetField<
unsigned int>(
"TrackIDDaughter1", TrackIDDaughterOne);
813 TrackFamily.
SetField<
unsigned int>(
"TrackIDDaughter2", TrackIDDaughterTwo);
816 return TrackFamily.
SaveInDB(iDatabaseConnector);
822 vtkMySQLDatabase* iDatabaseConnector,
823 unsigned int iDaughterID,
unsigned int iTrackFamilyID)
827 Daughter.
SetField<
unsigned int>(
"TrackFamilyID", iTrackFamilyID);
828 Daughter.
SaveInDB(iDatabaseConnector);
834 vtkMySQLDatabase* iDatabaseConnector,
835 std::list<unsigned int> &ioTrackIDsOfTheFamilies)
838 std::list<unsigned int> DaughtersLineageID =
840 ioTrackIDsOfTheFamilies);
842 std::list<unsigned int> FirstDaugthersIDs = ioTrackIDsOfTheFamilies;
843 std::list<unsigned int>::iterator iter = FirstDaugthersIDs.begin();
844 ioTrackIDsOfTheFamilies.clear();
846 while(iter != FirstDaugthersIDs.end() )
848 std::list<unsigned int> ListDaughterID;
849 ListDaughterID.push_back(*iter);
850 std::list<unsigned int> LineageIDofDaughter =
852 if (LineageIDofDaughter.empty())
854 ioTrackIDsOfTheFamilies.push_back(*iter);
858 std::list<unsigned int> CollectionID;
859 CollectionID.push_back(LineageIDofDaughter.front());
860 std::list<unsigned int> TrackIDsofTheFamily =
862 iDatabaseConnector, CollectionID);
863 std::list<unsigned int>::iterator iterTrackIDs = TrackIDsofTheFamily.begin();
864 while (iterTrackIDs != TrackIDsofTheFamily.end() )
866 ioTrackIDsOfTheFamilies.push_back(*iterTrackIDs);
873 return DaughtersLineageID;
879 vtkMySQLDatabase *iDatabaseConnector)
881 std::list<unsigned int> ListTrackIDs =
891 std::list<unsigned int> TrackIDNotMother = std::list<unsigned int>();
892 std::list<unsigned int> CheckedTracks;
894 if(iDivisions.size())
896 CheckedTracks = iDivisions;
904 std::list<unsigned int> TrackIDsWithNoLineage = std::list<unsigned int>();
905 std::list<unsigned int> LineagesToDelete = std::list<unsigned int>();
906 if (CheckedTracks.empty() )
910 tr(
"Please select the MotherTracks you want the divisions to be deleted") );
914 std::list<unsigned int>::iterator iter = CheckedTracks.begin();
915 while (iter != CheckedTracks.end())
919 Division.
SetField(
"TrackIDMother", *iter);
921 if (TrackFamilyToDelete == -1)
923 TrackIDNotMother.push_back(*iter);
935 if (!TrackIDsWithNoLineage.empty() )
944 vtkMySQLDatabase* iDatabaseConnector,
945 std::list<unsigned int> &ioTrackIDsNoLineage,
946 std::list<unsigned int> &ioMotherLineageToDelete)
948 std::list<unsigned int> DaughtersIDs;
949 DaughtersIDs.push_back( iDivision.
GetMapValue<
unsigned int>(
"TrackIDDaughter1") );
950 DaughtersIDs.push_back( iDivision.
GetMapValue<
unsigned int>(
"TrackIDDaughter2") );
951 int MotherID = iDivision.
GetMapValue<
int>(
"TrackIDMother");
952 bool IsPartOfBiggerLineage =
true;
956 ioTrackIDsNoLineage.push_back(MotherID);
957 IsPartOfBiggerLineage =
false;
965 IsPartOfBiggerLineage);
970 if (!IsPartOfBiggerLineage)
975 ioMotherLineageToDelete.push_back(Mother.
GetMapValue<
unsigned int>(
"lineageID") );
982 std::list<unsigned int> iDaughtersID,
983 std::list<unsigned int> &ioTrackIDsNoLineage,
984 bool &ioPartOfHigherLineage)
986 std::list<unsigned int>::iterator iter = iDaughtersID.begin();
987 while (iter != iDaughtersID.end() )
1000 ioTrackIDsNoLineage.push_back(*iter);
1011 std::list<unsigned int> iTracksNoDivision)
1013 if (!iTracksNoDivision.empty() )
1015 std::string Message =
"Nothing has been done for these tracks ";
1016 std::list<unsigned int>::iterator iter = iTracksNoDivision.begin();
1017 while (iter != iTracksNoDivision.end() )
1019 Message += ConvertToString<unsigned int>(*iter);
1023 Message +=
"because they are not mothers of any divisions";
1031 vtkMySQLDatabase* iDatabaseConnector)
1034 Family.
SetField<
unsigned int>(
"TrackIDMother", iDaughterID);
1037 if (TrackFamilyID != -1)
1039 return static_cast< unsigned int >( TrackFamilyID );
1047 vtkMySQLDatabase* iDatabaseConnector)
1050 return ss_atoi<unsigned int> (Track.
GetMapValue(
"TrackFamilyID") );
1056 unsigned int iDaughterID, vtkMySQLDatabase* iDatabaseConnector,
1057 bool &ioPartOfHigherLineage)
1060 std::list<unsigned int> PreviousLineageToDelete = std::list<unsigned int>();
1061 if (!ioPartOfHigherLineage)
1063 GoDBTrackRow Daughter(iDaughterID, iDatabaseConnector);
1064 PreviousLineageToDelete.push_back( Daughter.
GetMapValue<
unsigned int>(
"lineageID") );
1066 ioPartOfHigherLineage =
true;
1071 if (TracksIDs.size() > 1)
1081 vtkMySQLDatabase* iDatabaseConnector,
unsigned int iTrackID,
1082 unsigned int iMeshTimePoint,
1083 std::list<unsigned int> &ioMotherTrackDivisionToUpdate)
1085 std::string Message =
"";
1086 unsigned int TrackMinTimePoint =
1088 unsigned int TrackMaxTimePoint =
1091 if (iMeshTimePoint > TrackMinTimePoint && iMeshTimePoint < TrackMaxTimePoint)
1096 unsigned int DivisionIDTrackIsAMother = this->
IsTheTrackAMother(iTrackID, iDatabaseConnector);
1097 unsigned int DivisionIDTrackIsADaughter = this->
IsTheTrackADaughter(iTrackID, iDatabaseConnector);
1099 if (!DivisionIDTrackIsAMother && !DivisionIDTrackIsADaughter)
1104 if (DivisionIDTrackIsAMother)
1106 if (iMeshTimePoint >= TrackMinTimePoint)
1110 iDatabaseConnector, iMeshTimePoint, DivisionIDTrackIsAMother );
1111 if (DivisionToUpdate != 0)
1113 ioMotherTrackDivisionToUpdate.push_back(DivisionToUpdate);
1117 Message =
"The mesh will not belong to any track as there is a problem with the division";
1123 if (DivisionIDTrackIsADaughter)
1125 if (iMeshTimePoint > TrackMaxTimePoint)
1130 unsigned int DivisionToUpdate =
1132 DivisionIDTrackIsADaughter);
1133 if (DivisionToUpdate != 0)
1135 ioMotherTrackDivisionToUpdate.push_back(DivisionToUpdate);
1139 Message =
"The mesh will not belong to any track as there is a problem with the division";
1149 vtkMySQLDatabase* iDatabaseConnector,
unsigned int iTimePoint,
unsigned int iTrackFamilyID )
1151 if(iTrackFamilyID != 0)
1155 iDatabaseConnector, Division.
GetMapValue<
unsigned int>(
"TrackIDDaughter1") )
1157 iDatabaseConnector, Division.
GetMapValue<
unsigned int>(
"TrackIDDaughter2") ) ) ) )
1159 return Division.
GetMapValue<
unsigned int>(
"TrackIDMother");
1169 vtkMySQLDatabase* iDatabaseConnector,
unsigned int iTimePoint,
unsigned int iTrackFamilyID )
1171 if (iTrackFamilyID != 0)
1175 iDatabaseConnector, Division.
GetMapValue<
unsigned int>(
"TrackIDMother") ) )
1177 return Division.
GetMapValue<
unsigned int>(
"TrackIDMother");
1187 vtkMySQLDatabase* iDatabaseConnector,
unsigned int iTrackID )
1189 std::list<unsigned int> Tracks;
1190 Tracks.push_back(iTrackID);
1192 iDatabaseConnector, Tracks );
1193 return oDivisionIDs;
1200 std::list<unsigned int>::const_iterator iter = iListMotherTrackIDs.begin();
1201 while (iter != iListMotherTrackIDs.end() )
1211 AddVolume(
const unsigned int& iTrackID,
const double& iVolume)
1220 AddVolumes(
const std::list< std::pair<unsigned int, double> > & iVolumes)
1222 std::list< std::pair<unsigned int, double> >::const_iterator it =
1224 while(it != iVolumes.end())
1237 std::list< std::pair<unsigned int, double> >::const_iterator it =
1239 while(it != iVolumes.end())
1250 AddVolumes(
const std::list< std::pair<unsigned int, double> > & iVolumes,
1251 unsigned int iTrackID)
1253 std::list< std::pair<unsigned int, double> >::const_iterator it =
1255 while(it != iVolumes.end())
1267 unsigned int iTrackID)
1269 std::list< std::pair<unsigned int, double> >::const_iterator it =
1271 while(it != iVolumes.end())
1286 std::list< unsigned int > ListCheckedTraces =
1288 if ( ListCheckedTraces.size() != 1 )
1292 tr(
"Please select one and only one %1 to go to")
1300 this->m_DatabaseConnector,
1302 ListCheckedTraces.front()) );
1304 int numberOfPoints = 0;
1306 points >> numberOfPoints;
1308 if( numberOfPoints > 0)
1312 while( count < numberOfPoints )
1345 std::list< unsigned int > ListCheckedTraces =
1347 if ( ListCheckedTraces.size() != 1 )
1351 tr(
"Please select one and only one %1 to go to")
1359 this->m_DatabaseConnector,
1361 ListCheckedTraces.front()) );
1363 int numberOfPoints = 0;
1364 points >> numberOfPoints;
1366 if( numberOfPoints > 0)
1387 std::vector<unsigned int>
1389 unsigned int iTrackID)
1399 unsigned int iTrackID)