PRO example,i CASE i OF 1: make_browse,SAMP=1,PARAM='Cloud Cover',FILEIN='/Produits_POLDER/P3L2TRGB050617/P3L2TRGB013031GD';,SUFF='_CC.PNG' 2: make_browse,SAMP=3,PARAM='Cloud Cover',FILEIN='/Produits_POLDER/P3L2TRGB050617/P3L2TRGB013031GD',/DAILY;,SUFF='_CC.PNG' 3: make_browse,SAMP=3,PARAM='Opt. Thic Liq',FILEIN='/Produits_POLDER/Classe_2/Level3/BR/P2L3TRGB030615AD' 4: make_browse,SAMP=3,PARAM='Opt. Thic Liq',FILEIN='/Produits_POLDER/Classe_2/Level3/BR/P2L3TRGB030615AD',SUFF='_OTL.PNG' 5: make_browse,SAMP=3,FILEIN='/Produits_POLDER/Level3/P3L3TLGC050615GL',TO_TERRE_MER='/Produits_POLDER/Level3/P3L3TOGC050615GL';,SUFF='_OptThi.PNG' 6: make_browse,SAMP=3,FILEIN='/Produits_POLDER/P3L2TLGC050617/P3L2TLGC013031GD',TO_TERRE_MER='/Produits_POLDER/P3L2TOGC050617/P3L2TOGC013031GD',/DAILY;,SUFF='_OptThi.PNG' 7: make_browse,SAMP=5,FILEIN='/POLDER_pro_Std/N1/P1L1TBG1001493BD',VMIN=0.,VMAX=50. ELSE : make_browse,SAMP=3,FILEIN='/Produits_POLDER/P3L2TLGC050617/P3L2TLGC013031GD',TO_TERRE_MER='/Produits_POLDER/P3L2TOGC050617/P3L2TOGC013031GD';,/DAILY ENDCASE END ;================================================================================================================== ; Cette routine permet de fabriquer des images "browse" des produits POLDER/Parasol de niveau 1, 2 et 3. Il fonctionne ; avec les definitions des produits dans anapol. ; C'est un peu spécifique pour le N1 puisque on fait une composition colorée (865, 670, 490)=[R,G,B] alors que ce sont ; des visualisations avec palette de couleur pour les autres niveaux ; ; FILEIN = : Chemin vers le fichier en entree (LeaderFile ou Datafile) ; SAMP = n : Optionnel : Echantillonage du fichier pour une taille reduite en sortie ; PARAM = 'parametre': Nom du parametre (defini dans les defines anapol). Si non valide, le programme imprime ; la liste des parametres valide pour ce type de fichier [Sans effet pour N1] ; VMIN = valeur : Permet de forcer la valeur minimale de la palette de couleur (sinon, a 5% de l'histogramme) ; VMAX = valeur : Permet de forcer la valeur maximale de la palette de couleur (sinon, a 95% de l'histogramme) ; SUFFIX = 'suff' : Permet de sauver le browse dans un fichier qui a le meme nom, plus le suffixe donne. ; L'image sauvee est au format PNG. Si ni ce parametre ni FILEOUT ne sont présents, le programme affiche ; le browse a l'ecran ; FILEOUT= 'fieout' : Permet de sauver le browse dans un fichier de nom fileout. ; L'image sauvee est au format PNG. Si ni ce parametre ni SUFFIX ne sont présents, le programme affiche ; le browse a l'ecran ; /DAILY : Permet de faire facilement un "daily browse". Si ce parametre est défini, le code cherche ; tous les fichiers de meme type dans le dossier, et genere une image pour tous. L'option SUFFIX ; permet de sauver l'image au format PNG, avec la date dans le nom du fichier. ; /TO_TERRE_MER : Ce keyword permet de generer une image combinée Terre-Mer de l'epaisseur optique du petit mode (niveaux 2 et 3). ; Dans ce cas, le keyword PARAM est sans effet. Il faut mettre dans FILEIN le chemin vers le fichier "Terre" ; et dans TO_TERRE_MER le chemin vers le fichier "Mer" ; TITLE='title' : Permet de donner un titre a l'image (Niveaux 3 et daily uniquement). Par défaut "Parasol within the A-Train" ;================================================================================================================== PRO make_browse, FILEIN=filein, SAMP=samp, PARAM=param, VMIN=vvmin, VMAX = vvmax, SUFFIX = suff, FILEOUT=fileout, DAILY=DAILY, $ TO_TERRE_MER=totermer,TITLE=title FORWARD_FUNCTION get_image_N1 IF NOT KEYWORD_SET(filein) THEN BEGIN PRINT, 'Il faut choisir un fichier avec le parametre FILEIN=' RETURN ENDIF IF NOT KEYWORD_SET(param) THEN param=' ' IF NOT KEYWORD_SET(samp) THEN samp=1 jump_totermer : ; Utile uniquement pour fabriquer des images composite Terre-Mer de l'epaisseur optique aerosol seppos = STRPOS(filein,path_sep(),/REVERSE_SEARCH) ; Position du separateur des dossiers pathin = STRMID(filein,0,seppos+1) orbit_label =STRMID(filein,seppos+1,15) fileD = filein & STRPUT,fileD,'D',seppos+16 ; Data file fileL = filein & STRPUT,fileL,'L',seppos+16 ; Leader file ; Ouvertude du fichier OPENR,lunL,fileL,/get_Lun,ERROR=err IF err NE 0 THEN BEGIN PRINT,'The Leader file for this product was not found: '+fileL RETURN ENDIF ; ; Verification rapide que on lit bien un fichier POLDER ; POINT_LUN,lunL,8 ref = BYTARR(11) & READU,lunL,ref & ref=STRING(ref) IF (ref NE 'PAST33131CN' AND ref NE 'P2ST33131CN' AND ref NE 'SPG9N122-31') THEN BEGIN PRINT,'The file was not recognized as a standard POLDER product' FREE_LUN,lunL RETURN ENDIF POINT_LUN,lunL,36 typ_prod = BYTARR(8) & READU,lunL,typ_prod & typ_prod = STRING(typ_prod) parasol = STRMID(typ_prod,1,1) EQ '3' ;IF Parasol THEN print,' Parasol data file' ELSE print,'POLDER data file' ;PRINT,' Product type : ',typ_prod IF STRMID(typ_prod,3,1) EQ '3' THEN daily = 0 ; On ne peut pas faire du daily sur un produit de niveau 3 N1 = STRMID(typ_prod,3,1) EQ '1' ; Identifie un fichier de niveau 1 (car traitement specifique) ; ; On lit le nom du fichier ; OPENR,lunD,fileD,/get_Lun,ERROR=err IF err NE 0 THEN BEGIN PRINT,'Error when trying to open file '+fileD FREE_LUN,lunL RETURN ENDIF ; On lit la taille du record POINT_LUN,lunD,58 len_prod = BYTARR(2) & readu,lunD,len_prod rec_size=len_prod[0]*256l+len_prod[1] ; ; Lecture de la version et de la date de traitement ; version=BYTARR(6) & date_pr=BYTARR(8) CASE STRMID(typ_prod,3,1) OF '1': BEGIN POINT_LUN,lunL, 180+360+1620+180+166320+232 & READU,lunL,date_pr & date_pr=STRING(date_pr) POINT_LUN,lunL, 180+360+1620+180+166320+248 & READU,lunL,version & version=STRING(version) END '2': BEGIN POINT_LUN,lunL, 180+360+1620+180+392 & READU,lunL,date_pr & date_pr=STRING(date_pr) POINT_LUN,lunL, 180+360+1620+180+456 & READU,lunL,version & version=STRING(version) END '3': BEGIN POINT_LUN,lunL, 180+360+ 40 & READU,lunL,date_pr & date_pr=STRING(date_pr) POINT_LUN,lunL, 180+360+104 & READU,lunL,version & version=STRING(version) END ENDCASE Prod = define_product(typ_prod,rec_size,ERROR=err,PARASOL=parasol) ; On recupere toutes les infos sur ce produit IF Prod.Nbyte_Tot NE rec_size THEN BEGIN PRINT,'The record size of the product does not corresponds to its Anapol definition:',Prod.Nbyte_Tot,rec_size FREE_LUN,lunL,lunD RETURN ENDIF ; ; Determination de la longitude de passage a l'equateur (si niveau 1 ou 2) ; Si Daily, on récupère la date ; IF STRMID(Prod.type,1,1) EQ 3 OR KEYWORD_SET(daily) THEN BEGIN LonEq = 0. point_lun,lunL,180+360+58 sdate = BYTARR(8) & READU,lunL,sdate date = STRING(sdate) ENDIF ELSE BEGIN point_lun,lunL,180+360+50 lon = BYTARR(8) & readu,lunL,lon READS,STRING(lon),LonEq ENDELSE FREE_LUN, lunL,lunD ; ; Recherche dans la liste du parametre choisi. Si on ne trouve pas le parametre choisi, on affiche la liste ; IF KEYWORD_SET(totermer) THEN IF STRMID(Prod.type,1,1) EQ 2 THEN param='Fine Opt. Thick.' ELSE param='MM Fine OptThi' IF N1 THEN BEGIN param = 'Ref_670' v = WHERE(prod.D_par.name EQ param,cc) par = prod.D_par[v[0]] ENDIF ELSE BEGIN v = WHERE(prod.U_par.name EQ param,cc) IF cc EQ 0 THEN BEGIN PRINT, 'Parametre non reconnu: ',param PRINT, 'Parametres valides:' FOR ip=0, prod.Nu_par-1 DO print," >"+prod.U_par[ip].name+"<" RETURN ENDIF ip = v[0] par = prod.U_par[ip] ENDELSE ; ; Definition de la taille de la fenetre ; Nlin = 180*prod.resol Ny = Nlin/samp IF STRMID(typ_prod,3,1) EQ 3 OR KEYWORD_SET(daily) THEN !P.CHARSIZE = Ny/360. ELSE !P.CHARSIZE = Ny/1080. IF STRMID(typ_prod,3,1) EQ 3 OR KEYWORD_SET(daily) THEN Nx=Ny*2 ELSE Nx=Ny/4 ; ; Definition de l'image a générer, en fonction du type du parametre choisi ; IF N_ELEMENTS(resu) EQ 0 THEN $ CASE par.size OF 1 : resu = BYTARR(Nx,Ny) + par.dummy 2 : resu =UINTARR(Nx,Ny) + par.dummy -2 : resu = INTARR(Nx,Ny) + par.dummy ELSE : BEGIN PRINT, 'Taille de parametre non prevu:',par.size RETURN END ENDCASE IF N1 THEN resu = INTARR(3,Nx,Ny) + par.dummy ; ; Liste des fichiers a lire (1 seul, sauf dans le cas daily) ; IF KEYWORD_SET(daily) THEN liste = FILE_SEARCH(pathin,STRMID(orbit_label,0,8)+'*D') $ ELSE liste = [filein] ; ; Boucle sur les fichiers a lire ; FOR ifile = 0, N_ELEMENTS(liste)-1 DO BEGIN fileName = STRMID(liste[ifile],0,STRLEN(liste[ifile])-1) OPENR,lunL,fileName+'L',/GET_LUN OPENR,lunD,fileName+'D',/GET_LUN ;----------------------------------------------------------- ; Lectures GetNpix,lunL,Prod,NPIXLINE=Npix,NPIXSUM=NpixSum,PARASOL=parasol ; ; Boucle sur les lignes ; FOR ilin = 0, Ny-1 DO BEGIN linpol = samp/2 + ilin*samp IF Npix[linpol] EQ 0 THEN CONTINUE point_lun,lunD,180+NpixSum[linpol]*rec_size data = BYTARR(rec_size, Npix[linpol]) readu,lunD,data col = REFORM(data[ 8,*]*256s + data[ 9,*]) lat = 90. - (linpol+0.5)/prod.resol NcolM = 2*ROUND(Nlin*COS(lat*!DTOR)) colcen = FIX(((LonEq+180.) MOD 360.)/360.*NcolM) ; colcen va de 0 a NcolM-1 entre -180 et 180. colcor = (col-1-Nlin+ NcolM/2) MOD NcolM ; colcor va de 0 a NcolM-1 entre -180 et 180. dist = ((colcor-colcen + (3*NcolM)/2) MOD NcolM)-NcolM/2 IF (Nx MOD 2) EQ 0 THEN $ valid = WHERE( (ABS(dist) LE samp*(Nx/2)) AND ( ((dist+samp/2) MOD samp) EQ 0), count) $ ELSE valid = WHERE( (ABS(dist) LE samp*(Nx/2)) AND ( ((dist ) MOD samp) EQ 0), count) IF count NE 0 THEN BEGIN indice = FIX(dist[valid]/float(samp) + Nx/2.) indice = (indice>0) < (Nx-1) IF N1 THEN resu[*,indice,ilin] = get_image_N1(data[*,valid],PARASOL=parasol) ELSE $ CASE par.size OF 1 : resu[indice,ilin] = data[par.fi_by,valid] 2 : resu[indice,ilin] = data[par.fi_by,valid]*256us + data[par.fi_by+1,valid] -2 : resu[indice,ilin] = data[par.fi_by,valid]*256s + data[par.fi_by+1,valid] ENDCASE ENDIF ENDFOR FREE_LUN,lunL,lunD ENDFOR ; Fin de la boucle sur les fichiers. Les lectures sont terminées ; ; Cas tres particulier de la combinaison des produits aerosol Terre/Mer ; IF KEYWORD_SET(totermer) THEN BEGIN filein = totermer totermer = 0 IF STRMID(Prod.type,1,1) EQ 2 THEN param='Fine OptThi 865' ELSE param='MM Fine OptTh' GOTO, jump_totermer ENDIF ; ; On recherche maintenant les min et max de l'histogramme a 5% de chaque cote ; valid = WHERE(resu NE par.dummy AND resu NE par.satur AND resu NE par.unvalid,count) IF count EQ 0 THEN BEGIN vmin=0 & vmax=100 ENDIF ELSE BEGIN histo = HISTOGRAM(resu[valid]*1,OMIN=omin) Nel = N_ELEMENTS(histo) IF Nel LE 3 THEN BEGIN ; Cas particulier lorsque tres peu de valeurs dans l'histogramme vmin = 0 & vmax = (Nel-1)>1 ENDIF ELSE BEGIN chisto = histo FOR i=1l, Nel-1 DO chisto[i] = chisto[i-1] + histo[i] vm = 0.05 * chisto[Nel-1] vmin = 0l & WHILE (chisto[vmin] LT vm) DO vmin=vmin+1 vm = 0.95 * chisto[Nel-1] vmax = 0l & WHILE (chisto[vmax] LT vm) DO vmax=vmax+1 IF vmin EQ vmax THEN BEGIN vmin = 0 & vmax = (Nel-1)>1 ENDIF ENDELSE vmin = vmin + omin vmax = vmax + omin ENDELSE IF N_ELEMENTS(vVmin) EQ 1 THEN vmin = (vvmin-Par.offset)/Par.slope ; On ecrase la valeur calculee si le vmin est "force" IF N_ELEMENTS(vVmax) EQ 1 THEN vmax = (vvmax-Par.offset)/Par.slope ; On ecrase la valeur calculee si le vmax est "force" ; ; Définition de la palette de couleur ; palette,COL_SATUR=col_satur,COL_DUMMY=col_dummy,COL_UNVALID=col_unvalid,COL_COAST=col_coast,NC=NC,R=r,g=g,b=b ; ; On génère l'image en répartissant les valeurs sur la plage de la palette de couleur entre vmin et vmax ; IF N1 THEN BEGIN FOR i=0, 2 DO resu[i,*,*] = ROTATE(REFORM(resu[i,*,*]),7) ; Notez que on a mis une echelle quadratique image = BYTE( ((((resu-vmin)>0)/FLOAT(vmax-vmin))<1.)^(0.5)*255) ; pour mettre en valeur les faibles niveaux ENDIF ELSE BEGIN image = BYTE( (((resu-vmin)>0)*(NC-1)/(vmax-vmin))<(NC-1) ) + 1 v = WHERE(resu EQ par.satur ,cc) & IF cc NE 0 THEN image[v] = col_satur v = WHERE(resu EQ par.dummy ,cc) & IF cc NE 0 THEN image[v] = col_dummy v = WHERE(resu EQ par.unvalid,cc) & IF cc NE 0 THEN image[v] = col_unvalid image = ROTATE(image,7) ; Inversion Nord-Sud de l'image ENDELSE ; ; On affiche l'image sur la projection de la Terre, et on ajoute limite de la projection ainsi que limites des continents ; deltaLon = (Nx/FLOAT(Ny)*90.)<179.99 SET_PLOT,'Z' DEVICE,SET_RESOLUTION=[Nx,Ny] MAP_SET,0,LonEq,/NOBORDER,POS=[0.,0.,1.,1],LIMIT=[-89.99,LonEq-deltaLon,89.99,LonEq+deltaLon],/SINUSOIDAL,/HORIZON,E_HORIZON={FILL:1, COLOR:!P.COLOR} map = TVRD() & outside=WHERE(map EQ !P.BACKGROUND,c_out) ERASE & MAP_CONTINENTS,/COAST & map = TVRD() & coast=WHERE(map EQ !P.COLOR,c_coa) IF N1 THEN BEGIN image = REFORM(image,3,Nx*1l*Ny) dummy = WHERE(resu[0,*,*] EQ par.dummy,cc) IF cc NE 0 THEN image[*,dummy ] = 200 IF c_out NE 0 THEN image[*,outside] = 255 IF c_coa NE 0 THEN image[*,coast ] = 0 ENDIF ELSE BEGIN IF c_out NE 0 THEN image[outside] = !P.BACKGROUND IF c_coa NE 0 THEN image[coast] = col_coast TV,image ENDELSE ; ; Ajout de la palette de couleur et annotations ; IF NOT KEYWORD_SET(title) THEN title = 'PARASOL within the A-Train' Smonth=['blabla','January','February','March','April','May','June','July','August','September','October','November','December'] IF STRMID(typ_prod,3,1) EQ 3 OR KEYWORD_SET(daily) THEN BEGIN IF KEYWORD_SET(daily) THEN xyouts,0.,0.05,STRING(STRMID(date,6,2),Smonth(FIX(STRMID(date,4,2))),STRMID(date,0,4),format='(I2,X,A,I5)'),/NORMAL $ ELSE BEGIN xyouts,0.,0.10,STRING(Smonth(FIX(STRMID(orbit_label,10,2))),2000+STRMID(orbit_label,8,2),FORMAT='(A,I5)'),$ /NORMAL,CHARSIZE=!P.CHARSIZE*1.1 xyouts,0.,0.05,orbit_label,/NORMAL,CHARSIZE=!P.CHARSIZE*0.8 ENDELSE xyouts,0.,0.01,'Version: '+version+' Created:'+date_pr,/NORMAL,CHARSIZE=!P.CHARSIZE*0.7 xyouts,1.,0.96,title,/NORMAL,ALIGN=1 ,CHARSIZE=!P.CHARSIZE*1.1 xyouts,1.,0.91,'Processing: LOA/LSCE/ICARE',/NORMAL,ALIGN=1,CHARSIZE=!P.CHARSIZE*0.8 xyouts,1.,0.86,'Data: CNES',/NORMAL,ALIGN=1,CHARSIZE=!P.CHARSIZE*0.8 IF NOT N1 THEN drawctbl,VMIN=vmin*Par.slope+Par.offset,VMAX=vmax*Par.slope+Par.offset,POS=[0.7,0.05,0.99,0.10],TIT=par.name+' ['+par.unit+']',FI=1,NC=NC ENDIF ELSE BEGIN IF NOT N1 THEN xyouts, 1.,0.985,par.name+' ['+par.unit+']',ALIGN=1,/NORMAL xyouts,0.,0.050,orbit_label,ALIGN=0,/NORMAL xyouts,0.,0.02,'Version: '+version,/NORMAL,CHARSIZE=!P.CHARSIZE*0.7 xyouts,0.,0.005,'Created: '+date_pr,/NORMAL,CHARSIZE=!P.CHARSIZE*0.7 xyouts,1.,0.005,'Processing: LOA/LSCE/ICARE',/NORMAL,ALIGN=1,CHARSIZE=!P.CHARSIZE*0.8 xyouts,1.,0.02,'Data: CNES',/NORMAL,ALIGN=1,CHARSIZE=!P.CHARSIZE*0.8 sat = 'PARASOL' & IF STRMID(typ_prod,1,1) NE '3' THEN sat='POLDER-'+STRMID(typ_prod,1,1) xyouts,0.,0.985,sat,/NORMAL,CHARSIZE=!P.CHARSIZE*1.1 IF NOT N1 THEN drawctbl,VMIN=vmin*Par.slope+Par.offset,VMAX=vmax*Par.slope+Par.offset,POS=[0.9,0.63,0.99,0.95],FI=1,NC=NC,/VERTICAL END IF N1 THEN BEGIN annotations = WHERE(tvrd() NE 0,cc) IF cc NE 0 THEN image[*,annotations] = 0 image = REFORM(image,3,Nx,Ny) ENDIF ELSE image = TVRD() ; ; Affichage de l'image, ou sauvegarde dans un fichier ; IF KEYWORD_SET(suff) THEN $ ; On construit le nom du fichier IF KEYWORD_SET(daily) THEN fileout=STRMID(filein,0,STRLEN(filein)-8)+STRMID(date,2,6)+STRMID(filein,STRLEN(filein)-2,1)+'B'+suff $ ELSE fileout=filein+suff IF KEYWORD_SET(fileout) THEN IF N1 THEN WRITE_PNG,fileout,image ELSE WRITE_PNG,fileout,image, r,g,b ELSE BEGIN ; On sauve l'image au format PNG SET_PLOT, 'X' WINDOW, XSIZE=Nx, YSIZE=Ny IF N1 THEN BEGIN DEVICE,/DECOMPOSED TV,image,TRUE=1 ENDIF ELSE BEGIN DEVICE, DECOMPOSE=0 ; Affichage de l'image TVLCT,r,g,b TV, image ENDELSE ENDELSE END ;============================================================================================================ ; Cette fonction retourne les reflectances POLDER/Parasol acquises soit dans la direction de thetaV min (Terre), ; soit dans la direction de Rbleu min (Ocean) ;------------------------------------------------------------------------------------------------------------ FUNCTION get_image_N1,data,PARASOL=parasol,VERBOSE=verbose IF Parasol THEN Ndir=16 ELSE Ndir=14 IF parasol THEN Bnd =50 ELSE Bnd =46 ; Nombre d'octets non directionnels ;canaux = [21,27,15] ; [R,G,B]=[670,865,490] ;canaux = [27,21,15] ; [R,G,B]=[865,670,490] canaux = [21,19,15] ; [R,G,B]=[670,565,490] Land = data[12,*] GE 50 Npix = N_ELEMENTS(Land) data = REFORM(data[Bnd:*,*],43,Ndir,Npix) ; On recupere uniquement parametres directionnels fac = 1.5E-3*!DTOR thes = REFORM(data[ 5,*,*]*256us + data[ 6,*,*])*fac thev = REFORM(data[ 7,*,*]*256us + data[ 8,*,*])*fac Lum = REFORM(data[canaux,*,*]*256s + data[canaux+1,*,*]) unval = WHERE(MIN(Lum,DIMENSION=1) EQ -32767,cc) IF cc NE 0 THEN BEGIN ; On élimine les directions pour lesquels une des reflectances est non valide Lum = REFORM(Lum,3,Ndir*Npix) Lum[*,unval] = -32767 Lum = REFORM(Lum,3,Ndir,Npix) thev [unval] = 99. ENDIF tempo = MIN(thev ,dirL,DIMENSION=1) ; Sur Terre, on cherche la direction de thev minimum tempo = MIN(REFORM(ABS(Lum[2,*,*])),dirO,DIMENSION=1) ; Sur Mer, on cherche la direction avec Lbleu minimum dir = REFORM(Land*(dirL MOD Ndir) + (1-Land)*(dirO MOD Ndir)) ; Combinaison Terre/mer L = INTARR(3,Npix) FOR i=0,Npix-1 DO L[*,i]=Lum[*,dir[i],i] fac = 1./COS(thes[dir,INDGEN(Npix)]) R=L & FOR i=0,2 DO R[i,*]=FIX(ROUND(L[i,*]*fac)) satur = WHERE(L EQ 32767,cc) & IF cc NE 0 THEN R[satur] = 32767 unval = WHERE(L EQ -32767,cc) & IF cc NE 0 THEN R[unval] = -32767 RETURN,R END ;============================================================================================================ ; Definition de la palette de couleur ;------------------------------------------------------------------------------------------------------------ PRO palette,COL_SATUR=col_satur,COL_DUMMY=col_dummy,COL_UNVALID=col_unvalid,COL_COAST=col_coast,NC=Nc,R=r,G=g,B=b r=[ $ 255, 50, 54, 58, 61, 64, 68, 69, 72, 74, 77, 79, 80, 82, 83, 85, 84, 86, 87, 88,$ 86, 87, 87, 87, 85, 84, 84, 84, 83, 79, 78, 77, 76, 71, 70, 68, 66, 60, 58, 55,$ 53, 46, 43, 40, 36, 33, 25, 21, 16, 12, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,$ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,$ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,$ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,$ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,$ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 12, 21, 25, 29, 33, 42, 46, 51, 55,$ 63, 67, 72, 76, 80, 89, 93, 97,101,110,114,119,123,131,135,140,144,153,157,161,$ 165,169,178,182,187,191,199,203,208,212,221,225,229,233,242,246,250,255,255,255,$ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,$ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,$ 255,255,255,255,255,255,255,255,255,255,255,255,255,100,170, 0] g=[ $ 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,$ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,$ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 16, 21, 25, 29, 38, 42,$ 46, 51, 55, 63, 67, 72, 76, 84, 89, 93, 97,106,110,114,119,127,131,135,140,144,$ 152,157,161,165,174,178,182,187,195,199,203,208,216,220,225,229,233,242,246,250,$ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,$ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,$ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,$ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,$ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,250,242,$ 238,233,229,221,216,212,208,199,195,191,187,178,174,170,165,161,153,148,144,140,$ 131,127,123,119,110,106,102, 97, 89, 85, 80, 76, 72, 63, 59, 55, 51, 42, 38, 34,$ 29, 21, 17, 12, 8, 0, 51, 42, 38, 34, 29, 21, 17,100,170, 0] b=[ $ 255, 48, 53, 59, 63, 68, 72, 77, 81, 86, 91, 95,100,104,109,113,118,122,127,132,$ 136,141,145,150,154,159,163,168,173,177,182,186,191,195,200,204,209,214,218,223,$ 227,232,236,241,245,250,255,255,255,255,255,255,255,255,255,255,255,255,255,255,$ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,$ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,$ 255,246,242,238,233,225,220,216,212,203,199,195,191,187,178,174,170,165,157,152,$ 148,144,135,131,127,123,114,110,106,102, 97, 89, 84, 80, 76, 67, 63, 59, 55, 46,$ 42, 38, 34, 25, 21, 16, 12, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,$ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,$ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,$ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,$ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,$ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100,170, 0] N = 256 & x = 10 & Nc = N-x !P.BACKGROUND = 0 !P.COLOR = N-1 col_satur = N-3 col_unvalid = N-3 col_dummy = N-2 col_coast = !P.COLOR END ;===================================================================================================== ; Cette routine retourne Npix et NpixSum qui permettent de lire rapidement le fichier ligne par ligne ;------------------------------------------------------------------------------------------------------------ PRO GetNpix,lunL,Prod,NPIXLINE=Npix,NPIXSUM=NpixSum,PARASOL=parasol ; On lit le nombre de pixels par ligne Nlin = 180 * Prod.resol & Npix=INTARR(Nlin) CASE STRMID(Prod.type,1,1) OF '1' : point_lun,lunL,180+360+1620+180+166320l+720+13140+204 '2' : point_lun,lunL,180+360+1620+180 +720+13140+204 '3' : point_lun,lunL,180+360 +720+13140+204 ENDCASE READF,lunL,Npix,format='(3240I4)' ; ; On trouve le nombre de pixels par ligne ; NpixSum = LONARR(Nlin) IF parasol AND prod.type EQ 'L1TBG1' THEN BEGIN NpixSum[Nlin-1] = 0 FOR i = Nlin-2, 0, -1 DO NpixSum[i] = NpixSum[i+1]+ Npix[i+1] ENDIF ELSE BEGIN NpixSum[0] = 0 FOR i = 1, Nlin-1 DO NpixSum[i] = NpixSum[i-1]+ Npix[i-1] ENDELSE END ;============================================================================================================ ; Cette routine permet de tracer une palette de couleur ; Tous les parametres sont optionnels ; vmin= : valeur physique de la premiere couleur utile (defaut zero) ; vmax= : Valeur physique de la derniere couleur utile (defaut Nombre de couleurs) ; POS=[Xmin,Ymin,Xmax,Ymax] : Position de la palette, en unite normalisee [0,1] dans la fenetre ; NC= : Nombre de couleurs "utiles" de la palette ; FIRST= : Indice de la premiere couleur utile ; TIT='' : Pour mettre un titre a la palette ; /NOFRAME : Pour ne pas indiquer les valeur physiques ; /VERTICAL : Pour faire une palette verticale (defaut: horizontale) ; /HELP : Pour afficher les options ;------------------------------------------------------------------------------------------------------------ PRO drawctbl,vmin=vmin,vmax=vmax,POS=pos,NC=nc,FIRST=fi,TIT=tit,NOFRAME=noframe,VERTICAL=vert,HELP=help IF KEYWORD_SET(help) THEN BEGIN PRINT,'******************* DRAWCTBL ***********************' PRINT,' Permet de tracer une palette de couleurs sur un plot' PRINT,' Tous les parametres sont optionnels' PRINT,'vmin= : valeur physique de la premiere couleur utile (defaut zero)' PRINT,'vmax= : Valeur physique de la derniere couleur utile (defaut Nombre de couleurs)' PRINT,'POS=[Xmin,Ymin,Xmax,Ymax] : Position de la palette, en unite normalisee [0,1] dans la fenetre' PRINT,'NC= : Nombre de couleurs "utiles" de la palette' PRINT,'FIRST= :Indice de la premiere couleur utile' PRINT,'TIT = : Pour mettre un titre a la palette' PRINT,'/NOFRAME : Pour ne pas mettre de valeur physiques' PRINT,'/NOFRAME : Pour ne pas indiquer les valeur physiques' PRINT,'/VERTICAL : Pour faire une palette verticale (defaut: horizontale)' PRINT,'/HELP : Pour afficher ce menu' RETURN ENDIF IF NOT KEYWORD_SET(nc) THEN nc = !D.N_COLORS-1 IF NOT KEYWORD_SET(fi) THEN fi = 0 IF NOT KEYWORD_SET(vmin) THEN vmin=0 IF NOT KEYWORD_SET(vmax) THEN vmax=nc-1 IF NOT KEYWORD_SET(pos) THEN IF KEYWORD_SET(vert) THEN pos=[0.92,0.3,0.95,0.7] ELSE pos=[0.3,0.05,0.7,0.1] IF !D.NAME EQ 'PS' THEN BEGIN V = BYTARR(nc,1) V[*,0] = BYTE(INDGEN(nc)+fi) IF KEYWORD_SET(vert) THEN V=TRANSPOSE(V) tv,V,pos[0],pos[1],/NORMAL,xsize=pos[2]-pos[0],ysize=pos[3]-pos[1] ENDIF ELSE BEGIN pxsize = LONG((pos[2]-pos[0])*!D.X_SIZE + 0.5) pysize = LONG((pos[3]-pos[1])*!D.Y_SIZE + 0.5) V = BYTARR(pxsize,pysize) IF KEYWORD_SET(vert) THEN BEGIN Vv = BYTE(INDGEN(pysize)*(nc-1.)/float(pysize-1)+fi) FOR i=0,pxsize-1 DO V[i,*] = Vv ENDIF ELSE BEGIN Vv = BYTE(INDGEN(pxsize)*(nc-1.)/float(pxsize-1)+fi) FOR i=0,pysize-1 DO V[*,i] = Vv ENDELSE tv,V,pos(0),pos(1),/NORMAL ENDELSE IF NOT KEYWORD_SET(noframe) THEN IF KEYWORD_SET(vert) THEN BEGIN plot,[0.,1.],[0.,1.],yrange=[vmin,vmax],pos=pos,$ /NODATA,/NORMAL,XSTYLE=4,YSTYLE=1,/NOERASE,YTICKLEN=0.2 ; AXIS,YAXIS=1 IF KEYWORD_SET(tit) THEN xyouts,pos[0]-(pos[2]-pos[0])/5,(pos[1]+pos[3])/2.,tit,ALIGN=0.5,ORIENT=90.,/NORMAL ENDIF ELSE plot,[0.,1.],[0.,1.],xrange=[vmin,vmax],pos=pos,$ /NODATA,/NORMAL,XSTYLE=1,YSTYLE=4,/NOERASE,TIT=tit,/YNOZERO,XTICKLEN=0.2,CHARSIZE=!P.CHARSIZE*0.7 END