(file) Return to cosmic_ray_post.c CVS log (file) (dir) Up to [Development] / JSOC / proj / flatfield / apps

File: [Development] / JSOC / proj / flatfield / apps / cosmic_ray_post.c (download)
Revision: 1.9, Thu Jan 18 21:49:33 2018 UTC (5 years, 8 months ago) by rick
Branch: MAIN
CVS Tags: Ver_LATEST, Ver_9-5, Ver_9-41, Ver_9-4, Ver_9-3, Ver_9-2, HEAD
Changes since 1.8: +29 -14 lines
modified for JSOC release 9.2

 /*
 * cosmic_ray_post - Post processing of cosmic ray series for false positives
 *
 */

/**
\defgroup module_flatfield module_flatfield - derive line-of-sight observables

\par Synopsis
\code
cosmic_ray_post input_series= camera= datum= hour=
\endcode

\details

cosmic_ray_post is post-processing the cosmic ray series (hmi.cosmic_rays) for false positives. The module processes 2 hours at a time, starting 
at the time given by the datum and hour argument

par Options

\par Mandatory arguments:
\li \c input_series="string" where string is the series name of the intermediate flatfield (su_production.flatfield_fid)
\li \c camera=cam,  side camera: cam=1, front camera: cam=2
\li \c datum="date" date="yyyy.mm.dd" TAI-day for which the intermediate flatfields have been calculated. End of TAI-day datum is T_START of updated flatfield
\li \c hour=hour

\par Examples

\b Example 1:

\code
cosmic_ray_post input_series="su_production.flatfield_fid" camera=2 datum="2010.10.09" hour=2
\endcode

*/



#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <jsoc_main.h>
#include <string.h>
#include <time.h>
#include <omp.h>
#include <fresize.h>
#include <module_flatfield.h>

char *module_name  = "module_flatfield_combine";    //name of the module

#define kRecSetIn      "input_series" //name of the series containing the input filtergrams
#define datumn  "datum"
#define cameran "camera"
#define fsnname      "fsn"
#define fsnf_name "fsn_first"
#define fsnl_name "fsn_last"

#define minval(x,y) (((x) < (y)) ? (x) : (y))                  

ModuleArgs_t module_args[] =        
{
     {ARG_STRING, kRecSetIn, "",  "Input data series."},
  {ARG_STRING, "output_series", "hmi.cosmic_rays",  "Output data series"},
     {ARG_STRING, datumn, "yyyy.mm.dd", "Datum string"},
     {ARG_INT, "hour", "00", "Hour"},
     {ARG_INT, cameran, 0, "Camera"},
     {ARG_INT, fsnf_name, "0"},
     {ARG_INT, fsnl_name, "2147483647"},
     {ARG_END}
};



void printtime();
int is_element(int value, int *array, int n);

int DoIt(void)
{

#include "module_flatfield_const.h"

  /*********************/
  //read input parameters

  const char *inRecQuery = cmdparams_get_str(&cmdparams, kRecSetIn, NULL); //cmdparams is defined in jsoc_main.h
  const char *datum =  cmdparams_get_str(&cmdparams, datumn, NULL);
  const char *output_series = cmdparams_get_str (&cmdparams, "output_series", NULL);
 
 int cameraint = cmdparams_get_int(&cmdparams, cameran, NULL);
 int hour= cmdparams_get_int(&cmdparams, "hour", NULL);
 int fsn_first=cmdparams_get_int(&cmdparams, fsnf_name, NULL);
 int fsn_last=cmdparams_get_int(&cmdparams, fsnl_name, NULL);


 /**********************/
 //define variables


  int  status= DRMS_SUCCESS, stat=DRMS_SUCCESS;

  DRMS_Segment_t *seg, *seg_val, *seg_sig;
  DRMS_Segment_t *segout, *segout_val, *segout_sig;
  
  DRMS_Type_t type_time = DRMS_TYPE_TIME;
  DRMS_Type_t type_int = DRMS_TYPE_INT;
  DRMS_Type_t type_float = DRMS_TYPE_FLOAT;
  DRMS_Type_t type_double = DRMS_TYPE_DOUBLE;

  DRMS_RecordSet_t *data, *dataout;
  DRMS_Record_t  *recout, *rec0;
  DRMS_Array_t *arrout, *arrout_val, *arrout_sig;

  int *cosmic_ray_data;
  float *val_data, *sig_data;

  DRMS_Type_Value_t  keyvalue_time;

  int ct,ct_prev,ct_next,ctr;
  float *sig, *lev;
  int *hits;
  int axisbad[1];

  int i, j, k, c; //loop variables


  int axisout[2]={nx,ny};

  
  /**********************/
  //*CHECK WHETHER THE FLATFIELD OUTPUT SERIES EXISTS                                                                    */

    
       drms_series_exists(drms_env, output_series, &status);
      if (status == DRMS_ERROR_UNKNOWNSERIES)
	{
	  printf("Output series %s doesn't exist\n", output_series);       //if the output series does not exit
	  exit(EXIT_FAILURE);                                        //we exit the program
	} 
  

      printf("START!\n");
      printtime();

      /*****************************/
      //build query string

      char fnumb[2]={""};
      char ffnumb[2]={""};
      char timefirst[256]="";

      strcat(timefirst, datum);
      strcat(timefirst, "_");
      sprintf(fnumb, "%2.2d", hour);
      strcat(timefirst, fnumb);
      strcat(timefirst, ":00:00.00_TAI");
 
 

      char query0[256]="";
      TIME tfirst, tlast;

      printf("fsnfs %d %d\n", fsn_first, fsn_last);


 if (fsn_first == 0 || fsn_last == 2147483647)
   {

 char timelast[256]="";
 strcat(timelast, datum);
 strcat(timelast, "_");
 sprintf(ffnumb, "%2.2d", hour+1);
 strcat(timelast, ffnumb);
 strcat(timelast, ":59:59.99_TAI");


     tfirst=sscan_time(timefirst);
     tlast=sscan_time(timelast);

     char datefirst[256]="";
     sprint_ut(datefirst, tfirst-5.0);

 char datelast[256]="";
 sprint_ut(datelast, tlast+5.0);


 strcat(query0, inRecQuery);
 strcat(query0, "[");
 strcat(query0, datefirst);
 strcat(query0, "-");
 strcat(query0, datelast);
 strcat(query0, "][?CAMERA=");
 sprintf(fnumb, "%1.1d", cameraint);
 strcat(query0, fnumb);
 strcat(query0, "?]");

  printf("query string time: %s\n", query0);
    
  }


  if (fsn_first != 0 && fsn_last != 2147483647)
    {

      tfirst=0;
      tlast=3881520000.0;

      strcat(query0, inRecQuery);
      strcat(query0, "[][");
       char fsnf[10]={""};
       sprintf(fsnf, "%d", fsn_first-2);
       strcat(query0, fsnf);
      strcat(query0, "-");
      char fsnl[10]={""};
      sprintf(fsnl, "%d", fsn_last+2);
       strcat(query0, fsnl);
       strcat(query0, "][?CAMERA=");
      char fnumb[2]={""};
     sprintf(fnumb, "%1.1d", cameraint);
     strcat(query0, fnumb);
      strcat(query0, "?]");
      printf("query string fsn: %s\n", query0);  
    }

  
  /****************************/
  //open records

 
  data     = drms_open_records(drms_env,query0,&stat);

  if (data == NULL){printf("can not open records\n"); exit(EXIT_FAILURE);}

  drms_stage_records(data, 1, 0);

  int nRecs=data->n;
  printf("number of records %d\n", nRecs);
  printtime();


  /******************************/
  //read out keywords


if (stat == DRMS_SUCCESS && data != NULL && nRecs > 0)
  {
  int keyvalue_fid[nRecs];
  int keyvalue_cam[nRecs];
  DRMS_Record_t *rec0[nRecs];
  int  *cosmic_rays[nRecs];
  int keyvalue_recnum[nRecs];
  DRMS_Array_t *arr_cosmic[nRecs], *arr_level[nRecs], *arr_sig[nRecs];
  short wave[nRecs];
  short pol[nRecs];
  int count[nRecs];
  double time_fl[nRecs];
  int keyvalue_fsn[nRecs];
  int keyvalue_flag[nRecs];
  float keyvalue_factor[nRecs];
  float *significance[nRecs], *level[nRecs];
  int new_count[nRecs];
  int npairs[nRecs];
  float crrmax[nRecs];


  printtime();
  printf("create_records ...");
  dataout = drms_create_records (drms_env, nRecs, output_series,
      DRMS_PERMANENT, &stat);
  printf("done\n");
  printtime();

  printf("begin keyword  reading loop\n");
for (k=0; k<nRecs; ++k)
  {
    rec0[k]=data->records[k];

   
   
    count[k]= drms_getkey_int(rec0[k],keycount,&status);
    keyvalue_fid[k] = drms_getkey_int(rec0[k],fidkey,&status);
    keyvalue_cam[k] = drms_getkey_int(rec0[k],keycamera,&status);
    keyvalue_fsn[k]= drms_getkey_int(rec0[k],keyfsn,&status);
    keyvalue_flag[k] = drms_getkey_int(rec0[k],keyexmax,&status);
    keyvalue_factor[k] = drms_getkey_float(rec0[k],keylimit,&status);

    keyvalue_time=drms_getkey(rec0[k], keytobs, &type_time, &status);   ;   //read "T_OBS" of filtergram
    time_fl[k] = keyvalue_time.time_val;

    wave[k]=((keyvalue_fid[k]-10000)/10-5)/2;
    pol[k]=(keyvalue_fid[k] % 10);    
    
    keyvalue_recnum[k]=drms_getkey_int(rec0[k], recnumkey,&status);
    crrmax[k] = drms_getkey_float (rec0[k], "CRRMAX", &status);

      }
 printtime();

 

 /***********************************/
 //data reading loop


printf("begin data  reading loop\n");

 for (k=0; k<nRecs; ++k)
   {

     seg = drms_segment_lookup(rec0[k], segmentname_cosmic);
     seg_val=drms_segment_lookup(rec0[k], segmentname_val);
     seg_sig=drms_segment_lookup(rec0[k], segmentname_sig);
	    
     arr_cosmic[k]= drms_segment_read(seg, type_int, &status);
     arr_level[k]=drms_segment_read(seg_val, type_float, &status);
     arr_sig[k]=drms_segment_read(seg_sig, type_float, &status);


     cosmic_rays[k] = arr_cosmic[k]->data;
     significance[k]=arr_sig[k]->data;
     level[k]=arr_level[k]->data;

   }

 printtime();

 /******************************/
 //test loop

  int elem_prev, elem_next;

  int *cosmic_new;
  float *val_new;
  float *sig_new;

  int counter=0;
  int falsecounter=0, goodcounter=0;

  cosmic_new=(int *)(malloc(limit_cosmic*sizeof(int)));
  val_new=(float *)(malloc(limit_cosmic*sizeof(float)));
  sig_new=(float *)(malloc(limit_cosmic*sizeof(float)));




printf("begin test loop\n");

 for (k=0; k<nRecs; ++k)
   {
     

     if (time_fl[k] >= tfirst && time_fl[k] <= tlast  && keyvalue_fsn[k] >= fsn_first && keyvalue_fsn[k] <= fsn_last)
       {

	 hits=cosmic_rays[k];
	 sig=significance[k];
	 lev=level[k];

	 ct=minval(count[k], limit_cosmic);

	 if (count[k] > 0 && k >=1 && k < (nRecs-1)) //at least one count, not first or last record -> do weeding
	   {
	     
	     ct_prev=minval(count[k-1], limit_cosmic);
	     ct_next=minval(count[k+1], limit_cosmic);
  

	     ctr=0;

	     for (c=0; c<ct; ++c)
	       {
	    
	     	 ++counter;
		 elem_prev=is_element(hits[c], cosmic_rays[k-1], ct_prev);
		 elem_next=is_element(hits[c], cosmic_rays[k+1], ct_next);

		 if (elem_prev == 0 && elem_next == 0)
		   {
		     
		     cosmic_new[ctr]=hits[c];
		     val_new[ctr]=lev[c];
		     sig_new[ctr]=sig[c];
		     ++ctr;
		     ++goodcounter;
		   }
		 else
		   {
		     ++falsecounter;
		   }
	       }
	    	       
	     new_count[k]=ctr;
	   }
	 else  //else, just copy
       {
	 ctr=count[k];

	 for (c=0; c<ct; ++c)
	   {
	    		
	     cosmic_new[c]=hits[c];
	     val_new[c]=lev[c];
	     sig_new[c]=sig[c];                                  
	    
	   }
	       
	 new_count[k]=ctr;
       }

	 /*************************/
	 //set keywords
     

     recout = dataout->records[k];

     status=drms_setkey_int(recout, keyfsn, keyvalue_fsn[k]);
     status=drms_setkey_time(recout, keytobs, time_fl[k]);
     
     status=drms_setkey_int(recout, fidkey, keyvalue_fid[k]);
     status=drms_setkey_int(recout, keycamera, keyvalue_cam[k]);
     status=drms_setkey_int(recout, keyexmax, keyvalue_flag[k]);
     status=drms_setkey_float(recout, keylimit, keyvalue_factor[k]); 
     drms_setkey_float (recout, "CRRMAX", crrmax[k]); 
	
     drms_keyword_setdate(recout);

     status=drms_setkey_int(recout, keycount, new_count[k]);
    
     if (keyvalue_cam[k] == 2) status=drms_setkey_string(recout, keyinstrument, camera_str_front);
     if (keyvalue_cam[k] == 1) status=drms_setkey_string(recout, keyinstrument, camera_str_side);
	    
   	    
	 
     /************************************/
     //write out data segments


     if (new_count[k] >= 0)
       {

	 segout = drms_segment_lookup(recout, segmentname_cosmic);
	 segout_val=drms_segment_lookup(recout, segmentname_val);
	 segout_sig=drms_segment_lookup(recout, segmentname_sig);

     axisbad[0]=new_count[k];
     arrout=drms_array_create(type_int,1,axisbad,NULL,&status);
     cosmic_ray_data=arrout->data;
	  	 
     arrout_val=drms_array_create(type_float,1,axisbad,NULL,&status);
     val_data=arrout_val->data;

     arrout_sig=drms_array_create(type_float,1,axisbad,NULL,&status);
     sig_data=arrout_sig->data;


     for (i=0; i<new_count[k]; ++i){cosmic_ray_data[i]=cosmic_new[i]; val_data[i]=val_new[i]; sig_data[i]=sig_new[i];} //copy new data array

       status=drms_segment_write(segout, arrout, 0);
       status=drms_segment_write(segout_val, arrout_val, 0);
       status=drms_segment_write(segout_sig, arrout_sig, 0);
	   
       drms_free_array(arrout);
       drms_free_array(arrout_val);
       drms_free_array(arrout_sig);
       }
       }
    
   }
 
 /****************/
 //free arrays

 for (k=0; k<nRecs; ++k)
   {
     drms_free_array(arr_level[k]);
     drms_free_array(arr_cosmic[k]);
     drms_free_array(arr_sig[k]);
   }

   
 drms_close_records(dataout, DRMS_INSERT_RECORD);


 drms_close_records(data,DRMS_FREE_RECORD);

 free(cosmic_new);
 free(sig_new);
 free(val_new);


 printf("correctly identified cosmic rays %d out of %d %f\n", goodcounter, (goodcounter+falsecounter), (float)goodcounter/(float)(falsecounter+goodcounter));
 
  }
 else 
    {
      printf("No data records found\n");
    }     

 
   



 printtime();

 printf("COMLETED!\n");
 return 0;

}





int is_element(int value, int *array, int n)
{

  int isel, ctr;

  ctr=0;
  isel=0;
  while (ctr < n && isel == 0)
    {
      isel=(value == array[ctr]);
      ++ctr;
    }

  return isel;
}


void printtime()	
// print time
{
  time_t timer, timerd;
  char *timestring;
  int i;

	timerd=time(&timer);
	timestring=ctime(&timer);
        for (i=0; i<24; ++i) printf("%c", *(timestring+i));
	printf("\n");
}

/*
 *  Revision history
 *
 *  2017.11.01	Added optional argument for output_series to replace previously
 *	hard-coded value of "hmi.cosmic_rays" (defined as filename_cosmic2_out)
 *	Added propagation of keyword CRRMAX if present from input_series
 * 
 */




Karen Tian
Powered by
ViewCVS 0.9.4