Exemple #1
0
void decimate_header() /* includefile */
{
  /* go no further here if not interested in header parameters */
  if (headerless) return;
  /* broadcast the header parameters to the output stream */
  send_string("HEADER_START");
  if (!strings_equal(source_name,"")) {
    send_string("source_name");
    send_string(source_name);
  }
  send_int("telescope_id",telescope_id); 
  send_int("machine_id",machine_id);
  send_coords(src_raj,src_dej,az_start,za_start);
  if (nchans/naddc==1) {
    send_int("data_type",2);
    //    send_double("refdm",0.0);
   
    send_double("refdm",refdm); 
    /*== MKEITH: A hack to stop the dminfo being lost when decimating after dedisperse! ==*/
  
  } else {
    send_int("data_type",1);
  }
  send_double("fch1",fch1);
  send_double("foff",foff*(double)naddc);
  send_int("nchans",nchans/naddc);
  send_int("nbits",obits);
  send_double ("tstart",tstart); 
  send_double("tsamp",tsamp*(double)naddt);
  send_int("nifs",nifs);
  send_int("barycentric",barycentric);
  send_string("HEADER_END");
}
void filterbank_header(FILE *outptr) /* includefile */
{
  int i,j;
  output=outptr;
  if (obits == -1) obits=nbits;
  /* go no further here if not interested in header parameters */
  if (headerless) return;
  /* broadcast the header parameters to the output stream */
  if (machine_id != 0) {
    send_string("HEADER_START");
    send_string("rawdatafile");
    send_string(inpfile);
    if (!strings_equal(source_name,"")) {
      send_string("source_name");
      send_string(source_name);
    }
    send_int("machine_id",machine_id);
    send_int("telescope_id",telescope_id);
    send_coords(src_raj,src_dej,az_start,za_start);
    if (zerolagdump) {
      /* time series data DM=0.0 */
      send_int("data_type",2);
      refdm=0.0;
      send_double("refdm",refdm);
      send_int("nchans",1);
    } else {
      /* filterbank data */
      send_int("data_type",1);
      send_double("fch1",fch1);
      send_double("foff",foff);
      send_int("nchans",nchans);
    }
    /* beam info */
    send_int("nbeams",nbeams);
    send_int("ibeam",ibeam);
    /* number of bits per sample */
    send_int("nbits",obits);
    /* start time and sample interval */
    send_double("tstart",tstart+(double)start_time/86400.0);
    send_double("tsamp",tsamp);
    if (sumifs) {
      send_int("nifs",1);
    } else {
      j=0;
      for (i=1;i<=nifs;i++) if (ifstream[i-1]=='Y') j++;
      if (j==0) error_message("no valid IF streams selected!");
      send_int("nifs",j);
    }
    send_string("HEADER_END");
  }
  
}
Exemple #3
0
main (int argc, char **argv)
{
  int i=1, j, k, nfiles=0, *numbt, schans=0, nbytes, *nchan;
  FILE *input[32];
  char *block;
  double *stamp, *frch1, *froff, *frmhz;
  output=stdout;
  /* print help if necessary */
  if (argc<=1 || help_required(argv[1])) {
    /*splice_help();*/
    exit(0);
  } else {
    print_version(argv[0],argv[1]);
  }

  /* open up files */
  while (i<argc) {
    if (file_exists(argv[i])) {
      input[nfiles]=open_file(argv[i],"rb");
      nfiles++;
    } else if (strings_equal(argv[i],"-o")) {
      output=open_file(argv[++i],"wb");
    }
    i++;
  }

  /* read in headers and check time stamps */
  stamp = (double *) malloc(nfiles*sizeof(double));
  frch1 = (double *) malloc(nfiles*sizeof(double));
  froff = (double *) malloc(nfiles*sizeof(double));
  numbt = (int *) malloc(nfiles*sizeof(int));
  nchan = (int *) malloc(nfiles*sizeof(int));
  for (i=0; i<nfiles; i++) {
    if (read_header(input[i])) {
      stamp[i]=tstart;
      frch1[i]=fch1;
      froff[i]=foff;
      numbt[i]=nbits;
      nchan[i]=nchans;
      schans+=nchans;
    } else {
      error_message("problem reading header parameters");
    }
    if (data_type != 1) 
      error_message("input data are not in filterbank format!");
    if (stamp[i] != stamp[0]) 
      error_message("start times in input files are not identical!");
    if (numbt[i] != numbt[0])
      error_message("number of bits per sample in input files not identical!");
    if (i>0) {
      if (frch1[i] > frch1[i-1]) 
	error_message("input files not ordered in descending frequency!");
    }

  }


  send_string("HEADER_START");
  send_int("machine_id",machine_id);
  send_int("telescope_id",telescope_id);
  send_int("data_type",1);

  send_string("FREQUENCY_START");
  send_int("nchans",schans);
  frmhz = (double *) malloc(sizeof(double)*schans);
  k=0;
  for (i=0; i<nfiles; i++) {
    for (j=0; j<nchans; j++) {
      frmhz[k]=frch1[i]+j*froff[i];
      send_double("fchannel",frmhz[k++]);
    }
  }
  send_string("FREQUENCY_END");
  

  if (!strings_equal(source_name,"")) {
    send_string("source_name");
    send_string(source_name);
  }
  send_coords(src_raj,src_dej,az_start,za_start);
  send_int("nbits",nbits);
  send_double("tstart",tstart);
  send_double("tsamp",tsamp);
  send_int("nifs",nifs);
  send_string("HEADER_END");

  nbytes = nchans*nbits/8;
  block = (char *) malloc(nbytes);
  while (1) {
    for (i=0; i<nfiles; i++) {
      if (feof(input[i])) exit(0);
      fread(block,nbytes,1,input[i]);
      fwrite(block,nbytes,1,output);
    }
  }
}
Exemple #4
0
main(int argc, char** argv)
{
    int 	  c,arg=1,i,j,k,nstep;
    long long int fsizeusb,nsamp,nextract=0,nsampuse;
    char	  fnameusb[180], fheader[180], headerline[80], junk[80];
    char          rastring[80], decstring[80], outputfile[180];
    double        ras, des;
    int           rah, ram, ded, dem, hh, mm, ssm;
    double        ss;
    FILE	  *finfileusb,*flog,*headerfile;
    short int     *DATA1,*DATA4,temp;
    unsigned char *DATA2,*DATA3;
    char          timeBuffer[80];
    time_t        now ;


    if (argc <= 1)
    {
      printf("USAGE : gmrt2fb -f filename -r raj -d decj -m MJD -s timeSample -n nbits -w channelWidth -c first_channelFreq -t No of Channels \n");
      printf("\n");
      printf("    filename: Combined Data filename \n");
      printf("\n");
      exit(0);
    }

    if (file_exists(argv[1])) {
      strcpy(fnameusb,argv[1]);
      if((finfileusb = fopen(fnameusb,"rb"))== NULL) {
	error_message("error opening GMRT data file");
      }
      strcpy(fheader,"");
      strncat(fheader,fnameusb,strlen(fnameusb)-3);
      strcat(fheader,"hdr");
      if((headerfile = fopen(fheader,"rb"))== NULL) {
	error_message("error opening GMRT data file");
      }
      while (fgets(headerline, 80, headerfile) != NULL) {
	if (strstr(headerline,"Num Channels") != NULL) {
	  sscanf(headerline,"%s %s %s %d",junk,junk,junk,&nchans);
	}
	if (strstr(headerline,"Channel width") != NULL) {
	  sscanf(headerline,"%s %s %s %lf",junk,junk,junk,&foff);
	  foff*=-1.0;
	}
	if (strstr(headerline,"Frequency Ch.1") != NULL) {
	  sscanf(headerline,"%s %s %s %lf",junk,junk,junk,&fch1);
	}
	if (strstr(headerline,"Num bits/sample") != NULL) {
	  sscanf(headerline,"%s %s %s %d",junk,junk,junk,&nbits);
	}
	if (strstr(headerline,"MJD") != NULL) {
	  sscanf(headerline,"%s %s %lf",junk,junk,&tstart);
	}
	if (strstr(headerline,"UTC") != NULL) {
	  sscanf(headerline,"%s %s %d:%d:%lf",junk,junk,&hh,&mm,&ss);
	  tstart+=(double)hh/24.0+(double)mm/1440.0+ss/86400.0;
	}
	if (strstr(headerline,"Sampling Time") != NULL) {
	  sscanf(headerline,"%s %s %s %lf",junk,junk,junk,&tsamp);
	  tsamp*=1.0e-6;
	}
	if (strstr(headerline,"Coordinates") != NULL) {
	  sscanf(headerline,"%s %s %s %s",junk,junk,junk,decstring);
	  strncat(rastring,junk,strlen(junk)-1);
	  rah=atoi(strtok(rastring,":"));
	  ram=atoi(strtok(NULL,":"));
	  ras=atof(strtok(NULL,":"));
	  src_raj=ras+ram*100.0+rah*10000.0;
	  ded=atoi(strtok(decstring,":"));
	  dem=atoi(strtok(NULL,":"));
	  des=atof(strtok(NULL,":"));
	  src_dej=des+100.0*dem+10000.0*abs(ded);
	}
	if (strstr(headerline,"Source") != NULL) {
	  sscanf(headerline,"%s %s %s",junk,junk,source_name);
	}
      }
    }
	

    //      flog=fopen("convert_sig_gmrt.log","a");
      one_more_time:
      now = time(0);
      strcpy(timeBuffer, ctime(&now));
      printf("\n\nStarting on %s\n",timeBuffer);
      //      fprintf(flog,"----------------------------\n");
      //      fprintf(flog,"Starting on %s\n",timeBuffer);

     while((c = getopt(argc, argv, "f:r:d:m:s:n:w:c:t:")) != -1)
      {
        switch (c)
        {
	 case 'f':
         sscanf(optarg,"%s",fnameusb);
              if((finfileusb = fopen(fnameusb,"rb"))== NULL)
              {
                    printf("%s\n",fnameusb);
                    printf("Error opening file \n");
		    //  fprintf(flog,"Error opening file \n");
                  //  exit(0);
               }
               else
               {
	            printf("\n opened file: %s \n",fnameusb);
		    // fprintf(flog,"\n opened file: %s \n",fnameusb);
               }
        }
        switch (c)
        {
          case 'r':
             sscanf(optarg,"%lf",&src_raj);
             printf("testing %lf\n",src_raj);
        }
        switch (c)
        {
          case 'd':
             sscanf(optarg,"%lf",&src_dej);
        }
        switch (c)
        {
          case 'm':
             sscanf(optarg,"%lf",&tstart);
        }
        switch (c)
        {
          case 's':
             sscanf(optarg,"%lf",&tsamp);
        }
        switch (c)
        {
          case 'n':
             sscanf(optarg,"%d",&nbits);
        }
        switch (c)
        {
          case 'w':
             sscanf(optarg,"%lf",&foff);
        }
        switch (c)
        {
          case 'c':
             sscanf(optarg,"%lf",&fch1);
        }
        switch (c)
        {
          case 't':
             sscanf(optarg,"%d",&nchans);
        }

      }

     printf("Filling the header for sigproc file\n");
     data_type=1;
     nifs=1;
/*   the earlier code (convertSigM) was built with these values :
     machine_id=1;    // this is the id used for analysing sigproc data at NCRA
     telescope_id=3;  // this Arecibo id is used for analysing sigproc data at NCRA for the time being..
*/

/*   new values of machine_id and telescope_id : expected to work with sigproc3.7 and 4.1 */
     machine_id=7;   // new machine ID for GMRT
     telescope_id=7; // new telescope ID for GMRT 

     az_start=0.0;
     za_start=0.0;
     printf("machine_id %d ; telescope_id %d  \n",machine_id,telescope_id);

/******************************************/

     /* Find the file size */
      fseeko(finfileusb,0,SEEK_END);
      fsizeusb = ftello(finfileusb);
      fseeko(finfileusb,0,SEEK_SET);

      printf("File size : %lld\n",fsizeusb);
      //      fprintf(flog,"File size : %lld\n",fsizeusb);
      
     /* Move the file pointer */
              
      printf("Location of file ptr: %lld\n",ftello(finfileusb));

      /* 
	 build a file name of the form:
	 source_MJD_secondssincemidnight_gmrt.fil
      */
      ssm = (int) 86400.0*(tstart-floor(tstart));
      sprintf(outputfile,"%s_%d_%d_gmrt.fil",source_name,(int)floor(tstart),ssm);
      /*
      strcpy(outputfile,"");
      strncat(outputfile,fnameusb,strlen(fnameusb)-4);
      strcat(outputfile,".fil");
      */
      output = fopen(outputfile,"w");
      printf("Outputfile: %s\n",outputfile);
      //      fprintf(flog,"Outputfile: %s\n",outputfile);

      nsamp = fsizeusb;

  if (nbits == 16) { // for 16bit data, read and write it as short int
    DATA1 = malloc (2*nch*maxsamp * sizeof (short int *));
    DATA4 = malloc (2*nch*maxsamp * sizeof (short int *));
    nsamp = nsamp/1024; /* converting nsamp in units of time samples */
    printf("Number of bytes: %lld, Number of time samples:%lld\n",1024*nsamp,nsamp);
    //    fprintf(flog,"Number of bytes: %lld, Number of time samples:%lld\n",1024*nsamp,nsamp);
  }
  else {// for 8bit data, read and write it as unsigned char
    printf("no of bits %d \n",nbits); 
    DATA2 = malloc (2*nch*maxsamp * sizeof (unsigned char *));
    DATA3 = malloc (2*nch*maxsamp * sizeof (unsigned char *));
    nsamp = nsamp/512; /* converting nsamp in units of time samples */
    printf("Number of bytes: %lld, Number of time samples:%lld\n",512*nsamp,nsamp);
    //    fprintf(flog,"Number of bytes: %lld, Number of time samples:%lld\n",512*nsamp,nsamp);
  }


/* write out the header for the *fil files for sigproc that is needed*/

    send_string("HEADER_START");
    send_string("source_name");
    send_string(source_name);
    send_int("machine_id",machine_id);
    send_int("telescope_id",telescope_id);
    send_int("data_type",data_type);
    send_coords(src_raj,src_dej,az_start,za_start);
    send_double("fch1",fch1);
    send_double("foff",foff);
    send_int("nchans",nchans);
    send_int("nbits",nbits);
    send_double("tstart",tstart);
    send_double("tsamp",tsamp);
    send_int("nifs",nifs);
    send_string("HEADER_END");

// End of the Sigproc header...
//    fclose(output);
//    exit(0);

    nstep=5;
    nsampuse = nsamp/nstep;

    while(nsampuse > maxsamp)
    {
        nstep=nstep+10;
        nsampuse = nsamp/nstep;
        printf("Nsampuse: %lld\n",nsampuse);
    }
          
    printf("samples per block:%lld\n",nsampuse);
    //    fprintf(flog,"samples per block:%lld\n",nsampuse);
          
    for(i=0;i<nstep;i++)
    {
      if (nbits == 16) fread(DATA4,sizeof(short),2*nch*nsampuse,finfileusb);
      else fread(DATA2,sizeof(unsigned char),2*nch*nsampuse,finfileusb);
      for(k=0;k<nsampuse;k++)
      {
        for(j=0;j<nchans;j++) {
          if (nbits == 16) DATA1[k*nchans+j]=DATA4[k*nchans+(nchans-1-j)];
          else DATA3[k*nchans+j]=DATA2[k*nchans+(nchans-1-j)];
        }
      }

      if (nbits == 16) fwrite(DATA1,sizeof(short int),2*nch*nsampuse,output);
      else fwrite(DATA3,sizeof(unsigned char),2*nch*nsampuse,output);
      printf("STEP:%d out of %d steps writing %lld time samples\n",i+1,nstep,(i+1)*nsampuse);
      //      fprintf(flog,"STEP:%d out of %d steps writing %lld time samples\n",i+1,nstep,(i+1)*nsampuse);
    }
    //    fprintf(flog,"Finished\n\n");

    fclose(output);
    fclose(finfileusb);
    //    fclose(flog);
}
Exemple #5
0
main (int argc, char *argv[]) 
{
  float clip_level, *blk, sum, mean, blksum, blksum2, blkmean, blkmean2;
  unsigned char *cblk;
  unsigned short *sblk;
  float blksigma, dmean, dsigma;
  int blksize, nread, nsblk, i, headersize, c, s, offset, obits;
  long int isamp=0, seed=0, nclip=0;

  if (argc<2 || help_required(argv[1])) {
    //blanker_help();
    exit(0);
  }
  print_version(argv[0],argv[1]);
  if (!file_exists(argv[1]))
    error_message("input file does not exist!");

  strcpy(inpfile,argv[1]);
  input=open_file(inpfile,"r");
  strcpy(outfile,"stdout");
  output=stdout;
  nsblk=1024;
  clip_level=6.0;
  obits=32;

  i=2;
  while (i<argc) {
    if (strings_equal(argv[i],"-c"))       clip_level=atof(argv[++i]);
    if (strings_equal(argv[i],"-s"))       nsblk=atof(argv[++i]);
    if (strings_equal(argv[i],"-b"))       obits=atoi(argv[++i]);
    i++;
  }

  if ((headersize=read_header(input))) {

    if (nifs>1) error_message("blanker can only handle nifs=1");

    send_string("HEADER_START");
    if (!strings_equal(source_name,"")) {
      send_string("source_name");
      send_string(source_name);
    }
    send_int("telescope_id",telescope_id); 
    send_int("machine_id",machine_id);
    send_coords(src_raj,src_dej,az_start,za_start);
    send_int("data_type",data_type);
    send_double("fch1",fch1);
    send_double("foff",foff);
    send_int("barycentric",barycentric);
    send_int("nchans",nchans);
    send_int("nbits",obits);  
    send_double ("tstart",tstart); 
    send_double("tsamp",tsamp);
    send_int("nifs",nifs);
    send_string("HEADER_END");

    
    blksize=nchans*nsblk;
    blk = (float *) malloc(blksize*sizeof(float));
    cblk = (unsigned char *) malloc(blksize*sizeof(unsigned char));
    sblk = (unsigned short *) malloc(blksize*sizeof(unsigned short));
    
    while (nread=read_block(input,nbits,blk,blksize)) {

      /* calculate mean and sigma of the whole block */
      blksum=blksum2=0.0;
      for (i=0; i<nread; i++) {
	blksum+=blk[i];
	blksum2+=blk[i]*blk[i];
      }
      blkmean=blksum/(float)nread;
      blkmean2=blksum2/(float)nread;
      blksigma=sqrt(blkmean2-blkmean*blkmean);
      /* expected mean and sigma of a dedispersed sample in this block */
      dmean=blkmean*(float)nchans;
      dsigma=blksigma*sqrt((float)nchans);

      /* now work through each sample in the block */
      nsblk=nread/nchans;
      offset=0;
      for (s=0; s<nsblk; s++) {
	isamp++;
	sum=0.0;
	for (c=0; c<nchans; c++) sum+=blk[offset+c];
	if (abs(sum-dmean)>clip_level*dsigma) {
	  nclip++;
	  for (c=0; c<nchans; c++) 
	    blk[offset+c]=gasdev(&seed)*blksigma+blkmean;
	}
	offset+=nchans;
      }

      /* write out the clipped data (32 bit!) */
      if (obits == 32) 
	fwrite(blk,sizeof(float),nread,output);
      } else if (obits == 8) {
	for (i=0;i<nread;i++) cblk[i]=blk[i];
	fwrite(cblk,sizeof(unsigned char),nread,output);
      } else if (obits == 16) {
	for (i=0;i<nread;i++) sblk[i]=blk[i];
	fwrite(sblk,sizeof(unsigned short),nread,output);
      } else {
	error_message("only 8, 16 or 32 bit output modes supported");
      }
    }
Exemple #6
0
void Octtree::find_cell_ranks( const boost::multi_array<Real,2>& coordinates, std::vector<Uint>& ranks )
{
  ranks.resize(coordinates.size());

  Handle< Elements > element_component;
  Uint element_idx;
  std::deque<Uint> missing_cells;

  RealVector dummy(m_dim);

  for(Uint i=0; i<coordinates.size(); ++i)
  {
    for (Uint d=0; d<m_dim; ++d)
      dummy[d] = coordinates[i][d];
    if( find_element(dummy,element_component,element_idx) )
    {
      ranks[i] = Comm::instance().rank();
    }
    else
    {
      ranks[i] = math::Consts::uint_max();
      missing_cells.push_back(i);
    }
  }

  std::vector<Real> send_coords(m_dim*missing_cells.size());
  std::vector<Real> recv_coords;

  Uint c(0);
  boost_foreach(const Uint i, missing_cells)
  {
    for(Uint d=0; d<m_dim; ++d)
      send_coords[c++]=coordinates[i][d];
  }

  for (Uint root=0; root<PE::Comm::instance().size(); ++root)
  {

    recv_coords.resize(0);
    PE::Comm::instance().broadcast(send_coords,recv_coords,root,m_dim);

    // size is only because it doesn't get resized for this rank
    std::vector<Uint> send_found(missing_cells.size(),math::Consts::uint_max());

    if (root!=Comm::instance().rank())
    {
      std::vector<RealVector> recv_coordinates(recv_coords.size()/m_dim) ;
      boost_foreach(RealVector& realvec, recv_coordinates)
          realvec.resize(m_dim);

      c=0;
      for (Uint i=0; i<recv_coordinates.size(); ++i)
      {
        for(Uint d=0; d<m_dim; ++d)
          recv_coordinates[i][d]=recv_coords[c++];
      }

      send_found.resize(recv_coordinates.size());
      for (Uint i=0; i<recv_coordinates.size(); ++i)
      {
        if( find_element(recv_coordinates[i],element_component,element_idx) )
        {
          send_found[i] = Comm::instance().rank();
        }
        else
          send_found[i] = math::Consts::uint_max();
      }
    }

    std::vector<Uint> recv_found(missing_cells.size()*Comm::instance().size());
    PE::Comm::instance().gather(send_found,recv_found,root);

    if( root==Comm::instance().rank())
    {
      const Uint stride = missing_cells.size();
      for (Uint i=0; i<missing_cells.size(); ++i)
      {
        for(Uint p=0; p<Comm::instance().size(); ++p)
        {
          ranks[missing_cells[i]] = std::min(recv_found[i+p*stride] , ranks[missing_cells[i]]);
        }
      }
    }
  }
}