/* * 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); }
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; }
/* * 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); }
/* * 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); }