00001 #ifndef CALOAXIS2_H_
00002 #define CALOAXIS2_H_
00003
00004 #if !defined(__CINT__) || defined(__MAKECINT__)
00005
00006
00007 #include <TString.h>
00008 #include <TH1F.h>
00009 #include <TH2F.h>
00010 #include <TMath.h>
00011 #include <TLine.h>
00012 #include <TPolyMarker.h>
00013 #include <TSelector.h>
00014 #include <TFile.h>
00015
00016 #include <stdlib.h>
00017 #include <iostream>
00018 using namespace std;
00019
00020 #include <PamLevel2.h>
00021
00022
00023 #endif // !defined(__CINT__) || defined(__MAKECINT__)
00024
00025
00026
00027
00028
00029
00030 class CaloEvent{
00031
00032 public:
00033
00034
00035
00036
00037 vector<int> ids;
00038 vector<int> idp;
00039 vector<float> q;
00040 vector<float> zcoord;
00041 vector<float> xycoord;
00042
00043
00044
00045
00046
00047 void Add(int iis, int iip, float fq, float fz, float fxy){
00048 ids.push_back(iis);
00049 idp.push_back(iip);
00050 q.push_back(fq);
00051 zcoord.push_back(fz);
00052 xycoord.push_back(fxy);
00053 };
00054
00055
00056
00057 int GetN(){return (int)(q.size());};
00058
00059 void Reset(){
00060 ids.clear();
00061 idp.clear();
00062 q.clear();
00063 zcoord.clear();
00064 xycoord.clear();
00065 };
00066
00067 void Delete(){ Reset(); };
00068
00069 ~CaloEvent(){ Delete(); };
00070
00071 CaloEvent(){ };
00072
00073 CaloEvent( CaloLevel1* calo, int view, Bool_t usemechanicalalignement){ Set(calo,view,usemechanicalalignement); };
00074
00075 CaloEvent( CaloLevel1* calo, int view){ Set(calo,view); };
00076
00077 void Set(CaloLevel1* calo, int view, Bool_t usemechanicalalignement){
00078
00079 Reset();
00080
00081 CaloStrip cstrip;
00082 cstrip = CaloStrip(calo,usemechanicalalignement);
00083
00084 for(int ih=0;ih<calo->istrip;ih++){
00085 int iv=-1;
00086 int ip=-1;
00087 int is=-1;
00088 calo->DecodeEstrip(ih,iv,ip,is);
00089 if(iv==view){
00090 cstrip.Set(view,ip,is);
00091 float fxy = 0.;
00092 if( !view ) fxy = cstrip.GetX();
00093 else fxy = cstrip.GetY();
00094 float fz = cstrip.GetZ();
00095 float fq = cstrip.GetE();
00096 if(fq>0)Add(is,ip,fq,fz,fxy);
00097 }
00098 }
00099
00100 };
00101 void Set(CaloLevel1* calo, int view){ Set(calo,view,0); };
00102
00103
00104 };
00105
00106
00107
00108
00109
00110
00111 class CaloAxis {
00112
00113 public:
00114
00115 CaloEvent *cevent;
00116
00117
00118
00119
00120
00121 vector<float> x;
00122 vector<float> y;
00123 vector<float> w;
00124 vector<float> q;
00125
00126
00127
00128
00129 Float_t par[2];
00130 Float_t covpar[2][2];
00131
00132
00133
00134
00135 float cog[22];
00136 float qpl[22];
00137
00138
00139
00140
00141 TPolyMarker *sel;
00142 TLine *axis;
00143
00144
00145
00146
00147
00148 void Init(){
00149 for(Int_t i=0; i<2;i++){
00150 par[i]=0;
00151 for(Int_t j=0; j<2;j++)covpar[i][j]=0;
00152 };
00153 sel = 0;
00154 axis = 0;
00155 for(Int_t i=0; i<22; i++){
00156 cog[i]=0;
00157 qpl[i]=0;
00158 }
00159
00160 }
00161
00162 void Set(CaloLevel1* calo, Int_t view){ cevent->Set(calo,view,0); };
00163 void Set(CaloLevel1* calo, Int_t view, Bool_t usemechanicalalignement){ cevent->Set(calo,view,usemechanicalalignement); };
00164
00165 CaloAxis(){
00166 cevent = new CaloEvent();
00167 Init();
00168 };
00169
00170 CaloAxis(CaloLevel1* calo, Int_t view){
00171 cevent = new CaloEvent();
00172 Init();
00173 Set(calo,view);
00174 };
00175 CaloAxis(CaloLevel1* calo, Int_t view, Bool_t usemechanicalalignement){
00176 cevent = new CaloEvent();
00177 Init();
00178 Set(calo,view,usemechanicalalignement);
00179 };
00180
00181
00182 void Reset(){
00183
00184 x.clear();
00185 y.clear();
00186 w.clear();
00187 q.clear();
00188
00189 if(sel)sel->Delete();
00190
00191 if(axis)axis->Delete();
00192
00193 Init();
00194 }
00195
00196 void Delete(){ Reset(); delete cevent; };
00197
00198 ~CaloAxis(){ Delete(); };
00199
00200
00201 void Add(float xin, float yin){
00202 x.push_back(xin);
00203 y.push_back(yin);
00204 w.push_back(1.);
00205 q.push_back(0.);
00206
00207
00208 };
00209 void Add(float xin, float yin, float qin){
00210 x.push_back(xin);
00211 y.push_back(yin);
00212 q.push_back(qin);
00213 w.push_back(1.);
00214
00215
00216 };
00217 void Add(float xin, float yin, float qin, float win){
00218 x.push_back(xin);
00219 y.push_back(yin);
00220 w.push_back(win);
00221 q.push_back(qin);
00222
00223
00224 };
00225
00226 int Fit(){
00227
00228
00229 Float_t SSS = 0;
00230 Float_t SSX = 0;
00231 Float_t SXX = 0;
00232
00233 Float_t SSY = 0;
00234 Float_t SXY = 0;
00235
00236 Int_t np=0;
00237 for(Int_t i=0; i<(int)(x.size()); i++){
00238 SSS += w[i]*w[i];
00239 SSX += x[i]*w[i]*w[i];
00240 SXX += x[i]*x[i]*w[i]*w[i];
00241 SSY += y[i]*w[i]*w[i];
00242 SXY += x[i]*y[i]*w[i]*w[i];
00243 if(w[i])np++;
00244 }
00245 Float_t det = SSS*SXX-SSX*SSX;
00246 if(det==0)return 0;
00247 if(np<3)return 0;
00248
00249 par[0] = (SSY*SXX-SXY*SSX)/det;
00250 par[1] = (SXY*SSS-SSY*SSX)/det;
00251 return 1;
00252 };
00253
00254 void Print(){
00255
00256 }
00257
00258 float GetPar(Int_t i){return par[i];};
00259
00260 int GetN(){return (int)(x.size());};
00261
00262 float* GetX(){
00263 float *xout = new float[(int)(x.size())];
00264 for(Int_t i=0; i<(int)(x.size()); i++)xout[i]=x[i];
00265 return xout;
00266 }
00267
00268 float* GetY(){
00269 float *yout = new float[(int)(y.size())];
00270 for(Int_t i=0; i<(int)(y.size()); i++) yout[i]=y[i];
00271 return yout;
00272 }
00273
00274 float* GetQ(){
00275 float *qout = new float[(int)(q.size())];
00276 for(int i=0; i<(int)(q.size()); i++) qout[i]=q[i];
00277 return qout;
00278 }
00279
00280 float GetChi2(){
00281 float chi2=0;
00282 int nchi=0;
00283 for(Int_t i=0; i<(int)(y.size()); i++){
00284 chi2 += w[i]*w[i]*(y[i]-par[0]-par[1]*x[i])*(y[i]-par[0]-par[1]*x[i]);
00285 nchi += (int)w[i];
00286 };
00287
00288 if(nchi<3) return -999;
00289
00290
00291 chi2=chi2/(nchi-2);
00292 return chi2;
00293 }
00294
00295 float GetQaxis(){
00296 float qaxis=0;
00297 for(Int_t i=0; i<(int)(q.size()); i++) qaxis +=q[i];
00298
00299 return qaxis;
00300 }
00301
00302 float GetQaxis(float toll){
00303 float qaxis=0;
00304 for(int ih=0;ih<cevent->GetN(); ih++){
00305 float x = cevent->xycoord[ih];
00306 float z = cevent->zcoord[ih];
00307 float q = cevent->q[ih];
00308
00309 float d = fabs(x-par[0]-par[1]*z)/sqrt(par[1]*par[1]+1);
00310 if( d < toll )qaxis+=q;
00311 }
00312 return qaxis;
00313 }
00314
00315 float GetCOG(Int_t ip){
00316 if(ip>=0 && ip<22)return cog[ip];
00317 else return 0;
00318 }
00319
00320 float GetQ(Int_t ip){
00321 if(ip>=0 && ip<22)return qpl[ip];
00322 else return 0;
00323 }
00324
00325 float GetQstrip(){
00326
00327 float qaxis=0;
00328 for(Int_t i=0; i<(int)(q.size()); i++) qaxis +=q[i];
00329 if(q.size()==0) return 0.;
00330 return qaxis/q.size();
00331 }
00332
00333 float GetYfit(float x){
00334 return par[0]+x*par[1];
00335 }
00336
00337 float GetXmin(){
00338 float zmin=9999;
00339 for(Int_t i=0; i<(int)(x.size()); i++) if(x[i]<zmin) zmin = x[i];
00340 return zmin;
00341 }
00342 float GetXmax(){
00343 float zmax=-9999;
00344 for(Int_t i=0; i<(int)(x.size()); i++) if(x[i]>zmax) zmax = x[i];
00345 return zmax;
00346
00347 }
00348
00349
00350 void Draw(){
00351
00352
00353 if(GetN()<3)return;
00354
00355 sel = new TPolyMarker(GetN(),GetY(),GetX());
00356 sel->SetMarkerSize(0.3);
00357 sel->SetMarkerColor(5);
00358
00359 axis = new TLine( par[0]+GetXmin()*par[1], GetXmin(), par[0]+GetXmax()*par[1], GetXmax() );
00360 axis->SetLineWidth(1);
00361 axis->SetLineColor(5);
00362
00363
00364
00365
00366 sel->Draw();
00367 axis->Draw();
00368 };
00369
00370
00371
00372
00373
00374 int FitAxis( CaloLevel1* calo , Int_t view , Float_t toll , Bool_t usemechanicalalignement ){
00375
00376
00377
00378 Set(calo,view,usemechanicalalignement);
00379
00380
00381
00382
00383 for(int ih=0;ih<cevent->GetN(); ih++){
00384 float x = cevent->xycoord[ih];
00385 float z = cevent->zcoord[ih];
00386 float q = cevent->q[ih];
00387 Add(z,x,q);
00388 }
00389
00390 if(GetN()<3)return 0;
00391 Fit();
00392
00393
00394
00395
00396
00397
00398
00399 float P0;
00400 float P1;
00401 int dof;
00402
00403
00404
00405
00406 int niter=0;
00407 int pok[22];
00408
00409
00410
00411 float W22=1.;
00412 float W1=10.;
00413 float b=(W22-W1)/(22.-1.);
00414 float a=W1-b;
00415
00416 for(int i=0; i<22; i++)pok[i]=0;
00417 do{
00418 niter++;
00419 float ttoll = toll;
00420 if(niter==1)ttoll = 10.*toll;
00421 dof = GetN();
00422 P0 = par[0];
00423 P1 = par[1];
00424 Reset();
00425 for(int ih=0;ih<cevent->GetN(); ih++){
00426 float x = cevent->xycoord[ih];
00427 float z = cevent->zcoord[ih];
00428 float q = cevent->q[ih];
00429 int ip = cevent->idp[ih];
00430 float d = fabs(x-P0-P1*z)/sqrt(P1*P1+1);
00431
00432 if( d < ttoll && (niter==1 || (niter>1 && pok[ip]==1)) ){
00433
00434 float W=a+b*(ip+1);
00435
00436 Add(z,x,q,W);
00437 pok[ip]=1;
00438 }
00439 }
00440
00441 int nmissing = 0;
00442 for(int ip=0; ip<22; ip++){
00443 if(pok[ip]==0){
00444 nmissing++;
00445 }else{
00446 nmissing = 0;
00447 }
00448 if(nmissing==3){
00449 for(int ipp=ip+1; ipp<22; ipp++)pok[ipp]=0;
00450 break;
00451 }
00452 }
00453
00454
00455 if(niter==100)break;
00456 if(GetN()<3)break;
00457 Fit();
00458 }while(niter==1 || GetN() != dof);
00459
00460 if(GetN()<3)return 0;
00461 Fit();
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473 P0 = par[0];
00474 P1 = par[1];
00475 Reset();
00476
00477 float dmin[22];
00478 int closest[22];
00479 for(int ip=0; ip<22; ip++){
00480 dmin[ip]=999;
00481 closest[ip]=-1;
00482 }
00483 for(int ih=0;ih<cevent->GetN(); ih++){
00484 float x = cevent->xycoord[ih];
00485 float z = cevent->zcoord[ih];
00486
00487 int ip = cevent->idp[ih];
00488
00489 float d = fabs(x-P0-P1*z)/sqrt(P1*P1+1);
00490 if( d < toll && d<dmin[ip] && pok[ip]==1 ){
00491
00492 closest[ip]=ih;
00493
00494
00495 }
00496 }
00497 for(Int_t ip=0; ip<22; ip++){
00498 if(closest[ip]!=-1){
00499 float x = cevent->xycoord[closest[ip]];
00500 float z = cevent->zcoord[closest[ip]];
00501 float q = cevent->q[closest[ip]];
00502
00503 Add(z,x,q,q);
00504 cog[ip] += x*q;
00505 qpl[ip] += q;
00506
00507 }
00508 }
00509
00510
00511
00512 for(int ih=0;ih<cevent->GetN(); ih++){
00513 float x = cevent->xycoord[ih];
00514 float z = cevent->zcoord[ih];
00515 float q = cevent->q[ih];
00516 int ip = cevent->idp[ih];
00517 int is = cevent->ids[ih];
00518 if( closest[ip]!=-1 ){
00519 int isc = cevent->ids[closest[ip]];
00520 if( is == isc+1 || is == isc-1 ){
00521 Add(z,x,q,q);
00522 cog[ip] += x*q;
00523 qpl[ip] += q;
00524
00525 }
00526 }
00527 }
00528 Fit();
00529
00530 if(GetN()<3)return 0;
00531 for(int ip=0; ip<22; ip++){
00532 if(qpl[ip]!=0){
00533 cog[ip]=cog[ip]/qpl[ip];
00534
00535 }
00536 }
00537
00538
00539
00540
00541
00542
00543
00544
00545 return 1;
00546 };
00547
00548
00549 int FitAxis( CaloLevel1* calo , Int_t view , Float_t toll ){ return FitAxis(calo,view,toll,0); };
00550
00551
00552
00553
00554
00555
00556 int FitShower( CaloLevel1* calo , Int_t view , Float_t toll , Bool_t usemechanicalalignement ){
00557
00558
00559
00560 Set(calo,view,usemechanicalalignement);
00561
00562
00563
00564
00565 for(int ih=0;ih<cevent->GetN(); ih++){
00566 float x = cevent->xycoord[ih];
00567
00568 float q = cevent->q[ih];
00569 int ip = cevent->idp[ih];
00570 cog[ip] += x*q;
00571 qpl[ip] += q;
00572
00573 }
00574 for(int ip=0; ip<22; ip++){
00575 if(qpl[ip]!=0)cog[ip]=cog[ip]/qpl[ip];
00576
00577 }
00578
00579
00580
00581 float qplmax=1;
00582 int ipmax = -1;
00583 float dmin[22];
00584 int closest[22];
00585 for(int ip=0; ip<22; ip++)if(qpl[ip]>qplmax){
00586 ipmax=ip;
00587 qplmax=qpl[ip];
00588 dmin[ip]=1000.;
00589 closest[ip]=-1;
00590 }
00591 for(int ih=0;ih<cevent->GetN(); ih++){
00592 float x = cevent->xycoord[ih];
00593 float z = cevent->zcoord[ih];
00594 float q = cevent->q[ih];
00595 int ip = cevent->idp[ih];
00596
00597 if( ip<=ipmax || ip<=3 ){
00598 Add(z,x,q);
00599 }
00600 }
00601 if(GetN()<3)return 0;
00602 Fit();
00603
00604
00605
00606
00607
00608
00609 float P0;
00610 float P1;
00611 int dof;
00612
00613
00614
00615
00616 int niter=0;
00617 int pok[22];
00618
00619
00620 float W22=1.;
00621 float W1=10.;
00622 float b=(W22-W1)/(22.-1.);
00623 float a=W1-b;
00624
00625 for(int i=0; i<22; i++){
00626 pok[i]=0;
00627 }
00628 do{
00629 niter++;
00630 float ttoll = toll;
00631 if(niter==1)ttoll = 10.*toll;
00632 dof = GetN();
00633 P0 = par[0];
00634 P1 = par[1];
00635 Reset();
00636 for(int i=0; i<22; i++){
00637 cog[i]=0;
00638 qpl[i]=0;
00639 }
00640 for(int ih=0;ih<cevent->GetN(); ih++){
00641 float x = cevent->xycoord[ih];
00642 float z = cevent->zcoord[ih];
00643 float q = cevent->q[ih];
00644 int ip = cevent->idp[ih];
00645 float d = fabs(x-P0-P1*z)/sqrt(P1*P1+1);
00646
00647 if(
00648 (niter==1 || (niter>1 && pok[ip]==1)) &&
00649 (ip<=ipmax || ip<=3) &&
00650
00651 true){
00652
00653 if(niter==1 && d<dmin[ip]){
00654 dmin[ip]=d;
00655 closest[ip]=ih;
00656 }
00657
00658 float W=a+b*(ip+1);
00659
00660 if( d < ttoll || ( niter==2 && ih==closest[ip] )){
00661
00662
00663 cog[ip] += x*q;
00664 qpl[ip] += q;
00665 Add(z,x,q,W);
00666 pok[ip]=1;
00667 cout << ip << " "<<qpl[ip]<<endl;
00668 }
00669 }
00670 }
00671
00672 int nmissing = 0;
00673 for(int ip=0; ip<22; ip++){
00674 if(pok[ip]==0){
00675 nmissing++;
00676 }else{
00677 nmissing = 0;
00678 }
00679 if(nmissing==6){
00680 for(int ipp=ip+1; ipp<22; ipp++)pok[ipp]=0;
00681 break;
00682 }
00683 }
00684
00685 for(int ip=0; ip<22; ip++)cout << qpl[ip] << " ";
00686 cout << endl;
00687
00688
00689 for(int ip=0; ip<22; ip++)if(qpl[ip]!=0)cog[ip]=cog[ip]/qpl[ip];
00690
00691
00692 if(niter==100)break;
00693 if(GetN()<3)break;
00694
00695 Fit();
00696
00697 }while(niter==1 || GetN() != dof);
00698
00699 if(GetN()<3)return 0;
00700 Fit();
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721
00722
00723
00724
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767
00768
00769
00770
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780 return 1;
00781 };
00782
00783
00784 int FitShower( CaloLevel1* calo , Int_t view , Float_t toll ){ return FitAxis(calo,view,toll,0); };
00785
00786
00787 };
00788
00789
00790
00791
00792
00793
00794
00795
00796 #endif // CALOAXIS2_H_