1 | /********************************************************************\
|
---|
2 |
|
---|
3 | rawtoroot.cc
|
---|
4 |
|
---|
5 | Reads rawfile created by the CTX DAQ.
|
---|
6 | Run using '.x rawtoroot.cc++("raw-filename")'.
|
---|
7 | Generate shared library using make, then load library in root
|
---|
8 | with gSystem->Load("RawDataCTX.so")
|
---|
9 |
|
---|
10 | Dominik Neise
|
---|
11 | based on rootread.cc by Oliver Grimm
|
---|
12 |
|
---|
13 | \********************************************************************/
|
---|
14 |
|
---|
15 | #include <stdlib.h>
|
---|
16 | #include <iostream>
|
---|
17 |
|
---|
18 | #include <TCanvas.h>
|
---|
19 | #include <TH1.h>
|
---|
20 | #include <TTree.h>
|
---|
21 | #include <TFile.h>
|
---|
22 | #include <TTimer.h>
|
---|
23 | #include <Getline.h>
|
---|
24 | #include <TLegend.h>
|
---|
25 |
|
---|
26 | #include <string.h>
|
---|
27 | #include "../../drsdaq/RawDataCTX.h"
|
---|
28 |
|
---|
29 | void rawtoroot(char* Filename) {
|
---|
30 |
|
---|
31 |
|
---|
32 | string c=Filename;
|
---|
33 | c.replace(c.length()-3,3,"root");
|
---|
34 |
|
---|
35 | TFile *myf = new TFile(c.c_str(),"RECREATE","Demo ROOT file with histograms & trees");
|
---|
36 |
|
---|
37 | #ifdef __CINT__
|
---|
38 | printf("Error: This script can only be executed via ACliC\n");
|
---|
39 | return;
|
---|
40 | #endif
|
---|
41 |
|
---|
42 | RawDataCTX *RD = new RawDataCTX();
|
---|
43 |
|
---|
44 | // Open data file and read run header
|
---|
45 | if (RD->OpenDataFile(Filename, NULL) != CTX_OK) {
|
---|
46 | delete RD;
|
---|
47 | return;
|
---|
48 | }
|
---|
49 |
|
---|
50 | // ...for convenience some abbrevations
|
---|
51 | unsigned int Boards = RD->RHeader->NBoards;
|
---|
52 | unsigned int Channels = RD->RHeader->NChips*RD->RHeader->NChannels;
|
---|
53 | unsigned int Samples = RD->RHeader->Samples;
|
---|
54 | if (Samples != 1024) {
|
---|
55 | cout << "Error: ROI is not 1024, but data is shifted according to physical pipeline. Makes no sense." << endl;
|
---|
56 | }
|
---|
57 |
|
---|
58 | int stopcell;
|
---|
59 | unsigned int channel,drs,Eventnumber,channelindex;
|
---|
60 |
|
---|
61 | TH1F* hist = new TH1F();
|
---|
62 |
|
---|
63 |
|
---|
64 | TTree *tree = new TTree("T","event data tree");
|
---|
65 |
|
---|
66 | tree->Branch("drs",&drs,"drs/I"); // from 0 .. 3
|
---|
67 | tree->Branch("channel",&channel,"channel/I"); // from 0 .. 8
|
---|
68 | tree->Branch("channelindex", &channelindex, "channelindex/I"); // from 0 .. 35
|
---|
69 | tree->Branch("hist","TH1F",&hist);
|
---|
70 | tree->Branch("samples",&Samples,"samples/I"); // size of ROI
|
---|
71 |
|
---|
72 | // note: not the real Eventnumber from RAW file is used
|
---|
73 | // TODO
|
---|
74 | tree->Branch("Eventnumber", &Eventnumber, "Eventnumber/I"); // Eventnumber 0..N
|
---|
75 |
|
---|
76 | // the data is shifted, which makes only sense for ROI=samples=1024
|
---|
77 | tree->Branch("stopcell", &stopcell, "stopcell/I");
|
---|
78 |
|
---|
79 | int num=0;
|
---|
80 |
|
---|
81 | // Read and display all events
|
---|
82 | while (RD->ReadEvent(0, stdout) == CTX_OK) {
|
---|
83 | Eventnumber = num;
|
---|
84 | int *TrigPnt = (int *) RD->Data;
|
---|
85 |
|
---|
86 | // apparently it is necessary to step back 8 byte ... I don't know why, but it works.
|
---|
87 | short *DataPnt = (short *) RD->Data + (Boards*RD->RHeader->NChips)*sizeof(int) - 8 * sizeof(char);
|
---|
88 |
|
---|
89 | printf("Trigger cells: ");
|
---|
90 | for(unsigned int i=0; i<Boards*RD->RHeader->NChips; i++) printf("%d ", *(TrigPnt + i));
|
---|
91 | printf("\n");
|
---|
92 |
|
---|
93 | for(unsigned int k=0; k<Boards; k++) {
|
---|
94 | for(unsigned int j=0; j<Channels; j++) {
|
---|
95 | TH1F* a = new TH1F();
|
---|
96 | a->SetBins(Samples, -0.5, Samples-0.5);
|
---|
97 | a->SetLineColor(1);
|
---|
98 | a->SetLineWidth(2);
|
---|
99 | a->SetLineStyle(1);
|
---|
100 | a->GetXaxis()->SetTitle(Form("Time slice (%.1f ns/slice)", 1./RD->BStruct[k].NomFreq));
|
---|
101 | a->GetYaxis()->SetTitle("Amplitude (a.u.)");
|
---|
102 | drs = j/9;
|
---|
103 | channel = j%9;
|
---|
104 | channelindex = j;
|
---|
105 | stopcell = *(TrigPnt + drs);
|
---|
106 | for(unsigned int i=0; i<Samples ; i++) {
|
---|
107 | a->SetBinContent((i+stopcell)%Samples+1, DataPnt[k*Channels*Samples + j*Samples + i] * RD->BStruct[k].ScaleFactor);
|
---|
108 | }
|
---|
109 |
|
---|
110 |
|
---|
111 | hist=a;
|
---|
112 | tree->Fill();
|
---|
113 | delete a;
|
---|
114 | }
|
---|
115 | }
|
---|
116 |
|
---|
117 | ++num;
|
---|
118 | }
|
---|
119 |
|
---|
120 | tree->BuildIndex("Eventnumber", "channelindex");
|
---|
121 |
|
---|
122 | myf->Write();
|
---|
123 | myf->Close();
|
---|
124 | delete RD;
|
---|
125 | }
|
---|