Changeset 3592 in Sophya for trunk/AddOn/TAcq/mfits2spec.cc
- Timestamp:
- Apr 6, 2009, 11:57:39 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/AddOn/TAcq/mfits2spec.cc
r3538 r3592 2 2 #include "sopnamsp.h" 3 3 #include "machdefs.h" 4 5 /* ------------------------------------------------------------------ 6 Programme de calcul de spectre moyenne a partir des fichiers fits 7 d'acquisition de BAORadio - donnees brutes (non FFT) 8 R. Ansari, C. Magneville 9 V1 : Juillet 2008 , V2 : Avril 2009 10 ------------------------------------------------------------------ */ 4 11 5 12 // include standard c/c++ … … 26 33 27 34 28 // include mini-fits lib 35 // include mini-fits lib , et structure paquet BAORadio 29 36 #include "minifits.h" 30 31 32 inline r_4 Zmod2(complex<r_4> z) 33 { return (z.real()*z.real()+z.imag()*z.imag()); } 34 37 #include "brpaqu.h" 38 39 //---- Declaration des fonctions de calcul ---- 40 // Fonction d'analyse 1ere version, pas d'entete ds le fichier, 1 voie 41 int ana_data_0(vector<string>& infiles, string& outfile); 42 // Fonction d'analyse 2eme version , 1 voie / paquet 43 int ana_data_1(vector<string>& infiles, string& oufile); 44 // Fonction d'analyse 2eme version , 2 voies / paquet 45 int ana_data_2(vector<string>& infiles, string& oufile); 46 47 //---------------------------------------------------- 48 //---------------------------------------------------- 35 49 int main(int narg, char* arg[]) 36 50 { 37 if (narg < 2) { 38 cout << " Usage: mfits2spec file1.fits [file2.fits ...] " << endl; 51 if (narg < 4) { 52 cout << " ---Calcul spectres moyennes a partir de fits BAORadio " << endl; 53 cout << " Usage: mfits2spec ACT OutPPF file1 [file2 file3 ...] " << endl; 54 cout << " ACT=-0,-1,-2 ==> 0: Nancay-Juil2008, - 1,2 : 1/2 voies / paquet " << endl; 55 cout << " OutPPF : Output PPF file name, file1,file2 ... Input FITS files " << endl; 39 56 return 1; 40 57 } 41 cout << " ---------- mfits2spec.cc Start ------------- " << endl;42 58 43 59 TArrayInitiator _inia; … … 45 61 int rc = 0; 46 62 try { 47 ResourceUsage resu; 48 TVector<float> spectre; 49 sa_size_t nzm = 0; // Nb de spectres moyennes 50 for(int ifile=1; ifile<narg; ifile++) { 51 string ffname = arg[ifile]; 52 // -------------- Lecture de bytes 53 cout << ifile <<"-Ouverture/lecture fichier " << ffname << endl; 54 MiniFITSFile mff(ffname, MF_Read); 55 cout << "... Type=" << mff.DataTypeToString() << " NAxis1=" << mff.NAxis1() 56 << " NAxis2=" << mff.NAxis2() << endl; 57 if (mff.DataType() != MF_Byte) { 58 cout << " PB : DataType!=MF_Byte --> skipping " << endl; 59 } 60 size_t sx = mff.NAxis1(); 61 size_t sy = mff.NAxis2(); 62 63 Byte* data = new Byte[sx]; 64 TVector<r_4> vx(sx); 65 TVector< complex<r_4> > cfour; 66 FFTPackServer ffts; 67 68 for(int j=0; j<sy; j++) { 69 mff.ReadB(data, sx, j*sx); 70 // On convertit en float 71 for(sa_size_t ix=0; ix<vx.Size(); ix++) vx(ix) = (r_4)(data[ix]); 72 // On fait le FFT 73 ffts.FFTForward(vx, cfour); 74 if (!spectre.IsAllocated()) spectre.SetSize(cfour.Size()); 75 76 // On cumule les modules carres 77 for(sa_size_t jf=1; jf<spectre.Size(); jf++) 78 spectre(jf) += Zmod2(cfour(jf)); 79 nzm++; 80 81 // cout << " j=" << j << " data[0...3]=" << (int)data[0] << " , " 82 // << (int)data[1] << " , " << (int)data[2] << endl; 83 } 84 cout << "---- FIN lecture " << ffname << endl; 85 } 86 cout << "---- Ecriture spectre moyenne ds mspectre.ppf " << endl; 87 spectre /= (r_4)(nzm); 88 POutPersist po("mspectre.ppf"); 89 po << spectre; 63 string act = arg[1]; 64 string outppf = arg[2]; 65 vector<string> infiles; 66 for(int i=3; i<narg; i++) infiles.push_back(arg[i]); 67 cout << " ---------- mfits2spec.cc Start - ACT= " << act << " ------------- " << endl; 68 ResourceUsage resu; 69 if (act == "-0") ana_data_0(infiles, outppf); 70 else if (act == "-1") ana_data_1(infiles, outppf); 71 else if (act == "-2") ana_data_2(infiles, outppf); 72 else cout << " mfits2spec.cc / Bad argument ACT=" << act << " -> exit" << endl; 90 73 cout << resu ; 91 74 } … … 109 92 110 93 } 94 95 inline r_4 Zmod2(complex<r_4> z) 96 { return (z.real()*z.real()+z.imag()*z.imag()); } 97 98 /*--Nouvelle-Fonction--*/ 99 int ana_data_0(vector<string>& infiles, string& outfile) 100 { 101 TVector<float> spectre; 102 sa_size_t nzm = 0; // Nb de spectres moyennes 103 for(int ifile=0; ifile<infiles.size(); ifile++) { 104 string ffname = infiles[ifile]; 105 // -------------- Lecture de bytes 106 cout << ifile <<"-Ouverture/lecture fichier " << ffname << endl; 107 MiniFITSFile mff(ffname, MF_Read); 108 cout << "... Type=" << mff.DataTypeToString() << " NAxis1=" << mff.NAxis1() 109 << " NAxis2=" << mff.NAxis2() << endl; 110 if (mff.DataType() != MF_Byte) { 111 cout << " PB : DataType!=MF_Byte --> skipping " << endl; 112 } 113 size_t sx = mff.NAxis1(); 114 size_t sy = mff.NAxis2(); 115 116 Byte* data = new Byte[sx]; 117 TVector<r_4> vx(sx); 118 TVector< complex<r_4> > cfour; 119 FFTPackServer ffts; 120 121 for(int j=0; j<sy; j++) { 122 mff.ReadB(data, sx, j*sx); 123 // On convertit en float 124 for(sa_size_t ix=0; ix<vx.Size(); ix++) vx(ix) = (r_4)(data[ix]); 125 // On fait le FFT 126 ffts.FFTForward(vx, cfour); 127 if (!spectre.IsAllocated()) spectre.SetSize(cfour.Size()); 128 129 // On cumule les modules carres 130 for(sa_size_t jf=1; jf<spectre.Size(); jf++) 131 spectre(jf) += Zmod2(cfour(jf)); 132 nzm++; 133 134 // cout << " j=" << j << " data[0...3]=" << (int)data[0] << " , " 135 // << (int)data[1] << " , " << (int)data[2] << endl; 136 } 137 cout << "---- FIN lecture " << ffname << endl; 138 delete[] data; 139 } 140 cout << "---- Ecriture spectre moyenne ds " << outfile << endl; 141 spectre /= (r_4)(nzm); 142 POutPersist po(outfile); 143 po << spectre; 144 return 0; 145 } 146 147 /*--Nouvelle-Fonction--*/ 148 int ana_data_1(vector<string>& infiles, string& outfile) 149 { 150 TVector<float> spectre; 151 float freq0 = 0; 152 int paqsz = 0; 153 int nfileok; 154 sa_size_t nzm = 0; // Nb de spectres moyennes 155 Byte* data = NULL; 156 FFTPackServer ffts; 157 for(int ifile=0; ifile<infiles.size(); ifile++) { 158 string ffname = infiles[ifile]; 159 // -------------- Lecture de bytes 160 cout << "ana_data_1[" << ifile <<"]Ouverture/lecture fichier " << ffname << endl; 161 MiniFITSFile mff(ffname, MF_Read); 162 cout << "... Type=" << mff.DataTypeToString() << " NAxis1=" << mff.NAxis1() 163 << " NAxis2=" << mff.NAxis2() << endl; 164 if (mff.DataType() != MF_Byte) { 165 cout << " PB : DataType!=MF_Byte --> skipping " << endl; 166 continue; 167 } 168 // Les fichier FITS contiennent l'entet (24 bytes), mais pas le trailer (16 bytes) ... 169 if (paqsz == 0) { // premier passage, on fixe la taille de paquet et on alloue le buffer 170 paqsz = mff.NAxis1()+16; 171 data = new Byte[paqsz]; 172 for(int ib=0; ib<paqsz; ib++) data[ib]=0; 173 } 174 else { 175 if (paqsz != mff.NAxis1()+16) { 176 cout << " PB : paqsz=" << paqsz << " != mff.NAxis1()+16 --> skipping " << endl; 177 continue; 178 } 179 } 180 size_t sx = mff.NAxis1(); 181 size_t sy = mff.NAxis2(); 182 BRPaquet paq(NULL, data, paqsz); 183 TVector<r_4> vx(paq.DataSize()); 184 TVector< complex<r_4> > cfour; 185 186 for(int j=0; j<sy; j++) { 187 mff.ReadB(data, sx, j*sx); 188 // On convertit en float 189 for(sa_size_t ix=0; ix<vx.Size(); ix++) vx(ix) = (r_4)(paq.Data1()[ix])-127.5; 190 // On fait le FFT 191 ffts.FFTForward(vx, cfour); 192 if (!spectre.IsAllocated()) spectre.SetSize(cfour.Size()); 193 194 // On cumule les modules carres - en sautant la frequence zero 195 for(sa_size_t jf=1; jf<spectre.Size(); jf++) 196 spectre(jf) += Zmod2(cfour(jf)); 197 nzm++; freq0 += cfour(0).real(); 198 } 199 nfileok++; 200 cout << "---- FIN lecture " << ffname << " NFileOK=" << nfileok << endl; 201 } 202 if (data) delete[] data; 203 if (nzm <= 0) { 204 cout << " ana_data_1/ERROR : nzm=" << nzm << " spectres moyennes !" << endl; 205 return nzm; 206 } 207 cout << "---- Ecriture spectre moyenne ds " << outfile << endl; 208 spectre /= (r_4)(nzm); 209 spectre.Info().Comment() = " SpectreMoyenne (Moyenne module^2) "; 210 spectre.Info()["NMOY"] = nzm; // Nombre de spectres moyennes 211 spectre.Info()["Freq0"] = freq0; 212 POutPersist po(outfile); 213 po << PPFNameTag("specV1") << spectre; 214 return nfileok; 215 } 216 217 /*--Nouvelle-Fonction--*/ 218 int ana_data_2(vector<string>& infiles, string& outfile) 219 { 220 TVector<float> specV1, specV2; 221 TVector< complex<float> > cxspecV12; 222 float freq0v1 = 0; 223 float freq0v2 = 0; 224 int paqsz = 0; 225 int nfileok; 226 sa_size_t nzm = 0; // Nb de spectres moyennes 227 Byte* data = NULL; 228 FFTPackServer ffts; 229 for(int ifile=0; ifile<infiles.size(); ifile++) { 230 string ffname = infiles[ifile]; 231 // -------------- Lecture de bytes 232 cout << "ana_data_2[" << ifile <<"]Ouverture/lecture fichier " << ffname << endl; 233 MiniFITSFile mff(ffname, MF_Read); 234 cout << "... Type=" << mff.DataTypeToString() << " NAxis1=" << mff.NAxis1() 235 << " NAxis2=" << mff.NAxis2() << endl; 236 if (mff.DataType() != MF_Byte) { 237 cout << " PB : DataType!=MF_Byte --> skipping " << endl; 238 continue; 239 } 240 // Les fichier FITS contiennent l'entet (24 bytes), mais pas le trailer (16 bytes) ... 241 if (paqsz == 0) { // premier passage, on fixe la taille de paquet et on alloue le buffer 242 paqsz = mff.NAxis1()+16; 243 cout << " ana_data_2/ Allocating data , PaqSz=" << paqsz << endl; 244 data = new Byte[paqsz]; 245 for(int ib=0; ib<paqsz; ib++) data[ib]=0; 246 } 247 else { 248 if (paqsz != mff.NAxis1()+16) { 249 cout << " PB : paqsz=" << paqsz << " != mff.NAxis1()+16 --> skipping " << endl; 250 continue; 251 } 252 } 253 size_t sx = mff.NAxis1(); 254 size_t sy = mff.NAxis2(); 255 BRPaquet paq(NULL, data, paqsz); 256 TVector<r_4> vx1(paq.DataSize()/2); 257 TVector<r_4> vx2(paq.DataSize()/2); 258 TVector< complex<r_4> > cfour1,cfour2; 259 260 for(int j=0; j<sy; j++) { 261 mff.ReadB(data, sx, j*sx); 262 // if (j%50 == 0) cout << " *DBG* mff.ReadB() , j=" << j << endl; 263 // On convertit en float 264 for(sa_size_t ix=0; ix<vx1.Size(); ix++) vx1(ix) = (r_4)(paq.Data1()[ix])-127.5; 265 for(sa_size_t ix=0; ix<vx2.Size(); ix++) vx2(ix) = (r_4)(paq.Data2()[ix])-127.5; 266 // On fait le FFT 267 ffts.FFTForward(vx1, cfour1); 268 ffts.FFTForward(vx2, cfour2); 269 if (!specV1.IsAllocated()) specV1.SetSize(cfour1.Size()); 270 if (!specV2.IsAllocated()) specV2.SetSize(cfour2.Size()); 271 if (!cxspecV12.IsAllocated()) cxspecV12.SetSize(cfour1.Size()); 272 273 // On cumule les modules carres - en sautant la frequence zero 274 for(sa_size_t jf=1; jf<specV1.Size(); jf++) { 275 specV1(jf) += Zmod2(cfour1(jf)); 276 specV2(jf) += Zmod2(cfour2(jf)); 277 cxspecV12(jf) += cfour1(jf)*cfour2(jf); 278 } 279 nzm++; freq0v1 += cfour1(0).real(); freq0v2 += cfour2(0).real(); 280 } 281 nfileok++; 282 cout << "---- FIN lecture " << ffname << " NFileOK=" << nfileok << endl; 283 } 284 if (data) delete[] data; 285 if (nzm <= 0) { 286 cout << " ana_data_2/ERROR : nzm=" << nzm << " spectres moyennes !" << endl; 287 return nzm; 288 } 289 cout << "---- Ecriture spectre moyenne ds " << outfile << endl; 290 specV1 /= (r_4)(nzm); 291 specV2 /= (r_4)(nzm); 292 cxspecV12 /= complex<r_4>((r_4)(nzm),0.); 293 specV1.Info().Comment() = " SpectreMoyenne (Moyenne module^2) - Voie 1 (/2)"; 294 specV2.Info().Comment() = " SpectreMoyenne (Moyenne module^2) - Voie 2 (/2)"; 295 specV1.Info()["NMOY"] = specV2.Info()["NMOY"] = nzm; // Nombre de spectres moyennes 296 specV1.Info()["Freq0"] = freq0v1; 297 specV2.Info()["Freq0"] = freq0v2; 298 POutPersist po(outfile); 299 po << PPFNameTag("specV1") << specV1; 300 po << PPFNameTag("specV2") << specV2; 301 po << PPFNameTag("cxspecV12") << cxspecV12; 302 return 0; 303 }
Note:
See TracChangeset
for help on using the changeset viewer.