C/C++文本统计分析

#include <iostream>
#include <fstream>


using namespace std;
int GetTxtLine(const char *filename);
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
char c[10];//使用文件流从txt文本中读入一行数据到c[10]
int main() {

    //ifstream f1("/home/geant4/CLionProjects/untitled/input.txt");//打开文件
    //char *FileName = "/home/geant4/CLionProjects/untitled3/BenDi-10min.txt";
     char *FileName="/home/geant4/CLionProjects/untitled3/Cs137-10min.txt";
    int Txtline = GetTxtLine(FileName);
    ifstream f1(FileName);
    int i = 0;

    int basline = 3000;//基线水平 wavedump里设置
    int trigger = 5;//如果数据采集仪器的trigger设置的比较大 这里的触发可以设置的比较低
    // int RecordLength=602;
    int RecordLength = 1024;//一个Event记录的数据数 wavedump里设置

    int Extra = 7;//文本中非数字的部分
    int Eline = RecordLength + Extra;//一个Event的总长
    int maxevent = Txtline / Eline;//总事件数
    int QshortGate = 20;
    //  int QlongGate=200;

    //共有统计量
    int a[maxevent][Eline];//记录所有数据
    double s[maxevent];    //统计Qshort
    double PSD[maxevent];//统计PSD

    //channel 0
    double b[maxevent];    //统计energy 也就是Qlong
    int sigma[maxevent][Eline];//basline 与脉冲的差值
    int plus[maxevent][Eline];//加trigger限制后的 脉冲数据

    //channel 1
    double b1[maxevent];    //统计energy 也就是Qlong
    int sigma1[maxevent][Eline];//basline 与脉冲的差值
    int plus1[maxevent][Eline];//加trigger限制后的 脉冲数据


    while (f1.good()) {
        int f = i % Eline;
        int n = f - Extra;
        int eventid = i / Eline;

        f1.getline(c, 40);
        //  cout<<"i"<<"   "<<i<<"   "<<"n"<<n<<"   "<<"eventid"<<eventid<<"   "<<endl;
        //cout << c << endl;

        if (n >= 0 && n <= RecordLength) {

            int C = atoi(c);
            //   int C=convert(c);
            a[eventid][n] = C;
            //cout<<C<<"  C"<<"   "<<"i"<<"   "<<i<<"   "<<"n"<<n<<"   "<<"eventid"<<eventid<<"   "<<"c"<<c<<endl;
        }


        i++;
    }

    //sigma 与基线的差值 以及plus脉冲数据的记录(设置trigger记录与脉冲的起始点与终止点)

    int K[maxevent];//记录一个每一个脉冲的数据数
    for (int A = 0; A < maxevent; A++) {
        int k = 0;
        int flag = A % 2;//flag 为0即位Channel0;为1即为channel1;
        // cout<<"flag"<<flag<<endl;
        if (flag == 0) {
            for (int b = 0; b < RecordLength; b++) {
                int Single = (A - 1) / 2;
                sigma[Single][b] = basline - a[A][b];
                // cout << "sigma" << " "<<sigma[Single][b]<<"   ";
                if (sigma[Single][b] >= trigger && sigma[Single][b] < basline - 1) {
                    plus[Single][k] = sigma[Single][b];
                    //cout<<"Plus"<<plus[A][k]<<"  ";
                    k++;
                }
                K[A] = k - 1;

            }
        }
        if (flag == 1) {
            for (int b = 0; b < RecordLength; b++) {
                int Double = A / 2;
                sigma1[Double][b] = basline - a[A][b];
                //   cout << "sigma1" << " "<<sigma1[Double][b]<<"   ";
                if (sigma1[Double][b] >= trigger && sigma1[Double][b] < basline - 1) {
                    plus1[Double][k] = sigma1[Double][b];
                    //cout<<"Plus"<<plus[A][k]<<"  ";
                    k++;

                }
                K[A] = k - 1;

            }
        }
        // cout<<endl;
    }


    //统计Qlong
    for (int A = 0; A < maxevent; A++) {
        int Energy = 0;
        int flag = A % 2;//flag 为0即位Channel0;为1即为channel1;
        if (flag == 0) {
            int Single = (A - 1) / 2;
            for (int b = 0; b < K[A]; b++) {
                // cout << a[A][b] << " ";
                //Energy+=a[A][b];
                if (plus[Single][b] > trigger && plus[Single][b])
                    Energy += plus[Single][b];
            }

            b[Single] = Energy;
            cout << "Qlong" << "  " << Energy << endl;
        }
        if (flag == 1) {
            int Double = A / 2;
            for (int b = 0; b < K[A]; b++) {
                // cout << a[A][b] << " ";
                //Energy+=a[A][b];
                if (plus1[Double][b] > trigger && plus1[Double][b])
                    Energy += plus1[Double][b];
            }

            b1[Double] = Energy;
            cout << "Qlong1" << "  " << Energy << endl;
        }
    }


    //统计Qshort 若QshortGate 大于Qlong的数据范围 会出错
    for (int A = 0; A < maxevent; A++) {
        int Qshort = 0;
        int flag = A % 2;//flag 为0即位Channel0;为1即为channel1;
        if (flag == 0) {
            int Single = (A - 1) / 2;
            for (int b = 0; b < QshortGate; b++) {
                // cout << a[A][b] << " ";
                //Energy+=a[A][b];
                if (b < K[A])
                    Qshort += plus[Single][b];
            }
            s[A] = Qshort;
            if (b[Single] == 0)PSD[A] = 0;
            else PSD[A] = (b[Single] - s[A]) / b[Single];

            //cout<<endl;
            cout << "Qshort" << "   " << s[A] << "   " << "PSD" << "  " << PSD[A] << endl;
        }
        if (flag == 1) {
            int Double = A / 2;
            for (int b = 0; b < QshortGate; b++) {
                // cout << a[A][b] << " ";
                //Energy+=a[A][b];
                if (b < K[A])
                    Qshort += plus1[A][b];
            }
            s[A] = Qshort;
            if (b1[Double] == 0)PSD[A] = 0;
            else PSD[A] = (b1[Double] - s[A]) / b1[Double];
            //cout<<endl;
            cout << "Qshort1" << "   " << s[A] << "   " << "PSD" << "  " << PSD[A] << endl;
        }
    }
}
int GetTxtLine(const char *filename)

{

    FILE *fd;

    int count = 0;

    if (fd =fopen(filename,"r"))

    {
        while (!feof(fd))

        {
            if ('\n' == fgetc(fd))

            {
                count ++;

            }

        }

    }

    printf("count: %d\n", count);


    if (fd)

    {
        fclose(fd);
        // printf("ccc: %d\n", count);
    }

    return count;

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2193410903

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值