diff --git a/R/api.R b/R/api.R
index a9a5e9adf15f2fcea38a2f9aee099bb2816dfd5e..e001ad320ccdd6f927c586d0322dd64fec77e7c4 100644
--- a/R/api.R
+++ b/R/api.R
@@ -325,7 +325,61 @@ extr_data2 <-function(m) {
 }
 
 extr_data <-function(m) {
-m
+
+    fine = create_fine_table(m)
+    ## fine_with_rt = fine[!is.na(rt_min)]
+    ## fine_wo_rt = fine[is.na(rt_min)]
+
+    ## fine_mz_rt = as.matrix(fine[,.(iso_fine_min,iso_fine_max)])
+    ## fine_rt_rt = as.matrix(fine[,.(rt_min,rt_max)])
+
+    dpath = m$run$paths$data
+
+    cg1 = data.table(isofine=integer(0),
+                     rt=numeric(0),
+                     intensity=numeric(0),
+                     scan=character(0),
+                     key = c("isofine","rt"))
+    
+    for (fn in fine[,unique(file)]) {
+
+        fncg1 = data.table(isofine=integer(0),
+                           rt=numeric(0),
+                           intensity=numeric(0),
+                           scan=character(0),
+                           key = c("isofine","rt"))
+        
+        ## Read data.
+        ms = read_data_file(file=file.path(dpath,fn))
+
+        ## Get input entries for a particular file.
+        ftab = fine[.(fn),on="file"]
+
+        ## Extract input data that is needed.
+        isotab = ftab[,.(iso_fine_min,iso_fine_max,rt_min,rt_max),by="isofine"]
+        isotab1 = isotab[is.na(rt_min),.(isofine,iso_fine_min,iso_fine_max)]
+        isotab2 = isotab[!is.na(rt_min),.(isofine,iso_fine_min,iso_fine_max,rt_min,rt_max)]
+                  
+
+        ## Extract MS1 chromatograms.
+        fncg1 = extr_ms1_cgm(ms=ms,
+                             isotab=isotab1,
+                             qrt=F,
+                             fncg1)
+        fncg1 = extr_ms1_cgm(ms=ms,
+                             isotab=isotab2,
+                             qrt=T,
+                             fncg1)
+        
+        cg1 = cg1[fncg1,.(isofine,
+                          rt,
+                          intensity=i.intensity,
+                          scan=i.scan)]
+        
+    }
+    m$db$extr$cgm$ms1 = res
+    m
+
 }
 
 extr_data_future <- function(m) {
diff --git a/R/data-model.R b/R/data-model.R
index cd99df8ac4305653c9f970f63902978025984e65..eb2c42b217ad34a07b82ff9f769b9ed8ee489e19 100644
--- a/R/data-model.R
+++ b/R/data-model.R
@@ -97,6 +97,9 @@ make_db_precursors <- function(m) {
                  iso_fine_max=max(mz_fine_max)),
                  by=isofine]
     setindex(masses,isocoarse,isofine)
+    ## Add files.
+    filetab = m$input$tab$mzml[m$db$cat,.(catid=i.catid,file=file),on=c("set","tag"),nomatch=NULL]
+    masses[filetab,file:=i.file,on="catid"]
     m$db$precursors = masses
     m
 }
diff --git a/R/extraction.R b/R/extraction.R
index bf558eb8e46d23d6f4057c1eba0d2902d27d344e..0410eec4770579a712deb31dce575c298d4965dc 100644
--- a/R/extraction.R
+++ b/R/extraction.R
@@ -611,3 +611,70 @@ gen_ms2_spec_blk <- function(spectra) {
 
 
 ## NEW FUNCTIONS.
+create_fine_table <- function(m) {
+    ## Select fine mz-ranges and split them into those with rt entries
+    ## and those without.
+    precs = m$db$precursors
+    precs[,unique(.SD),.SDcols=c("iso_fine_min",
+                                 "iso_fine_max",
+                                 "rt_min",
+                                 "rt_max",
+                                 "file"),
+          keyby=c("file","isofine")]
+
+}
+
+create_coarse_table <- function(m) {
+    ## Select coarse mz-ranges and split them into those with rt entries
+    ## and those without.
+    precs = m$db$precursors
+    precs[,unique(.SD),.SDcols=c("iso_coarse_min",
+                                 "iso_coarse_max",
+                                 "rt_min",
+                                 "rt_max",
+                                 "file"),
+          keyby=c("file","isocoarse")]
+
+}
+
+read_data_file <- function(file) {
+    MSnbase::readMSData(file=file,msLevel=c(1,2),mode="onDisk")
+}
+
+extr_ms1_cgm <- function(ms,isotab,qrt,res) {
+    ## Extract chromatograms.
+
+    ## Get mz ranges in matrix format.
+    mzrng = as.matrix(isotab[,.(iso_fine_min,iso_fine_max)])
+    x = if (!qrt) {
+            ## Call without rt argument.
+            MSnbase::chromatogram(ms,mz = mzrng)
+        } else {
+            ## Call with rt argument (in seconds).
+            rtrng = as.matrix(isotab[,.(rt_min*60,rt_max*60)])
+            MSnbase::chromatogram(ms,mz = mzrng, rt = rtrng)
+        }
+
+    ## If there were any input masses actually,
+    if (dim(mzrng)[[1L]] > 0L) {
+        ## fill the data table.
+        for (i in 1L:nrow(mzrng)) {
+            rt = rtime(x[i,1])
+            isofine = isotab[(i),isofine]
+            chunk = data.table(isofine=isofine,
+                               rt=rt,
+                               intensity=intensity(x[i,1]),
+                               scan = names(rt),
+                               key = c("isofine","rt"))
+
+            res = res[chunk,.(isofine,
+                              rt,
+                              intensity=i.intensity,
+                              scan=i.scan)]
+            
+        }
+    }
+    res
+}
+
+
diff --git a/tests/testthat/test-integration.R b/tests/testthat/test-integration.R
index e6f4da310a0237a65f32450923b815e711a4ab0c..44d1cc9f623454890d6a9032b301eaaff685d8d8 100644
--- a/tests/testthat/test-integration.R
+++ b/tests/testthat/test-integration.R
@@ -10,8 +10,9 @@ test_that("Extraction returns what is needed.",{
                 phase=c("setup","comptab","db"))
 
     cat = m$db$cat
+    print(m$db$precursors[,.(mz,file)])
 
     m = run(envopts=eo,m=m,phase="extract")
-    
+    print(m$db$extr$cgm$ms1)
     expect_true(1==1)
 })