// HiLumUtils // 08 November 2009 // 08 Nov 2009 Augmented for Nov 2009 run // 23 Apr 2010 Add Cenerkov event finder and reader // and update to newer header format on Cerenkov files // 27 Mar 2013 Update unix time stamp // 19 Apr 2013 Accommodate various bunch structures // // Utility routines to be used by HiLum analysis programs // // *************************************************** // Convert unix time stamp into Yr/Mo/Day/Hr/Min/Sec integers // for a clock in Protvino on Standard Time, not Daylight Savings Time void TimeStamp(int TS, unsigned int* pntr) { int dyr=0; // days in the year int Mth[]={31,28,31,30,31,30,31,31,30,31,30,31}; int UTSref=1199134800; // 2008/01/01 00:00:00 in Protvino int df=TS-UTSref; // seconds since UTSref time int dy=df/24/3600; // days since UTSref time int Year=2008; int Month=1; int leap; while(1) { leap=((Year%4==0)&&(Year%100!=0))?1:0; dyr=365+leap; if(dynSp) { cout <<"No Cerenkov file for this spill"<GetDate(kTRUE,0,&YMDHMS[0],&YMDHMS[1],&YMDHMS[2]); tm->GetTime(kTRUE,0,&YMDHMS[3],&YMDHMS[4],&YMDHMS[5]); printf("%4d.%02d.%02d %02d:%02d:%02d\n", YMDHMS[0],YMDHMS[1],YMDHMS[2],YMDHMS[3],YMDHMS[4],YMDHMS[5]); //****************** End test Bite1=inC.get(); Bite2=inC.get(); adcbuf_type=256*Bite2+Bite1; Bite1=inC.get(); Bite2=inC.get(); word1=256*Bite2+Bite1; Bite1=inC.get(); Bite2=inC.get(); word2=256*Bite2+Bite1; nw16=65536*word2+word1; // adcbuf_length nTurns=nw16/nBnTrn; // Number of complete turns cout <<"Getting Cerenkov Data, nw16 = "<0) { Cbuf[i]=4095; // ************************************* nCovf++; } //if(ii<32) printf("ii Cbuf[ii]: %8d %4d\n",ii,Cbuf[ii]); if(((i==0)&&(Cflg[0]==1))||((i>0)&&(Cflg[i]==1)&&(Cflg[i-1]==0))) { EvtPnt[k]=i; // Mark event iii[k]=i; // Mark line number // Go backwards to bunches corresponding to MPI samples if(EvtPnt[k]>Offset) {EvtPnt[k]-=Offset;} k++; } } printf("End of %s with %8d ADC overflows out of %10d bunches\n",pfn[SpillNo-1],nCovf,nw16); inC.close(); kevents=k; AvePed=0.; AvePedBeg=0.; AvePedEnd=0.; AvePedSqr=0; nPed=0; nPedBeg=0; nPedEnd=0; // First way to get pedestals int pedevent=kevents-1; if(kevents>6) pedevent=6; jend=EvtPnt[pedevent]; jbeg=jend-240000; if(jbeg<0) jbeg=0; // 4 events (40 ms) wide region for(int j=jbeg;jHiMax) {HiMax=HiBin[j]; ModMxB=j;}} for(int j=0;j0.25*HiMax) {ModFlg[j]=2;}} int jl,jj,jh; for(int j=nBnTrn;j<2*nBnTrn;j++) { jl=(j-1)%nBnTrn; jj=j%nBnTrn; jh=(j+1)%nBnTrn; if(ModFlg[jl]==0&&ModFlg[jj]==2&&ModFlg[jh]==0) ModFlg[jj]=1; } nModFlg=0; mModFlg=0; for(int j=0;j0) { jModFlg[mModFlg]=j; mModFlg++; } } printf("\n Isolated filled bunches\n nModFlg=%2d\n i iModFlg\n",nModFlg); for(int j=0;jEvtPnt[k]) ? kMax-1: kMax+2; PedC[k]=Cbuf[PdPntr[k]]; PdPntr[k]=0; PedC[k]=0; // Point to first isolated filled bunch in turn after event flag // and then take the empty bunch just before it as candidate for pedestal if(nModFlg>0) { PdPntr[k]=TnPntr[k]+iModFlg[0]-1; PedC[k]=Cbuf[PdPntr[k]]; } // Calculate pedestal values // Second way to get pedestals AvePed+=double(PedC[k]); nPed++; } printf("\nAvePedBeg integration region, jbeg, jend %8d %8d %8d\n\n",jbeg,jend,nPedBeg); // Third way to get pedestals jbeg=EvtPnt[kevents-2]; jend=jbeg+500; for(int j=jbeg;j=nBnTrn) { for(int j=jbeg;j<=jend;j++) { nsum[k]++; CHist1[k]+=double(Cbuf[j])-AvePedBeg; } } } for(int ki=0;ki0) ? k-1:k; Ediff=EvtPnt[k]-EvtPnt[kk]; if(nsum[k]>0) { CHist1[k]/=double(nsum[k]*mModFlg)/double(nBnTrn); } printf(" %3d %8d %6d %7d %7d %6d %6d %6d %8.0f\n", k,EvtPnt[k],Ediff,JBeg[k],JEnd[k],Cbuf[TnPntr[k]+iModFlg[0]],PedC[k],nsum[k],CHist1[k]); } return; } // *************************************************** int GetCData(int burst, int EvtNo) { int EP; EP=-1; if((burst>0)&&(burst<=nSp)) {EP=EvtPnt[EvtNo];} return EP; } // ***************************************************