00001
00002
00003 #include <assert.h>
00004 #include <stdlib.h>
00005
00006 #include <TClonesArray.h>
00007 #include <TObjArray.h>
00008 #include <TH1.h>
00009 #include <TH2.h>
00010
00011 #include "BbcVertex.h"
00012 #include "BbcHex.h"
00013 #include "TMath.h"
00014 ClassImp(BbcVertex)
00015
00016
00017
00018 BbcVertex::BbcVertex(){
00019
00020 nInpEve=0;
00021 HList=0;
00022 memset(hA,0, sizeof(hA));
00023 unixTime0=0;
00024 cm2tdcCh=-999;
00025
00026 int iew,ih;
00027 char cEW[mxEW]={'E','W'};
00028 for(iew=0;iew<mxEW;iew++) {
00029 for(ih=0;ih<mxHex;ih++) {
00030 char name[100];
00031 sprintf(name,"bbc%c%02d",cEW[iew],ih+1);
00032 BbcHex *x=new BbcHex(ih,name);
00033 x->setCalib(0,0,0,0);
00034 x->clear();
00035 hex[iew][ih]=x;
00036 }
00037 }
00038
00039 }
00040
00041
00042
00043 BbcVertex::~BbcVertex() {}
00044
00045
00046
00047
00048 void BbcVertex::clear(){
00049 unixTime=0;
00050 int iew,ih;
00051 for(iew=0;iew<mxEW;iew++)
00052 for(ih=0;ih<mxHex;ih++)
00053 hex[iew][ih]->clear();
00054
00055 onlTdiff=-999;
00056 onlTdiff=-997;
00057 zTpc=-998;
00058 }
00059
00060
00061
00062
00063 void BbcVertex::initRun(int runID){
00064 printf(" BbcVertex::initRun(%d), cm2tdcCh=%f\n",runID, cm2tdcCh);
00065 assert(TMath::Abs(cm2tdcCh)<20);
00066
00067 }
00068
00069
00070
00071 void BbcVertex::init(){
00072 int i;
00073 hA[0]=new TH1F ("onlvd","zTpc - Z(BBC) ; (cm)",50,-100,100);
00074 hA[1]=(TH1F*)new TH2F ("onlvv","BBC zTPC vs. onlTdiff; (TDC ch); Z vert (cm)",50,150,350,50,-200,200);
00075 hA[2]=(TH1F*)new TH2F ("onlvd2","BBC (onlZbbc-zTPC)/cm2ch vs. onlTdiff; (TDC ch); #D Z vert (TDC ch)",50,150,350,50,-20,20);
00076
00077 for(i=0;i<3;i++) hA[i]->SetLineColor(kGreen);
00078
00079
00080 hA[7]=(TH1F*)new TH2F ("vd2","BBC (oflZbbc-zTPC)/cm2ch vs. oflTdiff+256; (TDC ch); #D Z vert (TDC ch)",50,150,350,50,-20,20);
00081
00082 hA[8]=(TH1F*)new TH2F ("vk","BBC iW vs. iE",16,.5,16.5,16,0.5,16.5);
00083 hA[9]=(TH1F*)new TH2F ("va","BBC adcW vs. adcE",156,-0.5,155.5,156,-0.5,155.5);
00084 hA[10]=(TH1F*)new TH2F ("vt","BBC tdcW vs. tdcE",128,-0.5,255.5,128,-0.5,255.5);
00085 hA[11]=(TH1F*)new TH2F ("vv","BBC zTPC vs. oflTdiff+256; (TDC ch); Z vert (cm)",50,150,350,50,-200,200);
00086
00087 hA[12]=new TH1F ("vd","zTpc - Z(BBC) ; (cm)",50,-100,100);
00088 hA[13]=(TH1F*)new TH2F ("vE","BBC zTpc - Z(BBC) vs. adcE ; ADC; (cm)",120,0.5,120.5,50,-100,100);
00089 hA[14]=(TH1F*)new TH2F ("vW","BBC zTpc - Z(BBC) vs. adcW ; ADC; (cm)",120,0.5,120.5,50,-100,100);
00090
00091 hA[15]=(TH1F*)new TH2F ("vU","TPC vertex Z vs run time ; minutes; cm ",120,0,60, 50,-200,200);
00092 hA[16]=(TH1F*)new TH2F ("vD","Ztpc - Zbbc vs run time ; minutes; cm ",120,0,60, 50,-200,200);
00093
00094 hA[17]=new TH1F ("ts","sum of T_E + T_W ; raw chan",100,0,300);
00095
00096
00097 if(HList) {
00098 for(i=0;i<=17;i++) {
00099 if(hA[i]==0) continue;
00100 HList->Add(hA[i]);
00101 }
00102 }
00103
00104 char cEW[mxEW]={'E','W'};
00105 int iew,ih;
00106 for(iew=0;iew<mxEW;iew++) {
00107 for(ih=0;ih<mxHex;ih++) {
00108 char tt1[100],tt2[100];
00109 sprintf(tt1,"w%c%02d",cEW[iew],ih+1);
00110 sprintf(tt2,"%s , dZ vs. ADC ; ADC(chan) ;#Delta Z (cm)",tt1);
00111 TH2F *h=new TH2F (tt1,tt2,60,0.5,120.5,25,-100,100);
00112 hC[iew][ih]=h;
00113 HList->Add(h);
00114 }
00115 }
00116
00117 clear();
00118 }
00119
00120
00121 void BbcVertex::finish(){
00122
00123 printf("\n BbcVertex::finish() nInpEve=%d\n",nInpEve);
00124
00125
00126 }
00127
00128
00129
00130 int BbcVertex:: findTime(BbcHex **D){
00131 int i;
00132 float tMax=0;
00133 int iT=-1;
00134 for(i=0;i<mxHex;i++) {
00135
00136 if(D[i]->adc<5) continue;
00137 if(D[i]->tdc>245) continue;
00138 if(D[i]->tof<tMax) continue;
00139 tMax=D[i]->tof;
00140 iT=i;
00141 }
00142
00143 assert(iT>=0);
00144 return iT;
00145 }
00146
00147
00148
00149
00150 void BbcVertex:: export2NN(BbcHex **D){
00151 int key[mxHex];
00152 memset(key,0,sizeof(key));
00153 int k=0, nk=3;
00154
00155 for(k=0;k<nk;k++) {
00156 int i;
00157 float tMax=0;
00158 int iT=-1;
00159 for(i=0;i<mxHex;i++) {
00160
00161 if(key[i]) continue;
00162 if(D[i]->adc<5) continue;
00163 if(D[i]->tdc>245) continue;
00164 if(D[i]->tof<tMax) continue;
00165 tMax=D[i]->tof;
00166 iT=i;
00167 }
00168 if(iT>=0) {
00169 key[iT]=100+k;
00170 printf("%d %d %d ",iT,D[iT]->adc,D[iT]->tdc);
00171 } else {
00172 printf("-1 0 0 ");
00173 }
00174
00175 }
00176
00177 }
00178
00179
00180
00181
00182 void BbcVertex::print(){
00183 printf("\n BbcVertex::print()\n dump:\n");
00184 }
00185
00186
00187
00188 void BbcVertex:: doVertex(){
00189 if(zTpc>200) return;
00190
00191
00192 float onlZ=-(onlTdiff-256)*cm2tdcCh;
00193 float onlDz=onlZ-zTpc;
00194 float onlTcorr=onlDz/cm2tdcCh;
00195
00196
00197 hA[0]->Fill(onlDz);
00198 ( (TH2F*) hA[1])->Fill(onlTdiff,zTpc);
00199 ( (TH2F*) hA[2])->Fill(onlTdiff,onlTcorr);
00200
00201
00202
00203 printf("## ");
00204 export2NN(hex[0]);
00205 export2NN(hex[1]);
00206 printf(" %f\n",zTpc);
00207 return;
00208
00209 int iE=findTime(hex[0]);
00210 int iW=findTime(hex[1]);
00211 int kE=iE+1;
00212 int kW=iW+1;
00213
00214 float tE=hex[0][iE]->tof;
00215 float tW=hex[1][iW]->tof;
00216 float aE=hex[0][iE]->adc;
00217 float aW=hex[1][iW]->adc;
00218 float oflTdiff=256.+(tE-tW);
00219
00220 float oflZ=-(oflTdiff-256)*cm2tdcCh;
00221 float oflDz=oflZ-zTpc;
00222 float oflTcorr=oflDz/cm2tdcCh;
00223
00224
00225
00226 #if 0
00227 float diff=onlTdiff -oflTdiff;
00228 if(TMath::Abs(diff)>0.01)
00229 printf("DIFIDIF: Z=%f onlTd=%f oflTd=%f difT=%f\n",zTpc,onlTdiff,oflTdiff,diff);
00230 #endif
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240 ( (TH2F*) hA[8])->Fill(kE,kW);
00241 ( (TH2F*) hA[9])->Fill(aE,aW);
00242 ( (TH2F*) hA[10])->Fill(tE,tW);
00243 ( (TH2F*) hA[11])->Fill(oflTdiff,zTpc);
00244 ( (TH2F*) hA[7])->Fill(oflTdiff,oflTcorr);
00245 hA[12]->Fill(oflDz);
00246
00247 float time1= unixTime-unixTime0;
00248 time1/=60;
00249 ( (TH2F*) hA[15])->Fill(time1,zTpc);
00250 ( (TH2F*) hA[16])->Fill(time1,oflDz);
00251 hA[17]->Fill(tE+tW);
00252
00253 calibWalk(hex[1][iW],hex[0][iE],oflDz,hC[0]);
00254 calibWalk(hex[0][iE],hex[1][iW],oflDz,hC[1]);
00255
00256
00257 ( (TH2F*) hA[13])->Fill(aE,oflDz);
00258 ( (TH2F*) hA[14])->Fill(aW,oflDz);
00259
00260
00261 if(0) {
00262 int iew,ih;
00263 int adcMin=5;
00264 int nT[mxEW];
00265 for(iew=0;iew<mxEW;iew++){
00266 nT[iew]=0;
00267 for(ih=0;ih<mxHex;ih++) {
00268 if( hex[iew][ih]->adc<adcMin) continue;
00269 nT[iew]++;
00270 hex[iew][ih]->print();
00271 }
00272 }
00273 printf("nT-E=%d nT-W=%d\n\n",nT[0],nT[1]);
00274
00275 }
00276
00277 }
00278
00279
00280
00281
00282 void BbcVertex::calibWalk( BbcHex *x, BbcHex *y, float dz, TH2F **h){
00283
00284
00285
00286
00287
00288 assert(y->id>=0 && y->id<mxHex);
00289 h[y->id]->Fill(y->adc,dz);
00290 }
00291
00292
00293
00294
00295 void BbcVertex::readCalib(char *fname) {
00296 printf("readCalib('%s')\n",fname);
00297 FILE *fd=fopen(fname,"r");
00298
00299 if(fd==0) {
00300 printf("file %s was not open\n",fname);
00301 printf(" fix it, (JB)\n\n");
00302 assert(1==0);
00303 }
00304
00305 int nd=0,nl=0;;
00306 while (1 ) {
00307 const int mx=1000;
00308 char buf[mx];
00309 char * ret=fgets(buf,mx,fd);
00310 if(ret==0) break;
00311 nl++;
00312 if(buf[0]=='#') continue;
00313 char name[100];
00314 float a,b,c,d;
00315 int n=sscanf(buf,"%s %f %f %f %f",name,&a,&b,&c,&d);
00316 if(n!=5) {
00317 printf("faulty %d line in %s\n",nl,fname);
00318 printf("n=%d buf='%s'\n fix it, (JB)\n\n",n,buf);
00319 assert(1==2);
00320 }
00321 nd++;
00322
00323
00324 int iew,ih;
00325 int ok=0;
00326 for(iew=0;iew<mxEW;iew++)
00327 for(ih=0;ih<mxHex;ih++){
00328 if(strstr(hex[iew][ih]->name,name)==0) continue;
00329 ok=1;
00330 hex[iew][ih]->setCalib(a,b,c,d);
00331 break;
00332 }
00333 if(ok!=1) {
00334 printf("faulty BbcPMT name=%s in %d line in %s\n",name,nl,fname);
00335 printf("n=%d buf='%s'\n fix it, (JB)\n\n",n,buf);
00336 assert(1==3);
00337 }
00338 }
00339
00340 fclose(fd);
00341 printf("BbcVertex::readCalib() done, found %d valid records\n",nd);
00342 return;
00343 }
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361