| 1 | #include "sopnamsp.h" | 
|---|
| 2 | #include "machdefs.h" | 
|---|
| 3 | #include <iostream> | 
|---|
| 4 | #include <stdlib.h> | 
|---|
| 5 | #include <stdio.h> | 
|---|
| 6 | #include <string.h> | 
|---|
| 7 | #include <math.h> | 
|---|
| 8 | #include <unistd.h> | 
|---|
| 9 | #include "timing.h" | 
|---|
| 10 | #include "histerr.h" | 
|---|
| 11 | #include "hist2err.h" | 
|---|
| 12 | #include "fitshisterr.h" | 
|---|
| 13 |  | 
|---|
| 14 | int ObjectType(string nameh,string nameppf); | 
|---|
| 15 | int ConcatHistoErr(string nameh,vector<string> ppfname,int wrtyp=2,bool do_cov=false); | 
|---|
| 16 | int ConcatHisto2DErr(string nameh,vector<string> ppfname,int wrtyp=2,int ibinkt=-1,int ibinkz=-1); | 
|---|
| 17 | void usage(void); | 
|---|
| 18 | void usage(void) | 
|---|
| 19 | { | 
|---|
| 20 | cout | 
|---|
| 21 | <<"cmvconcherr -w wtyp -n name_histoerr file1.ppf file2.ppf ..."<<endl | 
|---|
| 22 | <<"  name_histoerr: object name"<<endl | 
|---|
| 23 | <<"  wtyp: bit0 write ASCII, bit1 write PPF, bit2 write FITS (all=7)"<<endl | 
|---|
| 24 | <<"  -C : compute covariance for 1D spectrum"<<endl | 
|---|
| 25 | <<"  -Z ibinKt : compute covariance of line Pk(ibinKt,.) along Kz for 2D"<<endl | 
|---|
| 26 | <<"  -T ibinKz : compute covariance of line Pk(.,ibinKz) along Kt for 2D"<<endl | 
|---|
| 27 | <<endl; | 
|---|
| 28 | } | 
|---|
| 29 |  | 
|---|
| 30 |  | 
|---|
| 31 | //--------------------------------------------------------------- | 
|---|
| 32 | int main(int narg,char *arg[]) | 
|---|
| 33 | { | 
|---|
| 34 | // "hpkgen"  "hpkgenfb"  "hpkgenf"  "hpkrecb"  "hpkrec" | 
|---|
| 35 | // "hpkgen2" "hpkgenfb2" "hpkgenf2" "hpkrecb2" "hpkrec2" | 
|---|
| 36 | string nameh = ""; | 
|---|
| 37 | vector<string> ppfname; | 
|---|
| 38 | int Write_Type = 2; | 
|---|
| 39 | bool Do_Cov = false; | 
|---|
| 40 | int ibinKt=-1, ibinKz=-1; | 
|---|
| 41 |  | 
|---|
| 42 | // --- Decodage arguments | 
|---|
| 43 | char c; | 
|---|
| 44 | while((c = getopt(narg,arg,"hCn:w:Z:T:")) != -1) { | 
|---|
| 45 | switch (c) { | 
|---|
| 46 | case 'n' : | 
|---|
| 47 | nameh = optarg; | 
|---|
| 48 | break; | 
|---|
| 49 | case 'w' : | 
|---|
| 50 | sscanf(optarg,"%d",&Write_Type); | 
|---|
| 51 | break; | 
|---|
| 52 | case 'C' : | 
|---|
| 53 | Do_Cov = true; | 
|---|
| 54 | break; | 
|---|
| 55 | case 'Z' : | 
|---|
| 56 | sscanf(optarg,"%d",&ibinKt); | 
|---|
| 57 | break; | 
|---|
| 58 | case 'T' : | 
|---|
| 59 | sscanf(optarg,"%d",&ibinKz); | 
|---|
| 60 | break; | 
|---|
| 61 | case 'h' : | 
|---|
| 62 | default : | 
|---|
| 63 | usage(); return -1; | 
|---|
| 64 | } | 
|---|
| 65 | } | 
|---|
| 66 | if(nameh.size()<=0 || optind>=narg) {usage(); return -1;} | 
|---|
| 67 | for (int i=optind;i<narg;i++) ppfname.push_back(arg[i]); | 
|---|
| 68 | cout<<"nameh = "<<nameh | 
|---|
| 69 | <<" , number of file to be read = "<<ppfname.size() | 
|---|
| 70 | <<" , write_type="<<Write_Type<<" , cov="<<Do_Cov<<endl; | 
|---|
| 71 |  | 
|---|
| 72 | // --- Quel type d'objet ? | 
|---|
| 73 | int obtyp = ObjectType(nameh,ppfname[0]); | 
|---|
| 74 |  | 
|---|
| 75 | // --- lecture et moyenne des HistoErr ou Histo2DErr | 
|---|
| 76 | int nread=0; | 
|---|
| 77 | if(obtyp==1) nread = ConcatHistoErr(nameh,ppfname,Write_Type,Do_Cov); | 
|---|
| 78 | else if(obtyp==2) nread = ConcatHisto2DErr(nameh,ppfname,Write_Type,ibinKt,ibinKz); | 
|---|
| 79 | else { | 
|---|
| 80 | cout<<"Type of object "<<nameh<<" not decoded"<<endl; | 
|---|
| 81 | return -1; | 
|---|
| 82 | } | 
|---|
| 83 | cout<<"Number of file read: "<<nread<<endl; | 
|---|
| 84 | return 0; | 
|---|
| 85 | } | 
|---|
| 86 |  | 
|---|
| 87 | //--------------------------------------------------------------- | 
|---|
| 88 | int ObjectType(string nameh,string nameppf) | 
|---|
| 89 | // retourne: 1 si HistoErr | 
|---|
| 90 | //           2 si Histo2DErr, | 
|---|
| 91 | //           0 si autre objet | 
|---|
| 92 | //          -1 si il n'y a pas d'objet de nom "nameh" | 
|---|
| 93 | { | 
|---|
| 94 | PInPersist pis(nameppf.c_str()); | 
|---|
| 95 |  | 
|---|
| 96 | bool found_tag = pis.GotoNameTag(nameh.c_str()); | 
|---|
| 97 | if(!found_tag) return -1; | 
|---|
| 98 |  | 
|---|
| 99 | PPersist *pps = pis.ReadObject(); | 
|---|
| 100 | AnyDataObj *obj = pps->DataObj(); | 
|---|
| 101 | cout<<"Object type read from input PPF file : "<<typeid(*obj).name()<< endl; | 
|---|
| 102 |  | 
|---|
| 103 | HistoErr *herr = dynamic_cast<HistoErr *>(obj); | 
|---|
| 104 | if(herr) return 1; | 
|---|
| 105 |  | 
|---|
| 106 | Histo2DErr *herr2 = dynamic_cast<Histo2DErr *>(obj); | 
|---|
| 107 | if(herr2) return 2; | 
|---|
| 108 |  | 
|---|
| 109 | return 0; | 
|---|
| 110 | } | 
|---|
| 111 |  | 
|---|
| 112 | //--------------------------------------------------------------- | 
|---|
| 113 | int ConcatHistoErr(string nameh,vector<string> ppfname,int wrtyp,bool do_cov) | 
|---|
| 114 | { | 
|---|
| 115 | if(ppfname.size()<=0) return 0; | 
|---|
| 116 |  | 
|---|
| 117 | HistoErr *herrconc = NULL; | 
|---|
| 118 | TVector<r_8> Tsum; TMatrix<r_8> Tsum2; | 
|---|
| 119 | int nherr=0, nread=0, itest=0; | 
|---|
| 120 | double sum=0., sum2=0., nsum=0; | 
|---|
| 121 | for (unsigned int ifile=0;ifile<ppfname.size();ifile++) { | 
|---|
| 122 | PInPersist pis(ppfname[ifile].c_str()); | 
|---|
| 123 | HistoErr herr; | 
|---|
| 124 | pis.GetObject(herr,nameh); | 
|---|
| 125 | cout<<ifile<<" : "<<ppfname[ifile]<<"  nbin="<<herr.NBins()<<endl; | 
|---|
| 126 |  | 
|---|
| 127 | if(ifile==0) { | 
|---|
| 128 | herrconc = new HistoErr(herr.XMin(),herr.XMax(),herr.NBins()); | 
|---|
| 129 | nherr = herr.NBins(); | 
|---|
| 130 | itest = int(herrconc->NBins()/5.+0.5); | 
|---|
| 131 | if(do_cov) {Tsum.ReSize(nherr); Tsum=0.; Tsum2.ReSize(nherr,nherr); Tsum2=0.;} | 
|---|
| 132 | } else if(nherr!=herr.NBins()) { | 
|---|
| 133 | cout<<"BAD NUMBER OF BINS"<<endl; | 
|---|
| 134 | continue; | 
|---|
| 135 | } | 
|---|
| 136 |  | 
|---|
| 137 | if(herr.NMean()!=1) cout<<"ATTENTION: file="<<ppfname[ifile] | 
|---|
| 138 | <<" nmean="<<herr.NMean()<<endl; | 
|---|
| 139 | nread++; | 
|---|
| 140 | for(int i=0;i<nherr;i++) herrconc->AddBin(i,herr(i)); | 
|---|
| 141 | sum+=herr(itest); sum2+=herr(itest)*herr(itest); nsum++; | 
|---|
| 142 |  | 
|---|
| 143 | if(do_cov) { | 
|---|
| 144 | for(int i=0;i<nherr;i++) { | 
|---|
| 145 | Tsum(i) += herr(i); | 
|---|
| 146 | for(int j=0;j<nherr;j++) Tsum2(i,j) += herr(i)*herr(j); | 
|---|
| 147 | } | 
|---|
| 148 | } | 
|---|
| 149 |  | 
|---|
| 150 | } | 
|---|
| 151 | herrconc->ToVariance(); | 
|---|
| 152 | if(nsum>0) {sum/=nsum; sum2/=nsum; sum2-=sum*sum;} | 
|---|
| 153 | cout<<"Test bin "<<itest<<" mean="<<sum<<" sigma^2="<<sum2<<"  nsum="<<nsum<<endl; | 
|---|
| 154 | cout<<"         "<<" mean="<<(*herrconc)(itest) | 
|---|
| 155 | <<" sigma^2="<<herrconc->Error2(itest)<<endl; | 
|---|
| 156 |  | 
|---|
| 157 | // --- Covariance | 
|---|
| 158 | if(do_cov && nread>1) { | 
|---|
| 159 | Tsum /= nread; | 
|---|
| 160 | Tsum2 /= nread; | 
|---|
| 161 | for(int i=0;i<nherr;i++) | 
|---|
| 162 | for(int j=0;j<nherr;j++) Tsum2(i,j) -= Tsum(i)*Tsum(j); | 
|---|
| 163 | } | 
|---|
| 164 |  | 
|---|
| 165 | // --- ecriture | 
|---|
| 166 | if(wrtyp&1) {   // ecriture ASCII | 
|---|
| 167 | string asname = "cmvconcherr.data"; | 
|---|
| 168 | herrconc->WriteASCII(asname); | 
|---|
| 169 | } | 
|---|
| 170 | if(wrtyp&2 || do_cov) {   // ecriture PPF | 
|---|
| 171 | string tagobs = "cmvconcherr.ppf"; | 
|---|
| 172 | POutPersist posobs(tagobs); | 
|---|
| 173 | tagobs = "herrconc"; posobs.PutObject(*herrconc,tagobs); | 
|---|
| 174 | if(do_cov) { | 
|---|
| 175 | tagobs = "mean"; posobs.PutObject(Tsum,tagobs); | 
|---|
| 176 | tagobs = "cov"; posobs.PutObject(Tsum2,tagobs); | 
|---|
| 177 | } | 
|---|
| 178 | } | 
|---|
| 179 | if(wrtyp&4) {   // ecriture FITS | 
|---|
| 180 | FitsInOutFile fio("!cmvconcherr.fits",FitsInOutFile::Fits_Create); | 
|---|
| 181 | fio << *herrconc; | 
|---|
| 182 | } | 
|---|
| 183 |  | 
|---|
| 184 | delete herrconc; | 
|---|
| 185 |  | 
|---|
| 186 | return nread; | 
|---|
| 187 | } | 
|---|
| 188 |  | 
|---|
| 189 | //--------------------------------------------------------------- | 
|---|
| 190 | int ConcatHisto2DErr(string nameh,vector<string> ppfname,int wrtyp,int ibinkt,int ibinkz) | 
|---|
| 191 | { | 
|---|
| 192 | if(ppfname.size()<=0) return 0; | 
|---|
| 193 |  | 
|---|
| 194 | Histo2DErr *herrconc = NULL; | 
|---|
| 195 | TVector<r_8> Tsum_kz; TMatrix<r_8> Tsum2_kz; | 
|---|
| 196 | TVector<r_8> Tsum_kt; TMatrix<r_8> Tsum2_kt; | 
|---|
| 197 | int nherrx=0, nherry=0, nread=0, itestx=0, itesty=0; | 
|---|
| 198 | double sum=0., sum2=0., nsum=0; | 
|---|
| 199 | for (unsigned int ifile=0;ifile<ppfname.size();ifile++) { | 
|---|
| 200 | PInPersist pis(ppfname[ifile].c_str()); | 
|---|
| 201 | Histo2DErr herr; | 
|---|
| 202 | pis.GetObject(herr,nameh); | 
|---|
| 203 | cout<<ifile<<" : "<<ppfname[ifile]<<"  nbin=" | 
|---|
| 204 | <<herr.NBinX()<<","<<herr.NBinY()<<endl; | 
|---|
| 205 |  | 
|---|
| 206 | if(ifile==0) { | 
|---|
| 207 | herrconc = new Histo2DErr(herr.XMin(),herr.XMax(),herr.NBinX() | 
|---|
| 208 | ,herr.YMin(),herr.YMax(),herr.NBinY()); | 
|---|
| 209 | nherrx = herr.NBinX(); nherry = herr.NBinY(); | 
|---|
| 210 | itestx = int(herrconc->NBinX()/5.+0.5); | 
|---|
| 211 | itesty = int(herrconc->NBinY()/5.+0.5); | 
|---|
| 212 | if(ibinkt>=0) { // matrix de covariance pour une ligne Kz | 
|---|
| 213 | if(ibinkt>=nherrx) ibinkt = nherrx-1; | 
|---|
| 214 | Tsum_kz.ReSize(nherry); Tsum_kz=0.; | 
|---|
| 215 | Tsum2_kz.ReSize(nherry,nherry); Tsum2_kz=0.; | 
|---|
| 216 | } | 
|---|
| 217 | if(ibinkz>=0) { // matrix de covariance pour une ligne Kt | 
|---|
| 218 | if(ibinkz>=nherry) ibinkz = nherry-1; | 
|---|
| 219 | Tsum_kt.ReSize(nherrx); Tsum_kt=0.; | 
|---|
| 220 | Tsum2_kt.ReSize(nherrx,nherrx); Tsum2_kt=0.; | 
|---|
| 221 | } | 
|---|
| 222 | } else if(nherrx!=herr.NBinX() || nherry!=herr.NBinY()) { | 
|---|
| 223 | cout<<"BAD NUMBER OF BINS"<<endl; | 
|---|
| 224 | continue; | 
|---|
| 225 | } | 
|---|
| 226 |  | 
|---|
| 227 | if(herr.NMean()!=1) cout<<"ATTENTION: file="<<ppfname[ifile] | 
|---|
| 228 | <<" nmean="<<herr.NMean()<<endl; | 
|---|
| 229 | nread++; | 
|---|
| 230 | for(int i=0;i<nherrx;i++) | 
|---|
| 231 | for(int j=0;j<nherry;j++) herrconc->AddBin(i,j,herr(i,j)); | 
|---|
| 232 | sum+=herr(itestx,itesty); sum2+=herr(itestx,itesty)*herr(itestx,itesty); nsum++; | 
|---|
| 233 |  | 
|---|
| 234 | if(ibinkt>=0) { | 
|---|
| 235 | for(int i=0;i<Tsum_kz.Size();i++) { | 
|---|
| 236 | Tsum_kz(i) += herr(ibinkt,i); | 
|---|
| 237 | for(int j=0;j<Tsum_kz.Size();j++) Tsum2_kz(i,j) += herr(ibinkt,i)*herr(ibinkt,j); | 
|---|
| 238 | } | 
|---|
| 239 | } | 
|---|
| 240 |  | 
|---|
| 241 | if(ibinkz>=0) { | 
|---|
| 242 | for(int i=0;i<Tsum_kt.Size();i++) { | 
|---|
| 243 | Tsum_kt(i) += herr(i,ibinkz); | 
|---|
| 244 | for(int j=0;j<Tsum_kt.Size();j++) Tsum2_kt(i,j) += herr(i,ibinkz)*herr(j,ibinkz); | 
|---|
| 245 | } | 
|---|
| 246 | } | 
|---|
| 247 |  | 
|---|
| 248 | } | 
|---|
| 249 | herrconc->ToVariance(); | 
|---|
| 250 | if(nsum>0) {sum/=nsum; sum2/=nsum; sum2-=sum*sum;} | 
|---|
| 251 | cout<<"Test bin "<<itestx<<","<<itesty | 
|---|
| 252 | <<" mean="<<sum<<" sigma^2="<<sum2<<"  nsum="<<nsum<<endl; | 
|---|
| 253 | cout<<"         "<<" mean="<<(*herrconc)(itestx,itesty) | 
|---|
| 254 | <<" sigma^2="<<herrconc->Error2(itestx,itesty)<<endl; | 
|---|
| 255 |  | 
|---|
| 256 | // --- Covariance | 
|---|
| 257 | if(ibinkt>=0 && nread>1) { | 
|---|
| 258 | Tsum_kz /= nread; | 
|---|
| 259 | Tsum2_kz /= nread; | 
|---|
| 260 | for(int i=0;i<Tsum_kz.Size();i++) | 
|---|
| 261 | for(int j=0;j<Tsum_kz.Size();j++) Tsum2_kz(i,j) -= Tsum_kz(i)*Tsum_kz(j); | 
|---|
| 262 | } | 
|---|
| 263 | if(ibinkz>=0 && nread>1) { | 
|---|
| 264 | Tsum_kt /= nread; | 
|---|
| 265 | Tsum2_kt /= nread; | 
|---|
| 266 | for(int i=0;i<Tsum_kt.Size();i++) | 
|---|
| 267 | for(int j=0;j<Tsum_kt.Size();j++) Tsum2_kt(i,j) -= Tsum_kt(i)*Tsum_kt(j); | 
|---|
| 268 | } | 
|---|
| 269 |  | 
|---|
| 270 | // --- ecriture | 
|---|
| 271 | if(wrtyp&1) {   // ecriture ASCII | 
|---|
| 272 | string asname = "cmvconcherr2.data"; | 
|---|
| 273 | herrconc->WriteASCII(asname); | 
|---|
| 274 | } | 
|---|
| 275 | if(wrtyp&2) {   // ecriture PPF | 
|---|
| 276 | string tagobs = "cmvconcherr2.ppf"; | 
|---|
| 277 | POutPersist posobs(tagobs); | 
|---|
| 278 | tagobs = "herrconc2"; posobs.PutObject(*herrconc,tagobs); | 
|---|
| 279 | if(ibinkt>=0) { | 
|---|
| 280 | char str[32]; | 
|---|
| 281 | sprintf(str,"kzm%d",ibinkt); | 
|---|
| 282 | posobs.PutObject(Tsum_kz,str); | 
|---|
| 283 | sprintf(str,"kzc%d",ibinkt); | 
|---|
| 284 | posobs.PutObject(Tsum2_kz,str); | 
|---|
| 285 | } | 
|---|
| 286 | if(ibinkz>=0) { | 
|---|
| 287 | char str[32]; | 
|---|
| 288 | sprintf(str,"ktm%d",ibinkz); | 
|---|
| 289 | posobs.PutObject(Tsum_kt,str); | 
|---|
| 290 | sprintf(str,"ktc%d",ibinkz); | 
|---|
| 291 | posobs.PutObject(Tsum2_kt,str); | 
|---|
| 292 | } | 
|---|
| 293 | } | 
|---|
| 294 | if(wrtyp&4) {   // ecriture FITS | 
|---|
| 295 | FitsInOutFile fio("!cmvconcherr2.fits",FitsInOutFile::Fits_Create); | 
|---|
| 296 | fio << *herrconc; | 
|---|
| 297 | } | 
|---|
| 298 |  | 
|---|
| 299 | delete herrconc; | 
|---|
| 300 |  | 
|---|
| 301 | return nread; | 
|---|
| 302 | } | 
|---|
| 303 |  | 
|---|
| 304 | /* | 
|---|
| 305 | #### | 
|---|
| 306 | #### HistoErr 1D | 
|---|
| 307 | #### | 
|---|
| 308 | openppf cmvconcherr.ppf | 
|---|
| 309 |  | 
|---|
| 310 | c++exec int i = 700; \ | 
|---|
| 311 | cout<<i<<" "<<herrconc.BinCenter(i)<<" "<<herrconc(i)<<" "<<herrconc.Error2(i)<<" "<<herrconc.NEntBin(i)<<endl; | 
|---|
| 312 |  | 
|---|
| 313 | zone 2 2 | 
|---|
| 314 | disp herrconc "hbincont err" | 
|---|
| 315 | disp herrconc "hbinerr" | 
|---|
| 316 | disp herrconc "hbinent" | 
|---|
| 317 |  | 
|---|
| 318 | zone | 
|---|
| 319 | n/plot herrconc.val%log10(x) x>0 ! "connectpoints" | 
|---|
| 320 | n/plot herrconc.val-sqrt(err2)%log10(x) x>0&&err2>0 ! "connectpoints same red" | 
|---|
| 321 | n/plot herrconc.val+sqrt(err2)%log10(x) x>0&&err2>0 ! "connectpoints same red" | 
|---|
| 322 |  | 
|---|
| 323 | n/plot herrconc.sqrt(err2)%log10(x) x>0&&err2>0 ! "connectpoints same red" | 
|---|
| 324 | n/plot herrconc.sqrt(err2)/val%log10(x) x>0&&err2>0&&val>0 ! "connectpoints" | 
|---|
| 325 |  | 
|---|
| 326 | disp mean | 
|---|
| 327 | imag cov | 
|---|
| 328 |  | 
|---|
| 329 | del cor | 
|---|
| 330 | c++exec \ | 
|---|
| 331 | TMatrix<r_8> cor(cov,false); cor = 0.; \ | 
|---|
| 332 | for(int i=0;i<cor.NRows();i++) { \ | 
|---|
| 333 | for(int j=0;j<cor.NCols();j++) { \ | 
|---|
| 334 | double v = cov(i,i)*cov(j,j); \ | 
|---|
| 335 | if(v<=0.) continue; \ | 
|---|
| 336 | cor(i,j) = cov(i,j)/sqrt(v); \ | 
|---|
| 337 | } } \ | 
|---|
| 338 | KeepObj(cor); \ | 
|---|
| 339 | cout<<"Matrice cor cree "<<endl; | 
|---|
| 340 |  | 
|---|
| 341 | imag cor | 
|---|
| 342 | n/plot cor.val%c r==500 ! "connectpoints" | 
|---|
| 343 |  | 
|---|
| 344 | #### | 
|---|
| 345 | #### Histo2DErr 2D | 
|---|
| 346 | #### | 
|---|
| 347 | openppf cmvconcherr2.ppf | 
|---|
| 348 |  | 
|---|
| 349 | zone 2 2 | 
|---|
| 350 | imag herrconc2 "hbincont" | 
|---|
| 351 | imag herrconc2 "hbinerr" | 
|---|
| 352 | imag herrconc2 "hbinent" | 
|---|
| 353 |  | 
|---|
| 354 | zone | 
|---|
| 355 |  | 
|---|
| 356 | set mean kzm140 | 
|---|
| 357 | set cov kzc140 | 
|---|
| 358 |  | 
|---|
| 359 | set mean ktm32 | 
|---|
| 360 | set cov ktc32 | 
|---|
| 361 |  | 
|---|
| 362 | n/plot $mean.val%n ! ! "connectpoints" | 
|---|
| 363 | disp $cov | 
|---|
| 364 | n/plot $cov.val%c r==32 ! "connectpoints" | 
|---|
| 365 |  | 
|---|
| 366 | set cor ${cov}cor | 
|---|
| 367 | del $cor | 
|---|
| 368 | c++exec \ | 
|---|
| 369 | TMatrix<r_8> $cor($cov,false); $cor = 0.; \ | 
|---|
| 370 | for(int i=0;i<$cor.NRows();i++) { \ | 
|---|
| 371 | for(int j=0;j<$cor.NCols();j++) { \ | 
|---|
| 372 | double v = $cov(i,i)*$cov(j,j); \ | 
|---|
| 373 | if(v<=0.) continue; \ | 
|---|
| 374 | $cor(i,j) = $cov(i,j)/sqrt(v); \ | 
|---|
| 375 | } } \ | 
|---|
| 376 | KeepObj($cor); \ | 
|---|
| 377 | cout<<"Matrice cor cree "<<endl; | 
|---|
| 378 |  | 
|---|
| 379 | disp $cor | 
|---|
| 380 | n/plot $cor.val%c r==32 ! "connectpoints" | 
|---|
| 381 | */ | 
|---|