diff --git a/src/utils/readspectrum.cpp b/src/utils/readspectrum.cpp
index 7b9f599774262ff8cdf8d32807ae1ef8aa4d1dbe..d889642a16ca2e0bb105b4e8e65d8bd942721ee2 100644
--- a/src/utils/readspectrum.cpp
+++ b/src/utils/readspectrum.cpp
@@ -47,6 +47,8 @@ pwiz::msdata::MSDataFile * getPwizMSDataFile(const QString & filename);
 
 pappso::QualifiedSpectrum getQualifiedSpectrumFromPwizMSDataFile(pwiz::msdata::MSDataFile * p_ms_data_file, unsigned int scan_num);
 
+void getXicFromPwizMSDataFile(pwiz::msdata::MSDataFile * p_mzdata, pappso::Xic * p_xic, const pappso::MassRange & mass_range,  XixExtactMethod method);
+
 
 pwiz::msdata::MSDataFile * getPwizMSDataFile(const QString & filename) {
     qDebug() << "getPwizMSDataFile opening file " << filename ;
@@ -76,22 +78,62 @@ pwiz::msdata::MSDataFile * getPwizMSDataFile(const QString & filename) {
     return dataFile;
 }
 
-/*
-MzFormat getPwizMSDataFileFormat(pwiz::msdata::MSDataFile * p_ms_data_file) {
-    pwiz::msdata::CVID native_id_format = pwiz::msdata::MSData::getDefaultNativeIDFormat(*p_ms_data_file);
-    if (native_id_format ==  pwiz::cv::CVID::MS_Mascot_MGF_format) {
-        return MzFormat::MGF;
-    }
-    if (native_id_format ==  pwiz::cv::CVID::MS_mzML_format) {
-        return MzFormat::mzML;
-    }
-    if (native_id_format ==  pwiz::cv::CVID::MS_ISB_mzXML_format) {
-        return MzFormat::mzXML;
+void getXicFromPwizMSDataFile(pwiz::msdata::MSDataFile * p_ms_data_file, pappso::Xic * p_xic, const pappso::MassRange & mass_range,  XixExtactMethod method) {
+
+    std::string env;
+    env=setlocale(LC_ALL,"");
+    setlocale(LC_ALL,"C");
+
+
+
+
+    const pwiz::msdata::SpectrumList * p_spectrum_list = p_ms_data_file->run.spectrumListPtr.get();
+    std::size_t spectrum_list_size = p_spectrum_list->size();
+    pwiz::msdata::SpectrumPtr spectrum;
+    
+    XicElement peak;
+    
+    for (std::size_t i=0; i < spectrum_list_size; i++) {
+        spectrum = p_spectrum_list->spectrum(i, false);
+        unsigned int ms_level(QString(spectrum->cvParam(pwiz::msdata::MS_ms_level).value.c_str()).toUInt());
+
+        if (ms_level == 1) {
+            spectrum = p_spectrum_list->spectrum(i, true);
+            peak.rt = QString(spectrum->scanList.scans[0].cvParam(pwiz::msdata::MS_scan_start_time).value.c_str()).toDouble();
+            peak.intensity = 0;
+            
+            vector<pwiz::msdata::MZIntensityPair> pairs;
+            spectrum->getMZIntensityPairs(pairs);
+
+            // iterate through the m/z-intensity pairs
+            for (vector<pwiz::msdata::MZIntensityPair>::const_iterator it=pairs.begin(), end=pairs.end(); it!=end; ++it)
+            {
+                //qDebug() << "it->mz " << it->mz << " it->intensity" << it->intensity;
+                if (mass_range.contains(it->mz)){
+                    if (method == XixExtactMethod::max) {
+                        if (peak.intensity < it->intensity) {
+                            peak.intensity = it->intensity;
+                        }
+                    }
+                    else {
+                        peak.intensity += it->intensity;
+                    }
+                }
+            }
+            
+            p_xic->push_back(peak);
+        }
+
     }
-    throw pappso::PappsoException(QObject::tr(" pwiz::msdata::CVID native_id_format %1 not found").arg(native_id_format));
-    return MzFormat::unknown;
+
+
+
+
+
+    setlocale(LC_ALL,env.c_str());
+
 }
-*/
+
 pappso::QualifiedSpectrum getQualifiedSpectrumFromPwizMSDataFile(pwiz::msdata::MSDataFile * p_ms_data_file, unsigned int scan_num) {
     unsigned int precursor_charge_state=0;
 
@@ -273,7 +315,7 @@ void SpectrumStore::checkMsRunStatistics(MsRunSp msrun) {
                 unsigned int msLevel(QString(spectrum->cvParam(pwiz::msdata::MS_ms_level).value.c_str()).toUInt());
                 count_mslevel[msLevel]++;
             }
-            
+
             msrun.get()->setMsRunStatistics(MsRunStatistics::total_spectra, (unsigned int) spectrum_list_size);
             msrun.get()->setMsRunStatistics(MsRunStatistics::total_spectra_ms1, (unsigned int) count_mslevel[1]);
             msrun.get()->setMsRunStatistics(MsRunStatistics::total_spectra_ms2, (unsigned int) count_mslevel[2]);
@@ -324,3 +366,15 @@ pappso::SpectrumSp SpectrumStore::getSpectrumSpFromMsRunSp(MsRunSp msrun, unsign
     return spectrum.getOriginalSpectrumSp();
 
 }
+
+pappso::XicSp SpectrumStore::getXicSpFromMsRunSp(MsRunSp msrun, const pappso::MassRange & mass_range, XixExtactMethod method) {
+    pwiz::msdata::MSDataFile * p_msdatafile = findPwizMSDataFile(msrun);
+
+    XicSp xic_sp;
+    if (p_msdatafile == nullptr) {
+        Xix xic;
+        getXicFromPwizMSDataFile(p_msdatafile, &xic, mass_range, method);
+        xic_sp = xic.makeXicSp();
+    }
+    return (xic_sp);
+}
diff --git a/src/utils/readspectrum.h b/src/utils/readspectrum.h
index 8051910c4ec7758ca33dbaa6422e3e9c6cb9eac1..507bb2fd524f2a10c9f628c7236be97de82a473d 100644
--- a/src/utils/readspectrum.h
+++ b/src/utils/readspectrum.h
@@ -26,6 +26,7 @@
 
 #include <QString>
 #include <pappsomspp/spectrum/qualifiedspectrum.h>
+#include <pappsomspp/xic/xic.h>
 #include <map>
 #include "../core/msrun.h"
 
@@ -42,6 +43,7 @@ class MSDataFile;
 class SpectrumStore {
 public:
     static pappso::SpectrumSp getSpectrumSpFromMsRunSp(MsRunSp msrun, unsigned int scan_num);
+    static pappso::XicSp getXicSpFromMsRunSp(MsRunSp msrun, const pappso::MassRange & mass_range, XixExtactMethod method);
     /** @brief try to find MS run statistics
      */
     static void checkMsRunStatistics(MsRunSp msrun);
diff --git a/src/utils/types.h b/src/utils/types.h
index 16889a9b904ec2317f734c68cd11aa2a17f622c5..4800b26e98d8efe37e8d628c49eae12883ebdb6f 100644
--- a/src/utils/types.h
+++ b/src/utils/types.h
@@ -88,6 +88,15 @@ enum class MsRunStatistics: std::int8_t {
 
 
 
+/** \def XixExtactMethod method to extract Xic
+ *
+ */
+enum class XixExtactMethod {
+    sum, ///< sum of intensities
+    max ///< maximum of intensities
+};
+
+
 /** \def ProjectMode separate each samples or combine all
  *
  */