text:
A new immunomagnetic bead separation–surfactant extraction treatment protocol for rapid and sensitive quantitative PCR detection of Cryptosporidium parvum DNA
Takahiro Sekikawa
Graduate Division of Nutritional and Environmental Sciences, University of Shizuoka, 52-1 Yada, Suruga-ku, Shizuoka 4228526, Japan
E-mail: sekikawa.shizuokakendai@gmail.com
Water Supply (2016) 17 (1): 161-168.
https://doi.org/10.2166/ws.2016.125
PDF LinkPDF
Takahiro Sekikawa; A new immunomagnetic bead separation–surfactant extraction treatment protocol for rapid and sensitive quantitative PCR detection of Cryptosporidium parvum DNA. Water Supply 1 February 2017; 17 (1): 161–168. doi: https://doi.org/10.2166/ws.2016.125
The Cryptosporidium oocyst is encased in a robust wall that is extremely resistant to detrimental environmental factors such as chlorine used to disinfect potable water. Therefore, extracting oocyst DNA is not a trivial undertaking. Standard procedures used to extract DNA from oocysts, such as freeze–thaw (F/T) methods and DNA purification kits, are time-consuming and expensive and are difficult to implement in routine clinical practice. Therefore, we developed a surfactant extraction treatment (SET) that efficiently extracts DNA from the oocyst. Immunomagnetic separation (IMS) combined with quantitative real-time polymerase chain reaction (qPCR) detects pathogenic microorganisms with high sensitivity. The objective of the present study was to evaluate SET for its ability to simplify qPCR detection of 18S rDNA directly from immunomagnetic bead–oocyst conjugates. DNA extracted directly from the conjugates using SET did not affect DNA amplification in the qPCR assay. Further, the rate of DNA amplification using IMS–SET was greater than that using F/T combined with the DNA purification kit. The rate of recovery of oocysts from surface water samples spiked with oocysts did not differ significantly from previously published values. These data demonstrate that the new IMS–SET protocol using qPCR can simplify the recovery and detection of Cryptosporidium oocysts.
Cryptosporidium DNA, immunomagnetic beads, oocysts, real-time PCR, surface water, surfactant extraction treatment
Cryptosporidium parvum was first recognized as a human pathogen in 1976 (Nime et al. 1976), nearly 70 years after the first cryptosporidial species was identified in mice (Tyzzer 1907). Cryptosporidium infects various vertebrate hosts, including mammals, rodents, birds, reptiles, and fish; and oocysts excreted by these hosts are present in the environment (Smith & Nichols 2010). Cryptosporidium parvum is a major zoonotic species that causes neonatal diarrhea in livestock, which is accompanied by significant economic losses (Smith & Nichols 2010).
Cases of cryptosporidiosis with HIV/AIDS were reported in the early 1980s. The link with AIDS was so strong that cryptosporidiosis became one of the defining features of the syndrome before the discovery of the human immunodeficiency virus (HIV) (Tzipori & Widmer 2008). Cryptosporidium is a significant pathogen in all populations regardless of the prevalence of HIV. It is the second most common pathogen in infants (Kotloff et al. 2013). In 1993, in the largest outbreak associated with a contaminated public water source reported to date in the United States, Cryptosporidium made 403,000 residents of Milwaukee, WI sick (Corso et al. 2003). This outbreak was caused by Cryptosporidium oocysts that were not removed by one of the city's water treatment plants, and the victims experienced watery diarrhea, abdominal cramps, fever, and vomiting (MacKenzie et al. 1994). In 2010, a waterborne cryptosporidiosis outbreak occurred in Östersund, Sweden, and affected at least 12,700 inhabitants (Widerström et al. 2014).
The infectious dose varies depending on the Cryptosporidium isolate, and as few as 10 oocysts cause disease (Okhuysen et al. 1999). Cryptosporidium represents a major challenge to the delivery of safe drinking water because the oocysts can survive and remain infectious for 16 months in disinfectant-treated water supplies (Bridle et al. 2012). The oocysts are encased in a durable oocyst wall comprising inner and outer walls composed of a protein–lipid–carbohydrate matrix that serves as a highly effective protective barrier against deleterious environmental factors (Fayer 2008). Thus, early detection of oocysts in water sources is essential to ensure the safety of drinking water (Widerström et al. 2014).
Successful detection of nucleic acids from purified oocysts usually requires complex extraction and purification processes aimed at digesting their protective wall. These protocols may involve techniques such as freeze–thaw (F/T) cycles as well as treatments using enzymes and surfactants before nucleic acid amplification. These procedures take at least 1 h (Gao et al. 2014).
Recently, we developed a new method – a surfactant extraction treatment (SET) that is simple to perform and inexpensive (Sekikawa & Toshiki 2015). SET uses an anionic surfactant, sodium dodecyl sulfate, or SDS, a common component of lysis buffers generally (Webster et al. 1993; Leng et al. 1996; Nichols & Smith 2004; Schiffner et al. 2005). The SET method can extract nucleic acids by incubating the oocyst in 0.1% SDS solution at 90°C for 15 min, without F/T and purification kits. Because SDS inhibits polymerase chain reaction (PCR) assays even at extremely low concentrations, a purification step is then required to eliminate any trace of SDS. In the SET assay we overcame inhibition by adding 5% Tween 20 to the PCR reactions (Sekikawa & Toshiki 2015).
Immunomagnetic separation (IMS) combined with quantitative PCR (qPCR) is an effective and sensitive method for detecting pathogenic microorganisms in environmental samples (Hallier-Soulier & Guillot 2000; Hwang et al. 2007; Gao et al. 2014). Therefore, IMS is generally used in combination with qPCR for detecting Cryptosporidium DNA in sources such as surface water and feces (Fontaine & Guillot 2003; Gao et al. 2014). We reasoned that DNA extracted directly from an immunomagnetic bead (IMB)–oocyst conjugate using 0.1% SDS could be applied prior to the qPCR assay to provide a simple method for detecting oocysts. Thus, the objective of the present study was to demonstrate the use of SET to extract the 18S rDNA gene directly from IMB conjugates for detection of Cryptosporidium without diminishing the sensitivity of the PCR assay.
C. parvum oocysts
Standard suspensions containing 105Cryptosporidium parvum oocysts (Iowa isolate, AccuSpike-IR) were obtained from Waterborne™, Inc. (New Orleans, LA, USA).
River water sample collection and water quality analysis
A surface water sample was obtained from the drinking water intake of the Okitsu River in Shizuoka City during March 2015. The surface water of the Okitsu River is a major source of drinking water for the residents of the Simizu-Ku area of Shizuoka City. Digital meters were used to measure the pH, temperature, electrical conductivity (EC), and total dissolved solids (TDS) of each water sample. The formazine standard solution, adjusted to 400 nephelometric turbidity units (NTUs) (Wako Pure Chemical Industries, Osaka, Japan), was used as a standard. Turbidity was determined at 660 nm using a spectrophotometer (UV-1600, Kyoto, Shimadzu) (Ortmanis et al. 1991).
DNA standard
A 192-bp fragment of standard DNA that included the partial sequence of the 18S rRNA gene of C. parvum (Accession No. L16996; nucleotides 187–378) was chemically synthesized and sequenced by Eurofins Genomics (Tokyo, Japan).
To extract nucleic acids, Cryptosporidium oocysts or IMB–oocyst conjugates were incubated at 90°C for 15 min in a SET tube containing Tris-EDTA (TE) buffer (Promega Corporation, Madison, WI, USA) and 0.1% SDS and used as a SET product (Figure 1). A SET procedure includes addition of the nonionic surfactant Tween 20 to a PCR tube at a final concentration of 5% in order to suppress PCR inhibition induced by SDS (Sekikawa & Toshiki 2015). After extracting nucleic acids, Tween 20 was added to a PCR tube containing FastStart Essential DNA Probes Master Mix (Roche Diagnostics, Mannheim, Germany), and 2.0 μL of the SET product was vortexed and added immediately to the PCR tube.
View largeDownload slide
SET applied to IMB–oocyst conjugates. SET, surfactant extraction treatment; IMB, immunomagnetic bead.
TaqMan PCR
A FastStart Essential DNA Probes Master Mix (Roche Diagnostics) that included a TaqMan probe was used for PCR assays. Cryptosporidium 18S rDNA was amplified using the forward primer Crypt-193f and the reverse primer Crypt-374r (Miller et al. 2006). DNA amplification was monitored using the TaqMan probe Crypt-276p (Miller et al. 2006). The TaqMan probe was labeled with 6-FAM and the quencher TAMRA at the 5′ and 3′ ends, respectively. The qPCR assay was conducted using a LightCycler Nano system (Roche Diagnostics). After 10 min at 95°C, the DNA was amplified for 50 cycles of the denaturation step at 95°C for 10 s and the prove measurement was taken during the annealing/extension step at 60°C for 30 s. Each PCR assay (final volume, 20 μL) contained 400 nM of each primer, 80 nM TaqMan probe, the master mix (Roche Diagnostics), and 2 μL sample. Tween 20 was added when required to each PCR tube at a final concentration of 5%. A cycle threshold analysis tool integrated in the LightCycler Nano software V1.1.0 was used to compute threshold levels.
Effect of IMBs subjected to SET on qPCR assays
The effects of 2 μL of IMBs (Dynabeads anti-Cryptosporidium [Invitrogen Dynal AS, Oslo, Norway]) with or without SET on a qPCR assay were determined using a DNA standard (3 × 104 copies/μL). The IMBs occupied 10% of the volume of the master mix.
Each reagent was independently prepared in a PCR tube. The PCR for each experiment was run together using the LightCycler Nano system (Roche Diagnostics).
Detection of Cryptosporidium DNA in IMB–oocyst conjugates subjected to SET
The effect of SET, and of IMB–oocyst conjugates subjected to SET, on qPCR assays was determined using standard suspensions of 105 oocysts added to 10 mL distilled water in a 10-mL centrifuge tube. IMB–oocysts were prepared and isolated using 100 μL of the IMB kit described above, according to the manufacturer's instructions (Dynabeads anti-Cryptosporidium Catalog 2012). The IMB–oocyst conjugates were resuspended in 100 μL of TE buffer (Promega). To compare IMS recovery rates, oocysts were isolated by centrifugation. For comparison with SET, DNA was isolated from oocysts using five cycles of F/T (at −80°C and 37°C) (Kishida et al. 2012; Ichikawa-Seki et al. 2015) in TE buffer and then purified using a commercial DNA purification kit (DNeasy Blood & Tissue kits; QIAGEN GmbH, Hilden, Germany) according to the manufacturer's instructions. Immediately after the last purification step, the nucleic acid solutions were cooled in ice. The theoretical concentration of oocysts was 103/μL in the SET tube after SET or after the IMB–oocyst conjugate was subjected to SET. Two microliters of the SET product was vortexed and immediately added to the PCR master mix. Serial dilutions of the SET product (1–104 fold) were used to prepare the samples for PCR assays. Amplifications of free oocyst DNA and the conjugates after SET were performed with or without 5% Tween 20 in a PCR tube. Each of the four reagents were independently prepared in a PCR tube. The PCR with the three prepared reagents was run together using the LightCycler Nano system (Roche Diagnostics).
qPCR detection of Cryptosporidium DNA in water samples spiked with oocysts that were subjected to IMB–SET
Water sample collection, Cryptosporidium oocyst isolation and detection were processed according to the method described by the Japan Water Works Association (JWWA) (Japan Water Works Association 2003). Oocysts were added to distilled water and river water samples to compare recovery rates. Briefly, 10 L of water samples added to a polyethylene tank were spiked with 105 oocysts and were filtered through a 5.0 μm pore PTFE membrane filter (Millipore, Carrigtwohill Co., Cork, Ireland). Cryptosporidium oocysts collected on the filter membrane were eluted by vortexing the filter in PET eluting solution (Inoue et al. 2003). The eluted material was concentrated by centrifugation (1,050 × g, 10 min) in a 50-mL centrifuge tube. The oocysts were isolated using 100 μL of IMBs and processed according to the manufacturer's instructions. The IMB–oocyst conjugate was resuspended in 100 μL TE buffer. Serial dilutions (1–104 fold) of the SET product were used to prepare the samples for PCR. Each DNA amplification was performed with or without 5% Tween 20 in a PCR tube. The recovery from each water sample spiked with oocysts was independently performed. Each reagent was independently prepared in a PCR tube. The PCR for each experiment was run together using the LightCycler Nano system (Roche Diagnostics).
Standard curve
Cryptosporidium parvum oocysts were used to generate a standard curve. Figure 2 shows the amplification of dilutions of the DNA extracted from the oocysts using SET. Ct values were calculated for 2 to 2 × 104 oocysts per PCR assay. Each point on the line represents the mean of three independent PCR amplifications. The slope = −1.447, and the correlation coefficient (r2) = 0.9979.
Standard curve generated from 2 to 2 × 104 oocysts of C. parvum per PCR assay (n = 3, r2 = 0.9979). DNA was extracted from the oocysts using SET.
The results of qPCR assays using the DNA standard with or without IMBs are shown in Table 1. In the absence of Tween 20, the Ct values of the untreated IMBs and the positive control were 23.09 and 23.14, respectively, indicating that a 10% suspension of IMBs did not inhibit the qPCR assay. DNA isolated from the IMBs after SET without Tween 20 was not amplified (Table 1). In our previous study, the final concentration of SDS in the PCR mix was 0.01%, which inhibits PCR (Sekikawa & Toshiki 2015). Further, we reported that inhibition of PCR by 0.01% SDS is reduced by adding 5% Tween 20 (Sekikawa & Toshiki 2015). Therefore, each PCR assay was performed in the presence of Tween 20 to examine the effect on DNA amplification of the IMBs after they were subjected to SET. Here, we show that Tween 20 abolished the inhibitory effect of the IMBs after SET (Table 1). The results of the Ct values in the presence of 5% Tween 20 indicate that the activity of Taq polymerase was not affected by SET.
qPCR assays of DNA extracted from IMBs subjected to SET
Ct value (mean ± SE)
Conc. of SDS in
Conc. of Tween 20 in the PCR mix
Sample for PCR
the PCR mix
IMBs and standard DNA 0.0% 23.09 ± 0.07 23.42 ± 0.01
IMBs after SET and standard DNA 0.01% ND 23.26 ± 0.05
Standard DNA (positive control) 0.0% 23.14 ± 0.02 23.28 ± 0.07
qPCR, quantitative real-time PCR; IMB, immunomagnetic bead; SET, surfactant extraction treatment; SE, standard error; ND, none detected. n = 3. Standard DNA (3 × 104 copies per reaction) was used for qPCR. The DNA standard included a partial sequence of the 18S rRNA gene of C. parvum.
Effect of IMB–oocyst conjugates subjected to SET on the qPCR assay
The Ct values obtained using oocysts and the conjugates are shown in Table 2. DNA was not detected following extraction from the oocysts or from the conjugates subjected to SET. SDS inhibited the PCR assay because the concentration of SDS in the PCR tube was 0.01%. However, it was difficult to judge whether the SET extracted DNA from the conjugates. To test whether Tween 20 suppressed the inhibition of the PCR assay by SDS, we determined the effect of combining the conjugates after SET and Tween 20. It was found that in the presence of Tween 20, the DNA extracted from the conjugates using SET was amplified and that the mean Ct value of the conjugates (25.32) was not significantly different compared with that of the oocysts recovered using centrifugation (25.27) (Table 2). These results indicate that DNA can be extracted from conjugates and amplified after SET.
Effect of IMB–oocyst conjugates combined with SET on the qPCR assay
Sample for DNA
IMB–oocyst conjugates SET NDa 25.32 ± 0.03
Oocysts SET NDa 25.27 ± 0.06
Oocysts F/T, DNA purification kit 25.64 ± 0.02 25.70 ± 0.03
IMB, immunomagnetic bead; SET, surfactant extraction treatment; qPCR, quantitative real-time PCR; SE, standard error; ND, none detected.
a0.01% SDS. n = 4. Oocysts were recovered from 10 mL of distilled water (DW) spiked with 105 oocysts using immunomagnetic separation (IMS) or centrifugation. Oocyst DNA was extracted using SET or F/T combined with a DNA purification kit.
DNA detection from river water samples spiked with oocysts that were subjected to IMS–SET
We tried detecting Cryptosporidium DNA in the water sample obtained from the Okitsu River using filtration, IMS, F/T and the DNA purification kit (DNeasy Blood & Tissue kits; QIAGEN). PCR inhibitors were removed from the river water sample by using the DNA purification kit. As a result, Cryptosporidium DNA was not detected on the qPCR assay. Therefore, the Okitsu River sample was used for the preparation of a river water sample spiked with oocysts.
Oocysts were recovered from samples of distilled water or river water using IMS, and DNA was extracted from IMB–oocyst conjugates using SET. The limit of detection of the qPCR assay was two oocysts/PCR reaction mixture (Table 3). The Ct values without Tween 20 at the dilution ratio of 1 were not detected because the concentrations of SDS in the PCR mix were 0.01%. The PCR assay is not inhibited by 0.001% SDS (Sekikawa & Toshiki 2015). Therefore, the amplification of DNA in 10 L distilled water with Tween 20 using a 10−1 dilution was not detected because the concentration of SDS was 0.001%.
qPCR detection of oocyst DNA in a 10 L water sample spiked with oocysts that were collected using IMS–SET
Theoretical number of
Distilled water (DW) sample Conc. of Tween 20 in the PCR mix
River water sample Conc. of Tween 20 in the PCR mix
Dilution of sample for PCR
oocysts in the PCR mix
1 2000 NDa 25.64 ± 0.17 NDa 26.04 ± 0.20
10−1 200 29.28 ± 0.17 29.01 ± 0.15 ND 29.39 ± 0.20
10−2 20 32.46 ± 0.14 32.30 ± 0.16 32.80 ± 0.17 32.70 ± 0.18
10−3 2 36.32 ± 0.22 35.79 ± 0.25 36.31 ± 0.27 36.19 ± 0.23
10−4 0.2 ND ND ND ND
qPCR, quantitative real-time PCR; SE, standard error; IMS, immunomagnetic separation; SET, surfactant extraction treatment; ND, none detected.
a0.01% SDS. n = 3. IMS was used to recover oocysts from 10 L of DW or river water spiked with 105 oocysts.
In general, oocyst recoveries depend on the compositions of water samples because river water contains inhibitory turbid materials (Fontaine & Gulliot 2003). Here, when we determined the ability of IMS–SET without Tween 20 to detect Cryptosporidium DNA in the river water sample diluted to 10−1 concentration (0.001% SDS), DNA amplification was not detected (Table 3). There are various substances and particles in the river water sample. Some substances and particles attach to the surface of IMB–oocyst conjugates. The SET product contains 0.1% SDS, free oocyst DNA and the conjugates with the substances and particles. Serial dilutions of the SET product (1–104 fold) were used to prepare the samples for PCR assays. Therefore, there is a possibility that the substances or the particles affected DNA amplification. DNA in the river water sample diluted to 10−2 concentration was able to be amplified as well as DNA in the distilled water sample because PCR inhibitors in the sample were diluted until their effect disappeared. The inhibition induced by the substances and particles was prevented by adding Tween 20, and further studies are required to identify these inhibitors.
The result of the recovery rates of Cryptosporidium oocysts from water samples spiked with 105 oocysts is shown in Figure 3. The recovery rates of IMS–SET from 10 mL-distilled water (DW), centrifuge-SET from 10 mL-DW, centrifuge-F/T-DNA purification from 10 mL-DW, IMS-SET from 10 L-DW and IMS-SET from 10 L-river water were 100.0 ± 2.0% (positive control), 103.5 ± 4.0%, 77.0 ± 9.0%, 80.0 ± 9.0% and 60.8 ± 7.8%, respectively. Of the three 10 mL-DW samples, the recovery rate of only the centrifuge-F/T-DNA purification sample was decreased. These results indicate that the process of F/T or DNA purification was not able to recover the Cryptosporidium DNA from the oocyst as well as SET.
The recovery rate of oocysts from water samples spiked with C. parvum oocysts. IMS, immunomagnetic separation. SET, surfactant extraction treatment. DW, distilled water. F/T, freeze–thaw. n = 3. Error bars express standard errors of the mean. IMS or centrifugation was used to collect oocysts from DW or river water samples spiked with 105 oocysts. Oocyst DNA was extracted using SET or F/T-DNA purification. Each water sample without dilution was added to a PCR tube. The concentration of Tween 20 in a PCR tube was 5%. The recovery rates of oocyst from samples were calculated using a standard curve.
Substances in the river water sample were not analyzed in the present study. However, the presence of large feed particles in raw water interferes with the ability of IMS to recover oocysts, and certain substances and particles inhibit PCR assays (Fontaine & Guillot 2003). The use of a current method with IMS makes it difficult to efficiently recover oocysts from the surface waters of rivers and lakes. For example, using IMS and staining with fluorescein isothiocyanate, 44 ± 10% of oocysts are recovered from a 15 L surface water sample (Blankaart catchment site, Belgium) spiked with 100 oocysts (Ehsan et al. 2015). The mean recovery rate using IMS, DNA purification, and qPCR from 5 L surface water samples (turbidity, 4–7 NTU) of the Seine River that were spiked with 775 oocysts is 57.6 ± 10.7% (Fontaine & Guillot 2003). The values for the turbidity, pH, EC, and TDS of the Okitsu River sample used here were 1.2 NTU, 7.0, 144.0 μS, and 98.4 mg/L, respectively. The recovery rate from the Okitsu River sample did not differ significantly from previously published values although the quality of river water was different. These data demonstrate that qPCR assays with Tween 20 can be used for detecting oocyst DNA recovered from river water using IMS combined with SET. Consequently, the new protocol was able to simplify the operation of Cryptosporidium detection. However, we couldn't explain how the substances and particles in the river water sample affect the recovery rate in the present study. We need further study to determine the cause of the low recovery rate of oocysts.
(1) A new protocol using IMS–SET can reduce the time spent on DNA extraction and purification procedures because SET takes only 15 min to extract DNA from the conjugates without the need for time-consuming processes.
(2) The new protocol was developed to simplify the recovery and detection of Cryptosporidium oocysts, which can facilitate risk assessment of the quality of drinking water.
(3) The oocyst is enclosed by a robust wall that is more resistant than the cell walls of common bacteria. Therefore, the SET protocol for extracting DNA from IMBs can be applied to numerous microorganisms present in water supplies.
This work was supported in part by JSPS KAKENHI Grant Number 25420559 and the Kurita Water and Environment Foundation.
Kersaudy-Kerhoas
Gavriilidou
Katzer
E. A.
Desmulliez
Detection of Cryptosporidium in miniaturised fluidic devices
M. H.
Addiss
D. G.
J. P.
A. C.
Cost of illness in the 1993 waterborne Cryptosporidium outbreak, Milwaukee, Wisconsin
Dynabeads anti-Cryptosporidium Catalog
Available from: http://www.veritastk.co.jp/attached/1057/73001Dynabeads_anti-Cryptosporidium(rev011).pdf
Geurden
Casaert
Paulussen
De Coster
Schoemaker
Vercruysse
Claerebout
Occurrence and potential health risk of Cryptosporidium and Giardia in different water catchments in Belgium
Fayer
. In:
Cryptosporidium and Cryptosporidiosis
2nd edn
, eds),
, pp.
Guillot
An immunomagnetic separation-real-time PCR method for quantification of Cryptosporidium parvum in water samples
Journal of Microbiological Methods
Luo
Development of an immunomagnetic bead separation-coupled quantitative PCR method for rapid and sensitive detection of Cryptosporidium parvum oocysts in calf feces
Parasitology Research
Hallier-Soulier
Detection of cryptosporidia and Cryptosporidium parvum oocysts in environmental water samples by immunomagnetic separation-polymerase chain reaction
Journal of Applied Microbiology
Hwang
Y. C.
O. M.
Comparison of a reporter assay and immunomagnetic separation real-time reverse transcription-PCR for the detection of enteroviruses in seeded environmental water samples
Applied Environmental Microbiology
Ichikawa-Seki
Masatani
Nitta
Tamayose
Suganuma
Niikura
Yokoyama
Yamakawa
Inokuma
Itagaki
Zakimi
Nishikawa
Molecular characterization of Cryptosporidium parvum from two different Japanese prefectures, Okinawa and Hokkaido
Parasitology International
Inoue
S. K.
A new filter-eluting solution that facilitates improved recovery of Cryptosporidium oocysts from water
Japan Water Works Association (JWWA)
pp. 50–55 JWWA (in Japanese)
Kishida
Furuta
Izumiyama
Tsuneda
Quantitative detection of Cryptosporidium oocyst in water source based on 18S rRNA by alternately binding probe competitive reverse transcription polymerase chain reaction (ABC-RT-PCR)
Kotloff
K. L.
Nataro
Blackwelder
W. C.
Nasrin
Farag
T. H.
Panchalingam
Breiman
R. F.
Faruque
A. K.
Tamboura
Sanogo
Onwuchekwa
Ramamurthy
Kanungo
Ochieng
J. B.
Omore
Oundo
J. O.
Hossain
Adegbola
R. A.
M. J.
Akinsola
Mandomando
Nhampossa
Acácio
Biswas
C. E.
Mintz
E. D.
L. Y.
Muhsen
Sommerfelt
Robins-Browne
R. M.
Burden and aetiology of diarrhoeal disease in infants and young children in developing countries (the Global Enteric Multicenter Study, GEMS): a prospective, case-control study
D. A.
R. D.
Simplified method for recovery and PCR detection of Cryptosporidium DNA from bovine feces
W. R.
M. E.
Gradus
D. E.
Kazmierczak
J. J.
K. R.
A massive outbreak in Milwaukee of Cryptosporidium infection transmitted through the public water supply
W. A.
I. A.
Atwill
E. R.
Leutenegger
C. M.
Hedrick
R. P.
N. M.
P. A.
Evaluation of methods for improved detection of Cryptosporidium spp. in mussels (Mytilus californianus)
H. V.
Optimization of DNA extraction and molecular detection of Cryptosporidium oocysts in natural mineral water sources
Journal of Food Protection
Nime
J. D.
D. L.
Holscher
J. H.
Acute enterocolitis in a human being infected with the protozoan Cryptosporidium
Okhuysen
P. C.
C. L.
H. L.
Virulence of three distinct Cryptosporidium parvum isolates for healthy adults
Journal of Infectious Diseases
Ortmanis
W. I.
R. J.
Evaluation of a new turbidimeter design incorporating a microprocessor-controlled variable pathlength cuvette
Enzyme and Microbial Technology
Schiffner
L. A.
E. J.
Sebestyen
Shaler
Caragine
T. A.
Optimization of a simple, automatable extraction method to recover sufficient DNA from low copy number DNA samples for generation of short tandem repeat profiles
Croatian Medical Journal
Sekikawa
Toshiki
A new method for efficient detection of Cryptosporidium RNA by real-time reverse transcription-PCR with surfactants
Water Science and Technology Water Supply
R. A. B.
Cryptosporidium: detection in water and food
Experimental Parasitology
Tyzzer
E. E.
A sporozoan found in the peptic glands of the common mouse
Proceedings of the Society for Experimental Biology and Medicine
Tzipori
A hundred-year retrospective on cryptosporidiosis
Trends in Parasitology
J. D. E.
Catchpole
Detection of Cryptosporidium parvum using a specific polymerase chain reaction
Veterinary Parasitology
Widerström
Schönning
Lebbad
Allestam
Björkholm
Hiltula
Långmark
Löfdahl
Omberg
Reuterwall
Samuelsson
Widgren
Wallensten
Lindh
Large outbreak of Cryptosporidium hominis infection transmitted through the public water supply, Sweden
© 2017 The Authors
This is an Open Access article distributed under the terms of the Creative Commons Attribution Licence (CC BY 4.0), which permits copying, adaptation and redistribution, provided the original work is properly cited (http://creativecommons.org/licenses/by/4.0/).
Nanofiltration of perfluorooctanoic acid and perfluorooctane sulfonic acid as a function of water matrix properties
Climate change impact on water supply demands: case study of the city of Skopje
Multi criteria decision analysis (MCDA) for surface water management plan, a case study of Kansachara sub watershed, West Bengal, India
Application of hybrid coagulation-ultrafiltration for decentralized drinking water treatment: impact on flux, water quality and costs
Evaluation of the effective forecast and decision horizon in optimal hydropower generation considering medium-range precipitation forecasts


text:
Q: Error when I close a windows with GTK3/Glade/Python I have a probleme with my interface glade. I can open my interface, no problem with that, It's work in the way I want but when I close it all the main programm stop and I have two messages in the consol
(BouclePrincipal.py:50516): Gtk-CRITICAL **: 09:01:00.615: gtk_widget_get_accessible: assertion 'GTK_IS_WIDGET (widget)' failed>
(BouclePrincipal.py:50516): Atk-CRITICAL **: 09:01:00.615: atk_object_remove_relationship: assertion 'ATK_IS_OBJECT (target)' failed

I don't understand what/where is the problem. I tried to add return true like the following
answer but it's dosn't work. Furthermore I don't know what I need to post for this problem (interface glad ? the init in python ?)
here the python code
# on importe les librairies dont nous avons besoins
import gi
import sqlite3
import Alerte
import datetime
import AjouterMedicament

gi.require_version("Gtk", "3.0")
from gi.repository import Gtk

Idutilisateur = 0

# on creer la classe pour l'interface
class AffichageEcritureIP:
    # ligne de code qui se lance lorsque de l'initialisation
    def __init__(self):
        # on creer la fenetre à partir de l'interface glade
        self.builder = Gtk.Builder()
        self.builder.add_from_file('EcritureIP.glade')
        self.window = self.builder.get_object('Main_Windows_IP')
        # on creer des objetrs pour chaqu'une des interractions
        self.builder.connect_signals(self)
        # on creer les variables
        self.DateIP = self.builder.get_object("DateRealisation")
        self.Service = self.builder.get_object("Services")
        self.NomPatient = self.builder.get_object("NomPatient")
        self.PrenomPatient = self.builder.get_object("PrenomPatient")
        self.Age = self.builder.get_object("Age")
        self.UniteAge = self.builder.get_object("UniteAge")
        self.Sexe = self.builder.get_object("Sexe")
        self.Probleme = self.builder.get_object("Probleme")
        self.Intervention = self.builder.get_object("Intervention")
        self.ATC1 = self.builder.get_object("ClasseATC1")
        self.ATC2 = self.builder.get_object("ClasseATC2")
        self.ProblemeDescription = self.builder.get_object("ProblemeDescription")
        self.Devenir = self.builder.get_object("DevenirIntervention")
        self.RetourMedecin = self.builder.get_object("RetourMedecin")
        self.Medoc1 = self.builder.get_object("Médicament1")
        self.Medoc2 = self.builder.get_object("Médicament2")
        self.Prescripteur = self.builder.get_object("Prescripteur")
        self.Contact = self.builder.get_object("Contact")
        self.CotationClinique = self.builder.get_object("CotationClinique")
        self.CotationEconomique = self.builder.get_object("CotationEconomique")
        self.CotationOrga = self.builder.get_object("CotationOrga")
        self.Conciliation = self.builder.get_object("Conciliation")
        self.Poids = self.builder.get_object("Poids")
        self.RetourMedecin = self.builder.get_object("RetourMedecin")
        self.DateMedecin = self.builder.get_object("DateMedecin")
        self.NumIP = self.builder.get_object("NumIP")

        # on affecte la date du jour à l'entrée
        dateBrut = datetime.datetime.now()
        DateJour = FormatDate(dateBrut.day, dateBrut.month, dateBrut.year)
        self.DateIP.set_text(DateJour)

        #on va creer les listes pour remplir les listes déroulantes
        conn = sqlite3.connect('déclaration.db')
        cursor = conn.cursor()
        cursor.execute("""SELECT NomService FROM Service """)
        self.ListeService = cursor.fetchall()
        cursor.execute("""SELECT Description FROM Probleme """)
        ListeProbleme = cursor.fetchall()
        cursor.execute("""SELECT Description FROM Resolution """)
        ListeResolution = cursor.fetchall()
        cursor.execute("""SELECT Description FROM ATC """)
        ListeATC = cursor.fetchall()
        cursor.execute("""SELECT Description FROM Devenir """)
        ListeDevenir = cursor.fetchall()
        cursor.execute("""SELECT Description FROM Prescripteur """)
        ListePrescripteur = cursor.fetchall()
        cursor.execute("""SELECT Description FROM Transmission """)
        ListeTransmission = cursor.fetchall()
        cursor.execute("""SELECT Description FROM CotationClinique """)
        ListeCotationClinique = cursor.fetchall()
        cursor.execute("""SELECT Description FROM CotationEconomique """)
        ListeCotationEconomique = cursor.fetchall()
        cursor.execute("""SELECT Description FROM CotationOrganisationnel """)
        ListeCotationOrga = cursor.fetchall()
        cursor.execute("""SELECT Libelle FROM Medoc ORDER BY Libelle ASC""")
        self.ListeMedoc = cursor.fetchall()
        cursor.execute("""SELECT Libelle FROM Sexe """)
        ListeSexe = cursor.fetchall()
        cursor.execute("""SELECT Libelle FROM UniteAge """)
        ListeUniteAge = cursor.fetchall()
        conn.close()

        # on va rajouter les services dans la liste
        for service in self.ListeService:
            self.Service.append_text(service[0])

        # on va rajouter les problemes dans la liste
        for probleme in ListeProbleme:
            self.Probleme.append_text(probleme[0])

        # on va rajouter les resolutions dans la liste
        for resolution in ListeResolution:
            self.Intervention.append_text(resolution[0])

        # on va rajouter les classe ATC dans la liste
        for resolution in ListeATC:
            self.ATC1.append_text(resolution[0])
            self.ATC2.append_text(resolution[0])

        # on va rajouter les  Devenir dans la liste
        for resolution in ListeDevenir:
            self.Devenir.append_text(resolution[0])

        # on va rajouter les prescripteur dans la liste
        for resolution in ListePrescripteur:
            self.Prescripteur.append_text(resolution[0])

        # on va rajouter le contact dans la liste
        for resolution in ListeTransmission:
            self.Contact.append_text(resolution[0])

        # on va rajouter les cotation clinique dans la liste
        for resolution in ListeCotationClinique:
            self.CotationClinique.append_text(resolution[0])

        # on va rajouter les cotation economique dans la liste
        for resolution in ListeCotationEconomique:
            self.CotationEconomique.append_text(resolution[0])

        # on va rajouter les cotation Orga dans la liste
        for resolution in ListeCotationOrga:
            self.CotationOrga.append_text(resolution[0])

        # on va rajouter les cotation Orga dans la liste
        for resolution in self.ListeMedoc:
            self.Medoc1.append_text(resolution[0])
            self.Medoc2.append_text(resolution[0])

        # on va rajouter les sexe dans la liste
        for resolution in ListeSexe:
            self.Sexe.append_text(resolution[0])

        # on va rajouter les unite d'age dans la liste
        for resolution in ListeUniteAge:
            self.UniteAge.append_text(resolution[0])

        #on va creer l'autocomplete pour les medicament
        self.liststoreMedoc = Gtk.ListStore(str)
        for s in list(sum(self.ListeMedoc,())):
            self.liststoreMedoc.append([s])
        self.autocompletemedoc = Gtk.EntryCompletion()
        self.autocompletemedoc.set_model(self.liststoreMedoc)
        self.autocompletemedoc.set_text_column(0)
        self.builder.get_object("EntreMedoc1").set_completion(self.autocompletemedoc)
        self.builder.get_object("EntreMedoc2").set_completion(self.autocompletemedoc)

    def ClicConciliation(self, widget):
        if self.Conciliation.get_label() == "Non":
            self.Conciliation.set_label("Oui")
        else:
            self.Conciliation.set_label("Non")

    def ValidationIP(self, widget):
        global Idutilisateur
        # on commence par verifier que les donne importante sont saisie
        continuer = 0
        if len(self.DateIP.get_text()) == 0:
            Alerte.appelAffichageAlerte("Il faut saisir la date")
            continuer = 1
        if len(self.Service.get_active_text()) == 0:
            Alerte.appelAffichageAlerte("Il faut saisir le service")
            continuer = 1
        if len(self.Age.get_text()) == 0:
            Alerte.appelAffichageAlerte("Il faut saisir l'age du patient")
            continuer = 1
        if self.UniteAge.get_active_text() is None:
            Alerte.appelAffichageAlerte("Il faut saisir l'unite de l'age du patient")
            continuer = 1
        if self.Sexe.get_active_text() is None:
            Alerte.appelAffichageAlerte("Il faut saisir le sexe du patient")
            continuer = 1
        if self.Probleme.get_active_text() is None:
            Alerte.appelAffichageAlerte("Il faut saisir le probleme")
            continuer = 1
        if self.Intervention.get_active_text() is None:
            Alerte.appelAffichageAlerte("Il faut saisir l'intervention")
            continuer = 1
        if self.Prescripteur.get_active_text() is None:
            Alerte.appelAffichageAlerte("Il faut saisir le prescripteur")
            continuer = 1
        if len(self.Medoc1.get_active_text()) == 0:
            Alerte.appelAffichageAlerte("Il faut saisir le médicament")
            continuer = 1
        if self.Devenir.get_active_text() is None:
            Alerte.appelAffichageAlerte("Il faut saisir le devenir de l'IP")
            continuer = 1
        # on creer un tableau avec les IP qui necessitent de saisir un autre médicaments
        IPavecdeuxMedoc = [15, 19, 20, 21, 22, 23, 24, 25, 34]
        # on rajoute 1 à l'ID car le premier de la liste à l'ID 0
        IDProbleme = (self.Probleme.get_active() + 1)
        if IDProbleme in IPavecdeuxMedoc and len(self.Medoc2.get_active_text()) == 0:
            Alerte.appelAffichageAlerte("Il faut saisir le second médicament pour cette intervention")
            continuer = 1

        if continuer == 1:
            pass
        else:
            # on va donc ajouter l'IP dans la base
            global Idutilisateur
            # on transformer la conciliation en 1 ou 0
            if self.Conciliation.get_label() == "Non":
                Conciliation = 0
            else:
                Conciliation = 1

            #on va verifier que le/les medoc(s) saisi existe bien dans la base de donnée
            # on verifie si le service fait partie de la liste
            # on va transformer la liste de tuple en list pur
            if self.Medoc1.get_active_text() in list(sum(self.ListeMedoc,())):
               pass
            else:
                AjouterMedicament.appelAffichageAjoutMedicament(self.Medoc1.get_active_text(), self.ATC1.get_active(),1)

            if self.Medoc2.get_active_text()=="" or self.Medoc2.get_active_text() in list(sum(self.ListeMedoc,())):
               pass
            else:
                AjouterMedicament.appelAffichageAjoutMedicament(self.Medoc2.get_active_text(), self.ATC2.get_active(),1)

            # on va chercher le code UCD et l'id du médicament
            conn = sqlite3.connect('déclaration.db')
            cursor = conn.cursor()
            cursor.execute("SELECT id,CodeUCD FROM Medoc WHERE Libelle = ?", (self.Medoc1.get_active_text(),))
            Medicament1 = cursor.fetchone()

            if self.Medoc2.get_active_text() == "":
                Medicament2 =[0,0]
            else:
                cursor.execute("SELECT id,CodeUCD FROM Medoc WHERE Libelle = ?", (self.Medoc2.get_active_text(),))
                Medicament2 = cursor.fetchone()
            conn.close()

            # on va creer des variable pour les texte
            # pour le TextViewer le texte est lié à une Buffer de Texte
            # pour afficher le texte il est necessaire d'avoir le début et la fin du texte
            # on creer donc le début et la fin et on l'inclut dans
            iterdebut, iterfin = self.ProblemeDescription.get_bounds()
            DescriptionProbleme = str(self.ProblemeDescription.get_text(iterdebut, iterfin, include_hidden_chars=True))
            iterdebut2, iterfin2 = self.RetourMedecin.get_bounds()
            RetourMedecin = str(self.RetourMedecin.get_text(iterdebut2, iterfin2, include_hidden_chars=True))

            # on creer une liste de tuplue pour fussioner avec la liste pour inserer les donnes
            IP = [(str(self.DateIP.get_text()),
                   Idutilisateur,
                   str(self.NomPatient.get_text()),
                   str(self.PrenomPatient.get_text()),
                   str(self.Age.get_text()),
                   self.UniteAge.get_active()+1,
                   self.Sexe.get_active()+1,
                   str(self.Poids.get_text()),
                   self.Probleme.get_active() + 1,
                   Medicament1[0],
                   Medicament1[1],
                   self.ATC1.get_active()+1,
                   Medicament2[0],
                   Medicament2[1],
                   self.ATC2.get_active()+1,
                   self.Service.get_active() + 1,
                   DescriptionProbleme,
                   self.Intervention.get_active() + 1,
                   self.Prescripteur.get_active() + 1,
                   self.Contact.get_active() + 1,
                   self.DateMedecin.get_text(),
                   self.Devenir.get_active() + 1,
                   self.CotationClinique.get_active() + 1,
                   self.CotationEconomique.get_active() + 1,
                   self.CotationOrga.get_active() + 1,
                   Conciliation,
                   RetourMedecin)]
            # pour reussir à faire l'insertion des données avec le Update , on creer une liste avec les noms de colonne
            ColonneSQL = [
                "DateSaisie",
                "Utilisateur",
                "NomPatient",
                "PrenomPatient",
                "AgePatient",
                "UniteAgePatient",
                "SexePatient",
                "Poids",
                "Probleme",
                "Medicament1",
                "CodeUCD1",
                "ATC1",
                "Medicament2",
                "CodeUCD2",
                "ATC2",
                "Service",
                "DescriptionProbleme",
                "Intervention",
                "Prescripteur",
                "Transmission",
                "DateContactMedecin",
                "DevenirIntervention",
                "CotationClinique",
                "CotationEconomique",
                "CotationOrganisationnel",
                "Conciliation",
                "JustificatifIntervention"
            ]

            #on creer une liste pour faire un for sur les nombres
            nombre = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26]

            # on se connecte à la base
            conn = sqlite3.connect('déclaration.db')
            cursor = conn.cursor()

            # on va utiliser l'interface pour saisir et modifier les IP
            # on va donc verifier si le numeroIP est saisie, dans la textbox, si ce n'est pas le cas on ajoute et on
            # affiche le numero IP
            # si c'est n'ai pas le cas on verifie que l'IP existe est on la met à jour
            if len(self.NumIP.get_text()) == 0:
                for i in IP:
                    cursor.execute(
                        "INSERT INTO Intervention(DateSaisie,Utilisateur,NomPatient,PrenomPatient,AgePatient,"
                        "UniteAgePatient,SexePatient,Poids,Probleme,Medicament1,CodeUCD1,ATC1,Medicament2,CodeUCD2,"
                        "ATC2,Service,DescriptionProbleme,Intervention,Prescripteur,Transmission,DateContactMedecin,"
                        "DevenirIntervention,CotationClinique,CotationEconomique,CotationOrganisationnel,Conciliation,"
                        "JustificatifIntervention) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", i)
                id = cursor.lastrowid
                message = "Féliciation vous avez sauvegarder votre IP sous le numero " + str(id)
                self.NumIP.set_text(str(id))
                Alerte.appelAffichageAlerte(message)
                conn.commit()
                conn.close()
            else:
                # on va tester voir si le numero de l'IP existe
                cursor.execute("SELECT count(*) FROM Intervention WHERE id= ?", (int(self.NumIP.get_text()),))
                IpExiste = cursor.fetchone()
                if IpExiste[0] == 0:
                    Alerte.appelAffichageAlerte("L'IP n'existe pas")
                    conn.close()
                else:
                    # on creer une boucle pour mettre à jour l'IP
                    for i in nombre:
                        sql = "UPDATE Intervention SET " + ColonneSQL[i] + "=? WHERE id=" + str(self.NumIP.get_text())
                        cursor.execute(sql, (IP[0][i],))
                        conn.commit()
                    conn.close()

    def Lecture(self,widget):
        """
            Cette fonction permet de lire la BDD et si , l'IP existe, mettre l'ensemble des données dans l'interface.
        """
        if self.NumIP.get_text() is None or self.NumIP.get_text()=="":
            self.effacerinterface(self)
        else:
            conn = sqlite3.connect('déclaration.db')
            cursor = conn.cursor()
            cursor.execute("SELECT count(*) FROM Intervention WHERE id= ?", (int(self.NumIP.get_text()),))
            IpExiste = cursor.fetchone()
            if IpExiste[0] == 1:
                cursor.execute("SELECT * FROM Intervention WHERE id= ?",(int(self.NumIP.get_text()),))
                ip_complete = cursor.fetchone()
                cursor.execute("SELECT Libelle FROM Medoc WHERE id= ?",(int(ip_complete[10]),))
                NomMedicament1  = cursor.fetchone()
                if int(ip_complete[13])==0:
                    NomMedicament2=[""]
                else:
                    cursor.execute("SELECT Libelle FROM Medoc WHERE id= ?",(int(ip_complete[13]),))
                    NomMedicament2  = cursor.fetchone()
                conn.close()
                self.DateIP.set_text(ip_complete[1])
                self.Service.set_active(int(ip_complete[16])-1)
                self.NomPatient.set_text(ip_complete[3])
                self.PrenomPatient.set_text(ip_complete[4])
                self.Age.set_text(str(ip_complete[5]))
                self.UniteAge.set_active(ip_complete[6]-1)
                self.Sexe.set_active(ip_complete[7] - 1)
                self.Poids.set_text(ip_complete[8])
                self.Probleme.set_active(ip_complete[9]-1)
                self.builder.get_object("EntreMedoc1").set_text(NomMedicament1[0])
                self.ATC1.set_active(ip_complete[12]-1)
                self.builder.get_object("EntreMedoc2").set_text(NomMedicament2[0])
                self.ATC2.set_active(ip_complete[15]-1)
                self.ProblemeDescription.set_text(ip_complete[17])
                self.Intervention.set_active(ip_complete[18]-1)
                self.Prescripteur.set_active(ip_complete[19]-1)
                self.Contact.set_active(ip_complete[20]-1)
                self.DateMedecin.set_text(ip_complete[21])
                self.Devenir.set_active(ip_complete[22]-1)
                self.CotationClinique.set_active(ip_complete[23]-1)
                self.CotationEconomique.set_active(ip_complete[24]-1)
                self.CotationOrga.set_active(ip_complete[25]-1)
                if ip_complete[26]==self.Conciliation.get_label():
                    pass
                else:
                    self.Conciliation.activate()
                self.RetourMedecin.set_text(ip_complete[27])
            else:
                self.effacerinterface(self)

    def ChangementMedicament1(self,widget):
        """
        Permet de changer le code ATC automatiquement quand on saisie un médicament dans la bare 1
        """
        if self.builder.get_object("EntreMedoc1").get_text()=="":
            pass
        else:
            conn = sqlite3.connect('déclaration.db')
            cursor = conn.cursor()
            SQL = "SELECT ClasseATC FROM Medoc WHERE Libelle= ?"
            Val = self.builder.get_object("EntreMedoc1").get_text()
            cursor.execute(SQL ,(Val,) )
            ClassATC = cursor.fetchone()
            if cursor.rowcount <0:
                self.builder.get_object("EntreClasseATC1").set_text("")
            else:
                self.ATC1.set_active(ClassATC[0]  - 1)

    def ChangementMedicament2(self,widget):
        """
        Permet de changer le code ATC automatiquement quand on saisie un médicament dans la bare 2
        """

        if self.builder.get_object("EntreMedoc2").get_text()=="":
            pass
        else:
            conn = sqlite3.connect('déclaration.db')
            cursor = conn.cursor()
            SQL = "SELECT ClasseATC FROM Medoc WHERE Libelle= ?"
            Val = self.builder.get_object("EntreMedoc2").get_text()
            cursor.execute(SQL ,(Val,) )
            ClassATC = cursor.fetchone()
            if cursor.rowcount<0:
                self.builder.get_object("EntreClasseATC2").set_text("")
            else:
                self.ATC2.set_active(ClassATC[0]  - 1)

    def effacerinterface(self,widget):
        dateBrut = datetime.datetime.now()
        DateJour = FormatDate(dateBrut.day, dateBrut.month, dateBrut.year)
        self.DateIP.set_text(DateJour)
        self.builder.get_object("EntreService").set_text("")
        self.NomPatient.set_text("")
        self.PrenomPatient.set_text("")
        self.Age.set_text("")
        self.builder.get_object("EntreUA").set_text("")
        self.builder.get_object("EntreSexe").set_text("")
        self.Poids.set_text("")
        self.builder.get_object("EntreProbleme").set_text("")
        self.builder.get_object("EntreMedoc1").set_text("")
        self.builder.get_object("EntreClasseATC1").set_text("")
        self.builder.get_object("EntreMedoc2").set_text("")
        self.builder.get_object("EntreClasseATC2").set_text("")
        self.ProblemeDescription.set_text("")
        self.builder.get_object("EntreIntervention").set_text("")
        self.builder.get_object("EntreMedecin").set_text("")
        self.builder.get_object("EntreContact").set_text("")
        self.DateMedecin.set_text("")
        self.builder.get_object("EntreDevenir").set_text("")
        self.builder.get_object("EntreClinique").set_text("")
        self.builder.get_object("EntreEconomique").set_text("")
        self.builder.get_object("EntreOrga").set_text("")
        if self.Conciliation.get_label() == "Oui":
            self.Conciliation.activate()

    def FermetureIP(self,widget):
        Gtk.main_quit()
        self.window.destroy()

def FormatDate(jour, mois, annee):
    jour = str(jour)
    mois = str(mois)
    annee = str(annee)
    if len(jour) < 2: jour = "0" + jour
    if len(mois) < 2: mois = "0" + mois
    return str(jour) + "/" + str(mois) + "/" + str(annee)

def appelAffichageAjoutIP(IDUtilisateurEnvoye):
    global Idutilisateur
    Idutilisateur = IDUtilisateurEnvoye
    AffichageEcritureIP()
    Gtk.main()

here the all project
Thank you for your futur answer

A: Hello I found the error
#on va creer l'autocomplete pour les medicament
    self.liststoreMedoc = Gtk.ListStore(str)
    for s in list(sum(self.ListeMedoc,())):
        self.liststoreMedoc.append([s])
    self.autocompletemedoc = Gtk.EntryCompletion()
    self.autocompletemedoc.set_model(self.liststoreMedoc)
    self.autocompletemedoc.set_text_column(0)
    self.builder.get_object("EntreMedoc1").set_completion(self.autocompletemedoc)
    self.builder.get_object("EntreMedoc2").set_completion(self.autocompletemedoc)

I used the same self.autocompletemedoc for the two entry.
I use the following algorithme in order to find the error :
1) removing the last function added
2) try the code
I correct the code with the folling
self.liststoreMedoc = Gtk.ListStore(str)
self.liststoreMedoc2 = Gtk.ListStore(str)
for s in list(sum(self.ListeMedoc,())):
    self.liststoreMedoc.append([s])
    self.liststoreMedoc2.append([s])
self.autocompletemedoc = Gtk.EntryCompletion()
self.autocompletemedoc2 = Gtk.EntryCompletion()
self.autocompletemedoc.set_model(self.liststoreMedoc)
self.autocompletemedo2c.set_model(self.liststoreMedoc2)
self.autocompletemedoc.set_text_column(0)
self.autocompletemedoc2.set_text_column(0)
self.builder.get_object("EntreMedoc1").set_completion(self.autocompletemedoc)
self.builder.get_object("EntreMedoc2").set_completion(self.autocompletemedoc2)

Now it's working and I can close my windows

redpajama_set_name: RedPajamaStackExchange


text:
Improving your
ability to play drums
MENDOLA
Proper Drum Technique »
A Short History of The Drum Set and Drum Set Independence
Published October 7, 2007 | By Tom
Drumming has been with us since man developed primitive societies. It served as a means of communication over distances as well as the foundation for more formalized expressions of sound which developed into musical forms that have sustained cultures up to the present time. Drumming originally started with just the hands creating rhythm with or without sticks.
This was true all the way up to the early part of the 20th century until "trap sets" began to appear. Drummers began adding bass drums with pedals and that got the feet involved.
Cymbals, wood blocks, chimes, triangles, cowbells, tambourines, small tom-toms from India, and anything else drummers could find to hit, were added to expand the sound beyond the snare drum.
The set-ups became know as "trap sets" (shortened from the word "contraption"). This referred to how people reacted when they first saw these sets ("What is that contraption?").
The great Chick Webb was the first to usher in the sound and style of what a swinging modern drummer sounded like in the late 1920s! A long line of great drummers such as Gene Krupa, Buddy Rich, Papa Jo Jones, Dave Tough, et al later emulated Chick.
By the late 1930s, modern drum sets began to appear regularly. The standard set became: snare, bass drum, high-hat, toms and cymbals. Still, the hands did most of the work, while the feet kept the time going. The bass drum played single beats (1, 2, 3, 4) while the high-hat played the backbeat (on 2 and 4). This style of playing Chick Webb started did not vary for a long time.
In 1938 at the age of 15, Louis Bellson began using two bass drums with his drum set up mainly for soloing. This required developing the weaker left foot that played the high hat.
Many drummers didn't want to take the time or see the need to develop the weaker limb as well as cart an extra bass drum around. They were short sighted.
As Bellson's career began to flourish in the 40's, only a handful of drummers followed him over the next twenty years in this experimentation (Sam Woodyard and Rufus Jones being excellent examples). Double bass playing would not begin to take off on a broad scale until the late 1960s with Ginger Baker.
By the late 1940s, when a style of Jazz called "Be-Bop" appeared, drummers began using the bass drum and left hand more for accents rather than time keeping and the ride cymbal carried more of the time while the high hat still remained on 2 and 4. Independence of the limbs became more demanding and tempos of songs increased dramatically. The playing of Kenny Clark, Max Roach, Art Blakey, and Philly Joe Jones were examples of this.
In November of 1948, drummer/author Jim Chapin published "Advanced Techniques for the Modern Drummer". This publication broke down the style of jazz/be-bop independence in a written format that was easy to understand. It was becoming increasingly clear that a new level of musicianship was being demanded of drummers in the area independence on the drum set.
By the 1960s, drummers such as Elvin Jones began to freely use the arms and legs equally in unusual poly-rhythmic combinations while playing time and soloing. This opened up a whole new area of possibilities for drummers to explore.
Drummers who could not understand and hear what drummers like Elvin (and those who followed him) were doing were stuck with the concept of the hands doing most of the expression on the set.
During this period of the 1960s other Jazz drummers, most notably Tony Williams, began exploring these poly-rhythmic independence patterns between the hands and feet.
Drummers began playing a style known as "Pulse". This meant that the time was not as strictly played on the set as it had been. The drummer could color the music with rhythmic patterns using the whole set to its fullest potential. It also meant a whole new level of independence was required to play this style of music.
As mentioned above, Ginger Baker came on the scene in the late 1960s with a rock band called "Cream." He used double bass not only when soloing, but also to create grooves that were recorded on hit songs. He had been listening to the innovations of the new jazz drummers of the 50's and 60's and played jazz prior to joining Cream.
Baker's style of playing incorporated these jazz influences and inspired more advanced rock and jazz players to experiment with double bass and advanced limb patterns on the set.
Double bass drum sets began popping up all over the world. In the 1970s, double bass pedals started to be massed produced and that made it easier for more drummers to start experimenting with this style.
This style of drumming has sustained to the present in both rock and fusion music.
While African, Latin music from the Caribbean, and Brazilian music began influencing American Music as early as the late 1800s, no one could have predicted the impact these styles would have on drumming up to the present day.
It is clear that all the innovative drummers listed above were to a greater or lesser degree influenced by African, Afro/Cuban, and Brazilian music. One just needs to understand the style and listen for it in their playing. That is worth an article unto itself.
I mention this because the current level of drum set independence required to play these styles is extremely demanding. In some cases, it requires the drummer to play a different rhythm on each limb simultaneously in a repetitive pattern and make it groove.
Today a drummer needs to be able to control and use all four limbs beyond keeping time so as to color the music and enhance the sound of the drum kit.
The combinations involving independence on the drum set are endless.
One bit of advice I give my students is to start with only the snare, bass drum, high hat, and one ride cymbal and see how much sound can be gotten out of this drum set configuration before adding anything else.
And what ever you come up with independence wise, make it sound musical or else it is just an exercise.
© 2007 Tom Mendola – all rights reserved.
Posted in About Drumming
8 Responses to A Short History of The Drum Set and Drum Set Independence
Nice to learn some history about drumming, and you wrote about it so well, thanks :)
Zach says:
This is a very informative article. Thank you, I am using this for a report. NO COPY INTENDED! But this helped me out A LOT once again thank you so much. Bye!!!
Nolie says:
Good article! Very interesting and answered both the questions I had.
Edward Truette says:
I am fascinated by the development of the hi-hat…Incredible history & so much fun…I use mine(on or off beat),footing it in consistent pattern(whatever it might be)to weave my groove…Love the pix of the early stunted hi-hat not extended yet to arm height…Very glad it grew tall,lol…Also love using my remote hi-hat in my kit…I like to playfully mess with my friends'/fans' minds by moving between my two hi-hats…Love their laughter & smiles as they try to keep up…ET
lanz says:
A short useful history and it's very well written ,you got the important part you need about "drumming history" THANKS a lot! keep writing. . ",)
Thanks for a fantastic article. Thorough yet precise. I was just surfing the web searching for information regarding limb independence. I am not a musician but I love music. I have always been fascinated by drummers and their ability to keep time and play four independent rythyms simutaneously. My favorite drummers are, in no particular order…Neil Peart (Rush), Ginger Baker (Cream), Ringo Starr (DUH!), John Bonham (Led Zepplin), Keith Moon (The Who) and Tommy Lee (Motley Crue)
Thanks for taking the time to read it!
It is really cool
Leave a Reply to Edward Truette Cancel reply
The Rhythm Course Re-Released
Ringo Starr – In Defense Of, A Drummer's Perspective
Drummers! How to "Play the Song"
Drumming and Drugs
Drumming and Rhythm
Proper Drum Technique
Copyright © 2012 TOM MENDOLA
Designed by Seidler Designs.

redpajama_set_name: RedPajamaCommonCrawl


If you have any questions, please call Outpatient Care Management at 314-205-6679.
At St. Luke's, our goal is to provide the best care possible and to help you stay healthy. For certain patients with high-risk discharges from St. Luke's Hospital, we connect you with an Outpatient Care Manager to provide continued support as you transition to home or to another care setting. Our team of Outpatient Care Managers are among the best in Missouri in helping patients avoid readmissions.
How will you benefit from an Outpatient Care Manager?
Some patients 65 and older hospitalized at St. Luke's with a diagnosis of heart failure, pneumonia, myocardial infarction or chronic obstructive pulmonary disease may qualify for the 30-day program. The patient will receive a phone call from one of the Outpatient Care Managers within 48 hours of discharge to review the recent hospitalization and enroll in the program.
What is an example of the value of the Outpatient Care Managers?
After a procedure or hospital stay, patients are often discharged with prescriptions to fill at their local pharmacy. Sometimes a patient may have difficulty filling important prescriptions that prevent dangerous complications. A care manager can help the patient identify ways to access the medication timely. In the past, our care managers have helped patients enroll in medication financial assistance programs or obtain samples from their doctor until the pharmacy could fill their prescription.
Who are the Outpatient Care Managers?


text:
ABM Lessons from The Kula Ring's First 100 Episodes
Episode 100 ABM Lessons from The Kula Ring's First 100 Episodes
Posted on September 8, 2020 Topics: Account-Based Marketing
To celebrate The Kula Ring's 100th episode, co-hosts Jeff White and Carman Pirie reflect on account-based marketing insights from exceptional guests. They share lessons from Sangram Vajre, Co-Founder of Terminus, on the strategic nature of ABM; Daniel Englebretson's 100% win rate using ABM with Phononic; and Fabio Luz's pilot ABM campaign success at Schneider Electric.
ABM Lessons from The Kula Ring's First 100 Episodes Transcript:
Jeff White: Welcome to The Kula Ring, a podcast for manufacturing marketers brought to you by Kula Partners. My name is Jeff White and joining me today is Carman Pirie for a very special episode.
Carman Pirie: A very special episode indeed. I guess we're at episode 100.
Jeff White: Yeah. We've been at this for just over two years now.
Carman Pirie: Yeah, it's like this kind of weird reflection, like you look back and you see how long you actually stuck with something almost.
Jeff White: I know. I mean, and for us to stick with something as a marketing vehicle for more than two years, we certainly have done more of these than we have written blog posts, for example.
Carman Pirie: Ouch. Ouch. I don't know. Do we want to tell people that?
Jeff White: Probably not.
Carman Pirie: We can decide in the edit later. Well, look. Yeah, I think what's exciting about, what I've been looking forward to as we've kind of been looking ahead to our 100th episode is… We should let our audience in on the notion of what we're thinking here, which is what we really want to do is break down what we've seen as some of the greatest hits of the first 100 episodes. And what are some of the themes that have emerged from there, and just reflect on some of the key lessons along the way.
Jeff White: Exactly. Yeah. And I think it's going to end up being a handful of episodes where we break down some of those key themes, because they certainly did reappear as we interviewed different and phenomenally smart marketers in the manufacturing space. It's really been interesting to see some of those things show up again and again because they're obviously on the minds of these exceptionally intelligent marketers.
Carman Pirie: Yeah. And I guess first things first, what seems to be on the mind of a lot of folks lately is taking more account-based approaches to marketing and sales. Today's show, we're gonna look back on some of the episodes that have focused on account-based marketing, and what did we learn along the way. The first episode, episode 63 of the show featured the Co-Founder of Terminus, Sangram.
Jeff White: Sangram Vajre. He really brought a very interesting perspective, and certainly has more experience in ABM than most, having coined the term.
Carman Pirie: Indeed, and certainly… I think just helped our audience focus in on account-based marketing and what are the basics or the fundamentals that in some way power it. Here's a clip.
Sangram Vajre: To set the stage, I still… We really, truly, do believe that we're just in the early innings of this, so it's like 5 to 10% of the market, the early adopters are in the game, and are checking out and scouting everything that's going on, and will essentially drive the mass market in the next few years.
I think there are probably two or three areas that are really interesting. One, we think that this idea of fit, intent, and engagement is pretty solid, which means find the right list of target accounts, you find the right fit. You just figure out, do you know your target account list? You'll be surprised. Anywhere I go, one of the things I do from the event stage is like, "Raise your hand if you know your total addressable market. Exactly the number of companies you should be closing or selling to that you can serve." And in a room of thousand people, there are like five people who would raise their hand, and I think that's because all of them are from the same team, or it's a peer pressure.
A lot of time people don't even know the exact number or list of accounts they need to go after. I think that is something that they can literally take away from this, ask themselves, and go back to the team and ask, "Hey, sales, or marketing, or CEO, do we know exactly, not billion-dollar market size. Exactly the number of companies you need to tell, that you can sell, you can serve this year or this month." Start focusing on that level of preciseness, and I feel like that's a big challenge, so I feel like getting above the noise, to figure out who you want to go after is a big challenge right now across industry.
I think if people can figure that out, the fit part, and then figure the intent, which is as you said, through intent data and stuff is like, "All right, now that I know, let me closely watch any and everything that happens with these accounts that I care to close this month, or this quarter, or this year."
Then engagement is really where you pull the real data from all these engagement metrics, where I don't… I imagine a day where marketing and sales are actually looking into the same dashboard, and not walking into a room with two different spreadsheets, or two different dashboards, saying, "We don't know whose numbers are correct." I really feel like that's where the world is going. That's where I think Terminus wants to go, is to unify that one view for marketing and sales, because quite honestly, I wrote it in the first page of the book, I believe that marketing's job is defined by sales, which means we need to drive incremental or exponential sales, so in that case, if we don't have the same view, the same dashboard, the same pain that sales might feel at any given time, then we're missing the point of this whole thing.
Jeff White: I think what Sangram had to say there about ABM being at the cross-section of fit, intent, and engagement, is really I think at the heart of the fundamental of ABM as a whole. You have these technologies that enable account-based advertising and account-based marketing, allowing you to get a better insight to the top tier accounts that you may be targeting as an organization.
Carman Pirie: And I liked how Sangram pushed us in that episode to basically challenge people to say raise their hand. If you're an audience of a thousand marketers, raise your hand if you know your total addressable market and all the companies with it. Do you have a target account list, right?
Jeff White: Yeah. Yeah. I mean, hopefully, more do now. That was 40-odd episodes ago, so-
Carman Pirie: Well, we have been in the middle of a pandemic. Maybe they have other things on the go.
Jeff White: I suppose, but I mean as we've seen with a number of our clients and ourselves, as well, ABM has truly been a bit of the replacement and the focus for a lot of marketers as they have had to abandon tactics and strategies that may have worked pre-pandemic.
Carman Pirie: Yeah. Absolutely. And I guess as I think about that, and so it almost feels like gotcha journalism a bit, when you ask somebody, "Do you know your total addressable market as a marketer?" Well, they know that, as the marketing lead or a sales lead, they know the right answer to that is supposed to be yes. I guess at that point, where do you go from there if the answer is kind of no? And to me, it kind of spoke more to just getting to the basics and maybe paying attention a bit more to some of those basics, and it reminded me of a conversation that I was in around an ABM program and brainstorming with a sales team about how we could focus on a specific segment of targets.
And the sales leader let slip that those exact people were actually directly contacting him about working with this firm just four or five months ago, but the firm wasn't ready to take them on as clients. And I just remember thinking, "Well, did you keep a list? Could we go back in the email and find out who reached out to us?"
Jeff White: Yeah, those are tier A1 plus.
Carman Pirie: Right! But I guess you kind of poke the bear a bit and you think, "Oh, that's obvious." Right? And I guess I think the lesson to us as marketers is that yeah, there's an awful lot of this business that's pretty tough, and sometimes we can make our lives easier by just keeping our eyes wide open to the opportunities that show up and the stuff that is obvious, i.e. we can know who we want to serve. We can identify those target accounts. Why wouldn't we do that? Or we can at least keep track of the people that call us and ask to buy from us so that we can maybe call them back when we have some capacity.
Jeff White: Precisely. And I think one of the key lessons from Sangram in that episode as well was this idea, you're not just talking about the target accounts, but you're talking about the individuals within the buying committee, within those target accounts. And how are you crafting a sales experience, a journey map, the content that's going to be required in order to address those specific people within that buying committee? Because we may know who our tier-one accounts are, or know who's reached out after a trade show to speak with us, but we're not necessarily thinking about the different needs of those different people within that buying committee.
Carman Pirie: Yeah. I'm just sitting here nodding my head in agreement.
Jeff White: Nothing to disagree with there.
Carman Pirie: Exactly. I guess moving on a little bit, I think the episode just before Sangram's show, we had an incredibly smart account-based marketer on, Daniel Englebretson, who at that point was doing a lot of account-based work with Phononics.
Jeff White: That's right. Phononic. Phononic.
Carman Pirie: Ah, now you're just making fun of me.
Jeff White: No, I'm not. No.
Carman Pirie: With the word Phononic, you're gonna bring this up?
Jeff White: Hooked on phonics worked for us.
Carman Pirie: But episode 62 with Daniel really unpacked a very successful tier-one ABM campaign that basically moved, if my memory serves, something like 40 tier one target accounts from being unaware of them to closed-won.
Jeff White: Yeah. 100% win rate.
Carman Pirie: Indeed.
Jeff White: Just incredible.
Carman Pirie: Here's a little clip from Daniel.
Daniel Englebretson: In optoelectronics there, when we started, we thought there was about 40 accounts, so the world engagement was 40. As we got into it, we learned there were closer to 90 accounts. It took us a while to figure out, so the campaign we would run there, or that we are running there, is two tiers. There are about 15 accounts in tier one, and the remainder in tier two of the 90, and that's what we've been running with. And that's actually an excellent use case for ABM. When you have a small TAM, and you need to win a large percentage of it, being as relevant as possible when you're doing your marketing to those accounts is always going to improve your likelihood of converting it, and also putting in place the listening and the structure to pay attention to what's going on at those accounts helps your win rate.
So, that campaign, the tier one campaign, you had referenced digging around on my LinkedIn, that was actually the campaign that we won an interesting award with from Demand Gen Report. We achieved 100% win rate in that tier one campaign over 10 months, and that was absolutely part of what makes ABM awesome.
But moving out of that, life sciences, there's about 6,500 hospitals. When we were breaking down the targeting… I'll jump to the end. They map back to what's called IDNs, integrated delivery networks, and there were about 65 that we were targeting, which represented about 2,200 hospitals. From an account perspective, we were organizing it by IDN, but from a physical location perspective, it was the 2,200.
Then in food and beverage, we have many different sub-verticals that we get into, but all of the campaigns that we're running right now are tier one and tier two structured, and usually, there are 20 or 30 tier ones, and then there may be 150 or 200 tier twos.
Carman Pirie: And you know, Jeff, the thing about Daniel's approach to ABM, yes, very much a holistic approach, very much connected to the sales organization and if you will, seeking the validation and support and ongoing coordination with sales, I think that's a great lesson for marketers seeking to take an account-based approach, is to be eyes wide open to the fact that it's going to involve knocking the wall down between marketing and sales at some point.
Jeff White: And I think, too, the other part, obviously he was very well invested at bridging the sales-marketing divide, as it were, in terms of making sure that they were well aligned. But also, really looked at what could be offered to people as an asset to get them engaged. If you're targeting these tier one accounts and you're going after people who are going to be very valuable to your business, maybe you don't just repurpose an old piece of content from somewhere else. Maybe you think about what is the one thing, the interesting thing that we can create, or craft, or say in order to truly convert those visitors. And I think what they did was just next level.
Carman Pirie: Yeah, I mean so folks, they built an augmented reality app to show the product in situ at their prospect's retail locations. A highly, obviously highly interactive piece of content. Very useful to prospective buyers. And one that takes a bit of investment. It's not simply, like you say, repurposing an old white paper or something like that. And you know, and that's so instructive, because it's not like… I guess the old equivalent would be like a marketer, some marketers approached account-based advertising like they just discovered television. And they say, "Oh, okay? Like it's TV? And wow, well, TV's a really big thing these days, so all we need is a TV ad."
Carman Pirie: "And then it's gonna be on the… We're gonna be on the moving picture box and things are gonna happen." Well, the quality of the ad matters. The quality of the assets matter. And it certainly matters in account-based advertising, and that's something that Daniel got right out of the gate.
Jeff White: Absolutely, and not just creating the impressive augmented reality app that is going to capture the attention of the people within their tier-one accounts, but also thinking about, and this goes back to the tie in with sales, but what are the touchpoints that come after that? What are the things that we're doing after they've tried out that augmented reality app that led to a 100% closed rate? You know, because you don't just put out one interesting piece of content and then sit back and wait for the money to roll in. You have to have a structured and well-considered journey for those people to move through and a sales team that is on board with actually executing that and obviously seeing the results at the end of it.
Carman Pirie: Yeah, and if all of that seems like it's the polar opposite of a magic silver bullet that's really easy to fire, that's because it is the polar opposite.
Jeff White: Yeah. It's not like, "Okay. Well, now that we've heard that he had a 100% success rate with that, that every time we do an ABM campaign that we're looking to roll out an augmented reality app." That is not the solution. It was the solution in that one particular case and it worked beautifully. He certainly had a number of other campaigns that were perhaps more traditional, I guess, in terms of what was offered, and they did very well, too. But you know, it's certainly the case where there's a lot of planning going into each one of these campaigns from the outset in order to ensure the best possible result.
Carman Pirie: The one additional piece to Daniel's integration with sales that I think is important to highlight is how he seemed to really view the voice of the sales organization as the voice of the customer. He kind of, he'd say like, "Okay, well, run this by the sales organization. Do my customers…" I think he said, "Do my customers actually think like this?" And have sales validate that.
Now, I'm a little torn, because of course, I've also worked with a number of sales organizations that carry if you will an oversimplification and perhaps even a misunderstanding entirely of their customers, and often of prospective customers if they're a very intensely farming sales organization, versus a hunting one. But I do think that Daniel's approach there is instructive and maybe as marketers, we'd be well served to believe every once in a while that somebody else might know more than we do. And we could ask sales about our work through the lens of do my customers actually think like this? Based upon your sales interactions with them.
Jeff White: Yeah. And trust their instincts maybe more. You know, there's a lot of marketers that could probably benefit more from actually asking those questions of the sales team and truly being invested in processing the answer and figuring out how to integrate what they're learning with the marketing outreach that they're going to be doing.
Carman Pirie: Yeah. Exactly right.
Jeff White: Yeah. Also on the ABM side of what we've learned over the last 100 episodes, we had Fabio Luz on the show from Schneider Electric, and Fabio, he's the Latin America Media Team Leader & North America Digital Media Strategist for Schneider, obviously a huge organization that sells in every corner of the world. But there's one thing that he said that isn't necessarily even directly related to ABM, per se, but really applies to absolutely every part of an organization's marketing and sales, and that's that if you're selling outside of purely English-speaking countries, you need to be creating content that is contextual, and translated, and aware of where it's being consumed.
Carman Pirie: Yeah. Exactly. Let's first listen to what Fabio had to say.
Fabio Luz: They kind of know Schneider, and also because it was a global account, we had different content to approach them, as well. Let's say we were working with a different language, so we had Germany, French, Spanish, English, so it was kind of different content strategy, just to make sure that we are reaching those accounts for a specific region with their local language, as well. Otherwise, let's say just using English to reach them, maybe wouldn't see a good conversion rate for that. But pretty much they knew Schneider, pretty much the sales team somehow, they had in the past interacted with them. But for those specific accounts, we could see that it had a huge potential, so that's why we started to work with them.
I think even because when we are working with those accounts, let's say if you are speaking the same language than them, I think the chance to have a higher conversion rate is much higher. And it's funny, because actually when you start this campaign, like we started this campaign a little bit much smaller, just with basic LinkedIn doing ABM, and it was just English, right? So, we said, "Okay, how we can leverage that, so how we can go to the next step." And for sure, with that we start to develop… So, pretty much our ABM strategy was not just social media with LinkedIn, but also like working with a third-party database to reach those accounts, and we had not just web banners on the local language, but also whitepapers with local languages, also how people are engaged with us, what kind of piece of content they are downloading, and also here at Schneider we have our customer stories, which usually we see very good performance. Because people watching, okay, what that company's doing, what is the success, and everything else.
We also translate all those pieces of content for the local language, and with that, we could see very high conversion rates.
Carman Pirie: Okay, so look, we know that marketers, Schneider is one of those organizations that a lot of industrial B2B organizations will kind of hold up as being a marketing leader in a number of aspects. Certainly very well known, et cetera. But, I wonder if those marketers are gonna be willing to take Fabio's advice. I sure hope they are. It has been something that I have felt that I have just… It's been a drum that I've beat for what feels like 20-plus years.
Jeff White: Same.
Carman Pirie: Which is to say, so let's just be honest. This is a counter-argument: "English is the language of business. In our industry, almost everybody does business in English." And I get that may indeed well be true, and then the implied next comment there is, "Well, what would be the real business benefit to us of translating all of this content, anyway? What would be the real benefit of talking to somebody in their native language?"
Jeff White: Hmmm. I don't know.
Jeff White: What would be the real benefit?
Carman Pirie: You know, can you say a 10% lift? Can you say 15? They want you to put a hard, quantitative number, like there would be an ROI of 6%. Now, there is no way to know that. But there is a fundamentally human way to think about this, and if you can just for one minute imagine that you worked in an industry where English isn't the most common language, and the most common language is actually, in that industry that you now work in, is one that you don't understand. Or you only have a marginal, passing understanding of it. Which, by the way, guys, if English isn't your first language, it's a tough language.
If you can try to put yourself in that position for just a moment, you can begin the thought experiments around, "Wow, what could be the benefit? What are the possible connections that I could make with the marketplace? How much richer could they be if I just chose to respect them enough to communicate with them in their language? Because I kind of want their money."
Jeff White: Well, and if you think back to what we were just saying about what Sangram was talking about, about all the different personas in all of those different accounts that you're going to be targeting, English may be the language of business, and perhaps the CEO and the CFO speak English beautifully in the Latin American company that you're targeting. But there are probably engineers, there are probably other people who are as important a part of the buying committee as anyone who may not speak English at all, and may be Spanish speakers, or Portuguese, or German. Who knows? And if you are providing content in that language and your competitors aren't, you're already going to have a leg up simply by being aware that English isn't the only language spoken by your customers.
Carman Pirie: Then also, just think about what if everybody that you wanted to sell to actually did speak English just fine, but it wasn't their native language for a huge percentage? What does it even say about your company that you make the choice to speak to them in their native language? To me, there's a base level of respect associated with that, that the benefit of bringing that to market would be impossible to know in advance, but-
Carman Pirie: We've gotta just… Of all the things that you ought to just trust your gut on here, guys, this is one of them.
Jeff White: Well, and we're talking about Schneider Electric. It's not exactly a small company, and if they're doing it and seeing success with it, I think that a lot of us could probably follow their lead and expect to see good things. One of the episodes that we'll be recapping some of the other themes from The Kula Ring that we've heard is just the cost and the time of creating content, like we all know that content is expensive to produce and we'll be talking about that soon in another episode. But at the same time, the cost to translate content, while expensive, is not as expensive as creating that content off the top net new. You're taking it and translating it and moving it into regionally-specific language or what have you, so there actually is a savings there for the cost of translation versus the cost of creation.
Carman Pirie: And I really want to challenge people to, because it's easy to look at Schneider and say, "Oh, of course, they do it. They would have almost unlimited resources, such a big company, but my company can't do it." It's like yeah, but you also don't have the same number of SKUs that they have. You're not selling to-
Jeff White: Yeah, you don't have as much content to translate from the get-go.
Carman Pirie: Right, so there's a scale that applies in the other direction, as well. So, I don't… You're not gonna get away that easy. Don't use that as the excuse.
Jeff White: Part of our vehemence here is being from a country with two official languages, so we're just used to creating things in both French and English so often for our clients, and it is certainly the kind of thing that if we were targeting more manufacturers in Quebec, we would probably look to translate more of Kula's content, for example.
Carman Pirie: Indeed. Yeah. No, that's a great example.
Jeff White: Yeah. So, we don't currently target those companies, so that's why it's all in English.
Carman Pirie: Indeed, indeed. Well, yeah, and it's also difficult for us to service entirely a francophone account, given that if I just successfully buy a bottle of wine in a Paris wine shop in French, I think I've just cracked the code, you know? But it's a far cry from being able to do that and offer reasonably sophisticated marketing counsel en français, but in any event, I think this is… Look, we've kicked that around enough. I hope we've convinced our listeners to take a good, hard look at their translation practices and how they serve their customers in their language of choice. It is a global manufacturing world and maybe we ought to act that way.
Now, and so I hope you've enjoyed the show. I've really enjoyed kind of reflecting on this, Jeff, and going back over some of these key lessons. I think that those guests brought an awful lot of value. It's just great to have a chance to reflect on it even more.
Jeff White: Absolutely, and I also look forward to the other episodes, where we will be recapping some of the other lessons that we've learned over the last 100 episodes or so, and we'll be back with more very soon, and great to chat with you.
Carman Pirie: Until next time.
« Episode 99: Re-Imagining IMTS for a Digital Audience
Customer Feedback Lessons from The Kula Ring's First 100 Episodes »
Sangram Vajre
Co-Founder & Chief Evangelist at Terminus
Sangram Vajre is the Co-Founder & Chief Evangelist at Terminus, a SaaS platform for account-based marketing (ABM). He has quickly built a reputation as one of the leading minds in B2B marketing. Sangram has been a driving force behind the success of Terminus and building the ABM subcategory of marketing technology. Before co-founding Terminus, Sangram was Head of Marketing at Pardot through its acquisition by ExactTarget and then Salesforce. Sangram is the author of "Account-Based Marketing For Dummies" and "B2B is ABM", a contributing columnist for Inc., and is the mastermind behind #FlipMyFunnel. In 2016, Sangram was named to the DMNews 40 Under 40 list in addition to Terminus winning more than a dozen awards such as Startup of the Year from the American Marketing Association (Atlanta chapter) and #1 Best Place to Work from the Atlanta Business Chronicle. The company scaled to more than 100 people and graduated from the Atlanta Tech Village. In 2017, Terminus was named #1 in Employee Appreciation by The Atlanta Journal-Constitution and #3 Top SMB Company for Top Workplaces in Atlanta. Terminus was also awarded Top 10 Most Innovative Companies in Georgia for 2017, having ranked in the Top 40 in 2015 and 2016.
Daniel Engelbretson
Director, Growth Marketing and Demand Generation
Daniel Englebretson is a B2B marketing professional with a background in building demand generation organizations for Fortune 500 manufacturing and high-growth startups. He blends a strong understanding of martech and problem solving with creativity and a hard-hitting professional drive to deliver exceptional results at speed. Daniel has driven $10s of millions in revenue results, multiple times, starting from 0 and achieving within 1 year; built 4 teams from the ground up, hiring more than 50 people and 10 agencies across 6 COEs; and managed $11M+ in marketing budget, including multiple full-stack builds. He has 30+ recommendations, has won 9+ awards, and has been featured 35+ times. Daniel works hard, plays hard, and genuinely enjoys what he does.
Fabio Luz
Latin America Media Team Leader & North America Digital Media Strategist
Fabio Luz is the Latin America Media Team Leader & North America Digital Media Strategist at Schneider Electric, a global leader in the digital transformation of energy management and automation. Fabio holds a bachelor's degree in Advertising, as well as an Executive MBA with an emphasis on Trends & Innovation and has over 12 years of marketing experience in a wide range of industries in Latin America, Europe, and North America. At Schneider Electric, Fabio and his team handle the in-house media planning and buying, developing strategies and driving efficiency in media spend in the B2B space.


text:
<?php

namespace cmsadmin\base;

use Exception;

class BlockCfg extends \cmsadmin\base\BlockConfigElement
{
    public function toArray()
    {
        return [
            'id' => $this->id,
            'var' => $this->item['var'],
            'label' => $this->item['label'],
            'type' => $this->item['type'],
            'placeholder' => $this->get('placeholder'),
            'options' => $this->get('options'),
            'initvalue' => $this->get('initvalue'),
        ];
    }
}

redpajama_set_name: RedPajamaGithub