#include #include #include //for 64bit compiler: #include #include char outdata[70],outloga[70]; //int *outenergy=NULL; int outsize=1; //char *outcount=NULL; //char *outdetnum=NULL; char *outcount=new char[1]; char *outdetnum=new char[1]; //outenergy=new int[1]; int *outenergy=new int[1]; //outcount[0]=1; int correctflag = 0,gateflag = 0,CntAll = 0,CntGate = 0; long maxtime=100; //max number of 10 ns tics for an event long maxeventime=0,mineventime=400000000,CntEvts[64]; int multiplicity[10],startdet=15,PileUp[64]; int evN=0; int evStart = 0; int evEnd = 1; unsigned int *bufsam=NULL; long *bufsiz=NULL; long negativedelevtimecount=0,timezero=-30000; int size1,size2,bsize,bsam=2,bread=1,chan,slot,chann,outevtcount=0; int pu,energy,evtimehi,pileupcount=0,zerocount=0; unsigned short cfd,cfdold; int detectorcount=0,mul=0; short detenergy[256],detid[256]; unsigned long maskpu = 2147483648,evtimelo; long long deltime=0LL,timeinevent=0LL; unsigned long long evtime,multiplier=4294967296LL,oldtime=0LL; long long zero=0LL; int channel[65][100],timelo[65],timehi[65]; float correctable[65][100]; float fracx,correct,top,bottom,tdc,percent,averagetime=0; int ipnt,iadc,itdc; int pntcnt[65]; void InitializeVariables(char **args); void WriteOutEvent(char **args,FILE *outdat); void BuildEvent(); int main(int argn,char **argv) { if ((argn<3) || (argn>8)) { std::cerr<<"Usage:\n "<6) { evStart=atoi(argv[6]); maxtime=atoi(argv[4]); startdet=atoi(argv[5]); correctflag = 1; if (evStart == 0) evEnd = 1; else { std::cerr<<"You must specify an end event number if the start event number is not 0. Your start event number is "< int for 64 bit fread(bufsiz,sizeof(int),bread,infile); //std::cout<=evStart) { if (bufsam[0] == 30) { chan = (bufsam[2]) & (15); slot = ((bufsam[2]) & (240))/16; chann = (slot - 2)*16 + chan + 1; pu = ((bufsam[2]) & (maskpu))/maskpu; energy = ((bufsam[5]) & 65535); evtimehi = ((bufsam[4]) & 65535); evtimelo = bufsam[3]; evtime = evtimelo + multiplier*evtimehi; cfd = bufsam[4]/65536; deltime = evtime - oldtime; if(deltime < zero) negativedelevtimecount++; if (energy==0) zerocount++; if(pu>0)pileupcount++; if ((pu > 0)&&(chann>0)&&(chann<65)) PileUp[chann-1]++; // ignore pileups timeinevent=timeinevent+deltime; oldtime = evtime; if(timeinevent > maxtime) { //This detector starts another event. First write out the previous event. WriteOutEvent(argv,outdat); // Now store this signal which starts a new event timeinevent = 1; timezero = -30000; detectorcount = 0; mul = 0; averagetime = 0; BuildEvent(); }else { //This is just another detector in the current event //Now we have to put the event just read into the buffer BuildEvent(); } //end if(timeinevent } //end if bufsam[0]=30 } //end if evN >= evStart } //end while evN < evEnd delete [] bufsiz; delete [] bufsam; if(feof(infile) && evN 0) std::cout<<"PU("<0) fprintf(outlog,"Corrected time walk using file %s \n\n",argv[3]); if (strcmp(argv[2],"NULL") != 0) fprintf(outlog,"wrote %i events to %s using xia2ev2_part with particle detector number %i\n\n",outevtcount,outdata,startdet); fprintf(outlog,"negativedelevtimecount = %i, pileupcount = %i zerocount = %i\n",negativedelevtimecount,pileupcount,zerocount); fprintf(outlog,"max time (10 ns) in event = %i min time betweeen events = %i\n\n",mineventime,maxtime); for(int is=0;is<10;is=is+2) fprintf(outlog,"multiplicity %i: counts = %i; multiplicity %i: counts = %i\n",is+1,multiplicity[is],is+2,multiplicity[is+1]); fprintf(outlog,"\n"); for(int is=0; is<64;is++) { if (CntEvts[is] > 0) fprintf(outlog,"ADC(%i): Counts = %i Pileups = %i\n",is+1,CntEvts[is],PileUp[is]); } percent = 0.; if (CntAll > 0) percent = 100. * float(CntGate)/ float(CntAll); fprintf(outlog,"Total coincidence events = %i Number in time gates = %i\n Percent in time gate = %5.2f\n",CntAll,CntGate,percent); if (strcmp(argv[2],"NULL") != 0) fclose(outdat); return 0; } void InitializeVariables(char **args) { //initialize correctable for (ipnt = 0; ipnt<65; ipnt++) pntcnt[ipnt]=0; for (int adc=0; adc<65; adc++){ timelo[adc] = 0; timehi[adc]=32767; for (ipnt=0; ipnt<100; ipnt++) { correctable[adc][ipnt] = -1.; channel[adc][ipnt]=-1; } } for (int is=0; is<10; is++) multiplicity[is]=0; for (int is=0; is<64;is++) PileUp[is]=0; for (int is=0; is<64; is++) CntEvts[is]=0; if (correctflag > 0) { // Read in correction table std::cerr<<"correction table file = "<> iadc; *in >> offset; *in >> timelo[iadc]; *in >> timehi[iadc]; while (iadc >= 0) { if (startdet == -2) std::cout<<"iadc ="<> channel[iadc][ipnt]; // std::cout<> iadc; *in >> offset; *in >> timelo[iadc]; *in >> timehi[iadc]; } //end if (iadc ipnt=0; } //end while (iadc if (startdet == -2) return; } //end if (correctflag > 0 } //end void InitializaVariables void WriteOutEvent(char **args,FILE *outdat) { if(timeinevent < mineventime) mineventime = timeinevent; if (mul>8) mul=9; multiplicity[mul]++; if (strcmp(args[2],"NULL") != 0) { detectorcount = detectorcount & 255; // timezero will be > 0 if startdet fired in this event // if(detectorcount > 0 && timezero > -30000) { if(detectorcount > 0 && timezero == -30000) { CntAll ++; // printf("\n[%i] ",detectorcount); for (int icnt=1; icnt 0) { //Is there a correct table for this ADC? ipnt=0; // Linear interpolation between points in correct.tab while (ipnt < pntcnt[iadc] && (detenergy[icnt-1] >= channel[iadc][ipnt])) ipnt++; top = correctable[iadc][ipnt] - correctable[iadc][ipnt-1]; bottom = channel[iadc][ipnt] - channel[iadc][ipnt-1]; fracx = top/bottom; correct = correctable[iadc][ipnt-1] + fracx*(detenergy[icnt] - channel[iadc][ipnt-1]); tdc = detenergy[icnt]; if (detid[icnt-1] != startdet) tdc = 200 - correct + tdc; if (detid[icnt-1] == startdet) tdc = correct + tdc; if (tdc <1) tdc=1; if (tdc > 32767) tdc=32767; detenergy[icnt] = tdc + 0.5; averagetime += tdc; if (detid[icnt-1] == startdet) timezero = (long) (tdc+0.5); } //end if (pntcnt else if (timezero == -30000) { detenergy[icnt] = detenergy[icnt] + 99; averagetime += detenergy[icnt]; } } //end for (int icnt= // Adjust for timezero averagetime = 2*averagetime/detectorcount; for (int icnt=1; icnt timehi[iadc])) gateflag = 1; } // write out event if in gate if (gateflag == 0) { CntGate ++; outevtcount++; outcount[0] = detectorcount; fwrite(outcount,sizeof(char),outsize,outdat); for (int icnt=0; icnt 0 && timezero > -30000) } //endif strcmp // timeinevent = 0; // timezero=-30000; } //end void WriteOutEvent( void BuildEvent() { if(timeinevent > maxeventime) maxeventime = timeinevent; mul++; //first put energy in list //suppress zero energies and those over range to not confuse gnuscope if(energy>10 && energy < 32000) { detid[detectorcount]=chann; detenergy[detectorcount]=energy; detectorcount++; if (chann == startdet) timezero = timeinevent + 99; //now put timeinevent in list as chann + 64 detid[detectorcount]=chann+64; detenergy[detectorcount]=timeinevent; detectorcount++; } // end if (energy>10 .. } // end BuildEvent