bool CNoiseReduction::NewScanAverage(Spectrum& sp, char* file, int width, float cutoff, int scanNum){ Spectrum ts; vector<int> vPos; int i; int j; int k; int m; int widthCount=0; int numScans=1; double dif; double prec; double dt; double c; bool bLeft=true; int posLeft; int posRight; int index; char cFilter1[256]; //char cFilter2[256]; //double slope; //double intercept; sp.clear(); Spectrum* specs; specs = new Spectrum[width*2+1]; //if file is not null, create new buffer if(file!=NULL){ strcpy(lastFile,file); bs.clear(); if(scanNum>0) r->readFile(file,ts,scanNum); else r->readFile(file,ts); if(ts.getScanNumber()==0) { delete [] specs; return false; } bs.push_back(ts); specs[0]=bs[0]; c=CParam(specs[0],3); posA=0; } else { posA++; if(posA>=(int)bs.size()) { //end of buffer, no more data delete [] specs; return false; } specs[0]=bs[posA]; c=CParam(specs[0],3); } specs[0].getRawFilter(cFilter1,256); posLeft=posA; posRight=posA; while(widthCount<(width*2)){ index=-1; //Alternate looking left and right if(bLeft){ bLeft=false; widthCount++; while(true){ posLeft--; if(posLeft<0) { //buffer is too short on left, add spectra i=bs[0].getScanNumber(); while(true){ i--; if(i==0) break; r->readFile(lastFile,ts,i); if(ts.getScanNumber()==0) continue; else break; } if(i==0) break; bs.push_front(ts); posA++; posRight++; posLeft=0; //ts.getRawFilter(cFilter2,256); if(ts.getMsLevel()==cs.msLevel) { index=posLeft; break; } } else { //bs[posLeft].getRawFilter(cFilter2,256); if(bs[posLeft].getMsLevel()==cs.msLevel) { index=posLeft; break; } } } } else { bLeft=true; widthCount++; while(true){ posRight++; if(posRight>=(int)bs.size()) { //buffer is too short on right, add spectra r->readFile(lastFile,ts,bs[bs.size()-1].getScanNumber()); r->readFile(NULL,ts); if(ts.getScanNumber()==0) { posRight--; break; } bs.push_back(ts); //ts.getRawFilter(cFilter2,256); if(ts.getMsLevel()==cs.msLevel) { index=posRight; break; } } else { //bs[posRight].getRawFilter(cFilter2,256); if(bs[posRight].getMsLevel()==cs.msLevel) { index=posRight; break; } } } } if(index==-1) continue; specs[numScans++]=bs[index]; } double tmz; int mzcount=0; /* Ledford equation correction double freq; double conA=0.0; double conB=0.0; for(m=0;m<numScans;m++){ conA+=specs[m].getConversionA(); conB+=specs[m].getConversionB(); } conA/=numScans; conB/=numScans; printf("%.10lf, %.10lf\n",conA,conB); for(k=0;k<numScans;k++){ for(j=0;j<specs[k].size();j++){ freq = sqrt(specs[k].getConversionA()*specs[k].getConversionA() - (4*specs[k].at(j).mz*(-specs[k].getConversionB()))); freq += specs[k].getConversionA(); freq /= (2*specs[k].at(j).mz); specs[k].at(j).mz = conA/freq + conB/(freq*freq); } } */ //Match peaks between pivot scan (0) and neighbors (the rest) for(m=0;m<numScans;m++){ vPos.clear(); for(i=0;i<numScans;i++) vPos.push_back(0); for(i=0;i<specs[m].size();i++){ //iterate all points if(specs[m].at(i).intensity<0.1) continue; tmz=specs[m].at(i).mz; mzcount=1; prec = c * tmz * tmz / 2; for(k=m+1;k<numScans;k++){ //iterate all neighbors dif=100000.0; for(j=vPos[k];j<specs[k].size();j++){ //check if point is a match if(specs[k].at(j).intensity<0.1) continue; //skip meaningless datapoints to speed along dt=fabs(tmz-specs[k].at(j).mz); if(dt<=dif) { if(dt<prec) { //linear interpolate //if(specs[k].at(j).mz<tmz && j<specs[k].size()-1){ // slope=(specs[k].at(j+1).intensity-specs[k].at(j).intensity)/(specs[k].at(j+1).mz-specs[k].at(j).mz); // intercept=specs[k].at(j).intensity-specs[k].at(j).mz*slope; // specs[m].at(i).intensity+=(tmz*slope+intercept); //} else if(specs[k].at(j).mz>tmz && j>0) { // slope=(specs[k].at(j).intensity-specs[k].at(j-1).intensity)/(specs[k].at(j).mz-specs[k].at(j-1).mz); // intercept=specs[k].at(j).intensity-specs[k].at(j).mz*slope; // specs[m].at(i).intensity+=(tmz*slope+intercept); //} else { specs[m].at(i).intensity += specs[k].at(j).intensity; //} //Averaging the mz values appears equivalent to realigning all spectra against //an average Ledford correction. specs[m].at(i).mz += specs[k].at(j).mz; vPos[k]=j+1; specs[k].at(j).intensity=-1.0; mzcount++; break; } dif=dt; } else { vPos[k]=j-1; break; } } }//for k sp.add(specs[m].at(i).mz/mzcount,specs[m].at(i).intensity/numScans); } //next i } //next m if(sp.size()>0) sp.sortMZ(); sp.setScanNumber(specs[0].getScanNumber()); sp.setScanNumber(specs[0].getScanNumber(true),true); sp.setRTime(specs[0].getRTime()); sp.setRawFilter(cFilter1); if(posLeft>0){ while(posLeft>0){ bs.pop_front(); posLeft--; posA--; } } delete [] specs; return true; }
bool CNoiseReduction::ScanAveragePlusDeNoise(Spectrum& sp, char* file, int width, float cutoff, int scanNum){ Spectrum ts; Spectrum ps; //MSReader r; vector<int> v; vector<int> vPos; int i; int j; int k; int widthCount=0; int numScans=1; int match; double dif; double prec; double dt; double c; bool bLeft=true; int posLeft=ps.getScanNumber()-1; int posRight=ps.getScanNumber()+1; int index; char cFilter1[256]; //char cFilter2[256]; sp.clear(); //if file is not null, create new buffer if(file!=NULL){ strcpy(lastFile,file); bs.clear(); if(scanNum>0) r->readFile(file,ts,scanNum); else r->readFile(file,ts); if(ts.getScanNumber()==0) return false; bs.push_back(ts); ps=bs[0]; c=CParam(ps,3); posA=0; } else { posA++; //cout << "ER: " << posA << " " << bs.size() << endl; if(posA>=(int)bs.size()) return false; //end of buffer, no more data ps=bs[posA]; c=CParam(ps,3); } //set our pivot spectrum //ps=bs[posA]; ps.getRawFilter(cFilter1,256); //cout << "Averaging: " << ps.getScanNumber() << endl; posLeft=posA; posRight=posA; while(widthCount<(width*2)){ index=-1; //Alternate looking left and right if(bLeft){ bLeft=false; widthCount++; while(true){ posLeft--; //cout << posLeft << endl; if(posLeft<0) { //buffer is too short on left, add spectra i=bs[0].getScanNumber(); while(true){ i--; //cout << "I: " << i << endl; if(i==0) break; r->readFile(lastFile,ts,i); if(ts.getScanNumber()==0) continue; else break; } if(i==0) break; bs.push_front(ts); for(i=0;i<(int)v.size();i++)v[i]++; posA++; posRight++; posLeft=0; //ts.getRawFilter(cFilter2,256); if(ts.getMsLevel()==cs.msLevel) { index=posLeft; break; } } else { //bs[posLeft].getRawFilter(cFilter2,256); if(bs[posLeft].getMsLevel()==cs.msLevel) { index=posLeft; break; } } } } else { bLeft=true; widthCount++; while(true){ posRight++; if(posRight>=(int)bs.size()) { //buffer is too short on right, add spectra r->readFile(lastFile,ts,bs[bs.size()-1].getScanNumber()); r->readFile(NULL,ts); if(ts.getScanNumber()==0) { posRight--; break; } bs.push_back(ts); //ts.getRawFilter(cFilter2,256); if(ts.getMsLevel()==cs.msLevel) { index=posRight; break; } } else { //bs[posRight].getRawFilter(cFilter2,256); if(bs[posRight].getMsLevel()==cs.msLevel) { index=posRight; break; } } } } if(index==-1) continue; //ts=bs[index]; v.push_back(index); numScans++; } //cout << "Still Averaging: " << ps.getScanNumber() << endl; //cout << " with: "; //for(i=0;i<v.size();i++) cout << bs[v[i]].getScanNumber() << " "; //cout << endl; //cout << numScans << " " << v.size() << endl; //Match peaks between pivot scan and neighbors for(i=0;i<(int)v.size();i++) vPos.push_back(0); for(i=0;i<(int)ps.size();i++){ //iterate all points prec = c * ps.at(i).mz * ps.at(i).mz / 2; match=1; for(k=0;k<(int)v.size();k++){ //iterate all neighbors dif=100000.0; //cout << "Checking " << bs[v[k]].getScanNumber() << " pos " << vPos[k] << endl; for(j=vPos[k];j<bs[v[k]].size();j++){ //check if point is a match dt=fabs(ps.at(i).mz-bs[v[k]].at(j).mz); if(dt<=dif) { if(dt<prec) { ps.at(i).intensity+=bs[v[k]].at(j).intensity; vPos[k]=j+1; match++; break; } dif=dt; } else { vPos[k]=j-1; break; } } } //if data point was not visible across enough scans, set it to 0 if(match<cs.boxcarFilter && match<(int)v.size()) ps.at(i).intensity=0.0; } //Average points and apply cutoff for(i=0;i<ps.size();i++) { ps.at(i).intensity/=numScans; sp.add(ps.at(i)); //if(ps.at(i).intensity>=cutoff) sp.add(ps.at(i)); } sp.setScanNumber(ps.getScanNumber()); sp.setScanNumber(ps.getScanNumber(true),true); sp.setRTime(ps.getRTime()); sp.setRawFilter(cFilter1); //clear unused buffer if(posLeft>0){ while(posLeft>0){ bs.pop_front(); posLeft--; posA--; } } //cout << "Done averaging" << endl; return true; }