`); let searchUrl = `/search/`; history.forEach((elem) => { prevsearch.find('#prevsearch-options').append(`
${elem} `); }); } $('#search-pretype-options').empty(); $('#search-pretype-options').append(prevsearch); let prevbooks = $(false); [ {title:"Recently Opened Textbooks", books:previous_books}, {title:"Recommended Textbooks", books:recommended_books} ].forEach((book_segment) => { if (Array.isArray(book_segment.books) && book_segment.books.length>0 && nsegments<2) { nsegments+=1; prevbooks = $(`
${book_segment.title} `); let searchUrl = "/books/xxx/"; book_segment.books.forEach((elem) => { prevbooks.find('#prevbooks-options'+nsegments.toString()).append(`
${elem.title} ${ordinal(elem.edition)} ${elem.author} `); }); } $('#search-pretype-options').append(prevbooks); }); } function anon_pretype() { let prebooks = null; try { prebooks = JSON.parse(localStorage.getItem('PRETYPE_BOOKS_ANON')); }catch(e) {} if ('previous_books' in prebooks && 'recommended_books' in prebooks) { previous_books = prebooks.previous_books; recommended_books = prebooks.recommended_books; if (typeof PREVBOOKS !== 'undefined' && Array.isArray(PREVBOOKS)) { new_prevbooks = PREVBOOKS; previous_books.forEach(elem => { for (let i = 0; i < new_prevbooks.length; i++) { if (elem.id == new_prevbooks[i].id) { return; } } new_prevbooks.push(elem); }); new_prevbooks = new_prevbooks.slice(0,3); previous_books = new_prevbooks; } if (typeof RECBOOKS !== 'undefined' && Array.isArray(RECBOOKS)) { new_recbooks = RECBOOKS; for (let j = 0; j < new_recbooks.length; j++) { new_recbooks[j].viewed_at = new Date(); } let insert = true; for (let i=0; i < recommended_books.length; i++){ for (let j = 0; j < new_recbooks.length; j++) { if (recommended_books[i].id == new_recbooks[j].id) { insert = false; } } if (insert){ new_recbooks.push(recommended_books[i]); } } new_recbooks.sort((a,b)=>{ adate = new Date(2000, 0, 1); bdate = new Date(2000, 0, 1); if ('viewed_at' in a) {adate = new Date(a.viewed_at);} if ('viewed_at' in b) {bdate = new Date(b.viewed_at);} // 100000000: instead of just erasing the suggestions from previous week, // we just move them to the back of the queue acurweek = ((new Date()).getDate()-adate.getDate()>7)?0:100000000; bcurweek = ((new Date()).getDate()-bdate.getDate()>7)?0:100000000; aviews = 0; bviews = 0; if ('views' in a) {aviews = acurweek+a.views;} if ('views' in b) {bviews = bcurweek+b.views;} return bviews - aviews; }); new_recbooks = new_recbooks.slice(0,3); recommended_books = new_recbooks; } localStorage.setItem('PRETYPE_BOOKS_ANON', JSON.stringify({ previous_books: previous_books, recommended_books: recommended_books })); build_popup(); } } var whiletyping_search_object = null; var whiletyping_search = { books: [], curriculum: [], topics: [] } var single_whiletyping_ajax_promise = null; var whiletyping_database_initial_burst = 0; //number of consecutive calls, after 3 we start the 1 per 5 min calls function get_whiletyping_database() { //gets the database from the server. // 1. by validating against a local database value we confirm that the framework is working and // reduce the ammount of continuous calls produced by errors to 1 per 5 minutes. return localforage.getItem('whiletyping_last_attempt').then(function(value) { if ( value==null || (new Date()) - (new Date(value)) > 1000*60*5 || (whiletyping_database_initial_burst < 3) ) { localforage.setItem('whiletyping_last_attempt', (new Date()).getTime()); // 2. Make an ajax call to the server and get the search database. let databaseUrl = `/search/whiletype_database/`; let resp = single_whiletyping_ajax_promise; if (resp === null) { whiletyping_database_initial_burst = whiletyping_database_initial_burst + 1; single_whiletyping_ajax_promise = resp = new Promise((resolve, reject) => { $.ajax({ url: databaseUrl, type: 'POST', data:{csrfmiddlewaretoken: "Im0wKZCApYiQvXYxxQ9C5ZFN6z1uONJ5KRTBS4gXwMJGI9fVisuFhh10ryFiW68b"}, success: function (data) { // 3. verify that the elements of the database exist and are arrays if ( ('books' in data) && ('curriculum' in data) && ('topics' in data) && Array.isArray(data.books) && Array.isArray(data.curriculum) && Array.isArray(data.topics)) { localforage.setItem('whiletyping_last_success', (new Date()).getTime()); localforage.setItem('whiletyping_database', data); resolve(data); } }, error: function (error) { console.log(error); resolve(null); }, complete: function (data) { single_whiletyping_ajax_promise = null; } }) }); } return resp; } return Promise.resolve(null); }).catch(function(err) { console.log(err); return Promise.resolve(null); }); } function get_whiletyping_search_object() { // gets the fuse objects that will be in charge of the search if (whiletyping_search_object){ return Promise.resolve(whiletyping_search_object); } database_promise = localforage.getItem('whiletyping_database').then(function(database) { return localforage.getItem('whiletyping_last_success').then(function(last_success) { if (database==null || (new Date()) - (new Date(last_success)) > 1000*60*60*24*30 || (new Date('2023-04-25T00:00:00')) - (new Date(last_success)) > 0) { // New database update return get_whiletyping_database().then(function(new_database) { if (new_database) { database = new_database; } return database; }); } else { return Promise.resolve(database); } }); }); return database_promise.then(function(database) { if (database) { const options = { isCaseSensitive: false, includeScore: true, shouldSort: true, // includeMatches: false, // findAllMatches: false, // minMatchCharLength: 1, // location: 0, threshold: 0.2, // distance: 100, // useExtendedSearch: false, ignoreLocation: true, // ignoreFieldNorm: false, // fieldNormWeight: 1, keys: [ "title" ] }; let curriculum_index={}; let topics_index={}; database.curriculum.forEach(c => curriculum_index[c.id]=c); database.topics.forEach(t => topics_index[t.id]=t); for (j=0; j
Solutions
Textbooks
`); } function build_solutions() { if (Array.isArray(solution_search_result)) { const viewAllHTML = userSubscribed ? `View All` : ''; var solutions_section = $(` Solutions ${viewAllHTML} `); let questionUrl = "/questions/xxx/"; let askUrl = "/ask/question/xxx/"; solution_search_result.forEach((elem) => { let url = ('course' in elem)?askUrl:questionUrl; let solution_type = ('course' in elem)?'ask':'question'; let subtitle = ('course' in elem)?(elem.course??""):(elem.book ?? "")+" "+(elem.chapter?"Chapter "+elem.chapter:""); solutions_section.find('#whiletyping-solutions').append(` ${elem.text} ${subtitle} `); }); $('#search-solution-options').empty(); if (Array.isArray(solution_search_result) && solution_search_result.length>0){ $('#search-solution-options').append(solutions_section); } MathJax.typesetPromise([document.getElementById('search-solution-options')]); } } function build_textbooks() { $('#search-pretype-options').empty(); $('#search-pretype-options').append($('#search-solution-options').html()); if (Array.isArray(textbook_search_result)) { var books_section = $(` Textbooks View All `); let searchUrl = "/books/xxx/"; textbook_search_result.forEach((elem) => { books_section.find('#whiletyping-books').append(` ${elem.title} ${ordinal(elem.edition)} ${elem.author} `); }); } if (Array.isArray(textbook_search_result) && textbook_search_result.length>0){ $('#search-pretype-options').append(books_section); } } function build_popup(first_time = false) { if ($('#search-text').val()=='') { build_pretype(); } else { solution_and_textbook_search(); } } var search_text_out = true; var search_popup_out = true; const is_login = false; const user_hash = null; function pretype_setup() { $('#search-text').focusin(function() { $('#search-popup').addClass('show'); resize_popup(); search_text_out = false; }); $( window ).resize(function() { resize_popup(); }); $('#search-text').focusout(() => { search_text_out = true; if (search_text_out && search_popup_out) { $('#search-popup').removeClass('show'); } }); $('#search-popup').mouseenter(() => { search_popup_out = false; }); $('#search-popup').mouseleave(() => { search_popup_out = true; if (search_text_out && search_popup_out) { $('#search-popup').removeClass('show'); } }); $('#search-text').on("keyup", delay(() => { build_popup(); }, 200)); build_popup(true); let prevbookUrl = `/search/pretype_books/`; let prebooks = null; try { prebooks = JSON.parse(localStorage.getItem('PRETYPE_BOOKS_'+(is_login?user_hash:'ANON'))); }catch(e) {} if (prebooks && 'previous_books' in prebooks && 'recommended_books' in prebooks) { if (is_login) { previous_books = prebooks.previous_books; recommended_books = prebooks.recommended_books; if (prebooks.time && new Date().getTime()-prebooks.time<1000*60*60*6) { build_popup(); return; } } else { anon_pretype(); return; } } $.ajax({ url: prevbookUrl, method: 'POST', data:{csrfmiddlewaretoken: "Im0wKZCApYiQvXYxxQ9C5ZFN6z1uONJ5KRTBS4gXwMJGI9fVisuFhh10ryFiW68b"}, success: function(response){ previous_books = response.previous_books; recommended_books = response.recommended_books; if (is_login) { localStorage.setItem('PRETYPE_BOOKS_'+user_hash, JSON.stringify({ previous_books: previous_books, recommended_books: recommended_books, time: new Date().getTime() })); } build_popup(); }, error: function(response){ console.log(response); } }); } $( document ).ready(pretype_setup); $( document ).ready(function(){ $('#search-popup').on('click', '.search-view-item', function(e) { e.preventDefault(); let autoCompleteSearchViewUrl = `/search/autocomplete_search_view/`; let objectUrl = $(this).attr('href'); let selectedId = $(this).data('objid'); let searchResults = []; $("#whiletyping-solutions").find("a").each(function() { let is_selected = selectedId === $(this).data('objid'); searchResults.push({ objectId: $(this).data('objid'), contentType: $(this).data('contenttype'), category: $(this).data('category'), selected: is_selected }); }); $("#whiletyping-books").find("a").each(function() { let is_selected = selectedId === $(this).data('objid'); searchResults.push({ objectId: $(this).data('objid'), contentType: $(this).data('contenttype'), category: $(this).data('category'), selected: is_selected }); }); $.ajax({ url: autoCompleteSearchViewUrl, method: 'POST', data:{ csrfmiddlewaretoken: "Im0wKZCApYiQvXYxxQ9C5ZFN6z1uONJ5KRTBS4gXwMJGI9fVisuFhh10ryFiW68b", query: $('#search-text').val(), searchObjects: JSON.stringify(searchResults) }, dataType: 'json', complete: function(data){ window.location.href = objectUrl; } }); }); });
FAQs
The mass spectrometer generates multiple ions from the sample under investigation; it then sorts and separates according to their specific mass-to-charge ratio and then records the relative abundance of each ion type.
Why do mass spectrometers require ionized analytes? ›
Ionizing molecules for mass spectrometry analysis. Because mass spectrometry (MS) measurements are based on mass-to-charge ratio (m/z), ionization is essential. Ionization causes sample components to become either positively or negatively charged.
What is EI in mass spectrometry? ›
Electron Impact ionization (EI) - EI is done by volatilizing a sample directly in the source that is contained in a vacuum system directly attached to the analyzer. The gas phase molecules are bombarded by a beam of electrons formed by heating a filament bias at a negative voltage compared to the source.
What does mass spectrometry measure? ›
Mass spectrometry is an analytical tool useful for measuring the mass-to-charge ratio (m/z) of one or more molecules present in a sample. These measurements can often be used to calculate the exact molecular weight of the sample components as well.
What is mass spectrometry quizlet? ›
Mass spectrometry. An analytical technique that uses the mass-to-charge ratio of atoms, molecules and fragments of molecules to identify substances.
What does mass spectrometry depend on? ›
Many mass spectrometers work in either negative ion mode or positive ion mode. It is very important to know whether the observed ions are negatively or positively charged. This is often important in determining the neutral mass but it also indicates something about the nature of the molecules.
Why an analyte must be charged in mass spectrometry? ›
This is important because the particles must be charged to pass through the analyzer. As the ions continue from the source, they travel through an analyzer (electromagnetic/quadrupole/the ion trap) that filters the ions based on mass to charge ratio.
Why must the sample be ionised in a mass spectrometer? ›
Ionization
Molecules in a sample are vaporized (converted to the gas phase by heating). Then, an electron beam bombards the vapors, which converts the vapors to ions. Because mass spectrometry measures the mass of charged particles, only ions will be detected, and neutral molecules will not be seen.
What is the source of ions for mass spectrometry? ›
The action of the primary droplets hitting the surface produces secondary droplets that are the source of ions for the mass spectrometer. Desorption electrospray ionization (DESI) uses an electrospray source to create charged droplets that are directed at a solid sample a few millimeters to a few centimeters away.
Why does EI create more fragment ions? ›
This technique is considered a hard (high fragmentation) ionization method, since it uses highly energetic electrons to produce ions. This leads to extensive fragmentation, which can be helpful for structure determination of unknown compounds.
EI and CI can be used as complimentary to each other. While EI provides structural information, CI provides molecular weight information and hence you can characterize the molecule with full confidence. Negative Chemical Ionization (NCI) is only used for trace analysis of electrophilic compounds.
What is EI in structural analysis? ›
The product of modulus of elasticity and planar moment of inertia is sometimes referred to as the material's flexural rigidity (EI).
How are ions detected in mass spectrometry? ›
Ion source: a sample is put into the mass spectrometer, which is then ionized by the apparatus. [12] Mass analyzer: ions are sorted in the device based on their mass-to-charge ratio (m/z). Detector: ions are measured and displayed on the mass spectrum chart.
What are the results of mass spectrometry? ›
A mass spectrum will usually be presented as a vertical bar graph, in which each bar represents an ion having a specific mass-to-charge ratio (m/z) and the length of the bar indicates the relative abundance of the ion. The most intense ion is assigned an abundance of 100, and it is referred to as the base peak.
What are the conditions for mass spectrometry? ›
To obtain a mass spectrum, the sample must be vaporized, ionized and, assuming it is molecular, fragmentation of the molecular ion must occur. The various ions thus formed are separated according to their mass-to-charge ratio (m/ze) and then detected.
What mass spectrometry involves? ›
In general, a mass spectrometry is an analytical technique that involves the ionization of a chemical species followed by the sorting of the ions based on their mass to charge ratio.
What is the source of ions in mass spectrometry? ›
The action of the primary droplets hitting the surface produces secondary droplets that are the source of ions for the mass spectrometer. Desorption electrospray ionization (DESI) uses an electrospray source to create charged droplets that are directed at a solid sample a few millimeters to a few centimeters away.
How are ions formed in mass spectrometer? ›
The particles in the sample (atoms or molecules) are therefore bombarded with a stream of electrons, and some of the collisions are energetic enough to knock one or more electrons out of the sample particles to make positive ions.
What is the principle involved in mass spectrometry? ›
Principle of MS
Mass spectrometry (MS) is an analytical technique that separates ionized particles such as atoms, molecules, and clusters by using differences in the ratios of their charges to their respective masses (mass/charge; m/z), and can be used to determine the molecular weight of the particles.