source: Sophya/trunk/AddOn/TAcq/corrcrtadc.cc@ 4001

Last change on this file since 4001 was 4001, checked in by ansari, 14 years ago

Suite (2) amelioration prog calcul correlation ADC-CRT, Reza 14/06/2011

File size: 10.7 KB
RevLine 
[3996]1// Utilisation de SOPHYA pour faciliter les tests ...
2#include "sopnamsp.h"
3#include "machdefs.h"
4
5/* ----------------------------------------------------------
[3999]6 Projet BAORadio - (C) LAL/IRFU 2008-2011
[3996]7
8 Programme de lecture des fichiers DUMP ADC du CRT (Pittsburgh)
9 pour calcul de spectres / correlations
10 R. Ansari, C. Magneville - LAL/Irfu - Juin 2011
11 ---------------------------------------------------------- */
12
13// include standard c/c++
14#include <math.h>
15#include <stdio.h>
16#include <stdlib.h>
17#include <string.h>
18
19#include <iostream>
20#include <string>
21
22#include "pexceptions.h"
23#include "tvector.h"
24#include "fioarr.h"
25// #include "tarrinit.h"
26#include "ntuple.h"
27#include "datatable.h"
28#include "histinit.h"
29#include "matharr.h"
30#include "timestamp.h"
31#include "fftwserver.h"
32#include "fftpserver.h"
33#include "utilarr.h"
[3999]34#include "histats.h"
[3996]35
36// include sophya mesure ressource CPU/memoire ...
37#include "resusage.h"
38#include "ctimer.h"
39#include "timing.h"
40
41
42//--------------------------- Fonctions de ce fichier -------------------
43int Usage(bool fgshort=true);
44int DecodeProc(int narg, char* arg[]);
[3999]45int ProcessADCFiles(string& inoutpath, vector<int>& adcids, string& outname, int imin, int imax, int istep, int jf1, int jf2, int nfreq);
[3997]46int ComputeCorrel(TMatrix< complex<r_4> >& cfour, TMatrix< complex<r_8> >& correl, TMatrix< complex<r_8> >& autocorrel);
[3999]47int ADCFiles2Histo(string& inoutpath, vector<int>& adcids, string& outname, int imin, int imax, int istep);
48
[3996]49//------------------------------------------------------------------------------------------------------------
50
51/* --Fonction-- */
52int Usage(bool fgshort)
53{
[3999]54 cout << " --- corrcrtadc.cc : Read CRT-ADC dump files and process to produce correlation matrices \n"
[4000]55 << " Usage: corrcrtadc -corr/-hval InOutPath OutFile [AdcIds] [Imin,Imax,step]\n" << endl;
[3996]56 if (fgshort) {
57 cout << " corrcrtadc -h for detailed instructions" << endl;
58 return 1;
59 }
[3999]60 cout << " -corr/-hval : Compute correlations or Fill histograms for ADC sample values \n"
61 << " InOutPath : Input/Output directory name \n"
[4000]62 << " ADCIds : ADC Id's to be processed (Example: 1,2,3,4, default=0,1) \n"
[3996]63 << " OutFile : Output PPF file name \n"
64 << " Imin,Imax,IStep: Input ADC dump files sequence number \n"
[3999]65 << " FileNames=InOutPath/adcdumpNJFII.fits Imin<=II<=Imax II+=IStep , J=ADCIds \n" << endl;
66 // << " NumFreq1,NumFreq2,NBinFreq: Freq Zone and number of frequency bins for ntuple" << endl;
[3996]67 return 1;
68}
69
70//----------------------------------------------------
71//----------------------------------------------------
72int main(int narg, char* arg[])
73{
74 if ((narg>1)&&(strcmp(arg[1],"-h")==0)) return Usage(false);
75 if (narg<4) return Usage(true);
76 HiStatsInitiator _inia;
77 // TArrayInitiator _inia;
78
79 int rc = 0;
80 try {
81 ResourceUsage resu;
82 DecodeProc(narg-1, arg+1);
83 resu.Update();
84 cout << resu;
85 }
86 catch (PException& exc) {
87 cerr << " corrcrtadc.cc catched PException " << exc.Msg() << endl;
88 rc = 77;
89 }
90 catch (std::exception& sex) {
91 cerr << "\n corrcrtadc.cc std::exception :"
92 << (string)typeid(sex).name() << "\n msg= "
93 << sex.what() << endl;
94 rc = 78;
95 }
96 catch (...) {
97 cerr << " corrcrtadc.cc catched unknown (...) exception " << endl;
98 rc = 79;
99 }
100
101 cout << ">>>> corrcrtadc.cc ------- END ----------- RC=" << rc << endl;
102 return rc;
103
104}
105
[3999]106
[3996]107//--------------------------------------------------------------------
108// Traitement fichiers produits par vismfib (V Nov09)
109/* --Fonction-- */
110int DecodeProc(int narg, char* arg[])
111{
112 // Decodage des arguments et traitement
[3999]113 string popt = arg[0];
114 bool fillhis=false;
115 if (popt=="-hval") fillhis=true;
116 string inoutpath = arg[1];
117 string outname = arg[2];
[4001]118 int aids[4]={0,1,-1,-1};
[3999]119 if (narg>3) sscanf(arg[3],"%d,%d,%d,%d",aids,aids+1,aids+2,aids+3);
120 vector<int> adcids;
121 for(int ii=0;ii<4;ii++)
[4001]122 if((aids[ii]>=0)&&(aids[ii]<16)) adcids.push_back(aids[ii]);
[3996]123 int imin=0;
124 int imax=0;
125 int istep=1;
[3999]126 if (narg>4) sscanf(arg[4],"%d,%d,%d",&imin,&imax,&istep);
[3996]127 int jf1=0;
128 int jf2=0;
129 int nfreq=0;
[3999]130 if (narg>5)
131 sscanf(arg[5],"%d,%d,%d",&jf1,&jf2,&nfreq);
[3996]132
[3999]133 cout << " ----- corrcrtadc/DecodeProc - Start " << ((fillhis)? " Fill ADC-val histogram" : " Compute Correlation") << endl;
134 cout << " InOutPath= " << inoutpath << " ADCIds: " ;
135 for(size_t ii=0; ii<adcids.size(); ii++) cout << adcids[ii] << " , ";
[4001]136 cout << " (NbADC=" << adcids.size() << ") OutFileName= " << outname
137 << " IMin,Max,Step=" << imin << "," << imax << "," << istep << endl;
138 // << "Frequency num range JF=" << jf1 << "," << jf2 << "," << nfreq << " ------- " << endl;
[3999]139 int rc=0;
140 if (fillhis) rc = ADCFiles2Histo(inoutpath, adcids, outname, imin, imax, istep);
141 else rc=ProcessADCFiles(inoutpath, adcids, outname, imin, imax, istep, jf1, jf2, nfreq);
142
[3996]143 return rc;
144}
145
[3999]146// Taille des fichiers 4 voies = 1024*1024*128 ===> 32 x 1024 x 1024 samples / voie
147// On lit par paquet de 4096 = 4 x 1024 / voie --> ADCRDBLKSZ=16x1024=16384
148#define ADCFLEN 4096
149#define ADCRDBLKSZ 16384
150#define ADCNREAD 8192
151
[4001]152static int PRTMODULO = 1000;
[3999]153
[3996]154// Pour traitement (calcul FFT et visibilites (ProcA) 1 fibre, 2 voies RAW)
155/* --Fonction-- */
[3999]156int ProcessADCFiles(string& inoutpath, vector<int>& adcids, string& outname, int imin, int imax, int istep, int jf1, int jf2, int nfreq)
[3996]157{
158 Timer tm("ProcessADCFiles");
159
[3999]160#define NFREQUSED 2040
161#define NFREQUSESTART 5
162#define NFREBIN 4
[3996]163
[3999]164 sa_size_t NFREQREBIN = NFREQUSED/NFREBIN;
165 sa_size_t NBADC = adcids.size();
166
[3996]167 sa_size_t NCHAN = 4*NBADC;
168 TMatrix< complex<r_4> > cfour(NCHAN, NFREQUSED);
169 sa_size_t NCORREL = NCHAN*(NCHAN+1)/2;
170 TMatrix< complex<r_8> > correl(NCORREL,NFREQUSED);
[3997]171 TMatrix< complex<r_8> > autocorrel(NCHAN,NFREQUSED);
[3999]172 double nsumcor=0.;
[3996]173
[3999]174 vector<FILE*> fip;
175 vector<int> adcchans;
176 for(size_t ka=0; ka<NBADC; ka++) {
177 fip.push_back(NULL);
178 adcchans.push_back(adcids[ka]*4+ka);
179 }
180
[3996]181 FFTPackServer ffts(false);
182
183 TVector<r_4> sigadc(ADCFLEN);
184 TVector< complex<r_4> > foursig;
185
186 char fname[512];
187
[3997]188 signed char rdbuff[ADCRDBLKSZ];
[3996]189 for(int ifile=imin; ifile<=imax; ifile+=istep) {
190 for(int ka=0; ka<NBADC; ka++) {
[3999]191 sprintf(fname, "%s/adcdumpN%dF%d.bd",inoutpath.c_str(),adcids[ka],ifile);
[3996]192 fip[ka]=fopen(fname,"rb");
[3999]193 if (fip[ka]==NULL)
194 cout << "ProcessADCFiles/ERROR opening file " << fname << " AdcId=" << adcids[ka] << " I=" << ifile << endl;
195 else
196 cout << "ProcessADCFiles/Info - file " << fname << " opened ... " << " AdcId=" << adcids[ka] << " I=" << ifile << endl;
[3996]197 }
198
199 for(int m=0; m<ADCNREAD; m++) {
200 sa_size_t irc=0;
201 for(int ka=0; ka<NBADC; ka++) {
202 fread(rdbuff,1,ADCRDBLKSZ,fip[ka]);
203 for(int jac=0; jac<4; jac++) {
[3997]204 for(sa_size_t ls=0; ls<ADCFLEN; ls++) sigadc(ls)=(float)rdbuff[ls*4+jac];
[3996]205 ffts.FFTForward(sigadc, foursig);
[3999]206 cfour.Row(irc)=foursig(Range(NFREQUSESTART,NFREQUSESTART+NFREQUSED-1)).Transpose(); irc++;
[3996]207 }
208 }
[3997]209 ComputeCorrel(cfour, correl, autocorrel);
[3999]210 nsumcor++;
211 if (m%PRTMODULO==0) cout << " ProcessADCFiles/Info Done read+FFT+correl m=" << m << " / Max=" << ADCNREAD << endl;
[3996]212 }
213 for(int ka=0; ka<NBADC; ka++) fclose(fip[ka]);
214 }
215
216
[3999]217 correl /= nsumcor;
218 autocorrel /= nsumcor;
219
220 TMatrix< complex<r_8> > correbin(NCORREL,NFREQREBIN);
221 sa_size_t icc=0;
222 for(sa_size_t i=0; i<correbin.NCols(); i++) {
223 for(sa_size_t j=0; j<NFREBIN; j++) {
224 correbin.Column(i) += correl.Column(icc);
225 icc++;
226 }
227 }
228
[3996]229 sprintf(fname, "%s/%s",inoutpath.c_str(),outname.c_str());
230 cout << "ProcessADCFiles: Opening file " << fname << " for writing correlation matrix" << endl;
231 POutPersist po(fname);
[3997]232 po << PPFNameTag("correlmtx") << correl;
233 po << PPFNameTag("acorrmtx") << autocorrel;
[3999]234 po << PPFNameTag("rebincormtx") << correbin;
[3997]235
[3996]236 cout << "ProcessADCFiles: finished FFT + correlation computing " << endl;
[3999]237
238 cout << " --------------- Channel/Correlation number association --------------- " << endl;
239 cout << " CorreNumber- axb (MtxRow) : (Ca, Cb) -- ADCChan(c,d) " << endl;
240 cout << " ----------------------------------------------------------------------- " << endl;
241 sa_size_t jcr=0;
242 for(sa_size_t j1=0; j1<cfour.NRows(); j1++) {
243 for(sa_size_t j2=j1; j2<cfour.NRows(); j2++) {
244 cout << jcr << " : (" << j1 << "," << j2 << ") -> ADCChans (" << adcchans[j1] << "," << adcchans[j2] << ")" << endl;
245 jcr++;
246 }
247 }
248 cout << " ----------------------------------------------------------------------- " << endl;
249
[3996]250 return 0;
251}
252
253/* --Fonction-- */
[3997]254int ComputeCorrel(TMatrix< complex<r_4> >& cfour, TMatrix< complex<r_8> >& correl, TMatrix< complex<r_8> >& autocorrel)
[3996]255{
256 sa_size_t jcr=0;
257 for(sa_size_t j1=0; j1<cfour.NRows(); j1++) {
258 for(sa_size_t j2=j1; j2<cfour.NRows(); j2++) {
259 for(sa_size_t i=0; i<cfour.NCols(); i++)
260 correl(jcr,i) += complex<r_8> ( cfour(j1,i)*conj(cfour(j2,i)) );
[3997]261 if (j1==j2) autocorrel.Row(j1)=correl.Row(jcr);
[3996]262 jcr++;
263 }
264 }
265 return 0;
266}
267
[3999]268/* --Fonction-- */
269int ADCFiles2Histo(string& inoutpath, vector<int>& adcids, string& outname, int imin, int imax, int istep)
270{
271 Timer tm("ADCFiles2Histo");
272
273 sa_size_t NBADC = adcids.size();
274
275 sa_size_t NCHAN = 4*NBADC;
276 vector<Histo *> vhist;
277 for(int ka=0; ka<NCHAN; ka++)
278 vhist.push_back(new Histo(-128.5,128.5,257) );
279
280 vector<FILE*> fip;
281 for(size_t ka=0; ka<NBADC; ka++) fip.push_back(NULL);
282
283 char fname[512];
284
285 signed char rdbuff[ADCRDBLKSZ];
286 for(int ifile=imin; ifile<=imax; ifile+=istep) {
287 for(int ka=0; ka<NBADC; ka++) {
288 sprintf(fname, "%s/adcdumpN%dF%d.bd",inoutpath.c_str(),adcids[ka],ifile);
289 fip[ka]=fopen(fname,"rb");
290 if (fip[ka]==NULL)
291 cout << "ADCFiles2Histo/ERROR opening file " << fname << " AdcId=" << adcids[ka] << " I=" << ifile << endl;
292 else
293 cout << "ADCFiles2Histo/Info - file " << fname << " opened ... " << " AdcId=" << adcids[ka] << " I=" << ifile << endl;
294 }
295
296 for(int m=0; m<ADCNREAD; m++) {
297 sa_size_t irc=0;
298 for(int ka=0; ka<NBADC; ka++) {
299 fread(rdbuff,1,ADCRDBLKSZ,fip[ka]);
300 for(int jac=0; jac<4; jac++) {
301 for(sa_size_t ls=0; ls<ADCFLEN; ls++) vhist[irc]->Add((r_8)rdbuff[ls*4+jac]);
302 irc++;
303 }
304 }
305 if (m%PRTMODULO==0) cout << " ADCFiles2Histo/Info Done FillHist m=" << m << " / Max=" << ADCNREAD << endl;
306 }
307 for(int ka=0; ka<NBADC; ka++) fclose(fip[ka]);
308 }
309
310 sprintf(fname, "%s/%s",inoutpath.c_str(),outname.c_str());
311 cout << "ADCFiles2Histo: Opening file " << fname << " for writing ADC value histograms " << endl;
312 POutPersist po(fname);
313 char nametag[64];
314 for(size_t ka=0; ka<NCHAN; ka++) {
315 sprintf(nametag,"adcvalC%d",ka);
[4000]316 po << PPFNameTag(nametag) << *(vhist[ka]);
[3999]317 }
318 for(size_t ka=0; ka<NCHAN; ka++) delete vhist[ka];
319
320 cout << "ADCFiles2Histo: finished ADC value histogram fill " << endl;
321 return 0;
322}
Note: See TracBrowser for help on using the repository browser.