source: Sophya/trunk/ArchTOIPipe/TestPipes/gph425_ring.cc@ 4081

Last change on this file since 4081 was 1984, checked in by cecile, 23 years ago

pour release juin 02 de L2 gph 425

File size: 8.8 KB
Line 
1//////////////////////////
2// gph425_ring.cc //
3//////////////////////////
4
5//*******************************************************
6
7#include <iostream.h>
8#include <stdlib.h>
9//#include <strstream.h>
10#include <string>
11#include <stdio.h>
12#include <vector>
13
14#include "toi.h"
15#include "toisegment.h"
16//#include "toiseqbuff.h"
17#include "nooppr.h"
18#include "toiprocessor.h"
19#include "fitstoirdr.h"
20#include "fitstoiwtr.h"
21#include "toimanager.h"
22#include "datacards.h"
23#include "fitsfile.h"
24#include "sophyainit.h"
25#include "toiseqbuff.h"
26#include "timing.h"
27#include "sambainit.h"
28#include "fitsspherehealpix.h"
29#include "ring33.h"
30#include "Bolos2ring.h"
31#include "PSB2ring.h"
32
33#include <stdexcept>
34
35int main(int argc, char* argv[])
36{
37 cout << "Starting Simple Ring Making ..." << endl;
38
39 try {
40
41 SophyaInit();
42 InitTim();
43
44 char str[80];
45
46 TOIManager* mgr = TOIManager::getManager();
47 int wsize = 512; /// Segment size for TOISegmented
48
49 /// One command line argument: the filename of the datacard.
50 if( argc < 2 )
51 {
52 cout << "Need a parameter file!! " << endl;
53 exit(-1);
54 }
55 DataCards param(argv[1]);
56
57
58 int_8 PSB = param.IParam("METHOD_PSB_diff");
59 int_8 COMBI = param.IParam("METHOD_BOLOS_combi");
60
61 if ((PSB + COMBI <= 0) || (PSB + COMBI >= 2))
62 {
63 cout << "METHOD should be PSB_DIFF or BOLOS_COMBI" << endl;
64 exit(-1);
65 }
66
67 cout << endl << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
68 if(PSB==1) cout << "!!!!!!!!!!!!!! METHOD PSB_DIFF !!!!!!!!!!!!!!!!!" << endl;
69 else cout << "!!!!!!!!!!!!!! METHOD BOLOS_combi !!!!!!!!!!!!!!" << endl;
70 cout << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl << endl;
71
72 int_4 Bolos_OK[4];
73 int nbbolos_ok=0;
74
75 if (PSB==0) {
76 for(int i=0; i<4; i++) {
77 sprintf(str,"BOLOS_OK_%d",i);
78 Bolos_OK[i] = param.IParam(str);
79 if (Bolos_OK[i] >=1 ) nbbolos_ok ++;
80 }
81 if (nbbolos_ok <3) {
82 cout << "At least 3 Bolos must be used : " << Bolos_OK [0] << " "
83 << Bolos_OK[1] << " "<< Bolos_OK[2] << " "<< Bolos_OK[3] << " "<< endl;
84 exit(-1);
85 } else
86 cout << nbbolos_ok << " Bolos OK : " << Bolos_OK[0] << " "
87 << Bolos_OK[1] << " "<< Bolos_OK[2] << " "<< Bolos_OK[3] << " "<< endl;
88
89 } else Bolos_OK[0]=Bolos_OK[1]=Bolos_OK[2]=Bolos_OK[3]=1;
90
91
92 /// Nside : parameter for HEALPix ring
93 int_4 Nside = param.IParam("Nside", 0, 128);
94
95 /// The rings to create (Q,U and weight ring)
96 SphereHEALPix<r_8>* ringQ = new SphereHEALPix<r_8>(Nside);
97 SphereHEALPix<r_8>* ringU = new SphereHEALPix<r_8>(Nside);
98 SphereHEALPix<r_8>* ringQW = new SphereHEALPix<r_8>(Nside);
99 SphereHEALPix<r_8>* ringUW = new SphereHEALPix<r_8>(Nside);
100
101 int_8 snb = param.IParam("SN_Start", 0);
102 int_8 sne = param.IParam("SN_End", 0);
103
104 /// Define start and end sample number to treat
105 mgr->setRequestedSample(snb,sne);
106 cout << "SampleNumbers from " << snb << " to " << sne << endl;
107
108 vector<string> file_pointing(2);
109 vector<string> theta_pointing(2);
110 vector<string> phi_pointing(2);
111 vector<string> file_bolo(4);
112 vector<string> name_bolo(4);
113 vector<r_8> table_angle(4);
114 string toiqfile = param.SParam("FILE_TOI_Q",0,"toiQ.fits");
115 string toiufile = param.SParam("FILE_TOI_U",0,"toiU.fits");
116 string ringqfile = param.SParam("FILE_RING_Q",0,"ringQ.fits");
117 string ringufile = param.SParam("FILE_RING_U",0,"ringU.fits");
118 string ringqwfile = param.SParam("FILE_RING_WQ",0,"ringQW.fits");
119 string ringuwfile = param.SParam("FILE_RING_WU",0,"ringUW.fits");
120 if (PSB == 1) cout << "Output toi files " << toiqfile << " " << toiufile <<endl;
121 cout << "Output ring files " << ringqfile << " " << ringufile <<endl;
122 cout << "Output weights files " << ringqwfile << " " << ringuwfile <<endl;
123
124
125 int i,j;
126 for(i=0; i<2; i++ ) {
127 sprintf(str,"FILE_POINT_%d",i);
128 file_pointing[i] = param.SParam(str, 0);
129 cout << "Pointing file " << i << ": " << file_pointing[i] << endl;
130
131 sprintf(str,"NAME_POINT_%d_theta",i);
132 theta_pointing[i] = param.SParam(str, 0);
133 cout << "Pointing theta " << i << ": " << theta_pointing[i] << endl;
134
135 sprintf(str,"NAME_POINT_%d_phi",i);
136 phi_pointing[i] = param.SParam(str, 0);
137 cout << "Pointing phi " << i << ": " << phi_pointing[i] << endl;
138
139 for(j=0; j<2; j++ ) if (Bolos_OK[2*i+j]) {
140
141 sprintf(str,"FILE_PSB%d_BOLO%d",i,j);
142 file_bolo[i*2+j] = param.SParam(str, 0);
143 cout << "bolo file " << i*2+j << ": " << file_bolo[i*2+j] << endl;
144
145 sprintf(str,"NAME_PSB%d_BOLO%d",i,j);
146 name_bolo[i*2+j] = param.SParam(str, 0);
147 cout << "bolo name " << i*2+j << ": " << name_bolo[i*2+j] << endl;
148
149 sprintf(str,"ANGLE_PSB%d_BOLO%d",i,j);
150 table_angle[i*2+j] = param.DParam(str, 0);
151 cout << "Angle " << i*2+j << ": " << table_angle[i*2+j] << endl;
152 }
153 }
154
155 PSB2ring psb2ring(ringQ, ringU, ringQW, ringUW, table_angle, wsize);
156 Bolos2ring bolos2ring(ringQ, ringU, ringQW, ringUW, table_angle, Bolos_OK, wsize);
157
158 // 1- pointage
159 vector<FITSTOIReader*> pt(2);
160 for(i=0; i<2; i++)
161 {
162 pt[i] = new FITSTOIReader(file_pointing[i]);
163 pt[i]->setImplicitSN(long(0));
164 cout << "Opening pointing file " << file_pointing[i] << endl;
165 }
166 // 2- les Bolos
167 vector<FITSTOIReader*> bolo(4);
168 for(i=0; i<4; i++) if (Bolos_OK[i])
169 {
170 bolo[i] = new FITSTOIReader(file_bolo[i]);
171 bolo[i]->setImplicitSN(long(0));
172 cout << "Opening bolometer signal file " << file_bolo[i] << endl;
173 }
174
175 // Creation des tubes:
176 // 1- du pointage vers Bolos2ringQU
177 // chaque fichier de pointage envoie 2 donnees au processor
178 vector<TOI*> toi_pt_theta(2);
179 vector<TOI*> toi_pt_phi(2);
180 for(i=0; i<2; i++)
181 {
182 cout << "Creation des pipes pour Pointage " << i << endl;
183
184 sprintf(str,"toi_theta_%d",i);
185 toi_pt_theta[i] = new TOISegmented(str,wsize);
186
187 sprintf(str,"toi_phi_%d",i);
188 toi_pt_phi[i] = new TOISegmented(str,wsize);
189
190 pt[i]->addOutput(theta_pointing[i], toi_pt_theta[i]);
191 pt[i]->addOutput(phi_pointing[i], toi_pt_phi[i]);
192
193 sprintf(str,"theta_pointing%d",i);
194 if (PSB == 1) psb2ring.addInput(str, toi_pt_theta[i]);
195 else bolos2ring.addInput(str, toi_pt_theta[i]);
196 sprintf(str,"phi_pointing%d",i);
197 if (PSB == 1) psb2ring.addInput(str, toi_pt_phi[i]);
198 else bolos2ring.addInput(str, toi_pt_phi[i]);
199 }
200 // 2- les Bolos
201 vector<TOI*> toi_bolo(4);
202 for(i=0; i<4; i++) {
203
204 sprintf(str,"toi_%d",i);
205
206 if (Bolos_OK[i]) {
207 toi_bolo[i] = new TOISegmented(str,wsize); // creation des tuyaux
208 bolo[i]->addOutput(name_bolo[i], toi_bolo[i]); // assemblage sortie de Bolos
209
210 } else {
211 NoOpProcessor noop;
212 noop.addOutput(name_bolo[i],toi_bolo[i] );
213 }
214
215 sprintf(str,"Bolo%d",i);
216 if (PSB == 1) psb2ring.addInput(str, toi_bolo[i]); // assemblage entree de Bolos2ringQU
217 else bolos2ring.addInput(str, toi_bolo[i]);
218 }
219
220 // Maintenant, le traitement est termine, et on doit avoir recupere
221 // les cartes de Q et U dans ringQ et ringU.
222 // Il n'y a plus qu'a ecrire ces cartes sur le disque:
223
224 // TOI
225 FITSTOIWriter wtoiU(toiufile),wtoiQ(toiqfile);
226 wtoiU.setImplicitSN();
227 wtoiQ.setImplicitSN();
228 cout << "fits toi writer created" << endl;
229
230 TOISegmented * toioutQ = new TOISegmented("toi_outQ",wsize);
231 TOISegmented * toioutU = new TOISegmented("toi_outU",wsize);
232 if (PSB == 1) {
233 psb2ring.addOutput("out_toiQ",toioutQ);
234 psb2ring.addOutput("out_toiU",toioutU);
235 wtoiQ.addInput("power",toioutQ);
236 wtoiU.addInput("power",toioutU);
237 cout << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
238
239 }
240
241
242
243 // L'assemblage est termine : il reste a lancer les Processors
244 cout << "Starting all processors..." << endl;
245
246 for(i=0; i<2; i++) pt[i]->start();
247 for(i=0; i<4; i++) bolo[i]->start();
248 if (PSB == 1) {
249 psb2ring.start();
250 wtoiU.start();
251 wtoiQ.start();
252 }
253 else bolos2ring.start();
254
255 cout << "Joining ..." << endl;
256 mgr->joinAll();
257 PrtTim("End threads");
258
259
260 // Write rings in FITS files
261 FitsOutFile qfits(ringqfile,FitsFile::clear);
262 cout<<"gph524_ring: Creating sphere fits file "<<ringqfile<<endl;
263 qfits << *ringQ;
264 FitsOutFile ufits(ringufile,FitsFile::clear);
265 cout<<"gph524_ring: Creating sphere fits file "<<ringufile<<endl;
266 ufits << *ringU;
267
268 FitsOutFile qwfits(ringqwfile,FitsFile::clear);
269 cout<<"gph524_ring: Creating sphere fits file "<<ringqwfile<<endl;
270 qwfits << *ringQW;
271 FitsOutFile uwfits(ringuwfile,FitsFile::clear);
272 cout<<"gph524_ring: Creating sphere fits file "<<ringuwfile<<endl;
273 uwfits << *ringUW;
274
275 // Nettoyage
276 cout << "gph524_ring: cleanup " << endl;
277 delete ringQ; delete ringU;
278 delete ringQW; delete ringUW;
279
280 return(0);
281 }
282 catch(PThrowable & exc )
283 {
284 cerr << " Catched Exception " << (string)typeid(exc).name()
285 << " - Msg= " << exc.Msg() << endl;
286 }
287 catch(...)
288 {
289 cerr << " Catched another exception..." << endl ;
290 }
291
292}
293
294
295
296
Note: See TracBrowser for help on using the repository browser.