CryptStatistics.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "CryptStatistics.hpp"
00029 #include "RandomNumberGenerator.hpp"
00030
00034 bool CellsHeightComparison(const std::pair<TissueCell*, double> lhs, const std::pair<TissueCell*, double> rhs)
00035 {
00036 return lhs.second < rhs.second;
00037 }
00038
00039
00040
00041
00042
00043 bool CryptStatistics::CellIsInSection(double xBottom, double xTop, double yTop, const c_vector<double,2>& rCellPosition, double widthOfSection)
00044 {
00045 c_vector<double,2> intercept;
00046
00047 if (xBottom==xTop)
00048 {
00049 intercept[0] = xTop;
00050 intercept[1] = rCellPosition[1];
00051 }
00052 else
00053 {
00054 double m = (yTop)/(xTop-xBottom);
00055
00056 intercept[0] = (m*m*xBottom + rCellPosition[0] + m*rCellPosition[1])/(1+m*m);
00057 intercept[1] = m*(intercept[0] - xBottom);
00058 }
00059
00060 c_vector<double,2> vec_from_A_to_B = mrCrypt.rGetMesh().GetVectorFromAtoB(intercept, rCellPosition);
00061 double dist = norm_2(vec_from_A_to_B);
00062
00063 return (dist <= widthOfSection);
00064 }
00065
00066 bool CryptStatistics::CellIsInSectionPeriodic(double xBottom, double xTop, double yTop, const c_vector<double,2>& rCellPosition, double widthOfSection)
00067 {
00068 bool is_in_section = false;
00069
00070 c_vector<double,2> intercept;
00071 double crypt_width = TissueConfig::Instance()->GetCryptWidth();
00072
00073 double m;
00074 double offset;
00075
00076 if (xBottom<xTop)
00077 {
00078 offset = -crypt_width;
00079 }
00080 else
00081 {
00082 offset = crypt_width;
00083 }
00084
00085 m = (yTop)/(xTop-xBottom+offset);
00086
00087
00088 intercept[0] = (m*m*xBottom + rCellPosition[0] + m*rCellPosition[1])/(1+m*m);
00089 intercept[1] = m*(intercept[0] - xBottom);
00090
00091 c_vector<double,2> vec_from_A_to_B = mrCrypt.rGetMesh().GetVectorFromAtoB(intercept, rCellPosition);
00092 double dist = norm_2(vec_from_A_to_B);
00093
00094 if (dist < widthOfSection)
00095 {
00096 is_in_section = true;
00097 }
00098
00099
00100 intercept[0] = (m*m*(xBottom-offset) + rCellPosition[0] + m*rCellPosition[1])/(1+m*m);
00101 intercept[1] = m*(intercept[0] - (xBottom-offset));
00102
00103 vec_from_A_to_B = mrCrypt.rGetMesh().GetVectorFromAtoB(intercept, rCellPosition);
00104 dist = norm_2(vec_from_A_to_B);
00105
00106 if (dist < widthOfSection)
00107 {
00108 is_in_section = true;
00109 }
00110
00111 return is_in_section;
00112 }
00113
00114
00115
00116
00117 std::vector<TissueCell*> CryptStatistics::GetCryptSection(double xBottom, double xTop, double yTop, bool periodic)
00118 {
00119
00120 if (xBottom == DBL_MAX)
00121 {
00122 xBottom = RandomNumberGenerator::Instance()->ranf()*TissueConfig::Instance()->GetCryptWidth();
00123 }
00124
00125 if (xTop == DBL_MAX)
00126 {
00127 xTop = RandomNumberGenerator::Instance()->ranf()*TissueConfig::Instance()->GetCryptWidth();
00128 }
00129
00130 assert(yTop>0.0);
00131 std::list<std::pair<TissueCell*, double> > cells_list;
00132
00133 if (fabs(xTop-xBottom)<0.5*TissueConfig::Instance()->GetCryptWidth())
00134 {
00135
00136 periodic = false;
00137 }
00138
00139
00140
00141 for (AbstractTissue<2>::Iterator cell_iter = mrCrypt.Begin();
00142 cell_iter != mrCrypt.End();
00143 ++cell_iter)
00144 {
00145 if (periodic)
00146 {
00147 if (CellIsInSectionPeriodic(xBottom, xTop, yTop, mrCrypt.GetLocationOfCellCentre(*cell_iter)))
00148 {
00149
00150 std::pair<TissueCell*, double> pair(&(*cell_iter), mrCrypt.GetLocationOfCellCentre(*cell_iter)[1]);
00151 cells_list.push_back(pair);
00152 }
00153 }
00154 else
00155 {
00156 if (CellIsInSection(xBottom, xTop, yTop, mrCrypt.GetLocationOfCellCentre(*cell_iter)))
00157 {
00158
00159 std::pair<TissueCell*, double> pair(&(*cell_iter), mrCrypt.GetLocationOfCellCentre(*cell_iter)[1]);
00160 cells_list.push_back(pair);
00161 }
00162 }
00163 }
00164
00165
00166 cells_list.sort(CellsHeightComparison);
00167
00168
00169 std::vector<TissueCell*> ordered_cells;
00170 for (std::list<std::pair<TissueCell*, double> >::iterator iter = cells_list.begin();
00171 iter!=cells_list.end();
00172 iter++)
00173 {
00174 ordered_cells.push_back(iter->first);
00175 }
00176
00177 return ordered_cells;
00178 }
00179
00180 std::vector<TissueCell*> CryptStatistics::GetCryptSectionPeriodic(double xBottom, double xTop, double yTop)
00181 {
00182 return GetCryptSection(xBottom, xTop, yTop, true);
00183 }
00184