GOFIGURE2  0.9.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
QGoDBLineageManager.cxx
Go to the documentation of this file.
1 /*=========================================================================
2  Authors: The GoFigure Dev. Team.
3  at Megason Lab, Systems biology, Harvard Medical school, 2009-11
4 
5  Copyright (c) 2009-11, President and Fellows of Harvard College.
6  All rights reserved.
7 
8  Redistribution and use in source and binary forms, with or without
9  modification, are permitted provided that the following conditions are met:
10 
11  Redistributions of source code must retain the above copyright notice,
12  this list of conditions and the following disclaimer.
13  Redistributions in binary form must reproduce the above copyright notice,
14  this list of conditions and the following disclaimer in the documentation
15  and/or other materials provided with the distribution.
16  Neither the name of the President and Fellows of Harvard College
17  nor the names of its contributors may be used to endorse or promote
18  products derived from this software without specific prior written
19  permission.
20 
21  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
23  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
25  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
26  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
27  OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
28  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
30  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
31  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 
33 =========================================================================*/
34 
35 #include "QGoDBLineageManager.h"
36 #include "GoDBLineageRow.h"
37 #include "GoDBTrackRow.h"
38 #include "GoDBTrackFamilyRow.h"
39 #include <iostream>
40 #include <sstream>
41 
42 // directory for export
43  #include <QFileDialog>
44 #include <QString>
45 
46 //writer
47 #include "vtkSmartPointer.h"
48 #include "vtkTree.h"
49 #include "vtkTreeWriter.h"
50 #include "vtkMutableDirectedGraph.h"
51 #include "vtkGraphLayoutView.h"
52 #include "LineageStructure.h"
53 
54 QGoDBLineageManager::QGoDBLineageManager(int iImgSessionID, QWidget *iparent) :
55  QGoDBTraceManager(), m_LineageContainerInfoForVisu(NULL), m_TrackContainerInfoForVisu(NULL)
56 {
57  this->SetInfo(iImgSessionID, iparent);
58  this->m_TWContainer = new GoDBTWContainerForLineage(iImgSessionID);
59 }
60 
61 //-------------------------------------------------------------------------
62 
63 //-------------------------------------------------------------------------
65 {
66  if ( this->m_TWContainer )
67  {
68  delete this->m_TWContainer;
69  }
70 }
71 
72 //-------------------------------------------------------------------------
73 
74 //-------------------------------------------------------------------------
76  LineageContainer *iContainerForVisu, TrackContainer *iTrackContainerInfoForVisu)
77 {
78  this->SetTracesInfoContainerForVisuTemplate< LineageContainer >(
79  iContainerForVisu, &this->m_LineageContainerInfoForVisu);
80 
81  this->m_TrackContainerInfoForVisu = iTrackContainerInfoForVisu;
82 
83  // Connect signals
84  // actor picking in visualization
85  QObject::connect( m_TrackContainerInfoForVisu,
86  SIGNAL(UpdateLineageHighlightingFromTrackRootID(unsigned int)),
87  this,
88  SLOT( UpdateElementHighlighting(unsigned int) ) );
89 
90  // for a list of lineages
92  SIGNAL( HighlightLineage(const unsigned int&, const bool&) ),
93  m_TrackContainerInfoForVisu,
94  SLOT( HighlightCollection(const unsigned int&, const bool&) ) );
95 
97  SIGNAL( ShowLineage(const unsigned int&, const bool&) ),
98  m_TrackContainerInfoForVisu,
99  SLOT( ShowCollection(const unsigned int&, const bool&) ) );
100  // export lineage
102  SIGNAL( ExportLineages() ),
103  this,
104  SLOT( ExportLineages() ) );
105 }
106 
107 //-------------------------------------------------------------------------
108 
109 //-------------------------------------------------------------------------
111 {
112  this->m_TraceName = "lineage";
113  this->m_CollectionName = "None";
114  this->m_CollectionOf = "track";
115 }
116 
117 //-------------------------------------------------------------------------
118 
119 //-------------------------------------------------------------------------
121  vtkMySQLDatabase *iDatabaseConnector)
122 {
123  this->DisplayInfoForAllTracesTemplate< GoDBTWContainerForLineage >(
124  this->m_TWContainer, iDatabaseConnector, Qt::Unchecked);
125 }
126 
127 //-------------------------------------------------------------------------
128 
129 //-------------------------------------------------------------------------
131  vtkMySQLDatabase *iDatabaseConnector,
132  const std::list<unsigned int> & iListTPs)
133 {
134  (void) iListTPs;
135  this->DisplayInfoForAllTraces(iDatabaseConnector);
136 }
137 //-------------------------------------------------------------------------
138 
139 //-------------------------------------------------------------------------
140 
142  vtkMySQLDatabase *iDatabaseConnector)
143 {
144  this->m_Table->setSortingEnabled(false);
145 
146  std::vector< int > VectorIDs = this->m_TWContainer->GetAllTraceIDsInContainer();
147  std::list<unsigned int> ListIDs(VectorIDs.begin(), VectorIDs.end());
148 
149  std::list<LineageStructure> list_of_traces =
151  iDatabaseConnector, this->m_ImgSessionID, ListIDs);
152 
155 
156  std::list<LineageStructure>::iterator it = list_of_traces.begin();
157  while ( it != list_of_traces.end() )
158  {
159  LineageStructure Lineage = *it;
160  GoFigureLineageAttributes Attributes =
162  Lineage.TrackRootID, Lineage.rgba);
164  this->m_TWContainer->SetLineageAttributes(Attributes);
165  this->InsertLineageInTW(iDatabaseConnector, Lineage.TraceID);
166  ++it;
167  }
168 
169  this->m_Table->setSortingEnabled(true);
171 }
172 
173 //-------------------------------------------------------------------------
174 
175 //-------------------------------------------------------------------------
176 void QGoDBLineageManager::InsertLineageInTW(vtkMySQLDatabase *iDatabaseConnector,
177  unsigned int iTraceID)
178  {
179  TWContainerType RowContainer =
180  this->m_TWContainer->GetContainerForOneSpecificTrace(iDatabaseConnector,
181  iTraceID);
182 
183 
184  // insert is buggy on sorted table
185  // 1- unsort (if sorted)
186  // 2- insert
187  // 3- sort (if sorted)
188  bool sorting = this->m_Table->isSortingEnabled();
189  if(sorting)
190  {
191  this->m_Table->setSortingEnabled(false);
192  }
193  this->m_Table->InsertOnlyOneNewRow(RowContainer,
194  this->m_TWContainer->GetIndexForGroupColor(this->m_TraceName),
196  this->m_TraceName, this->m_CollectionName, Qt::Unchecked);
197  if(sorting)
198  {
199  this->m_Table->setSortingEnabled(true);
200  }
201  }
202 //-------------------------------------------------------------------------
203 
204 //-------------------------------------------------------------------------
206  vtkMySQLDatabase *iDatabaseConnector)
207 {
208  this->DisplayInfoForLastCreatedTraceTemplate< GoDBTWContainerForLineage >(
209  this->m_TWContainer, iDatabaseConnector);
210 }
211 
212 //-------------------------------------------------------------------------
213 
214 //-------------------------------------------------------------------------
216  vtkMySQLDatabase *iDatabaseConnector, int iTraceID)
217 {
218  this->DisplayInfoForExistingTraceTemplate< GoDBTWContainerForLineage >(
219  this->m_TWContainer, iDatabaseConnector, iTraceID);
220 }
221 
222 //-------------------------------------------------------------------------
223 
224 //-------------------------------------------------------------------------
226  vtkMySQLDatabase *iDatabaseConnector, unsigned int iTrackRoot)
227 {
228  GoDBLineageRow NewLineage;
229  unsigned int NewLineageID =
231  iDatabaseConnector, *this->m_SelectedColorData, NewLineage);
232  this->UpdateTrackRootSelectedLineage(iDatabaseConnector, NewLineageID, iTrackRoot);
233  // pointer to double has to be deleted after usage...
234  double* color = this->GetVectorFromQColor(this->m_SelectedColorData->second);
235  this->m_LineageContainerInfoForVisu->InsertNewLineage(NewLineageID, color
236  , iTrackRoot,
237  true);
238  delete[] color;
239  this->DisplayInfoForLastCreatedTrace(iDatabaseConnector);
240 
241  return NewLineageID;
242 }
243 
244 //-------------------------------------------------------------------------
245 
246 //-------------------------------------------------------------------------
248  vtkMySQLDatabase *iDatabaseConnector)
249 {
251  LineageContainer >(iDatabaseConnector, this->m_LineageContainerInfoForVisu);
252 
253  std::list< unsigned int > oList = this->GetListHighlightedIDs();
254 
255  std::list< unsigned int >::iterator it = oList.begin();
256  while( it != oList.end() )
257  {
258  // pointer to double has to be deleted after usage...
259  double* color = this->GetVectorFromQColor(this->m_SelectedColorData->second);
260  unsigned int trackRoot = this->m_LineageContainerInfoForVisu->GetLineageTrackRootID(*it);
262  delete[] color;
263  ++it;
264  }
265 
266  return oList;
267 }
268 
269 //-------------------------------------------------------------------------
270 
271 //-------------------------------------------------------------------------
273  const std::vector< int > & iVectorImportedTraces,
274  vtkMySQLDatabase *iDatabaseConnector)
275 {
276  //this->UpdateTWAndContainerWithImportedTracesTemplate<
277  // GoDBTWContainerForLineage >(this->m_TWContainer,
278  // iVectorImportedTraces, iDatabaseConnector);
279 
280 }
281 
282 //-------------------------------------------------------------------------
283 
284 //-------------------------------------------------------------------------
285 void QGoDBLineageManager::DeleteCheckedTraces(vtkMySQLDatabase *iDatabaseConnector)
286 {
287  this->DeleteListTraces(iDatabaseConnector, this->GetListHighlightedIDs() );
288 }
289 
290 //-------------------------------------------------------------------------
291 
292 //-------------------------------------------------------------------------
294 DeleteListTraces(vtkMySQLDatabase *iDatabaseConnector,
295  const std::list< unsigned int > & iListTraces)
296 {
297  //delete the lineages from the visu, the database and the TW:
298  this->DeleteTracesTemplate< LineageContainer >(iDatabaseConnector,
299  this->m_LineageContainerInfoForVisu, iListTraces, false);
300 }
301 
302 //-------------------------------------------------------------------------
303 
304 //-------------------------------------------------------------------------
306 {
308 }
309 
310 //-------------------------------------------------------------------------
311 // From table widget
312 //-------------------------------------------------------------------------
314  int iTraceID)
315 {
316  // update lineage container element (invert highlighted boolean)
318  UpdateElementHighlightingWithGivenTraceID(iTraceID);
319  //get root track id
320  unsigned int trackRootID = this->m_LineageContainerInfoForVisu->
321  GetLineageTrackRootID(iTraceID);
322  // is the lineage highlighted?
323  bool highlighted = this->m_LineageContainerInfoForVisu->
324  GetLineageHighlighted(iTraceID);
325  // update divisions
326  this->m_TrackContainerInfoForVisu->HighlightCollection(trackRootID, highlighted);
327 }
328 
329 //-------------------------------------------------------------------------
330 
331 //-------------------------------------------------------------------------
333 {
334  // update container element (invert visible bool)
336  UpdateElementVisibilityWithGivenTraceID(iTraceID);
337  //get root track id
338  unsigned int trackRootID = this->m_LineageContainerInfoForVisu->
339  GetLineageTrackRootID(iTraceID);
340  // is the lineage visible?
341  bool visible = this->m_LineageContainerInfoForVisu->
342  GetLineageVisibile(iTraceID);
343  // update divisions
344  this->m_TrackContainerInfoForVisu->ShowCollection(trackRootID, visible);
345 }
346 
347 //-------------------------------------------------------------------------
348 
349 //-------------------------------------------------------------------------
351  vtkMySQLDatabase *iDatabaseConnector,
352  std::list< unsigned int > iListTraceIDs)
353 {
354  std::list<LineageStructure> list_of_traces =
356  iDatabaseConnector, this->m_ImgSessionID, iListTraceIDs);
357  std::list<LineageStructure>::iterator it = list_of_traces.begin();
358  while ( it != list_of_traces.end() )
359  {
360  LineageStructure Lineage = *it;
362  Lineage.TrackRootID, Lineage.rgba);
364  ++it;
365  }
366 }
367 
368 //-------------------------------------------------------------------------
369 
370 //-------------------------------------------------------------------------
372 {
373  std::string ColumnName = "";
374  std::map<unsigned int, std::string> Values;
375  std::map<unsigned int, std::string> NewValues;
376  m_IsColorCodingOn = IsChecked;
377  //create map track ID/field
378  if (IsChecked)
379  {
380  Values = this->m_Table->GetTraceIDAndColumnsValues(
381  this->m_TraceNameID, ColumnName);
382 
383  // change lineage id by track root id
384  std::map<unsigned int, std::string>::iterator trackRootIt = Values.begin();
385  while(trackRootIt != Values.end())
386  {
387  unsigned int trackRoot =
389  NewValues.insert(
390  std::pair<unsigned int,std::string>(trackRoot, trackRootIt->second) );
391  ++trackRootIt;
392  }
393 
394  vtkLookupTable* LUT = NULL;
395 
396  bool IsRandomIncluded =
397  (ColumnName == this->m_TraceNameID) ||
398  (ColumnName == this->m_CollectionNameID);
399 
400  QGoColorCodingDialog::ColorWay UserColorway =
402  IsRandomIncluded, this->m_Table );
403 
404  switch ( UserColorway )
405  {
407  m_TrackContainerInfoForVisu->SetCollectionColorCode( ColumnName,NewValues );
408  break;
409 
411  m_TrackContainerInfoForVisu->SetDivisionRandomColor(ColumnName,NewValues );
412  break;
413 
415  m_TrackContainerInfoForVisu->SetCollectionColorCode( ColumnName,NewValues );
417  break;
418 
419  default:
421  m_IsColorCodingOn = !IsChecked;
422  break;
423  }
424  }
425  else
426  {
427  m_TrackContainerInfoForVisu->SetCollectionColorCode( ColumnName, NewValues );
428  }
429 }
430 
431 //-------------------------------------------------------------------------
432 
433 //-------------------------------------------------------------------------
435  vtkMySQLDatabase* iDatabaseConnector,
436  unsigned int iLineageID, unsigned int iTrackIDRoot)
437 {
438  GoDBLineageRow LastLineage;
439  LastLineage.SetValuesForSpecificID(iLineageID, iDatabaseConnector);
440  LastLineage.SetField("TrackIDRoot", iTrackIDRoot);
441  LastLineage.SaveInDB(iDatabaseConnector);
442 }
443 //-------------------------------------------------------------------------
444 // actor picking
445 //-------------------------------------------------------------------------
446 void
448 UpdateElementHighlighting(unsigned int iTraceRootID)
449 {
450  unsigned int lineageID = this->m_LineageContainerInfoForVisu->GetTraceIDFromTrackRootID(
451  iTraceRootID);
453 }
454 //-------------------------------------------------------------------------
455 
456 //-------------------------------------------------------------------------
457 void
460 {
461  //get path to export somewhere
462  QString dir = QFileDialog::getExistingDirectory(NULL, tr("Choose Directory"));
463  //get lineages info
464  std::list<unsigned int> rootIDs =
466 
467  std::list<unsigned int> lineageIDs =
469 
470  std::list<unsigned int>::iterator itLineage = lineageIDs.begin();
471  std::list<unsigned int>::iterator itTrack = rootIDs.begin();
472 
473  // export all the lineages
474  while(itLineage != lineageIDs.end() )
475  {
476  vtkMutableDirectedGraph* graph =
478 
479  vtkSmartPointer<vtkTree> tree =
480  vtkSmartPointer<vtkTree>::New();
481  tree->CheckedDeepCopy(graph);
482 
483  //save tree
484  vtkSmartPointer<vtkTreeWriter> writer =
485  vtkSmartPointer<vtkTreeWriter>::New();
486  writer->SetInput(tree);
487  QString name(dir);
488  name.append("/lineage_");
489  name.append( QString::number(*itLineage, 10) );
490  name.append(".vtk");
491  writer->SetFileName(name.toLocal8Bit().data());
492  writer->Write();
493 
494  graph->Delete();
495 
496  ++itLineage;
497  ++itTrack;
498  }
499 }
500 //-------------------------------------------------------------------------
501 
502 //-------------------------------------------------------------------------
503 void
505 UpdateBoundingBoxes(vtkMySQLDatabase *iDatabaseConnector,
506  const std::list< unsigned int > & iListTracesIDs,
507  bool UpdateTW)
508 {
510  iDatabaseConnector, iListTracesIDs);
511 
512  std::list<unsigned int>::const_iterator iter = iListTracesIDs.begin();
513 
514  while(iter != iListTracesIDs.end() )
515  {
516  std::list<unsigned int> Listiter;
517  Listiter.push_back(*iter);
518  //need to check first that the lineage does exist, which corresponds to check if there are tracks that have this lineageid:
519  if (!this->m_CollectionOfTraces->GetListTracesIDsFromThisCollectionOf(iDatabaseConnector, Listiter).empty())
520  {
521  this->UpdateDivisionsInTrackContainer(*iter);
522  if ( UpdateTW )
523  {
524  this->DisplayInfoForExistingTrace(iDatabaseConnector, *iter);
525  }
526  }
527  ++iter;
528  }
529 }
530 //-------------------------------------------------------------------------
531 
532 //-------------------------------------------------------------------------
534 {
535  unsigned int root =
537  double* color = this->m_LineageContainerInfoForVisu->GetLineageColor(iLineageID);
538 
539  GoFigureLineageAttributes Attributes;
540  if(color)
541  {
542  Attributes = m_TrackContainerInfoForVisu->UpdateDivisionsForALineage(root, color);
543  }
544  else
545  {
547  }
548 
549  this->m_TWContainer->SetLineageAttributes(Attributes);
550 }
551 //-------------------------------------------------------------------------
552 
553 //-------------------------------------------------------------------------
555 {
556  std::list<unsigned int> ListLineagesToDelete =
557  this->GetListHighlightedIDs();
558  if ( QGoDBTraceManager::CheckThatThereAreTracesToDelete(ListLineagesToDelete) )
559  {
562  this->m_DatabaseConnector, ListLineagesToDelete );
564 
565  emit CheckedTracesToDelete();
566  }
567 }
568 //-------------------------------------------------------------------------
569 
570 //-------------------------------------------------------------------------
572  vtkMySQLDatabase *iDatabaseConnector,
573  const std::list<unsigned int> & iLineagesID)
574 {
575  std::list<unsigned int> TrackFamiliesToDelete =
576  this->m_CollectionOfTraces->GetTrackFamiliesForLineages(iDatabaseConnector, iLineagesID);
577 
578  std::list<unsigned int>::iterator iter = TrackFamiliesToDelete.begin();
579  while(iter != TrackFamiliesToDelete.end() )
580  {
581  if (*iter != 0)
582  {
583  this->DeleteADivision(iDatabaseConnector, *iter);
584  }
585  ++iter;
586  }
587 }
588 //-------------------------------------------------------------------------
589 
590 //-------------------------------------------------------------------------
592  vtkMySQLDatabase *iDatabaseConnector, unsigned int iTrackFamilyID)
593 {
594  GoDBTrackFamilyRow TrackFamily(iTrackFamilyID, iDatabaseConnector);
595 
596  //update the trackfamilyID of the daughter:
597  GoDBTrackRow Daughter(TrackFamily.GetMapValue<unsigned int>("TrackIDDaughter1"), iDatabaseConnector);
598  Daughter.SetField("TrackFamilyID", 0);
599  Daughter.SaveInDB(iDatabaseConnector);
600  Daughter.SetValuesForSpecificID(TrackFamily.GetMapValue<unsigned int>("TrackIDDaughter2"), iDatabaseConnector);
601  Daughter.SetField("TrackFamilyID", 0);
602  Daughter.SaveInDB(iDatabaseConnector);
603 
604  //delete the division in the visu
606  TrackFamily.GetMapValue<unsigned int>("TrackIDMother") );
607 
608  //delete the division from the database:
609  TrackFamily.DeleteFromDB(iDatabaseConnector);
610 }