Example #1
0
/*
 *	Compute and save dark calibration
 */
void saveDarkcal(cGlobal *global, int detIndex) {
	
	// Dereference common variables
	cPixelDetectorCommon     *detector = &(global->detector[detIndex]);
	long	pix_nn = detector->pix_nn;
	char	filename[1024];
	
	//printf("Processing darkcal\n");
	//sprintf(filename,"r%04u-%s-%li-darkcal.h5",global->runNumber,detector->detectorName,detector->detectorID);
	//sprintf(filename,"r%04u-%s-detectorID%li-darkcal.h5",global->runNumber,detector->detectorName,detector->detectorID);
	//sprintf(filename,"%s-r%04u-%s-detector%li-darkcal.h5",global->experimentID, global->runNumber,detector->detectorName,detector->detectorID);
    sprintf(filename,"%s-r%04u-detector%li-darkcal.h5",global->experimentID, global->runNumber,detector->detectorID);

	float *buffer = (float*) calloc(pix_nn, sizeof(float));
	pthread_mutex_lock(&detector->powderData_mutex[0]);
	for(long i=0; i<pix_nn; i++)
		buffer[i] = detector->powderData_raw[0][i]/detector->nPowderFrames[0];
	pthread_mutex_unlock(&detector->powderData_mutex[0]);
    //printf("Saving darkcal to file: %s\n", filename);
    printf("%s\n", filename);
#ifdef H5F_ACC_SWMR_WRITE
	pthread_mutex_lock(&global->swmr_mutex);
#endif
	writeSimpleHDF5(filename, buffer, detector->pix_nx, detector->pix_ny, H5T_NATIVE_FLOAT,detector->detectorName,detector->detectorID);	
#ifdef H5F_ACC_SWMR_WRITE  
	pthread_mutex_unlock(&global->swmr_mutex);
#endif
	free(buffer);
}
Example #2
0
void saveIntegratedRunSpectrum(cGlobal *global) {
    
    // Simply return if spectrum is not asked for
    if(global->espectrum == 0)
        return;

    
	int     spectrumpix = global->espectrumWidth*global->espectrumLength;
	double  *espectrumDark = (double*) calloc(spectrumpix, sizeof(double));
	double  *espectrumScale = (double*) calloc(global->espectrumLength, sizeof(double));
	char	filename[1024];
	int     maxindex = 0;
	int     evspread = global->espectrumSpreadeV;
	double  pixincrement = (double) evspread/global->espectrumLength;
	double  beamAveV = global->meanPhotonEnergyeV;
	double  eVoffset;

	// compute spectrum camera darkcal and save to HDF5
	if(global->generateDarkcal){
		pthread_mutex_lock(&global->espectrumRun_mutex);
		pthread_mutex_lock(&global->nespechits_mutex);
		for(int i=0; i<spectrumpix; i++) {
			espectrumDark[i] = global->espectrumBuffer[i]/global->nespechits;
		}

		sprintf(filename,"r%04u-energySpectrum-darkcal.h5", global->runNumber);
		printf("Saving energy spectrum darkcal to file: %s\n", filename);
        
		writeSimpleHDF5(filename, espectrumDark, global->espectrumWidth, global->espectrumLength, H5T_NATIVE_DOUBLE);

		pthread_mutex_unlock(&global->espectrumRun_mutex);
		pthread_mutex_unlock(&global->nespechits_mutex);
		free(espectrumDark);
		return;
	}

	// find maximum of run integrated spectum array and save both to HDF5
	pthread_mutex_lock(&global->espectrumRun_mutex);
	pthread_mutex_lock(&global->nespechits_mutex);

	for (int i=0; i<global->espectrumLength; i++) {
		if (global->espectrumRun[i] > global->espectrumRun[maxindex]) {
			maxindex = i;
		}
	}
	eVoffset = beamAveV - maxindex*pixincrement;
	for (int i=0; i<global->espectrumLength; i++) {
		espectrumScale[i]=i*pixincrement + eVoffset;
	}

	sprintf(filename,"r%04u-integratedEnergySpectrum.h5", global->runNumber);
	printf("Saving run-integrated energy spectrum: %s\n", filename);

	writeSpectrumInfoHDF5(filename, espectrumScale, global->espectrumRun, global->espectrumLength, H5T_NATIVE_DOUBLE, &maxindex, 1, H5T_NATIVE_INT);

	pthread_mutex_unlock(&global->espectrumRun_mutex);
	pthread_mutex_unlock(&global->nespechits_mutex);
	return;
}
Example #3
0
/*
 *	Compute and save gain calibration
 */
void saveGaincal(cGlobal *global, int detIndex) {
	
	//printf("Processing gaincal\n");

	// Dereference common variables
	cPixelDetectorCommon     *detector = &(global->detector[detIndex]);
	long	pix_nn = detector->pix_nn;
	
	// Grab a snapshot of the current running sum
	pthread_mutex_lock(&detector->powderData_mutex[0]);
	float *buffer = (float*) calloc(pix_nn, sizeof(float));
	for(long i=0; i<pix_nn; i++)
		buffer[i] = detector->powderData_raw[0][i];
    for(long i=0; i<pix_nn; i++)
		buffer[i] /= detector->nPowderFrames[0];
	pthread_mutex_unlock(&detector->powderData_mutex[0]);

    
    
	// Find median value (this value will become gain=1)
	float	dc;
	float *buffer2 = (float*) calloc(pix_nn, sizeof(float));
	for(long i=0; i<pix_nn; i++) {
		buffer2[i] = buffer[i];
	}
	dc = kth_smallest(buffer2, pix_nn, lrint(0.5*pix_nn));
	printf("offset=%f\n",dc);
	free(buffer2);
    
    // Trap a potential error condition
	if(dc <= 0){
		printf("Error calculating gain, offset = %f\n",dc);
		return;
	}
    
    // Calculate gain
	// gain=1 for a median value pixel
    // Possibly bound gain between 0.1 and 10
	for(long i=0; i<pix_nn; i++) {
		buffer[i] /= (float) dc;
		//if(buffer[i] < 0.1 || buffer[i] > 10)
		//	buffer[i]=0;
	}

	char	filename[1024];
	sprintf(filename,"r%04u-%s-gaincal.h5",global->runNumber, detector->detectorName);
    //printf("Saving gaincal to file: %s\n", filename);
    printf("%s\n", filename);
#ifdef H5F_ACC_SWMR_WRITE
	pthread_mutex_lock(&global->swmr_mutex);
#endif
	writeSimpleHDF5(filename, buffer, detector->pix_nx, detector->pix_ny, H5T_NATIVE_FLOAT);
#ifdef H5F_ACC_SWMR_WRITE  
	pthread_mutex_unlock(&global->swmr_mutex);
#endif
	free(buffer);
}
Example #4
0
/*
 *  Save FEE spectral stacks
 */
void saveFEEspectrumStack(cGlobal *global, int powderClass) {
	
    if(!global->useFEEspectrum)
        return;
	
	char	filename[1024];
    float   *stack = global->FEEspectrumStack[powderClass];
    long	speclength = global->FEEspectrumWidth;
    long    stackCounter = global->FEEspectrumStackCounter[powderClass];
    long    stackSize = global->FEEspectrumStackSize;
    pthread_mutex_t mutex = global->FEEspectrumStack_mutex[powderClass];
	
	if(global->FEEspectrumStackCounter[powderClass]==0)
		return;
	
    // Lock
	pthread_mutex_lock(&mutex);
	
	
	// We re-use stacks, what is this number?
	long	stackNum = stackCounter / stackSize;
 	if(stackNum == 0) stackNum = 1;
	
	// If stack is not full, how many rows are full?
    long    nRows = stackSize;
    if(stackCounter % stackSize != 0)
        nRows = (stackCounter % stackSize);
	
    sprintf(filename,"r%04u-FEEspectrum-class%i-stack%li.h5", global->runNumber, powderClass, stackNum);
    printf("Saving FEE spectral stack: %s\n", filename);
    writeSimpleHDF5(filename, stack, speclength, nRows, H5T_NATIVE_FLOAT);
	
	
	// Flush stack index buffer
	if(global->FEElogfp[powderClass] != NULL)
		fflush(global->FEElogfp[powderClass]);
	
	pthread_mutex_unlock(&mutex);
	
}