text:
National Institute for Orthopaedically Handicapped (NIOH) Professional Trainee Vacancies
|No. of Vacancies : –
|Qualification: –
|PG / BPT / BOT / Diploma
|Age Limit : –
|Selection Process:
|Walk In Interview
|Date of Interview: –
|25th June 2012
|Job Tenure: –
|03 years
|Job Nature: –
Recruitment in NIOH for Professional Trainee Vacancies
National Institute for Orthpaedically Handicapped (NIOH) is requiring immediately a few candidates to appoint them as Professional Trainee. Regarding so, candidates are informed to participate in Walk In Interview, which is organised on 25th June 2012, at premises of Institute. Candidates possessing M.Sc OT / M.Sc P&O are eligible for Sr. Professional Trainee jobs while having Diploma in concern discipline are eligible for Profession Trainee jobs. Jobs related rest of the information are given below; –
Details of NIOH Professional Trainee Jobs
1. Sr. Professional Trainee (Academic) – P&O / OT
No. of Vacancies: – 05
Educational Qualification: – Post Graduation Degree (MOT / M.Sc OT or MPO / M.Sc P&O)
Salary: – On consolidated base Rs. 15000/- , Rs. 16000/- & Rs. 17000/- per month will be paid during Ist year, 2nd years & 3rd years of contract respectively.
2. Professional Trainee (PT / OT / P&O)
No. of Vacancies: – 06
Educational Qualification: – Bachelor Degree in concerned discipline or Diploma in respective discipline with substantial experience.
Salary: – Rs. 10000/- per month (inclusive)
Selection Procedure: – To select eligible candidates Walk In Interview will be initiated in the office of Director NIOH.
Date & Time of Walk In Interview: – Walk In Interview will be organised on 25th June 2012 at 2.00 PM Onwards.
Note: – Candidates meeting with above suitability are eligible for appearing in Walk In Selection of NIOH Professional Trainee jobs on scheduled date at the Institute premises. At the same time such candidates have to produce Original documents as well as one set of self attested certificates pertaining Educational Qualification and Experience.
Candidates are suggested to come for Walk In selection at NIOH Premise before 01 hour to scheduled interview timing.
Details of Professional Trainee of NIOH are available at link below: –
More jobs updated announced by NIOH will be seen at below web address; –


text:
Flat $5 U.S. Standard Shipping or Free Shipping on Orders $100+
Your Cart is Empty
$9.95 $15.95
You Save 37% ($6.00)
Notify me when this product is available:
These super cute and cool Bar earrings will soon become your go to earrings!
Matte finish, nickel & lead free.
Individual earrings measure 0.5 x 0.25 inches.

subset: commoncrawl


text:
Computes the energy distribution of the input signal in the joint time-frequency domain using the Wigner-Ville distribution (WVD) algorithm.
The input time-domain signal.
Time intervals, in units of samples, of the Wigner-Ville Distribution (WVD).
Performance Considerations
Increasing time increment decreases the computation time and reduces memory requirements but also reduces time-domain resolution. Decreasing time increment improves time-domain resolution but increases the computation time and memory requirements.
Default: 1
Error conditions that occur before this node runs. The node responds to this input according to standard error behavior.
Default: No error
The energy distribution of the input signal in the joint time-frequency domain.
Error information. The node produces this output according to standard error behavior.
For a discrete signal X, with an analytic associate of Z, the following equation defines the Wigner-Ville Distribution (WVD) of the analytic associate, :
Where This Node Can Run:
Desktop OS: Windows
FPGA: Not supported


text:
It is the period of year once more: Time to scour the web for springtime cleansing tips as fresh even as we want our houses become – and in my situation, my carpets searching for some dull. Vacuuming up any area debris before you clean your carpets could make the job easier and will stop your carpeting washer from getting all clogged up. This really is especially essential if you are cleaning after a Christmas celebration, as tinsel and pine needles can play havoc with your cleaner.
Allowing office carpeting to last providing possible, it's worth dealing with a specialist cleansing business Even with an in-house maintenance team to carry out day-to-day cleaning, a specialist cleansing company's expertise will allow you to develop a tailor-made cleansing and upkeep routine – making sure the recommendations covered right here could be used to maximum impact, to prolong the life span of one's office carpeting.
Many individuals assume that the easiest way to wash is always to "soak" their carpets and "draw" water straight back away, the technique commonly known as vapor cleansing. Dry-cleaning solvent is hard to find in grocery stores, therefore we utilized normal makeup products remover alternatively. When you have a pet urine stain on your own carpet, call Joanne's Chem-Dry of NJ at (732) 244-8080 ASAP.
If you can find solids on top of the stain, utilize a spoon or dull blade to very carefully clean the meals toward the center of the spill and into a white towel and then treat the stain. If you want a carpet cleaning service solution therefore need it now, leave it to us. With respect to the precise location of the carpet and/or style of therapy needed for the carpet, two various carpet cleaning service procedures can be used.
Dab away – never rub – fluids along with other spillage with paper towels or a clean cotton cloth. That which we do not have a tendency to think of the maximum amount of is our carpet, but adjusting your cleansing practices for the change from fall under Winter is very important! It is possible to choose between a deep extraction cleaning and a heavy-duty professional cleaning.
The carbonation enables the cleansing agents to access the carpeting fibers with minimal wetting. For coffee and tea stains, combine equal parts white vinegar and water and blot the stain. Deep-Cleaning by yourself: For both carpets Carpet Cleaning Tampa and wall-to-wall carpets, home cleaning is not suggested because wool materials absorb more water than synthetic fibers do. This will make them hard to dry, and area carpets become really heavy and hard to maneuver.


text:
Two days into the Spring Festival and Shanghaiist has already developed "cabin fever". While most of our friends and colleagues have left for Vietnam, Thailand, London, Sydney and Harbin respectively, we're having to make do with a week in our apartment, listening to the distant (and not-so-distant) snap, crackle and pop of fireworks, and waiting for the latest cold spell to kick in.
Yesterday we took affirmative action and decided to be tourists in our town. We chose to explore the Longhua Temple: unwisely, since the first day of the Lunar Year is one of the busiest on the Temple's calendar. Crowds gather to mill about, tie wishes onto a branch of The Wishing Tree, and to look (unsuccessfully) for empty taxis so they can get the hell out of the place.
It was largely to escape the hoards outside the Temple that we ended up at the Longhua Martyrs' Memorial, just around the corner. It's a large park and complex of buildings dedicated to Communist Party members (and a few Kuomintang individuals) who were killed resisting Japanese and other foreign powers during the Chinese Revolution.
And it makes for an interesting visit. There's a pyramid-shaped museum stuffed with stories of martyrs who died for their particular cause, with English-language subtitles and a whole bunch of items from the period (clothing, weapons, diaries). At the back of the museum you'll find an eternal flame and the statue pictured at the top of the post. And a long tunnel runs beneath the park which apparently follows the paths taken by prisoners from their jail cells (part of which remain) to the small grove where they were executed. The most famous incident from the period dates from 7 February 1931, when more than 20 prominent Chinese — including five left-wing writers — were killed by the Kuomintang.
By the time Shanghaiist emerged from these dusty halls of history the taxi queue had mercifully diminished, enabling us to return to our apartment and continue the process of going slowly batty while our friends eat pho in Hanoi and frolic on Australian beaches.
2887 Longhua Xi Lu. Open: 9am-4pm daily. Getting there: subway to Caobao Lu and walk (15 minutes). Or taxi (15-20 RMB from city). Admission: 8 RMB. Longhua Pagoda, part of the Longhua Temple complex, is the building second from the right in the Shanghaiist logo, by the way.


text:
Thousands of teachers across England took part in a one-day strike today, the second day of action this term. Many schools were closed in Cumbria, London, the North East, the South East and South West. Many members of the main teaching unions NUT and NASUWT took part in a rally in Bristol.
We asked teachers why they were striking today and here are some of their responses.
You can add your view or see more contributions from teachers from today and the last day of action on the GuardianWitness site.


text:
WEEKEND OFFENDER Alver White Buttonup
- $79.00
Availability: In stock
Brand: WEEKEND OFFENDER
WEEKEND OFFENDER Alver White Buttonup Fit Model is 6'0" 175 lbs and wearing a Large Classic slight Taper fit WEEKEND OFFENDER Alver White Buttonup is a long sleeve classic cotton Oxford shirt, which is...
WEEKEND OFFENDER Alver White Buttonup
- Model is 6'0" 175 lbs and wearing a Large
- Classic slight Taper fit
WEEKEND OFFENDER Alver White Buttonup is a long sleeve classic cotton Oxford shirt, which is a forever piece at Weekend Offender. A staple shirt suitable for all occasions with one subtle signature contrasting blue button for character. Weekend Offender, out of the UK, is known for their fine detail and construction. They have a clean, no-nonsense, design approach to casual clothes including Jackets, Polos, Sweats and T-shirts.
- 100% cotton
- Buttondown Collar
- Weekend Offender designer buttons and signature contrast button
- Weekend Offender branding on lower placket
- Machine wash cold / Hang dry for longest wear
- 100% cotton
Shipping is FREE for standard US shipping. Shipping times may vary. When you shop at AAURA, your goods will leave our warehouse within two days of the order and can take three to five days once received by the mail carrier. We cannot ship to PO BOXES. Returns are accepted within 30 days from the shipped date. We cannot reimburse for expedited shipping, sale or discounted items. Sale and discounted items can be exchanged for other merchandise on our website. We accept returns for items that have not been worn, altered, washed, or damaged, with tags still attached. Payment will be returned to the credit source originally used. Please email us at firstname.lastname@example.com first with the reason for the return and instructions. Please return your order to the address listed below: AAURA Returns 27555 YNEZ RD #409 Temecula, CA 92591 Items on Sale or Discounted are FINAL SALE and are eligible for exchange only.


text:
Anthem, is a new IP from Bioware/EA, slated to be released in 2018. The game will be released on PC, Xbox One and PS4, an open world RPG that is being compared to Destiny and Titanfall, with some Mass Effect elements. Anthem is a science fantasy game similar to Star Wars, meaning that technology and the surrounding environment isn't using real science. You play as a Freelancer, an explorer of the large landscape. Up to four players can play together, you share in the exploits of missions. Freelancers can wear fully customizable exosuits called Javelins. So far two Javelin types were revealed the Ranger and the Colossus.
Bioware has made it clear that single player will also be a big component of the game. Anthem's lead designer Corey Gaspur confirmed on twitter that, "single player experience is very important to the team." EA has suggested that Anthem is a "10 year journey," this is a similar strategy to that of Activision's view of Destiny. EA's executive VP Patrick Soderlund stated that "Anthem is a social game where you and your friends go on quests and journeys. It's a game that we've been working on for almost four years now, and once we launch it next year I think it'll be the start of a ten-year journey for us."
The former script writer from Mass Effect and KOTOR is work on the story for the game, showing that EA/Bioware is serious about single player. Players will encounter "world-altering events called Shaper Storms." These storms are similar to Destiny's "public events," they are "massive tempests crackling with lightning that wreak havoc on the environment as they intensify. Shaper Storms seem to warrant grouping up to prepare for an added challenge." You will face off against marauders and beasts, you will have a home base or main hub called Fort Tarsus. Protected by a wall that segregates the civilians from the more dangerous outside environment, you'll be free to go in any direction.
sources: Gamesradar , EA


text:
Founded in 1851, Horton's was supplying over half of New York City's ice cream by 1900. But like other small producers, it soon lost ground to bigger, mechanized operations, and eventually was sold to Bordon in 1930. Bordon kept the name and marketed it as a premium ice cream, as shown in these 1939 ads.
There's a Horton Dealer just around your corner who has that same fine ice cream that is served by the finer places in New York. Just name your favorite flavor! And remember. . . Horton's purity and safety are guaranteed! Try some today!
Below, a surreptitious ad disguised as a comic strip.


text:
Okay.. I had posted that I had bought some black (Jewel) reusable grocery bags for the ladies of my family. They have the pink breast cancer ribbon on them and I have planned on filling them with toiletries, cleaning products, and other small odds and ends I've found over the course of the months I've been hounding.
So my question today is this... what should I use to give the boys of our families their goodies? I had found $2 clearance laundry bags at Jewel but I figured that no boy is going to use a laundry bag anyway. I would like to go with the same "reusable" something idea for each of them and also something that they would have to actually open and take each product out to find out exactly what was in each bag.
Is there a masculine looking reusable grocery bag anyone has seen? or any other idea of something that would be big enough to hold deodorant, shower gel, and other goodies?
P.S. I only paid 70 cents for each of the girls bags so I was hoping to stay in that same range. Let me know what you come up with. Does Home Depot have bags? hmmmm What about Trader Joe's bags, how much are those? I think the Ikea blue plastic type bags might be too big and what man would reuse that? Where else have you seen any reusable bag that a man would use?
Wednesday, October 15, 2008
a week of questions?
Okay.. I had posted that I had bought some black (Jewel) reusable grocery bags for the ladies of my family. They have the pink breast cancer ribbon on them and I have planned on filling them with toiletries, cleaning products, and other small odds and ends I've found over the course of the months I've been hounding.
18 comments:
- Precious said...
How about a mens's toiletry travel bag? DH has one that he uses on our plane trips. Check Walmart for decently priced ones.
- October 15, 2008 at 8:17 PM
- Melissa said...
hmmm not sure if that would be big enough for all the goodies I plan on putting in them...
- October 15, 2008 at 8:18 PM
- Precious said...
How about something from this site?
- October 15, 2008 at 8:29 PM
- Precious said...
Melisa the Pron is Promotional. It didn't come all through.
- October 15, 2008 at 8:31 PM
- Melissa said...
yeah I looked at sites like this (I googled "reusable grocery bag") and the minimums you have to buy is normally 50 and they are well over a few dollars EACH.
- October 15, 2008 at 8:34 PM
- Kim said...
I like Target's bags, I think they are $1.50. They are red and white so they are gender neutral :)
- October 15, 2008 at 9:51 PM
- frugalsuz said...
I'm pretty sure Lowes has reusable bags now. Those would probably look pretty manly. I love the idea for your gifts!
- October 15, 2008 at 10:43 PM
- Anonymous said...
Even if you didn't want to use a reusable bag how about a tool belt or something. You know the tie kind as I don't think they are much and have pockets. Just a thought as something different. Not sure how much you are planning on putting in them, but you could put that in a brown paper handled bag as my husband just wouldn't use a reusable grocery bag (would forget it).
- October 15, 2008 at 11:17 PM
- Laurie said...
I know we don't live in the same area, but at my grocery store I saw Boston Red Sox reusable bags...maybe you could find some sports team bags somewhere?
- October 16, 2008 at 12:34 AM
- Lindsay said...
re: Laurie's post: my cvs has red sox bags for 99 cents?
Or you could put them in a cheap or homemade pillowcase (esp for the little boys)or even a heavy duty contractors bag?
- October 16, 2008 at 8:08 AM
- Queen of the Urban Jungle said...
I've seen red sox and patriots bags at CVS, what about that?
- October 16, 2008 at 9:11 AM
- Melissa said...
hmm I live in the Chicago area and have not seen Cubs or White Sox bags at CVS in the past.. that's weird.. if I did I would go for those for sure.
- October 16, 2008 at 9:40 AM
- Anonymous said...
What about a bucket {if they wash there cars it may come in handy/????? just a thought. Love your idea and may be doing the same I have 4 men to buy for. So will see.
- October 16, 2008 at 11:28 AM
- carolyns1975 said...
Hello my friend! How about a garbage can or a 5 gallon bucket?
- October 16, 2008 at 12:00 PM
- Melissa said...
I'm going to Ikea today so I'm gonna look around for something like a garbage/bucket type thing.. or maybe they'll have some sort of bag there?
Also our Steve & Berry's is going out of business.. I"m gonna stop there and see what they have.
- October 16, 2008 at 3:10 PM
- YARD SALE QUEEN said...
HomeDepot has reuseable bags that we paid 99 cents for. My husband doesn't use them to shop but he does pack stuff to go camping in. . .
- October 18, 2008 at 8:09 PM
- Melissa said...
funny you posted this.. I did a little "research" on Thursday/Friday hunting out some stores that might have some possibilties.. and actually the home depot bags are perfect! They even have a way to close them and lock them closed! no grocery bag has that and they stretch open. Another great use for those would be trick or treat bags!
- October 19, 2008 at 12:17 AM
- lin said...
- June 25, 2010 at 8:27 AM


text:
California Job - Carson Pass - Lyons Reservoir/
Lyons Reservoir Day Use
PG&E Motherlode Watershed / Carson Pass Area
Approx. Open/Close Dates: First of May - End of October
Approx. Hours/Week/Couple: 39
Available Utilities: W, S, E
# of Host Sites: 1
# of Campsites: 0; day use area
# of Restrooms: 1 vault, 2 toilets
Elevation: unknown
You stay at the Lyons Reservoir Day Use Area. The caretaker goes in the morning to open the gate, in the evening to close the gate and does general yard-care and cleaning. No money-handling is required as this is a non-fee area.


text:
Calls & Events
Voices from the Campaign Trail: Best Practices in Campaign Blogging
January 1, 2010
Sam Graham-Felsen
Guest: Sam Graham-Felsen, Lead Campaign Blogger, Obama for America. Learn More
Personal Democracy Media presents Civic Hall, a one-of-a-kind community center for the world's civic innovators. Located in the heart of New York City, Civic Hall is your home for civic tech.


text:
Only today, the weather turned worse.
Maybe wheedling out a smile...
...in the course of a walk through icy windy wetness is a so-what kind of thing in your book. In mine, it is (was) delightful. Work, then this. My day. (Though by dinner time, the tides shifted and a warm inner glow returned. But that's another story.)
Wednesday, November 29, 2006
Subscribe to: Posts (Atom)


text: Your immune system fights against infectious organisms, preventing them from entering the body. The immune system is comprised of proteins, organs, tissues and white blood cells which work together to fight disease. The immune system communicates with your central nervous system to help the body heal, but spinal misalignments can stress the body and lower the immune responses.


text:
buy mattress kmart Just what to understand before you buy mattress online? buy mattress kmart
When it comes to buying an item like a cushion that we are also made use of to going to the shop and purchase, we have a tendency to be hesitant often. Here are some of the points that you need to recognize prior to you buy mattress online. buy mattress kmart
Of all, it is essential that you recognize the studies of complete satisfaction degrees over buying a mattress has actually given comparable outcomes to those that bought them on-line as well as offline by checking out a store. Of all, the benefit of actually obtaining to attempt on the cushion that you get when you visit a shop is typically covered by thousands of customer examines one could discover online. If a thousand out of thousand individuals are claiming that a bed mattress is comfortable, the chances are it is in truth comfortable.
For an instance, the sample cushion that you are trying on in the shop has been tried on by lots of individuals before. You will certainly not get that comfy feeling with your brand new cushion up until after a couple of weeks when it is made use of for a while.
Now that you recognize getting a bed mattress online will not make you be sorry for at the end, let's see the points you can do it make your choice as far better as feasible.
buy mattress kmart There are mattresses which are better for back sleepers than side sleepers. Know exactly what you are going for, and also after that begin searching for the bed mattress that would match all your demands.
As stated over as well, among the biggest advantages of on the internet purchasing is the access to countless customer testimonials. If the users are verified, the opportunities are that they would talk about extra the weaknesses of a product that its assets– this is natural for us people and it excellent for you as a new customer to weed out the products that do not fit you. Read at the very least 20 evaluations by previous individuals before you make the final choice. The even more testimonials you can review the far better. There are rare opportunities that a product is a whole lot better than exactly what it has actually been defined by the users, yet many of the moment if the evaluations are reputable, it would provide you a wonderful understanding right into the experience of making use of the bed mattress that you can not receive from anywhere else.
Another problem when you buy mattress online is the cost. Usually, buying products online had an added cost for the delivery. There are numerous mattress firms on the internet which would organize the distribution free of cost. Take a while to seek them. Or else, you would certainly be shedding your benefit of acquiring online. There are sales in the shops nearing seasonal times of the year. Try to obtain huge products like mattresses on sale where sometimes they provide to 50% discount rates. Watch on promo code provides also. If you have a little persistence to do some excellent digging on online, you will most likely be able to get the very best cushion for the very best rate feasible.


text:
Double whammy for grieving spouses with sleep problems
Sleep disturbances have a strong negative impact on the immune system of people who have recently lost a spouse, reports a new study from Northwestern Medicine and Rice University. The overactivated immune system of the bereaved triggered by sleep disturbances—and resulting chronic inflammation—may make them more susceptible to heart disease or cancer, the study authors said. Grieving spouses have a […]Continue reading »


text:
In the event that we have more applicants than openings, we will hold a lottery for placement. The lottery will be held at 1040 I Street and is open to the public. Applicants receiving placement will be called after the lottery and those receiving a space on the wait list will be emailed.
Back to All Events
Earlier Event: February 14All New Student Applications Due Today!
Later Event: March 2A Night of Poetry


text:
Homestuck Portal
Homestuck Wallpapers Browse All (5) →
Homestuck Fan Art Browse All (294) →
Homestuck Fan Comics Browse All (3) →
Homestuck eCards Browse All (6) →
Homestuck Quizzes: Browse All (3) →
What Low blood Oc Troll Are You That I Created
~PastelFanGirl | 09/07/16
Which Alpha Female Troll Are You?
~gaaraskittygirl | 04/21/14
What Homestuck Kid Are You?
~gaaraskittygirl | 11/25/13
ICICLES Dating Card Game
Introducing ICICLES, the first ever card game for dating!
Break it out to break the ice. ICICLES uses tiny cards on a keyring that fit in a purse or pocket. Play it in a coffee shop, bar, or Uber! From the creators of theOtaku.com. Buy now - ships in time for Valentine's Day!


text:
Bright Institute at Knox: History Scholars Return to Discuss Teaching Strategies and Research
The Knox campus hosts a second summer seminar for select American History professors who teach at liberal arts colleges.
Office of Communications
2 East South Street
Galesburg, IL 61401
It's official—the new Prairie Fire mascot is Blaze the fox.
Hundreds of members of the Knox community, including current students and alumni, were officially introduced to the mascot for the first time on Friday, October 14. Blaze made a grand entrance at a special Meet the Mascot event, which was part of this year's Homecoming festivities. Accompanied by smoke, purple lights, and a cheering crowd, Blaze punched its way into Memorial Gym and entertained the crowd, stopping to take selfies with fans along the way.
Hosted by the Department of Athletics and the Student Homecoming Committee, the event featured games and karaoke for those in attendance, along with a variety of giveaways, including Prairie Fire rally towels, temporary tattoos, foam flame hats, and t-shirts. A special video, created with the assistance of Knox alumnus Andrew Isaacson '99 and his firm Famous Group, was featured at the event as well.
Friday night's event wasn't the first time Prairie Fire fans had seen the mascot. The fox was unveiled during the College's annual Pumphandle event on September 11, and students were given the opportunity to suggest and then vote on the mascot's name during the month of September. The name—and costumed mascot—was kept secret until Friday evening's Meet the Mascot event.
"This night has been a long time coming," said Chad Eisele, Knox College director of athletics. "We've been planning this event for the last few months, and it was amazing to finally meet Blaze live and in person and see the reactions from students and alumni. We are thrilled that our athletics program now has an official mascot to attend games, generate excitement, and represent our program both on campus and beyond."
The fox mascot was developed in conjunction with the new Prairie Fire logo, which was revealed in February 2016. The mascot and logo were designed and developed by SME, Inc. in New York, a brand development and creative consultant who has worked with many colleges and universities around the country. Knox athletics worked together with the Offices of Communications, Admission, and Advancement and AtLast Communications on the development of both projects. Support for the creation of the mascot was provided by the K Club, Knox's athletics booster club.
"We knew that students were excited about the new mascot," added Eisele, "but it was amazing to see our alumni get equally excited to meet Blaze over the weekend. We look forward to seeing Blaze at many upcoming events, not just for athletics but for the College as a whole."
After Friday's reveal, Blaze attended a number of Homecoming events over the weekend, including an all-class reception and Saturday's athletic competitions and visited with alumni across campus. Knox plans to make Blaze available for College and community events as well.
Merchandise featuring the new fox mascot is now available in the on-campus bookstore in Seymour Union, as well as online at knoxshop.knox.edu.
Published on October 18, 2016


text:
Fresh Decision Matrix Template
Fresh Decision Matrix Template
– Encouraged for you to my own blog, with this time period I will demonstrate in relation to Decision Matrix Template
. Now, this can be the 1st impression:
Resume to Apply for College Inspirational Sample College Application from Decision Matrix Template , source:myacereporter.com
26 of Job Matrix Template from Decision Matrix Template , source:leseriail.com
Why don't you consider photograph earlier mentioned? can be of which awesome???. if you think maybe so, I'l t provide you with a number of image yet again under:
Resource Allocation Matrix Template Best Resource Allocation from Decision Matrix Template , source:ticketszoom.us
Decision Tree Template for Powerpoint Best Excel Decision Matrix from Decision Matrix Template , source:ace5education.com
A Primer on Project Governance from Decision Matrix Template , source:smartsheet.com
So, if you wish to have all these incredible images about (Fresh Decision Matrix Template
), just click save button to store the shots in your personal pc. There're all set for save, if you love and want to obtain it, just click save symbol on the web page, and it will be instantly downloaded to your home computer. As a final point if you want to receive new and recent image related with (Fresh Decision Matrix Template
), please follow us on google plus or save this website, we attempt our best to provide daily up grade with all new and fresh pics. We do hope you like staying right here. For most up-dates and recent information about (Fresh Decision Matrix Template
) graphics, please kindly follow us on twitter, path, Instagram and google plus, or you mark this page on book mark section, We try to present you up-date periodically with all new and fresh images, enjoy your searching, and find the right for you.
Thanks for visiting our website, articleabove (Fresh Decision Matrix Template
) published by at . Today we're delighted to declare that we have found a veryinteresting nicheto be discussed, namely (Fresh Decision Matrix Template
) Many people attempting to find info about(Fresh Decision Matrix Template
) and certainly one of them is you, is not it?


text:
Category: tutorial
User parameters in PhysiCell
As of release 1.4.0, users can add any number of Boolean, integer, double, and string parameters to an XML configuration file. (These are stored by default in ./config/. The default parameter file is ./config/PhysiCell_settings.xml.) These parameters are automatically parsed into a parameters data structure, and accessible throughout a PhysiCell project.
This tutorial will show you the key techniques to use these features. (See the User_Guide for full documentation.) First, let's create a barebones 2D project by populating the 2D template project. In a terminal shell in your root PhysiCell directory, do this:
make template2D
We will use this 2D project template for the remainder of the tutorial. We assume you already have a working copy of PhysiCell installed, version 1.4.0 or later. (If not, visit the PhysiCell tutorials to find installation instructions for your operating system.)
User parameters in the XML configuration file
Next, let's look at the parameter file. In your text editor of choice, open up ./config/PhysiCell_settings.xml, and browse down to <user_parameters>, which will have some sample parameters from the 2D template project.
<user_parameters> <random_seed type="int" units="dimensionless">0</random_seed> <!-- example parameters from the template --> <!-- motile cell type parameters --> <motile_cell_persistence_time type="double" units="min">15</motile_cell_persistence_time> <motile_cell_migration_speed type="double" units="micron/min">0.5</motile_cell_migration_speed> <motile_cell_relative_adhesion type="double" units="dimensionless">0.05</motile_cell_relative_adhesion> <motile_cell_apoptosis_rate type="double" units="1/min">0.0</motile_cell_apoptosis_rate> <motile_cell_relative_cycle_entry_rate type="double" units="dimensionless">0.1</motile_cell_relative_cycle_entry_rate> </user_parameters>
Notice a few trends:
- Each XML element (tag) under <user_parameters> is a user parameter, whose name is the element name.
- Each variable requires an attribute named "type", with one of the following four values:
- bool for a Boolean parameter
- int for an integer parameter
- double for a double (floating point) parameter
- string for text string parameter
While we do not encourage it, if no valid type is supplied, PhysiCell will attempt to interpret the parameter as a double.
- Each variable here has an (optional) attribute "units". PhysiCell does not convert units, but these are helpful for clarity between users and developers. By default, PhysiCell uses minutes for all time units, and microns for all spatial units.
- Then, between the tags, you list the value of your parameter.
Let's add the following parameters to the configuration file:
- A string parameter called motile_color that sets the color of the motile_cell type in SVG outputs. Please refer to the User Guide (in the documentation folder) for more information on allowed color formats, including rgb values and named colors. Let's use the value darkorange.
- A double parameter called base_cycle_entry_rate that will give the rate of entry to the S cycle phase from the G1 phase for the default cell type in the code. Let's use a ridiculously high value of 0.01 min-1.
- A double parameter called base_apoptosis_rate for the default cell type. Let's set the value at 1e-7 min-1.
- A double parameter that sets the (relative) maximum cell-cell adhesion sensing distance, relative to the cell's radius. Let's set it at 2.5 (dimensionless). (The default is 1.25.)
- A bool parameter that enables or disables placing a single motile cell in the initial setup. Let's set it at true.
If you edit the <user_parameters> to include these, it should look like this:
<user_parameters> <random_seed type="int" units="dimensionless">0</random_seed> <!-- example parameters from the template --> <!-- motile cell type parameters --> <motile_cell_persistence_time type="double" units="min">15</motile_cell_persistence_time> <motile_cell_migration_speed type="double" units="micron/min">0.5</motile_cell_migration_speed> <motile_cell_relative_adhesion type="double" units="dimensionless">0.05</motile_cell_relative_adhesion> <motile_cell_apoptosis_rate type="double" units="1/min">0.0</motile_cell_apoptosis_rate> <motile_cell_relative_cycle_entry_rate type="double" units="dimensionless">0.1</motile_cell_relative_cycle_entry_rate> <!-- for the tutorial --> <motile_color type="string" units="dimensionless">darkorange</motile_color> <base_cycle_entry_rate type="double" units="1/min">0.01</base_cycle_entry_rate> <base_apoptosis_rate type="double" units="1/min">1e-7</base_apoptosis_rate> <base_cell_adhesion_distance type="double" units="dimensionless">2.5</base_cell_adhesion_distance> <include_motile_cell type="bool" units="dimensionless">true</include_motile_cell> </user_parameters>
Viewing the loaded parameters
Let's compile and run the project.
make ./project2D
At the beginning of the simulation, PhysiCell parses the <user_parameters> block into a global data structure called parameters, with sub-parts bools, ints, doubles, and strings. It displays these loaded parameters at the start of the simulation. Here's what it looks like:
shell$ ./project2D Using config file ./config/PhysiCell_settings.xml ... User parameters in XML config file: Bool parameters:: include_motile_cell: 1 [dimensionless] Int parameters:: random_seed: 0 [dimensionless] Double parameters:: motile_cell_persistence_time: 15 [min] motile_cell_migration_speed: 0.5 [micron/min] motile_cell_relative_adhesion: 0.05 [dimensionless] motile_cell_apoptosis_rate: 0 [1/min] motile_cell_relative_cycle_entry_rate: 0.1 [dimensionless] base_cycle_entry_rate: 0.01 [1/min] base_apoptosis_rate: 1e-007 [1/min] base_cell_adhesion_distance: 2.5 [dimensionless] String parameters:: motile_color: darkorange [dimensionless]
Getting parameter values
Within a PhysiCell project, you can access the value of any parameter by either its index or its name, so long as you know its type. Here's an example of accessing the base_cell_adhesion_distance by its name:
/* this directly accesses the value of the parameter */ double temp = parameters.doubles( "base_cell_adhesion_distance" ); std::cout << temp << std::endl; /* this streams a formatted output including the parameter name and units */ std::cout << parameters.doubles[ "base_cell_adhesion_distance" ] << std::endl; std::cout << parameters.doubles["base_cell_adhesion_distance"].name << " " << parameters.doubles["base_cell_adhesion_distance"].value << " " << parameters.doubles["base_cell_adhesion_distance"].units << std::endl;
Notice that accessing by () gets the value of the parameter in a user-friendly way, whereas accessing by [] gets the entire parameter, including its name, value, and units.
You can more efficiently access the parameter by first finding its integer index, and accessing by index:
/* this directly accesses the value of the parameter */ int my_index = parameters.doubles.find_index( "base_cell_adhesion_distance" ); double temp = parameters.doubles( my_index ); std::cout << temp << std::endl; /* this streams a formatted output including the parameter name and units */ std::cout << parameters.doubles[ my_index ] << std::endl; std::cout << parameters.doubles[ my_index ].name << " " << parameters.doubles[ my_index ].value << " " << parameters.doubles[ my_index ].units << std::endl;
Similarly, we can access string and Boolean parameters. For example:
if( parameters.bools("include_motile_cell") == true ) { std::cout << "I shall include a motile cell." << std::endl; } int rand_ind = parameters.ints.find_index( "random_seed" ); std::cout << parameters.ints[rand_ind].name << " is at index " << rand_ind << std::endl; std::cout << "We'll use this nice color: " << parameters.strings( "motile_color" );
Using the parameters in custom functions
Let's use these new parameters when setting up the parameter values of the simulation. For this project, all custom code is in ./custom_modules/custom.cpp. Open that source file in your favorite text editor. Look for the function called "create_cell_types". In the code snipped below, we access the parameter values to set the appropriate parameters in the default cell definition, rather than hard-coding them.
// add custom data here, if any /* for the tutorial */ cell_defaults.phenotype.cycle.data.transition_rate(G0G1_index,S_index) = parameters.doubles("base_cycle_entry_rate"); cell_defaults.phenotype.death.rates[apoptosis_model_index] = parameters.doubles("base_apoptosis_rate"); cell_defaults.phenotype.mechanics.set_relative_maximum_adhesion_distance( parameters.doubles("base_cell_adhesion_distance") );
Next, let's change the tissue setup ("setup_tissue") to check our Boolean variable before placing the initial motile cell.
// now create a motile cell /* remove this conditional for the normal project */ if( parameters.bools("include_motile_cell") == true ) { pC = create_cell( motile_cell ); pC->assign_position( 15.0, -18.0, 0.0 ); }
Lastly, let's make use of the string parameter to change the plotting. Search for my_coloring_function and edit the source file to use the new color:
// if the cell is motile and not dead, paint it black static std::string motile_color = parameters.strings( "motile_color" ); // tutorial if( pCell->phenotype.death.dead == false && pCell->type == 1 ) { output[0] = motile_color; output[2] = motile_color; }
Notice the static here: We intend to call this function many, many times. For performance reasons, we don't want to declare a string, instantiate it with motile_color, pass it to parameters.strings(), and then deallocate it once done. Instead, we store the search statically within the function, so that all future function calls will have access to that search result.
And that's it! Compile your code, and give it a go.
make ./project2D
This should create a lot of data in the ./output directory, including SVG files that color motile cells as darkorange, like this one below.
Now that this project is parsing the XML file to get parameter values, we don't need to recompile to change a model parameter. For example, change motile_color to mediumpurple, set motile_cell_migration_speed to 0.25, and set motile_cell_relative_cycle_entry_rate to 2.0. Rerun the code (without compiling):
And let's look at the change in the final SVG output (output00000120.svg):
More notes on configuration files
You may notice other sections in the XML configuration file. I encourage you to explore them, but the meanings should be evident: you can set the computational domain size, the number of threads (for OpenMP parallelization), and how frequently (and where) data are stored. In future PhysiCell releases, we will continue adding more and more options to these XML files to simplify setup and configuration of PhysiCell models.
Adding a directory to your Windows path
When you're setting your BioFVM / PhysiCell g++ development environment, you'll need to add the compiler, MSYS, and your text editor (like Notepad++) to your system path. For example, you may need to add folders like these to your system PATH variable:
- c:\Program Files\mingw-w64\x86_64-5.3.0-win32-seh-rt_v4_rev0\mingw64\bin\
- c:\Program Files (x86)\Notepad++\
- C:\MinGW\msys\1.0\bin\
Here's how to do that in various versions of Windows.
Windows XP, 7, and 8
First, open up a text editor, and concatenate your three paths into a single block of text, separated by semicolons (;):
- Open notepad ([Windows]+R, notepad)
- Type a semicolon, paste in the first path, and append a semicolon. It should look like this:
;c:\Program Files\mingw-w64\x86_64-5.3.0-win32-seh-rt_v4_rev0\mingw64\bin\;
- Paste in the next path, and append a semicolon. It should look like this:
;c:\Program Files\mingw-w64\x86_64-5.3.0-win32-seh-rt_v4_rev0\mingw64\bin\;C:\Program Files (x86)\Notepad++\;
- Paste in the last path, and append a semicolon. It should look something like this:
;c:\Program Files\mingw-w64\x86_64-5.3.0-win32-seh-rt_v4_rev0\mingw64\bin\;C:\Program Files (x86)\Notepad++\;c:\MinGW\msys\1.0\bin\;
Lastly, add these paths to the system path:
- Go the Start Menu, the right-click "This PC" or "My Computer", and choose "Properties."
- Click on "Advanced system settings"
- Click on "Environment Variables…" in the "Advanced" tab
- Scroll through the "System Variables" below until you find Path.
- Select "Path", then click "Edit…"
- At the very end of "Variable Value", paste what you made in Notepad in the prior steps. Make sure to paste at the end of the existing value, rather than overwriting it!
- Hit OK, OK, and OK to completely exit the "Advanced system settings."
Windows 10:
Windows 10 has made it harder to find these settings, but easier to edit them. First, let's find the system path:
- At the "run / search / Cortana" box next to the start menu, type "view advanced", and you should see "view advanced system settings" auto-complete:
- Click to enter the advanced system settings, then choose environment variables … at the bottom of this box, and scroll down the list of user variables to Path
- Click on edit, then click New to add a new path. In the new entry (a new line), paste in your first new path (the compiler):
- Repeat this for the other two paths, then click OK, OK, Apply, OK to apply the new paths and exit.
Working with PhysiCell MultiCellDS digital snapshots in Matlab
PhysiCell 1.2.1 and later saves data as a specialized MultiCellDS digital snapshot, which includes chemical substrate fields, mesh information, and a readout of the cells and their phenotypes at single simulation time point. This tutorial will help you learn to use the matlab processing files included with PhysiCell.
This tutorial assumes you know (1) how to work at the shell / command line of your operating system, and (2) basic plotting and other functions in Matlab.
Key elements of a PhysiCell digital snapshot
A PhysiCell digital snapshot (a customized form of the MultiCellDS digital simulation snapshot) includes the following elements saved as XML and MAT files:
- output12345678.xml : This is the "base" output file, in MultiCellDS format. It includes key metadata such as when the file was created, the software, microenvironment information, and custom data saved at the simulation time. The Matlab files read this base file to find other related files (listed next). Example: output00003696.xml
- initial_mesh0.mat : This is the computational mesh information for BioFVM at time 0.0. Because BioFVM and PhysiCell do not use moving meshes, we do not save this data at any subsequent time.
- output12345678_microenvironment0.mat : This saves each biochemical substrate in the microenvironment at the computational voxels defined in the mesh (see above). Example: output00003696_microenvironment0.mat
- output12345678_cells.mat : This saves very basic cellular information related to BioFVM, including cell positions, volumes, secretion rates, uptake rates, and secretion saturation densities. Example: output00003696_cells.mat
- output12345678_cells_physicell.mat : This saves extra PhysiCell data for each cell agent, including volume information, cell cycle status, motility information, cell death information, basic mechanics, and any user-defined custom data. Example: output00003696_cells_physicell.mat
These snapshots make extensive use of Matlab Level 4 .mat files, for fast, compact, and well-supported saving of array data. Note that even if you cannot ready MultiCellDS XML files, you can work to parse the .mat files themselves.
The PhysiCell Matlab .m files
Every PhysiCell distribution includes some matlab functions to work with PhysiCell digital simulation snapshots, stored in the matlab subdirectory. The main ones are:
- composite_cutaway_plot.m : provides a quick, coarse 3-D cutaway plot of the discrete cells, with different colors for live (red), apoptotic (b), and necrotic (black) cells.
- read_MultiCellDS_xml.m : reads the "base" PhysiCell snapshot and its associated matlab files.
- set_MCDS_constants.m : creates a data structure MCDS_constants that has the same constants as PhysiCell_constants.h. This is useful for identifying cell cycle phases, etc.
- simple_cutaway_plot.m : provides a quick, coarse 3-D cutaway plot of user-specified cells.
- simple_plot.m : provides, a quick, coarse 3-D plot of the user-specified cells, without a cutaway or cross-sectional clipping plane.
A note on GNU Octave
Unfortunately, GNU octave does not include XML file parsing without some significant user tinkering. And one you're done, it is approximately one order of magnitude slower than Matlab. Octave users can directly import the .mat files described above, but without the helpful metadata in the XML file. We'll provide more information on the structure of these MAT files in a future blog post. Moreover, we plan to provide python and other tools for users without access to Matlab.
A sample digital snapshot
We provide a 3-D simulation snapshot from the final simulation time of the cancer-immune example in Ghaffarizadeh et al. (2017, in review) at:
The corresponding SVG cross-section for that time (through z = 0 μm) looks like this:
Unzip the sample dataset in any directory, and make sure the matlab files above are in the same directory (or in your Matlab path). If you're inside matlab:
!unzip 3D_PhysiCell_matlab_sample.zip
Loading a PhysiCell MultiCellDS digital snapshot
Now, load the snapshot:
MCDS = read_MultiCellDS_xml( 'output00003696.xml');
This will load the mesh, substrates, and discrete cells into the MCDS data structure, and give a basic summary:
Typing 'MCDS' and then hitting 'tab' (for auto-completion) shows the overall structure of MCDS, stored as metadata, mesh, continuum variables, and discrete cells:
To get simulation metadata, such as the current simulation time, look at MCDS.metadata.current_time
Here, we see that the current simulation time is 30240 minutes, or 21 days. MCDS.metadata.current_runtime gives the elapsed walltime to up to this point: about 53 hours (1.9e5 seconds), including file I/O time to write full simulation data once per 3 simulated minutes after the start of the adaptive immune response.
Plotting chemical substrates
Let's make an oxygen contour plot through z = 0 μm. First, we find the index corresponding to this z-value:
k = find( MCDS.mesh.Z_coordinates == 0 );
Next, let's figure out which variable is oxygen. Type "MCDS.continuum_variables.name", which will show the array of variable names:
Here, oxygen is the first variable, (index 1). So, to make a filled contour plot:
contourf( MCDS.mesh.X(:,:,k), MCDS.mesh.Y(:,:,k), ... MCDS.continuum_variables(1).data(:,:,k) , 20 ) ;
Now, let's set this to a correct aspect ratio (no stretching in x or y), add a colorbar, and set the axis labels, using
metadata to get labels:
axis image colorbar xlabel( sprintf( 'x (%s)' , MCDS.metadata.spatial_units) ); ylabel( sprintf( 'y (%s)' , MCDS.metadata.spatial_units) );
Lastly, let's add an appropriate (time-based) title:
title( sprintf('%s (%s) at t = %3.2f %s, z = %3.2f %s', MCDS.continuum_variables(1).name , ... MCDS.continuum_variables(1).units , ... MCDS.metadata.current_time , ... MCDS.metadata.time_units, ... MCDS.mesh.Z_coordinates(k), ... MCDS.metadata.spatial_units ) );
Here's the end result:
We can easily export graphics, such as to PNG format:
print( '-dpng' , 'output_o2.png' );
For more on plotting BioFVM data, see the tutorial
at http://www.mathcancer.org/blog/saving-multicellds-data-from-biofvm/
Plotting cells in space
3-D point cloud
First, let's plot all the cells in 3D:
plot3( MCDS.discrete_cells.state.position(:,1) , MCDS.discrete_cells.state.position(:,2), ... MCDS.discrete_cells.state.position(:,3) , 'bo' );
At first glance, this does not look good: some cells are far out of the simulation domain, distorting the automatic range of the plot:
This does not ordinarily happen in PhysiCell (the default cell mechanics functions have checks to prevent such behavior), but this example includes a simple Hookean elastic adhesion model for immune cell attachment to tumor cells. In rare circumstances, an attached tumor cell or immune cell can apoptose on its own (due to its background apoptosis rate),
without "knowing" to detach itself from the surviving cell in the pair. The remaining cell attempts to calculate its elastic velocity based upon an invalid cell position (no longer in memory), creating an artificially large velocity that "flings" it out of the simulation domain. Such cells are not simulated any further, so this is effectively equivalent to an extra apoptosis event (only 3 cells are out of the simulation domain after tens of millions of cell-cell elastic adhesion calculations). Future versions of this example will include extra checks to prevent this rare behavior.
The plot can simply be fixed by changing the axis:
axis( 1000*[-1 1 -1 1 -1 1] ) axis square
Notice that this is a very difficult plot to read, and very non-interactive (laggy) to rotation and scaling operations. We can make a slightly nicer plot by searching for different cell types and plotting them with different colors:
% make it easier to work with the cell positions; P = MCDS.discrete_cells.state.position; % find type 1 cells ind1 = find( MCDS.discrete_cells.metadata.type == 1 ); % better still, eliminate those out of the simulation domain ind1 = find( MCDS.discrete_cells.metadata.type == 1 & ... abs(P(:,1))' < 1000 & abs(P(:,2))' < 1000 & abs(P(:,3))' < 1000 ); % find type 0 cells ind0 = find( MCDS.discrete_cells.metadata.type == 0 & ... abs(P(:,1))' < 1000 & abs(P(:,2))' < 1000 & abs(P(:,3))' < 1000 ); %now plot them P = MCDS.discrete_cells.state.position; plot3( P(ind0,1), P(ind0,2), P(ind0,3), 'bo' ) hold on plot3( P(ind1,1), P(ind1,2), P(ind1,3), 'ro' ) hold off axis( 1000*[-1 1 -1 1 -1 1] ) axis square
However, this isn't much better. You can use the scatter3 function to gain more control on the size and color of the plotted cells, or even make macros to plot spheres in the cell locations (with shading and lighting), but Matlab is very slow when plotting beyond 103 cells. Instead, we recommend the faster preview functions below for data exploration, and higher-quality plotting (e.g., by POV-ray) for final publication-
Fast 3-D cell data previewers
Notice that plot3 and scatter3 are painfully slow for any nontrivial number of cells. We can use a few fast previewers to quickly get a sense of the data. First, let's plot all the dead cells, and make them red:
clf simple_plot( MCDS, MCDS, MCDS.discrete_cells.dead_cells , 'r' )
This function creates a coarse-grained 3-D indicator function (0 if no cells are present; 1 if they are), and plots a 3-D level surface. It is very responsive to rotations and other operations to explore the data. You may notice the second argument is a list of indices: only these cells are plotted. This gives you a method to select cells with specific characteristics when plotting. (More on that below.) If you want to get a sense of the interior structure, use a cutaway plot:
clf simple_cutaway_plot( MCDS, MCDS, MCDS.discrete_cells.dead_cells , 'r' )
We also provide a fast "composite" cutaway which plots all live cells as red, apoptotic cells as blue (without the cutaway), and all necrotic cells as black:
clf composite_cutaway_plot( MCDS )
Lastly, we show an improved plot that uses different colors for the immune cells, and Matlab's "find" function to help set up the indexing:
constants = set_MCDS_constants % find the type 0 necrotic cells ind0_necrotic = find( MCDS.discrete_cells.metadata.type == 0 & ... (MCDS.discrete_cells.phenotype.cycle.current_phase == constants.necrotic_swelling | ... MCDS.discrete_cells.phenotype.cycle.current_phase == constants.necrotic_lysed | ... MCDS.discrete_cells.phenotype.cycle.current_phase == constants.necrotic) ); % find the live type 0 cells ind0_live = find( MCDS.discrete_cells.metadata.type == 0 & ... (MCDS.discrete_cells.phenotype.cycle.current_phase ~= constants.necrotic_swelling & ... MCDS.discrete_cells.phenotype.cycle.current_phase ~= constants.necrotic_lysed & ... MCDS.discrete_cells.phenotype.cycle.current_phase ~= constants.necrotic & ... MCDS.discrete_cells.phenotype.cycle.current_phase ~= constants.apoptotic) ); clf % plot live tumor cells red, in cutaway view simple_cutaway_plot( MCDS, ind0_live , 'r' ); hold on % plot dead tumor cells black, in cutaway view simple_cutaway_plot( MCDS, ind0_necrotic , 'k' ) % plot all immune cells, but without cutaway (to show how they infiltrate) simple_plot( MCDS, ind1, 'g' ) hold off
A small cautionary note on future compatibility
PhysiCell 1.2.1 uses the <custom> data tag (allowed as part of the MultiCellDS specification) to encode its cell data, to allow a more compact data representation, because the current PhysiCell daft does not support such a formulation, and Matlab is painfully slow at parsing XML files larger than ~50 MB. Thus, PhysiCell snapshots are not yet fully compatible with general MultiCellDS tools, which would by default ignore custom data. In the future, we will make available converter utilities to transform "native" custom PhysiCell snapshots to MultiCellDS snapshots that encode all the cellular information in a more verbose but compatible XML format.
Closing words and future work
Because Octave is not a great option for parsing XML files (with critical MultiCellDS metadata), we plan to write similar functions to read and plot PhysiCell snapshots in Python, as an open source alternative. Moreover, our lab in the next year will focus on creating further MultiCellDS configuration, analysis, and visualization routines. We also plan to provide additional 3-D functions for plotting the discrete cells and varying color with their properties.
In the longer term, we will develop open source, stand-alone analysis and visualization tools for MultiCellDS snapshots (including PhysiCell snapshots). Please stay tuned!
Coarse-graining discrete cell cycle models
One observation that often goes underappreciated in computational biology discussions is that a computational model is often a model of a model of a model of biology: that is, it's a numerical approximation (a model) of a mathematical model of an experimental model of a real-life biological system. Thus, there are three big places where a computational investigation can fall flat:
- The experimental model may be a bad choice for the disease or process (not our fault).
- Second, the mathematical model of the experimental system may have flawed assumptions (something we have to evaluate).
- The numerical implementation may have bugs or otherwise be mathematically inconsistent with the mathematical model.
Critically, you can't use simulations to evaluate the experimental model or the mathematical model until you verify that the numerical implementation is consistent with the mathematical model, and that the numerical solution converges as \( \Delta t\) and \( \Delta x \) shrink to zero.
There are numerous ways to accomplish this, but ideally, it boils down to having some analytical solutions to the mathematical model, and comparing numerical solutions to these analytical or theoretical results. In this post, we're going to walk through the math of analyzing a typical type of discrete cell cycle model.
Discrete model
Suppose we have a cell cycle model consisting of phases \(P_1, P_2, \ldots P_n \), where cells in the \(P_i\) phase progress to the \(P_{i+1}\) phase after a mean waiting time of \(T_i\), and cells leaving the \(P_n\) phase divide into two cells in the \(P_1\) phase. Assign each cell agent \(k\) a current phenotypic phase \( S_k(t) \). Suppose also that each phase \( i \) has a death rate \( d_i \), and that cells persist for on average \( T_\mathrm{A} \) time in the dead state before they are removed from the simulation.
The mean waiting times \( T_i \) are equivalent to transition rates \( r_i = 1 / T_i \) (Macklin et al. 2012). Moreover, for any time interval \( [t,t+\Delta t] \), both are equivalent to a transition probability of
\[ \mathrm{Prob}\Bigl( S_k(t+\Delta t) = P_{i+1} | S(t) = P_i \Bigr) = 1 – e^{ -r_i \Delta t } \approx r_i \Delta t = \frac{ \Delta t}{ T_i}. \] In many discrete models (especially cellular automaton models) with fixed step sizes \( \Delta t \), models are stated in terms of transition probabilities \( p_{i,i+1} \), which we see are equivalent to the work above with \( p_{i,i+1} = r_i \Delta t = \Delta t / T_i \), allowing us to tie mathematical model forms to biological, measurable parameters. We note that each \(T_i\) is the average duration of the \( P_i \) phase.
Concrete example: a Ki67 Model
Ki-67 is a nuclear protein that is expressed through much of the cell cycle, including S, G2, M, and part of G1 after division. It is used very commonly in pathology to assess proliferation, particularly in cancer. See the references and discussion in (Macklin et al. 2012). In Macklin et al. (2012), we came up with a discrete cell cycle model to match Ki-67 data (along with cleaved Caspase-3 stains for apoptotic cells). Let's summarize the key parts here.
Each cell agent \(i\) has a phase \(S_i(t)\). Ki67- cells are quiescent (phase \(Q\), mean duration \( T_\mathrm{Q} \)), and they can enter the Ki67+ \(K_1\) phase (mean duration \(T_1\)). When \( K_1 \) cells leave their phase, they divide into two Ki67+ daughter cells in the \( K_2 \) phase with mean duration \( T_2 \). When cells exit \( K_2 \), they return to \( Q \). Cells in any phase can become apoptotic (enter the \( A \) phase with mean duration \( T_\mathrm{A} \)), with death rate \( r_\mathrm{A} \).
Coarse-graining to an ODE model
If each phase \(i\) has a death rate \(d_i\), if \( N_i(t) \) denotes the number of cells in the \( P_i \) phase at time \( t\), and if \( A(t) \) is the number of dead (apoptotic) cells at time \( t\), then on average, the number of cells in the \( P_i \) phase at the next time step is given by
\[ N_i(t+\Delta t) = N_i(t) + N_{i-1}(t) \cdot \left[ \textrm{prob. of } P_{i-1} \rightarrow P_i \textrm{ transition} \right] – N_i(t) \cdot \left[ \textrm{prob. of } P_{i} \rightarrow P_{i+1} \textrm{ transition} \right] \] \[ – N_i(t) \cdot \left[ \textrm{probability of death} \right] \] By the work above, this is:
\[ N_i(t+\Delta t) \approx N_i(t) + N_{i-1}(t) r_{i-1} \Delta t – N_i(t) r_i \Delta t – N_i(t) d_i \Delta t , \] or after shuffling terms and taking the limit as \( \Delta t \downarrow 0\), \[ \frac{d}{dt} N_i(t) = r_{i-1} N_{i-1}(t) – \left( r_i + d_i \right) N_i(t). \] Continuing this analysis, we obtain a linear system:
\[ \frac{d}{dt}{ \vec{N} } = \begin{bmatrix} -(r_1+d_1) & 0 & \cdots & 0 & 2r_n & 0 \\ r_1 & -(r_2+d_2) & 0 & \cdots & 0 & 0 \\ 0 & r_2 & -(r_3+d_3) & 0 & \cdots & 0 \\ & & \ddots & & \\0&\cdots&0 &r_{n-1} & -(r_n+d_n) & 0 \\ d_1 & d_2 & \cdots & d_{n-1} & d_n & -\frac{1}{T_\mathrm{A}} \end{bmatrix}\vec{N} = M \vec{N}, \] where \( \vec{N}(t) = [ N_1(t), N_2(t) , \ldots , N_n(t) , A(t) ] \).
For the Ki67 model above, let \(\vec{N} = [K_1, K_2, Q, A]\). Then the linear system is
\[ \frac{d}{dt} \vec{N} = \begin{bmatrix} -\left( \frac{1}{T_1} + r_\mathrm{A} \right) & 0 & \frac{1}{T_\mathrm{Q}} & 0 \\ \frac{2}{T_1} & -\left( \frac{1}{T_2} + r_\mathrm{A} \right) & 0 & 0 \\ 0 & \frac{1}{T_2} & -\left( \frac{1}{T_\mathrm{Q}} + r_\mathrm{A} \right) & 0 \\ r_\mathrm{A} & r_\mathrm{A} & r_\mathrm{A} & -\frac{1}{T_\mathrm{A}} \end{bmatrix} \vec{N} .\]
(If we had written \( \vec{N} = [Q, K_1, K_2 , A] \), then the matrix above would have matched the general form.)
Some theoretical results
If \( M\) has eigenvalues \( \lambda_1 , \ldots \lambda_{n+1} \) and corresponding eigenvectors \( \vec{v}_1, \ldots , \vec{v}_{n+1} \), then the general solution is given by
\[ \vec{N}(t) = \sum_{i=1}^{n+1} c_i e^{ \lambda_i t } \vec{v}_i ,\] and if the initial cell counts are given by \( \vec{N}(0) \) and we write \( \vec{c} = [c_1, \ldots c_{n+1} ] \), we can obtain the coefficients by solving \[ \vec{N}(0) = [ \vec{v}_1 | \cdots | \vec{v}_{n+1} ]\vec{c} .\] In many cases, it turns out that all but one of the eigenvalues (say \( \lambda \) with corresponding eigenvector \(\vec{v}\)) are negative. In this case, all the other components of the solution decay away, and for long times, we have \[ \vec{N}(t) \approx c e^{ \lambda t } \vec{v} .\] This is incredibly useful, because it says that over long times, the fraction of cells in the \( i^\textrm{th} \) phase is given by \[ v_{i} / \sum_{j=1}^{n+1} v_{j}. \]
Matlab implementation (with the Ki67 model)
First, let's set some parameters, to make this a little easier and reusable.
parameters.dt = 0.1; % 6 min = 0.1 hours parameters.time_units = 'hour'; parameters.t_max = 3*24; % 3 days parameters.K1.duration = 13; parameters.K1.death_rate = 1.05e-3; parameters.K1.initial = 0; parameters.K2.duration = 2.5; parameters.K2.death_rate = 1.05e-3; parameters.K2.initial = 0; parameters.Q.duration = 74.35 ; parameters.Q.death_rate = 1.05e-3; parameters.Q.initial = 1000; parameters.A.duration = 8.6; parameters.A.initial = 0;
Next, we write a function to read in the parameter values, construct the matrix (and all the data structures), find eigenvalues and eigenvectors, and create the theoretical solution. It also finds the positive eigenvalue to determine the long-time values.
function solution = Ki67_exact( parameters ) % allocate memory for the main outputs solution.T = 0:parameters.dt:parameters.t_max; solution.K1 = zeros( 1 , length(solution.T)); solution.K2 = zeros( 1 , length(solution.T)); solution.K = zeros( 1 , length(solution.T)); solution.Q = zeros( 1 , length(solution.T)); solution.A = zeros( 1 , length(solution.T)); solution.Live = zeros( 1 , length(solution.T)); solution.Total = zeros( 1 , length(solution.T)); % allocate memory for cell fractions solution.AI = zeros(1,length(solution.T)); solution.KI1 = zeros(1,length(solution.T)); solution.KI2 = zeros(1,length(solution.T)); solution.KI = zeros(1,length(solution.T)); % get the main parameters T1 = parameters.K1.duration; r1A = parameters.K1.death_rate; T2 = parameters.K2.duration; r2A = parameters.K2.death_rate; TQ = parameters.Q.duration; rQA = parameters.Q.death_rate; TA = parameters.A.duration; % write out the mathematical model: % d[Populations]/dt = Operator*[Populations] Operator = [ -(1/T1 +r1A) , 0 , 1/TQ , 0; ... 2/T1 , -(1/T2 + r2A) ,0 , 0; ... 0 , 1/T2 , -(1/TQ + rQA) , 0; ... r1A , r2A, rQA , -1/TA ]; % eigenvectors and eigenvalues [V,D] = eig(Operator); eigenvalues = diag(D); % save the eigenvectors and eigenvalues in case you want them. solution.V = V; solution.D = D; solution.eigenvalues = eigenvalues; % initial condition VecNow = [ parameters.K1.initial ; parameters.K2.initial ; ... parameters.Q.initial ; parameters.A.initial ] ; solution.K1(1) = VecNow(1); solution.K2(1) = VecNow(2); solution.Q(1) = VecNow(3); solution.A(1) = VecNow(4); solution.K(1) = solution.K1(1) + solution.K2(1); solution.Live(1) = sum( VecNow(1:3) ); solution.Total(1) = sum( VecNow(1:4) ); solution.AI(1) = solution.A(1) / solution.Total(1); solution.KI1(1) = solution.K1(1) / solution.Total(1); solution.KI2(1) = solution.K2(1) / solution.Total(1); solution.KI(1) = solution.KI1(1) + solution.KI2(1); % now, get the coefficients to write the analytic solution % [Populations] = c1*V(:,1)*exp( d(1,1)*t) + c2*V(:,2)*exp( d(2,2)*t ) + % c3*V(:,3)*exp( d(3,3)*t) + c4*V(:,4)*exp( d(4,4)*t ); coeff = linsolve( V , VecNow ); % find the (hopefully one) positive eigenvalue. % eigensolutions with negative eigenvalues decay, % leaving this as the long-time behavior. eigenvalues = diag(D); n = find( real( eigenvalues ) > 0 ) solution.long_time.KI1 = V(1,n) / sum( V(:,n) ); solution.long_time.KI2 = V(2,n) / sum( V(:,n) ); solution.long_time.QI = V(3,n) / sum( V(:,n) ); solution.long_time.AI = V(4,n) / sum( V(:,n) ) ; solution.long_time.KI = solution.long_time.KI1 + solution.long_time.KI2; % now, write out the solution at all the times for i=2:length( solution.T ) % compact way to write the solution VecExact = real( V*( coeff .* exp( eigenvalues*solution.T(i) ) ) ); solution.K1(i) = VecExact(1); solution.K2(i) = VecExact(2); solution.Q(i) = VecExact(3); solution.A(i) = VecExact(4); solution.K(i) = solution.K1(i) + solution.K2(i); solution.Live(i) = sum( VecExact(1:3) ); solution.Total(i) = sum( VecExact(1:4) ); solution.AI(i) = solution.A(i) / solution.Total(i); solution.KI1(i) = solution.K1(i) / solution.Total(i); solution.KI2(i) = solution.K2(i) / solution.Total(i); solution.KI(i) = solution.KI1(i) + solution.KI2(i); end return;
Now, let's run it and see what this thing looks like:
Next, we plot KI1, KI2, and AI versus time (solid curves), along with the theoretical long-time behavior (dashed curves). Notice how well it matches–it's neat when theory works! :-)
Some readers may recognize the long-time fractions: KI1 + KI2 = KI = 0.1743, and AI = 0.00833, very close to the DCIS patient values from our simulation study in Macklin et al. (2012) and improved calibration work in Hyun and Macklin (2013).
Comparing simulations and theory
I wrote a small Matlab program to implement the discrete model: start with 1000 cells in the \(Q\) phase, and in each time interval \([t,t+\Delta t]\), each cell "decides" whether to advance to the next phase, stay in the same phase, or apoptose. If we compare a single run against the theoretical curves, we see hints of a match:
If we average 10 simulations and compare, the match is better:
And lastly, if we average 100 simulations and compare, the curves are very difficult to tell apart:
Even in logarithmic space, it's tough to tell these apart:
The following matlab files (available here) can be used to reproduce this post:
- Ki67_exact.m
- The function defined above to create the exact solution using the eigenvalue/eignvector approach.
- Ki67_stochastic.m
- Runs a single stochastic simulation, using the supplied parameters.
- script.m
- Runs the theoretical solution first, creates plots, and then runs the stochastic model 100 times for comparison.
To make it all work, simply run "script" at the command prompt. Please note that it will generate some png files in its directory.
Closing thoughts
In this post, we showed a nice way to check a discrete model against theoretical behavior–both in short-term dynamics and long-time behavior. The same work should apply to validating many discrete models. However, when you add spatial effects (e.g., a cellular automaton model that won't proliferate without an empty neighbor site), I wouldn't expect a match. (But simulating cells that initially have a "salt and pepper", random distribution should match this for early times.)
Moreover, models with deterministic phase durations (e.g., K1, K2, and A have fixed durations) aren't consistent with the ODE model above, unless the cells they are each initialized with a random amount of "progress" in their initial phases. (Otherwise, the cells in each phase will run synchronized, and there will be fixed delays before cells transition to other phases.) Delay differential equations better describe such models. However, for long simulation times, the slopes of the sub-populations and the cell fractions should start to better and better match the ODE models.
Now that we have verified that the discrete model is performing as expected, we can have greater confidence in its predictions, and start using those predictions to assess the underlying models. In ODE and PDE models, you often validate the code on simpler problems where you have an analytical solution, and then move on to making simulation predictions in cases where you can't solve analytically. Similarly, we can now move on to variants of the discrete model where we can't as easily match ODE theory (e.g., time-varying rate parameters, spatial effects), but with the confidence that the phase transitions are working as they should.
BioFVM warmup: 2D continuum simulation of tumor growth
Note: This is part of a series of "how-to" blog posts to help new users and developers of BioFVM. See also the guides to setting up a C++ compiler in Windows or OSX.
What you'll need
- A working C++ development environment with support for OpenMP. See these prior tutorials if you need help.
- A download of BioFVM, available at http://BioFVM.MathCancer.org and http://BioFVM.sf.net. Use Version 1.0.3 or later.
- Matlab or Octave for visualization. Matlab might be available for free at your university. Octave is open source and available from a variety of sources.
Our modeling task
We will implement a basic 2-D model of tumor growth in a heterogeneous microenvironment, with inspiration by glioblastoma models by Kristin Swanson, Russell Rockne and others (e.g., this work), and continuum tumor growth models by Hermann Frieboes, John Lowengrub, and our own lab (e.g., this paper and this paper).
We will model tumor growth driven by a growth substrate, where cells die when the growth substrate is insufficient. The tumor cells will have motility. A continuum blood vasculature will supply the growth substrate, but tumor cells can degrade this existing vasculature. We will revisit and extend this model from time to time in future tutorials.
Mathematical model
Taking inspiration from the groups mentioned above, we'll model a live cell density ρ of a relatively low-adhesion tumor cell species (e.g., glioblastoma multiforme). We'll assume that tumor cells move randomly towards regions of low cell density (modeled as diffusion with motility μ). We'll assume that that the net birth rate rB is proportional to the concentration of growth substrate σ, which is released by blood vasculature with density b. Tumor cells can degrade the tissue and hence this existing vasculature. Tumor cells die at rate rD when the growth substrate level is too low. We assume that the tumor cell density cannot exceed a max level ρmax. A model that includes these effects is:
\[ \frac{ \partial \rho}{\partial t} = \mu \nabla^2 \rho + r_B(\sigma)\rho \left( 1 – \frac{ \rho}{\rho_\textrm{max}} \right) – r_D(\sigma) \rho \]
\[ \frac{ \partial b}{\partial t} = – r_\textrm{degrade} \rho b \]
\[ \frac{\partial \sigma}{ \partial t} = D\nabla^2 \sigma – \lambda_a \sigma – \lambda_2 \rho \sigma + r_\textrm{deliv}b \left( \sigma_\textrm{max} – \sigma \right) \]
where for the birth and death rates, we'll use the constitutive relations:
\[ r_B(\sigma) = r_B \textrm{ max} \left( \frac{\sigma – \sigma_\textrm{min}}{ \sigma_\textrm{ max} – \sigma_\textrm{min} } , 0 \right)\]
\[r_D(\sigma) = r_D \textrm{ max} \left( \frac{ \sigma_\textrm{min} – \sigma}{\sigma_\textrm{min}} , 0 \right) \]
Mapping the model onto BioFVM
BioFVM solves on a vector u of substrates. We'll set u = [ρ , b, σ ]. The code expects PDEs of the general form:
\[ \frac{\partial q}{\partial t} = D\nabla^2 q – \lambda q + S\left( q^* – q \right) – Uq\]
So, we determine the decay rate (λ), source function (S), and uptake function (U) for the cell density ρ and the growth substrate σ.
Cell density
We first slightly rewrite the PDE:
\[ \frac{ \partial \rho}{\partial t} = \mu \nabla^2 \rho + r_B(\sigma) \frac{ \rho}{\rho_\textrm{max}} \left( \rho_\textrm{max} – \rho \right) – r_D(\sigma)\rho \]
and then try to match to the general form term-by-term. While BioFVM wasn't intended for solving nonlinear PDEs of this form, we can make it work by quasi-linearizing, with the following functions:
\[ S = r_B(\sigma) \frac{ \rho }{\rho_\textrm{max}} \hspace{1in} U = r_D(\sigma). \]
When implementing this, we'll evaluate σ and ρ at the previous time step. The diffusion coefficient is μ, and the decay rate is zero. The target or saturation density is ρmax.
Growth substrate
Similarly, by matching the PDE for σ term-by-term with the general form, we use:
\[ S = r_\textrm{deliv}b, \hspace{1in} U = \lambda_2 \rho. \]
The diffusion coefficient is D, the decay rate is λ1, and the saturation density is σmax.
Blood vessels
Lastly, a term-by-term matching of the blood vessel equation gives the following functions:
\[ S=0 \hspace{1in} U = r_\textrm{degrade}\rho. \]
The diffusion coefficient, decay rate, and saturation density are all zero.
Implementation in BioFVM
- Start a project: Create a new directory for your project (I'd recommend "BioFVM_2D_tumor"), and enter the directory. Place a copy of BioFVM (the zip file) into your directory. Unzip BioFVM, and copy BioFVM*.h, BioFVM*.cpp, and pugixml* files into that directory.
- Copy the matlab visualization files: To help read and plot BioFVM data, we have provided matlab files. Copy all the *.m files from the matlab subdirectory to your project.
- Copy the empty project: BioFVM Version 1.0.3 or later includes a template project and Makefile to make it easier to get started. Copy the Makefile and template_project.cpp file to your project. Rename template_project.cpp to something useful, like 2D_tumor_example.cpp.
- Edit the makefile: Open a terminal window and browse to your project. Tailor the makefile to your new project:
notepad++ Makefile
Change the PROGRAM_NAME to 2Dtumor.
Also, rename main to 2D_tumor_example throughout the Makefile.
Lastly, note that if you are using OSX, you'll probably need to change from "g++" to your installed compiler. See these tutorials.
- Start adapting 2D_tumor_example.cpp: First, open 2D_tumor_example.cpp:
notepad++ 2D_tumor_example.cpp
Just after the "using namespace BioFVM" section of the code, define useful globals. Here and throughout, new and/or modified code is in blue:
using namespace BioFVM: // helpful -- have indices for each "species" int live_cells = 0; int blood_vessels = 1; int oxygen = 2; // some globals double prolif_rate = 1.0 /24.0; double death_rate = 1.0 / 6; // double cell_motility = 50.0 / 365.25 / 24.0 ; // 50 mm^2 / year --> mm^2 / hour double o2_uptake_rate = 3.673 * 60.0; // 165 micron length scale double vessel_degradation_rate = 1.0 / 2.0 / 24.0 ; // 2 days to disrupt tissue double max_cell_density = 1.0; double o2_supply_rate = 10.0; double o2_normoxic = 1.0; double o2_hypoxic = 0.2;
- Set up the microenvironment: Within main(), make sure we have the right number of substrates, and set them up:
// create a microenvironment, and set units Microenvironment M; M.name = "Tumor microenvironment"; M.time_units = "hr"; M.spatial_units = "mm"; M.mesh.units = M.spatial_units; // set up and add all the densities you plan M.set_density( 0 , "live cells" , "cells" ); M.add_density( "blood vessels" , "vessels/mm^2" ); M.add_density( "oxygen" , "cells" ); // set the properties of the diffusing substrates M.diffusion_coefficients[live_cells] = cell_motility; M.diffusion_coefficients[blood_vessels] = 0; M.diffusion_coefficients[oxygen] = 6.0; // 1e5 microns^2/min in units mm^2 / hr M.decay_rates[live_cells] = 0; M.decay_rates[blood_vessels] = 0; M.decay_rates[oxygen] = 0.01 * o2_uptake_rate; // 1650 micron length scale
Notice how our earlier global definitions of "live_cells", "blood_vessels", and "oxygen" makes it easier to make sure we're referencing the correct substrates in lines like these.
- Resize the domain and test: For this example (and so the code runs very quickly), we'll work in 2D in a 2 cm × 2 cm domain:
// set the mesh size double dx = 0.05; // 50 microns M.resize_space( 0.0 , 20.0 , 0, 20.0 , -dx/2.0, dx/2.0 , dx, dx, dx );
Notice that we use a tissue thickness of dx/2 to use the 3D code for a 2D simulation. Now, let's test:
make 2Dtumor
Go ahead and cancel the simulation [Control]+C after a few seconds. You should see something like this:
Starting program ... Microenvironment summary: Tumor microenvironment: Mesh information: type: uniform Cartesian Domain: [0,20] mm x [0,20] mm x [-0.025,0.025] mm resolution: dx = 0.05 mm voxels: 160000 voxel faces: 0 volume: 20 cubic mm Densities: (3 total) live cells: units: cells diffusion coefficient: 0.00570386 mm^2 / hr decay rate: 0 hr^-1 diffusion length scale: 75523.9 mm blood vessels: units: vessels/mm^2 diffusion coefficient: 0 mm^2 / hr decay rate: 0 hr^-1 diffusion length scale: 0 mm oxygen: units: cells diffusion coefficient: 6 mm^2 / hr decay rate: 2.2038 hr^-1 diffusion length scale: 1.65002 mm simulation time: 0 hr (100 hr max) Using method diffusion_decay_solver__constant_coefficients_LOD_3D (implicit 3-D LOD with Thomas Algorithm) ... simulation time: 10 hr (100 hr max) simulation time: 20 hr (100 hr max)
- Set up initial conditions: We're going to make a small central focus of tumor cells, and a "bumpy" field of blood vessels.
// set initial conditions // use this syntax to create a zero vector of length 3 // std::vector<double> zero(3,0.0); std::vector<double> center(3); center[0] = M.mesh.x_coordinates[M.mesh.x_coordinates.size()-1] /2.0; center[1] = M.mesh.y_coordinates[M.mesh.y_coordinates.size()-1] /2.0; center[2] = 0; double radius = 1.0; std::vector<double> one( M.density_vector(0).size() , 1.0 ); double pi = 2.0 * asin( 1.0 ); // use this syntax for a parallelized loop over all the // voxels in your mesh: #pragma omp parallel for for( int i=0; i < M.number_of_voxels() ; i++ ) { std::vector<double> displacement = M.voxels(i).center – center; double distance = norm( displacement ); if( distance < radius ) { M.density_vector(i)[live_cells] = 0.1; } M.density_vector(i)[blood_vessels]= 0.5 + 0.5*cos(0.4* pi * M.voxels(i).center[0])*cos(0.3*pi *M.voxels(i).center[1]); M.density_vector(i)[oxygen] = o2_normoxic; }
- Change to a 2D diffusion solver:
// set up the diffusion solver, sources and sinks M.diffusion_decay_solver = diffusion_decay_solver__constant_coefficients_LOD_2D;
- Set the simulation times: We'll simulate 10 days, with output every 12 hours.
double t = 0.0; double t_max = 10.0 * 24.0; // 10 days double dt = 0.1; double output_interval = 12.0; // how often you save data double next_output_time = t; // next time you save data
- Set up the source function:
void supply_function( Microenvironment* microenvironment, int voxel_index, std::vector<double>* write_here ) { // use this syntax to access the jth substrate write_here // (*write_here)[j] // use this syntax to access the jth substrate in voxel voxel_index of microenvironment: // microenvironment->density_vector(voxel_index)[j] static double temp1 = prolif_rate / ( o2_normoxic – o2_hypoxic ); (*write_here)[live_cells] = microenvironment->density_vector(voxel_index)[oxygen]; (*write_here)[live_cells] -= o2_hypoxic; if( (*write_here)[live_cells] < 0.0 ) { (*write_here)[live_cells] = 0.0; } else { (*write_here)[live_cells] = temp1; (*write_here)[live_cells] *= microenvironment->density_vector(voxel_index)[live_cells]; } (*write_here)[blood_vessels] = 0.0; (*write_here)[oxygen] = o2_supply_rate; (*write_here)[oxygen] *= microenvironment->density_vector(voxel_index)[blood_vessels]; return; }
Notice the use of the static internal variable temp1: the first time this function is called, it declares this helper variable (to save some multiplication operations down the road). The static variable is available to all subsequent calls of this function.
- Set up the target function (substrate saturation densities):
void supply_target_function( Microenvironment* microenvironment, int voxel_index, std::vector<double>* write_here ) { // use this syntax to access the jth substrate write_here // (*write_here)[j] // use this syntax to access the jth substrate in voxel voxel_index of microenvironment: // microenvironment->density_vector(voxel_index)[j] (*write_here)[live_cells] = max_cell_density; (*write_here)[blood_vessels] = 1.0; (*write_here)[oxygen] = o2_normoxic; return; }
- Set up the uptake function:
void uptake_function( Microenvironment* microenvironment, int voxel_index, std::vector<double>* write_here ) { // use this syntax to access the jth substrate write_here // (*write_here)[j] // use this syntax to access the jth substrate in voxel voxel_index of microenvironment: // microenvironment->density_vector(voxel_index)[j] (*write_here)[live_cells] = o2_hypoxic; (*write_here)[live_cells] -= microenvironment->density_vector(voxel_index)[oxygen]; if( (*write_here)[live_cells] < 0.0 ) { (*write_here)[live_cells] = 0.0; } else { (*write_here)[live_cells] *= death_rate; } (*write_here)[oxygen] = o2_uptake_rate ; (*write_here)[oxygen] *= microenvironment->density_vector(voxel_index)[live_cells]; (*write_here)[blood_vessels] = vessel_degradation_rate ; (*write_here)[blood_vessels] *= microenvironment->density_vector(voxel_index)[live_cells]; return; }
And that's it. The source should be ready to go!
Source files
You can download completed source for this example here:
Using the code
Running the code
First, compile and run the code:
make 2Dtumor
The output should look like this.
Starting program … Microenvironment summary: Tumor microenvironment: Mesh information: type: uniform Cartesian Domain: [0,20] mm x [0,20] mm x [-0.025,0.025] mm resolution: dx = 0.05 mm voxels: 160000 voxel faces: 0 volume: 20 cubic mm Densities: (3 total) live cells: units: cells diffusion coefficient: 0.00570386 mm^2 / hr decay rate: 0 hr^-1 diffusion length scale: 75523.9 mm blood vessels: units: vessels/mm^2 diffusion coefficient: 0 mm^2 / hr decay rate: 0 hr^-1 diffusion length scale: 0 mm oxygen: units: cells diffusion coefficient: 6 mm^2 / hr decay rate: 2.2038 hr^-1 diffusion length scale: 1.65002 mm simulation time: 0 hr (240 hr max) Using method diffusion_decay_solver__constant_coefficients_LOD_2D (2D LOD with Thomas Algorithm) … simulation time: 12 hr (240 hr max) simulation time: 24 hr (240 hr max) simulation time: 36 hr (240 hr max) simulation time: 48 hr (240 hr max) simulation time: 60 hr (240 hr max) simulation time: 72 hr (240 hr max) simulation time: 84 hr (240 hr max) simulation time: 96 hr (240 hr max) simulation time: 108 hr (240 hr max) simulation time: 120 hr (240 hr max) simulation time: 132 hr (240 hr max) simulation time: 144 hr (240 hr max) simulation time: 156 hr (240 hr max) simulation time: 168 hr (240 hr max) simulation time: 180 hr (240 hr max) simulation time: 192 hr (240 hr max) simulation time: 204 hr (240 hr max) simulation time: 216 hr (240 hr max) simulation time: 228 hr (240 hr max) simulation time: 240 hr (240 hr max) Done!
Looking at the data
Now, let's pop it open in matlab (or octave):
To load and plot a single time (e.g., the last tim)
!ls *.mat M = read_microenvironment( 'output_240.000000.mat' ); plot_microenvironment( M );
To add some labels:
labels{1} = 'tumor cells'; labels{2} = 'blood vessel density'; labels{3} = 'growth substrate'; plot_microenvironment( M ,labels );
Your output should look a bit like this:
Lastly, you might want to script the code to create and save plots of all the times.
labels{1} = 'tumor cells'; labels{2} = 'blood vessel density'; labels{3} = 'growth substrate'; for i=0:20 t = i*12; input_file = sprintf( 'output_%3.6f.mat', t ); output_file = sprintf( 'output_%3.6f.png', t ); M = read_microenvironment( input_file ); plot_microenvironment( M , labels ); print( gcf , '-dpng' , output_file ); end
What's next
We'll continue posting new tutorials on adapting BioFVM to existing and new simulators, as well as guides to new features as we roll them out.
Stay tuned and watch this blog!


text:
Hit The Showers - Face & Body Cleansing Wipes
Hit The Showers - Face & Body Cleansing Wipes is rated out of 5 by 11.
This is not your average makeup wipe! The Hit the Showers Face and Body Cleansing Wipes let you go from ballet barre class to date night, quicker than that last 8 count. This gym bag essential busts up sweat, dirt, and oil, breaks down makeup, removes signs of odor and instantly refreshes skin with a lightweight fragrance in just one simple swipe.
- Leaves skin soft, clean and refreshed
- Good for all skin types
Cruelty Free. Gluten-Free. Vegan.
Remove dirt, oil, makeup and sweat with one swipe.
Water/Eau, Alcohol, Propylene Glycol, Caprylyl/Capryl Glucoside, Menthol, Disodium EDTA, Chlorphenesin, Cetylpyridinium Chloride, 2-Bromo-2-Nitropropane-1,3-Diol, Mentha Arvensis Leaf Oil, Menthyl Lactate, Sodium Citrate.


text:
- This event has passed.
University Championships
December 3, 2016 @ 10:00 am - December 4, 2016 @ 7:00 pm| 1£ - 20£
Event Navigation
- Regular Entry Price: £65
- Early Bird Entry Price: £60
- Early Bird Closing Date: 21st November 2016
- All Entries Close on: 28th November 2016
Start Time
10am both days
Events taking place
• Men's University Championships
• Women's University Championships
Event details
The UKDBA University Championships is open to entry from all University Dodgeball Clubs in the UK. Players must be aged 16 or over and registered with the UKDBA. All players competing must be in possession of a valid student ID for this current year. Teams competing must belong to an affiliated university dodgeball club. The UKDBA University Championships is played to UKDBA Match Rules under UKDBA Tournament Regulations. All teams competing will play a minimum of 4 matches. There will be a Plate competition in the men's event.
Saturday: Women's University Championships
Sunday: Men's University Championships
Trophy for Men's, Women's, Men's Plate and Women's Plate winners.
Medals for players from 1st, 2nd and plate winners in both categories
Schedule & Groups
Entries for this Tournament are now closed.


text:
Action |
Adventure |
Animation |
Family |
Action |
Adventure |
Animation |
Family |
Superman's clone, Bizarro, has become an embarrassing problem. Chaos and destruction follow Bizarro everywhere as he always hears the opposite of what is said, says the opposite of what he means and does the opposite of what is right. And when the citizens of Metropolis keep confusing Bizarro with Superman, the Man of Steel decides it's time to find a new home for him…on another planet! It's up to the Justice League to come to terms with their backward counterparts and team up with them to stop Darkseid and save the galaxy!
Directed By:
Brandon Vietti
Star Cast:
Nolan North ,
Troy Baker ,
Diedrich Bader ,
Khary Payton ,
dc comics
based on comic
super power
Nolan North
Superman and Bizarro (Voice)
Troy Baker
Bruce Wayne/Batman and Batzarro (Voice)
Diedrich Bader
Guy Gardner / Greenzarro (voice)
Khary Payton
Cyborg and Cyzarro (Voice)
James Arnold Taylor
The Flash (Voice)
John DiMaggio
Lex Luthor / Deathstroke (voice)
Kari Wahlgren
Wonder Woman / Bizzara (voice)
Tony Todd
Darkseid (voice)
Tom Kenny
Penguin / Plastic Man (voice)
Phil Morris
Green Arrow / Hawkman (voice)
Kevin Michael Richardson
Captain Cold / Gorilla Grodd (voice)
April Winchell
Giganta (voice)


text:
The "Dry Capital of the World" will be flowing with local craft beer on September 15 during Uptown Untapped.
Uptown Untapped is a craft beer festival recognizing Westerville's rich history as a hub for the temperance movement and celebrating the bright future of the city's unique Uptown district. The fest touts local breweries, restaurants and musicians on the same streets that once connected the Anti-Saloon League with the rest of the country.
Twenty local breweries will be pouring at the event including 2 Tones, Actual, Combustion, Commonhouse, Elevator, Four String, Ill Mannered, Land-Grant, Lineage, Loose Rail, North High, Pigskin, The Ram, Restoration, Seventh Son, Sideswipe, Temperance Row, Three Tigers, Wolf's Ridge and Zaftig.
General admission tickets are available for $35 and include 20 tastings and a tasting glass. VIP tickets, which also include early admission, a swag bag and access to a private restroom, are $45. DD tickets are also available for $10.
Food will be available at the event from Asterisk Supper Club, Phatt Taco/Tostadilicious, Old Bag of Nails, Barrel and Boar, and Shirley's Gourmet Popcorn.
Upwown Untapped will take place in Uptown Westerville on Saturday, September 15 from 6-10pm. Tickets can be purchased online.


text:
Dennis Yu had my wheels turning after a recent article about How to run an effective Facebook campaign for $5. In the article he describes how to micro target an ad for very little money. I couldn't wait to try it. Facebook ad campaigns have the ability to be highly targeted because Facebook users, without really thinking about it, give up enormous amounts of data to marketers. They willingly share their name, age, gender, interests, likes, workplace, high school and college. They upload and tag photos of their friends and create a digital footprint with every fan page they like.
Think about that! Imagine if I stopped you on the street for a survey and asked you to give me all that data. "Excuse me, can I have your name, birthdate, photos of your friends, where you work and went to school?" You probably wouldn't do it, right? Well most likely you, like everyone else on Facebook, already have. This is why Facebook ads have so much potential.
So, like Dennis' example I decided to use that data to create a micro targeted ad to get the attention of one person, my partner Rhonda Crum. Rhonda is actively using social media to promote her business ( Bee Honey Healthy if you want to check out her site) so I thought she'd be a good guinea pig for my experiment.
I created a campaign for her with the following criteria:
- who live within 50 miles of Cincinnati,OH
- between the ages of 54 and 56 inclusive
- who are female
- who graduated from Miami University
- who are in a relationship
- who are interested in bicycling
I had some problems. Of the more than 600 million users on Facebook less than 20 people met the criteria, which is too few for Facebook's rules. So I removed bicycling which increased the list to less than 80. Voila! I set my budget at $11.00 for the campaign and chose to pay only for clickthroughs.
According to the analytics on my campaign there were 256 impressions. Great! Here's the problem. Rhonda never saw the ad. Now, since there were no clickthroughs the ad didn't cost me a thing, but it also didn't accomplish my goal.
This was just one experiment and one set of criteria, but it does make me wonder. When I finally told her about my experiment Rhonda admitted that the ad very well could have displayed, but she probably didn't notice it because it just blends into everything else that's happening on Facebook. She couldn't distinguish it from the suggested pages, other ads and activity feeds.
Prove me wrong here. If you've had a positive ROI from Facebook ads I'd love to hear from you. Share your comments here with me, on my Facebook page, or on Twitter @suereynolds.
Read more posts on Carmine Media »


text:
Razer smartphone photo leak
After acquiring Nextbit it was only a matter of time before Razer dipped its toes into the smartphone pond. And now we have a better picture of "some" details (Thanks to TechByte website) about there first phone. The leaked photo is evidently from a source working in the games industry.
The picture does not show much more than a dual camera sensor, and from the looks of it it will be fairly large, which fits in with Min-Liang's statement that it would be focused on gaming and entertainment.


text:
סמינר כימיה פיזקאלית ואנאליטית
מרצה: Shira Bar-Zvi
מיקום: חדר סמינרים פקולטי
The major light harvesting antenna in cyanobacteria and red algae is the phycobilisome (PBS). The PBS typically contains different subunits, and energy efficiently flows from high (phycocyanin, PC) to low (allophycocyanin, APC) energy absorbing subunits. The smallest PBS identified to date is that of Acaryochloris marina (A. marina), composed of a single rod.
We have determined the crystal structure of A. marina PC (AmPC), the major phycobiliprotein (PBP) component of the A. marina PBS (AmPBS) to 2.1 Å. The basic unit of the AmPC is a heterodimer of two related subunits (α and β); two such α and two β isoforms, the products of simultaneous expression of different genes, turned out to be superimposed in the asymmetric unit of the PC monomer structure. We have isolated several PC types from the A. marina, of different spectral properties, corresponding with a different PC α and β isoform ratio. These include a PC type exhibiting APC-like characteristics, suggesting it can efficiently serve as the AmPBS terminal emitter. This is the first PC found to date, transferring energy in a way that challenges the currently known PBP classification system. The lack of APC in the AmPBS, as determined in this study, together with the novel AmPC types, suggest that the AmPBS may be the first PBS to operate without APC, solely based on one multi-functional PBP. The unique properties of the AmPBS and its components uncovered in this work are suggesting a new type of PBP energy transfer mechanism. Structural analysis of the two PC isoforms protein structure has indicated possible modifications to the phycocyanobilin chromophore protein environment, which may be responsible for this altered energy transfer capabilities of the different AmPC types. Additionally, combined spectroscopic and kinetic analysis of time-resolved fluorescence and absorption data of this antenna allowed us to identify spectrally different forms of chromophores and to propose a new minimal model of how they may be distributed within the AmPBS structure.


text:
Myanmar Oct 22 - Nov 3, 2018, SR1390
- Oct 22 2018 - Nov 3 2018
- Global Health Outreach
Opportunity Overview
This trip is now closed. Check out our other trips here.
We welcome physicians, dentists, pharmacists, optometrists, ophthalmologists, physician assistants, nurse practitioners, nurses, first responders, dental hygienists, dental assistants, physical/occupational therapists, students, logistics (non-medical helpers), and a trip photographer/videographer on all of our general medicine and dentistry trips.
Global Health Outreach will be taking its third trip to Myanmar, formerly called Burma, in October 2018. Myanmar is nestled between India and Bangladesh on the west, China on the north/northeast and Thailand on the east, and has slowly begun to open up to outside influences. A nominally civilian government was introduced in 2011, while November 2015 elections have given more hope to the people of Myanmar. Business, tourism and even religious freedom advocates are all hoping to see improvement for the daily lives of the Myanmar peoples.
Our last team served in the capital city and then took a short domestic flight to a small city in the mountains, where we served for several more days. In each site we experienced an amazing welcome and warmth by the Myanmar population. This year we will again serve in both of these sites, including in a boys detention center where we expect to broaden our impact to some 400 boys.
Our 2018 team will be limited to 15 team members comprised of 4-5 medical providers (including a dermatologist), 2 dentists, 1-2 hygienists, 1 pharmacist, 1 physical therapist, 2-3 nurses and 2 non-medical team members.
Please prayerfully consider joining this second trip for GHO to Myanmar.
Team Leader: Ron Brown - [email protected]
Global Health Outreach
P.O. Box 7500 • Bristol TN 37621
Phone: 888-230-2637
Fax: 423-764-1417
Stories Tell your story
Cost: $3,875.00
Application Fee: $150.00
|Due Date
|Application Fee (due upon applying/acceptance)
|Project Fee (due two weeks prior to trip)
|Estimated International Airfare (will be adjusted to actual airfare total and is due upon ticketing)
|Estimated Domestic Airfare (will be adjusted to actual airfare total and is due upon ticketing)
|Due Date
|Waiver of Responsibility Form
|Your application is not complete until this form is completed.
|Team Participant Manual
|An in-depth manual to guide you start-to-finish on your GHO trip.
|Frequently Asked Questions - Applying for a Trip
|Frequently Asked Questions - Trips
|Frequently Asked Questions - Trip Costs
|Frequently Asked Questions - Travel
|Frequently Asked Questions - Passports & Visas
- Important Note! The expiration date on your valid passport MUST be 6 months beyond the return date of your trip. We recommend g3visas.com.
- Foreign language skills are appreciated, but not required
- Immunizations
- Attending morning and evening team meetings, including devotions
- Serving in the capacity of position on team and/or at direction of the team leader
- Read "Team Participant Manual" located under Forms.
- Begin Fundraising
- Submit all requested documents to GHO right away
- Immunizations - www.cdc.gov/travel
Similar Opportunities
15 going