pro plotem,logT,EM,idstr=idstr,markmin=markmin,multid=multid,$
	lcol=lcol,lsiz=lsiz,tlog=tlog,wdth=wdth,$
	xtitle=xtitle,ytitle=ytitle,title=title,xrange=xrange,yrange=yrange,$
	xstyle=xstyle,ystyle=ystyle,xlog=xlog,ylog=ylog, _extra=e
;+
;procedure	plotem
;	plots emission measures derived from the output of POTEM_TOOL
;	(or other means)
;
;syntax
;	plotem,logT,EM,idstr=idstr,markmin=markmin,multid=multid,lcol=lcol,$
;	lsiz=lsiz,tlog=tlog,wdth=wdth,xtitle=xtitle,ytitle=ytitle,title=title,$
;	xrange=xrange,yrange=yrange,xstyle=xstyle,ystyle=ystyle,/xlog,/ylog,$
;	/nuthin,/noday,/notime,/nouser,/nopack,stacol=stacol,stasiz=stasiz,$
;	stathk=stathk
;
;parameters
;	logT	[INPUT] temperatures at which to plot the emission measure
;		estimates
;	EM	[INPUT] array of emission measures at the various temperatures
;		for each line
;		* if EM is not given, it is assumed that EM <- "LOGT" and
;		  LOGT = default
;		* EM is an array of the form EM(LOGT,WVL); if the size of
;		  the first dimension does not match input LOGT, the plots
;		  are interpolated
;
;keywords
;	idstr	[INPUT] ID structure, essentially to figure out labels for
;		the curves.
;		* if size does not match that of EM, cest la vie.
;	markmin	[INPUT] if set, plots only a single point for each curve,
;		corresponding to the minimum in EM
;		* the actual value of MARKMIN sets the PSYM for the points
;	multid	[INPUT] an integer array saying how many IDs there are
;		to each component of the ID structure (comes in handy
;		if IDSTR has all the emissivities collapsed into one)
;	lcol	[INPUT; default=200] color for the labels
;	lsiz	[INPUT; default=0.4] size of the labels
;	tlog	[I/O] if LOGT does not match size of EM, >and< EM does
;		not match the size of the temperature grid in emissivities
;		in ID being considered, then look for TLOG to supply the
;		actual temperature grid. (this latter feature is not yet
;		implemented)
;		* default is to go from log(T)=4..8 in as equidistant steps
;		* beware -- this will get overwritten if incorrect!!
;	wdth	[INPUT] the widths of each of the EM curves, from POTTASCH(),
;		via POTEM_TOOL()
;		* the size of this array must match the 2nd dimension of
;		  EM, or else it will be ignored
;
;	xtitle	[INPUT] passed w/o comment to PLOT
;	ytitle	[INPUT] passed w/o comment to PLOT
;	title	[INPUT] passed w/o comment to PLOT
;	xrange	[INPUT] overrides locally determined XRANGE
;	yrange	[INPUT] overrides locally determined YRANGE
;	xstyle	[INPUT] passed w/o comment to PLOT
;	ystyle	[INPUT] passed w/o comment to PLOT
;	xlog	[INPUT] passed w/o comment to PLOT, but default is 0
;	ylog	[INPUT] passed w/o comment to PLOT, but default is 1
;	_extra	[INPUT] pass defined keywords to subroutines
;		STAMPLE: NUTHIN,NODAY,NOTIME,NOUSER,NOPACK,STACOL,STASIZ,STATHK
;
;history
;	vinay kashyap (Nov98)
;	added keyword MULTID (VK; Dec98)
;	changed call to INITSTUFF to INICON (VK; 99May)
;	added call to STAMPLE (VK; JanMMI)
;	improved color-scale setting for 24-bit consoles (VK; FebMMI)
;	added keyword WDTH (VK; SepMMVII)
;-

;	usage
np=n_params()
if np lt 1 then begin
  print,'Usage: plotem,logT,EM,idstr=idstr,markmin=markmin,multid=multid,$'
  print,'       lcol=lcol,lsiz=lsiz,tlog=tlog,wdth=wdth,xtitle=xtitle,$'
  print,'       ytitle=ytitle,title=title,xrange=xrange,yrange=yrange,$'
  print,'       xstyle=xstyle,ystyle=ystyle,/xlog,/ylog,/nuthin,/noday,$'
  print,'       /notime,/nouser,/nopack,stacol=stacol,stasiz=stasiz,$'
  print,'       stathk=stathk'
  print,"  plots predicted emission measures for ID'd lines"
  return
endif

;	check input
nT=n_elements(logT) & szEM=size(EM) & nszEM=n_elements(szEM)
ok='ok'
if nT eq 0 then begin			;(logT not given
  nT=81L & logT=findgen(nT)*0.05+4.
  if szEM(nszEM-2) eq 0 then ok='Emission Measure not given' else $
   if szEM(nszEM-1) lt 2 then ok='Emission Measure must be an array'
endif					;NT=0->81)
if szEM(nszEM-2) eq 0 then begin	;(EM not given?
  szT=size(logT)
  if szT(0) eq 2 then begin
    EM=logT & szEM=szT & nszEM=n_elements(szEM)
    nT=81L & logT=findgen(nT)*0.05+4.
  endif else ok='confused.. where is the Emission Measure?'
endif					;EM<-logT)
if szEM(0) eq 1 then begin		;(EM is 1D?
  mT=szEM(1) & szEM=reform(EM,mT,1)
endif					;EM is 1D)
mT=szEM(1) & mW=szEM(2)
if mT lt 2 then ok='Emission Measure must be an array'
if ok ne 'ok' then begin
  message,ok,/info & return
endif

;	check keywords
dncolors=256. > !D.N_COLORS	;24-bit color screen temporary fix
lc=200 & if keyword_set(lcol) then lc=fix(lcol)
lc=fix(lc*(!d.n_colors/dncolors))
ls=0.5 & if keyword_set(lsiz) then ls=float(lsiz)
defT=findgen(mT)*(4./(mT-1.))+4. & moT=n_elements(tlog)
if moT ne mT then tlog=defT
xt='log!d10!n(T)' & if keyword_set(xtitle) then xt=strtrim(xtitle,2)
yt='EM' & if keyword_set(ytitle) then yt=strtrim(ytitle,2)
tt='Emission Measures' & if keyword_set(title) then tt=strtrim(title,2)
xs=1 & if keyword_set(xstyle) then xs=strtrim(xstyle,2)
ys=1 & if keyword_set(ystyle) then ys=strtrim(ystyle,2)
;
Tmin=min(logT,max=Tmax)
if Tmax eq Tmin then begin
  Tmin=Tmin-0.5 & Tmax=Tmax+0.5
endif
xr=[Tmin,Tmax]
if n_elements(xrange) eq 2 then xr=xrange	;override default XRange
;
EMin=min(EM,max=EMax)
if EMin eq -1 then begin	;(EMin=-1 ==> standard format for ignore
  oo=where(EM gt 0,moo)
  if moo gt 0 then EMin=min(EM(oo),max=EMax)
endif				;EMin=-1)
if EMax le EMin then EMax=EMin+!pi
if EMax gt 100. then begin		;(EM in normal numbers
  Emin=EMin/5. & EMax=EMax*5.			;stretch a little
endif else begin			;)(log(EM)
  EMin=EMin-0.5 & EMax=EMax+0.5		;stretch a little
endelse				;logEM)
yr=[EMin,EMax]
if n_elements(yrange) eq 2 then yr=yrange	;override default YRange
;
logx=0 & if keyword_set(xlog) then logx=1
logy=1 & if n_elements(ylog) ne 0 and not keyword_set(ylog) then logy=0
;
twdth=fltarr(mW)+median(logT(1:*)-logT)
if n_elements(wdth) eq mW then twdth=wdth

;	are there labels to be had?
labl=strarr(mW) & itlog=intarr(mW) & nid=n_tags(idstr)
if nid gt 0 then begin
  ;	initialize stuff
  ok='ok'
  atom=1 & rom=1 & inicon,atom=atom,roman=rom & atom=['?',atom] & rom=['',rom]
  ;	make sure the structure is in right format
  idnam=tag_names(idstr)
  ok='ok'
  if idnam(0) ne 'WVL' then ok='not ID structure' else $
   if idnam(1) eq 'WVL_COMMENT' then ok='no data in ID structure' else $
    if nid ne n_elements(idstr.(0))+1 then ok='no IDs?'
  if ok ne 'ok' then goto,noID		;{skip the label maker
  ;	if the number of WVLs in IDSTR match MW, excellent..
  nw=n_elements(idstr.WVL) & multID=0
  if n_elements(multid) eq nw then idmult=multid else idmult=intarr(nw)+1
  ;	..otherwise, see how many WVLs there are anyway..
  if nw ne mW then begin
    kID=0L
    for i=0,nW-1 do kID=kID+n_elements(idstr.(i+1).WVL)
    if kID eq mW then multID=1 else begin
      ;	..and as last resort, do the best ye can..
      multID=2
    endelse
  endif
  ;
  j=0L
  for i=0,nW-1 do begin				;{step through IDSTR
    tmp=idstr.(i+1) & zz=tmp.Z & jon=tmp.ion & ww=tmp.WVL
    n=n_elements(ww)
    ;
    em_added=0
    if idmult(i) gt 1 then em_added=1
    szz=size(zz) & nszz=n_elements(szz) & if szz(nszz-2) eq 4 then em_added=1
    ;
    for k=0,n-1 do begin			;{step through IDs
      if multID eq 0 then begin			;(IDs collapsed into 1
	labl(j)=labl(j)+'!C'+'!3'+atom(zz(k))+' '+rom(jon(k))+' !4k!3'+$
		strtrim(string(ww(k),'(g10.5)'),2)
	if k eq n-1 then j=j+1
      endif else begin				;)(each ID separate
	if j lt mW then begin
	  labl(j)='!3'+atom(zz(k))+' '+rom(jon(k))+' !4k!3'+$
		strtrim(string(ww(k),'(g10.5)'),2)
	  if keyword_set(em_added) then labl(j)=labl(j)+' ETC.'
	  j=j+1
	endif
      endelse					;MULTID)
    endfor					;K=0,N-1}
  endfor					;I=0,NW-1}
  noID:					;get here from GOTO}
endif

;	now go forth and set up the plot
plot,logT,0*logT,/nodata,xtitle=xt,ytitle=yt,title=tt,xrange=xr,yrange=yr,$
	xstyle=xs,ystyle=ys,xlog=logx,ylog=logy
stample, _extra=e
;	and plot!
for i=0,mW-1 do begin
  EMplot=reform(EM(*,i))
  if not keyword_set(markmin) then oplot,tlog,EMplot,col=(lc([i]))(0)
  oo=where(EMplot gt EMin,moo)
  if moo gt 0 then begin
    yl=min(EMplot(oo),ixl) & xl=tlog(oo(ixl))
    xyouts,xl,yl,labl(i),color=(lc([i]))(0),charsize=(ls([i]))(0),align=0.5
    if n_elements(wdth) eq mW then $
     oplot,tlog(i)+twdth(i)*0.5*[-1,1],yl*[1,1],color=(lc([i]))(0)
    if keyword_set(markmin) then begin
      ;	find the locations of all the minima (needed because emissivities
      ;	may be multi-bumped.  then mark all these points with PSYM=MARKMIN.
      xx=tlog & yy=-EMplot & nx=n_elements(xx) & ilm=lonarr(nx)-1L
      for j=0L,nx-1L do $
        if yy(j) ne -1 and (where(yy(j) le yy([j-1,j+1])))(0) eq -1 then $
	  ilm(j)=j
      olm=where(ilm ge 0,molm)
      if molm gt 0 then for j=0,molm-1 do $
	oplot,[tlog(olm(j))],[EMplot(olm(j))],psym=markmin;,col=(lc([i]))(0)
      if molm gt 0 then oplot,tlog(olm),EMplot(olm),line=1,col=(lc([i]))(0)
    endif
  endif
endfor

return
end