FlyoDoc_2011 Pisa 2011 by GmP --- 011

flyopunta/src/src_dev62/devlkr.cpp

00001 /***************************************************************************
00002                           devlkr.cpp  -  description
00003                              -------------------
00004     begin                : Sat May 26 2001
00005     copyright            : (C) 2001 by Giuseppe Pierazzini
00006     email                : peppe@unipi.it
00007   ***************************************************************************
00008   *                                                                         *
00009   *   NA48  simulation program.                                             *
00010   *                                                                         *
00011   ***************************************************************************/
00012 #define DEVLKR
00013 
00014 #include "parm.h"
00015 #include "part_db.h"
00016 #include "devlkr.h"
00017 #include "particella.h"
00018 #include "flyorea.h"
00019 #include "evento.h"
00020 #include "triggerbox.h"
00021 
00022 
00023 
00024 #define INTERNO  0
00025 #define EPSR     1.0E-200
00026 using namespace GmpConst;
00027 using namespace std;
00028 
00029 
00030 PadRaster PAD;
00031 
00032 double soglia_pic=0.35; //soglia di .3 gen per selezionare i picchi nelle pad44
00033 
00034 //==========================================
00035 // -------  CELLA ------------------
00036 
00037 void Cella::Set_index ( double xx ,double yy, int ixx,int iyy )
00038 {
00039   double Dcell=2.;
00040 
00041   if ( ix>-1&&ix<128&&iy>-1&&iy<128 )
00042     {
00043       x=xx;
00044       y=yy;
00045       ix=ixx;
00046       iy=iyy;
00047       id=128*iy+ix;
00048       Xcella = ( ix+0.5 ) *Dcell-128;
00049       Ycella = ( iy+0.5 ) *Dcell-128;
00050     }
00051 // else pone  id =0;che  corrisponde ad una regione esterna al volume di fiducial del calorimetro
00052   else
00053     {
00054       id=0;
00055       Xcella=Ycella=0.0;
00056       ix=0;
00057       iy=0;
00058       e=0.;
00059     }
00060 
00061 };
00062 
00063 
00064 // ============
00065 void Cella::Rilascia_E ( double sig,double e_in )
00066 {
00067   if ( id<1 ) return;
00068   double d=1.;  // mezza cella
00069 
00070 // if the center  is in the hole... get out....
00071   if ( ( Xcella*Xcella+Ycella*Ycella ) <64. ) return;
00072 
00073 
00074   double u1= ( x+d-Xcella ) / ( sig*SQRT2 );
00075   double u2= ( x-d-Xcella ) / ( sig*SQRT2 );
00076   double v1= ( y+d-Ycella ) / ( sig*SQRT2 );
00077   double v2= ( y-d-Ycella ) / ( sig*SQRT2 );
00078 
00079   double erfx=fabs ( erf ( u2 )-erf ( u1 ) );
00080   double erfy=fabs ( erf ( v2 )-erf ( v1 ) );
00081   double erfxy=erfx*erfy;
00082   if ( erfxy<0.00001 ) erfxy=0.;
00083 
00084   e =0.25*e_in*erfxy;
00085 
00086 //    cout<<"\n erfxy  "<<setw(8)<<u1<<" "<<setw(8)<<u2<<" " <<setw(8)<<v1<<" " <<setw(8)<<v2
00087 //    <<" " <<setw(8)<<erfxy<<" " <<setw(8)<<e<<setw(8)<<e_in;
00088 
00089 };
00090 void Cella::Cella2Pad()
00091 {
00092   if ( id<1 ) return;
00093 
00094   int ixp=int ( ix/2 );
00095   int iyp=int ( iy/8 );
00096   PAD.padx28[iyp][ixp]+=e;   // rivedre gli indici
00097 
00098   // pads di 4x4
00099   ixp=int ( ix/4 );
00100   iyp=int ( iy/4 );
00101   PAD.padxy44[ixp][iyp]+=e;
00102 //  cout<<" xye "<<ixp<<" " <<iyp<<" "  <<e <<" " << PAD.padxy44[iyp][ixp]  ;
00103 
00104 }
00105 
00106 //=========================PadRaster==========
00107 void PadRaster::Reset()
00108 {
00109   epad28=m28x=m28qx=m28y=m28qy=0.0;
00110   epad44=m44x=m44qx=m44y=m44qy=0.0;
00111   dist_max=0.;
00112   padhit=0;
00113 
00114   for ( int i=0;i<1024;i++ )
00115     {
00116       pad28[i]=pad44[i]=0.;
00117       PADflag_l[i]=0;
00118 
00119     }
00120 }
00121 
00122 //======
00123 
00124 void PadRaster::Momenti()
00125 {
00126 
00127   // lavora sulle proiezioni..... Padhit deve essere definito come mhit inizialmente..
00128   if ( padhit==0 ) return;
00129 
00130   for ( int k=0;k<1024;k++ )
00131     {
00132       epad28+=pad28[k];
00133     }
00134   if ( epad28<0.001 ) return;
00135   epad44=epad28;
00136 
00137 // 28 proiezione x
00138 
00139   for ( int i=0;i<64;i++ )
00140     {
00141       double ri= ( i+0.5 ) *4.-128;
00142       double riq=ri*ri;
00143       for ( int j=0;j<16;j++ )
00144         {
00145           m28x +=padx28[i][j]*ri;
00146           m28qx+=padx28[i][j]*riq;
00147         }
00148     }
00149 // 28 proiezione y
00150 
00151   for ( int i=0;i<16;i++ )
00152     {
00153       double ri= ( i+0.5 ) *16.-128;
00154       double riq=ri*ri;
00155       for ( int j=0;j<64;j++ )
00156         {
00157           m28y +=padx28[j][i]*ri;
00158           m28qy+=padx28[j][i]*riq;
00159         }
00160     }
00161 
00162 // proiezioni x e y
00163 
00164   for ( int i=0;i<32;i++ )
00165     {
00166       double ri= ( i+0.5 ) *8.-128;
00167       double riq=ri*ri;
00168       for ( int j=0;j<32;j++ )
00169         {
00170           m44y +=padxy44[j][i]*ri;
00171           m44qy+=padxy44[j][i]*riq;
00172 
00173           m44x +=padxy44[i][j]*ri;
00174           m44qx+=padxy44[i][j]*riq;
00175 
00176 
00177         }
00178     }
00179 //mediepadxy44
00180 
00181   m28x/=epad28;
00182   m28qx/=epad28;
00183   m28qx-=m28x*m28x;
00184   m28qx=sqrt ( m28qx );
00185   m28y/=epad28;
00186   m28qy/=epad28;
00187   m28qy-=m28y*m28y;
00188   m28qy=sqrt ( m28qy );
00189   m44x/=epad44;
00190   m44qx/=epad44;
00191   m44qx-=m44x*m44x;
00192   m44qx=sqrt ( m44qx );
00193   m44y/=epad44;
00194   m44qy/=epad44;
00195   m44qy-=m44y*m44y;
00196   m44qy=sqrt ( m44qy );
00197 
00198 //quadranti
00199 
00200   quad1=0.0;
00201   quad2=0.0;
00202   quad3=0.0;
00203   quad4=0.0;
00204 
00205   for ( int ix=0;ix<16;ix++ )
00206     {
00207       for ( int iy=0;iy<16;iy++ )
00208         {
00209           quad1+=padxy44[ix][iy];
00210           quad2+=padxy44[ix+16][iy];
00211           quad3+=padxy44[ix+16][iy+16];
00212           quad4+=padxy44[ix][iy+16];
00213         }
00214     }
00215 }
00216 //
00217 void  PadRaster::Get_Peak()
00218 {
00219   npeak=0;
00220 
00221 // main loop to discover peaks: avoid the border channels.
00222   for ( int ix=1;ix<31;ix++ )
00223     {
00224       for ( int iy=1;iy<31;iy++ )
00225         {
00226           if ( Peak_mask ( ix,iy ) ==1 )
00227             {
00228 
00229               Peak[npeak].ix=ix*8-124;
00230               Peak[npeak].iy=iy*8-124;
00231               npeak++;
00232               if ( npeak>9 ) break; //too many peaks
00233 
00234             }
00235         }
00236     }
00237 
00238   dist_max=150.;
00239   if ( npeak>8 ) return;//too many peaks
00240   dist_max=-1.;
00241   if ( npeak<2 ) return;  // only one or no peak;
00242 
00243 // check max distance between peaks.
00244 
00245   dist_max=0;
00246   for ( int i=0;i<npeak-1;i++ )
00247     {
00248       for ( int j=i+1;j<npeak;j++ )
00249         {
00250           int dx =Peak[i].ix-Peak[j].ix;
00251           int dy =Peak[i].iy-Peak[j].iy;
00252           double dist=sqrt ( dx*dx+dy*dy ) *4.;
00253           if ( dist_max<dist ) dist_max=dist;
00254         }
00255     }
00256 }
00257 //
00258 int  PadRaster::Peak_mask ( int ix,int iy )
00259 {
00260 
00261 // simple peak definition...
00262 
00263 // channel allready used...
00264   if ( PADflag[ix][iy]==1 ) return 0;
00265 
00266   double eseed= padxy44[ix][iy];
00267 
00268   if ( eseed<soglia_pic ) return 0;
00269 
00270   if ( eseed<padxy44[ix-1][iy-1] ||
00271        eseed<padxy44[ix  ][iy-1] ||
00272        eseed<padxy44[ix+1][iy-1] ||
00273        eseed<padxy44[ix-1][iy  ] ||
00274        eseed<padxy44[ix+1][iy  ] ||
00275        eseed<padxy44[ix-1][iy+1] ||
00276        eseed<padxy44[ix  ][iy+1] ||
00277        eseed<padxy44[ix+1][iy+1] ) return 0;
00278 
00279   double esomm8=  padxy44[ix-1][iy-1]+ padxy44[ix  ][iy-1] + padxy44[ix+1][iy-1];
00280   esomm8+=        padxy44[ix-1][iy  ]            +           padxy44[ix+1][iy  ];
00281   esomm8+=        padxy44[ix-1][iy+1]+ padxy44[ix  ][iy+1] + padxy44[ix+1][iy+1];
00282 
00283   if ( eseed<esomm8*.25 ) return 0;
00284 
00285   //  Gout<<"\n ev "<<Eventi_Fatti<<"  xy pad "<<ix<<" "<<iy<< "  eseed "<<eseed<<" etot "<<eseed+esomm8;
00286   // Trovato !   set flags...
00287   PADflag[ix-1][iy-1]= PADflag[ix][iy-1]= PADflag[ix+1][iy-1]= 1;
00288   PADflag[ix-1][iy]=   PADflag[ix][iy]=   PADflag[ix+1][iy]=1;
00289   PADflag[ix-1][iy+1]= PADflag[ix][iy+1]= PADflag[ix+1][iy+1]=1;
00290 
00291   return 1;
00292 }
00293 
00294 
00295 //================ooooOOO0OOOooo=   DevLkr    ==ooooOOO0OOOooo= ====================
00296 //================ooooOOO0OOOooo=   DevLkr    ==ooooOOO0OOOooo= ====================
00297 //================ooooOOO0OOOooo=   DevLkr    ==ooooOOO0OOOooo= ====================
00298 void  DevLkr::Pad_Filling( )
00299 {
00300   //reset parameters also for root
00301   epad28=m28x=m28qx=m28y=m28qy=0.0;
00302   epad44=m44x=m44qx=m44y=m44qy=0.0;
00303   dist_max=0.;
00304   padhit=0;
00305 
00306   if ( mhit<1 ) return;
00307 
00308   PAD.Reset();
00309   PAD.padhit=mhit;   //initial setting
00310   Cella CelSpace;
00311   double Dcell=2.;
00312 
00313 
00314   for ( int ipr=0; ipr<mhit; ipr++ )
00315     {
00316 
00317 
00318       double mx = M_Hits[ipr].Xdev.x;
00319       double my = M_Hits[ipr].Xdev.y;
00320       double e_in =M_Hits[ipr].e_rivela;
00321 
00322 // larghezza della distribuzione deposito energia.
00323       double  sig=2.;
00324       double rap= e_in/M_Hits[ipr].Pdev.e;
00325 
00326       if ( M_Hits[ipr].pnome==Pip||M_Hits[ipr].pnome==Pim )
00327         {
00328           sig=1.2;
00329 
00330           if ( rap<0.1 ) sig=0.7;
00331           if ( rap<0.5 ) sig=1.4;
00332 
00333         }
00334       else  if ( M_Hits[ipr].pnome==Gam||M_Hits[ipr].pnome==Elec||M_Hits[ipr].pnome==Elep ) sig=1.;
00335       else if ( M_Hits[ipr].pnome==Mup||M_Hits[ipr].pnome==Mum ) sig=0.5;
00336 
00337 // definisco CelSpace come la finestra delle (11x11) celle interessate  dalla particella incidente
00338 // la finestra è di 121 celle;
00339 //  la cella centrale è la (5,5);
00340 
00341 
00342       int ix=int ( ( mx+128. ) /Dcell );
00343       int iy=int ( ( my+128. ) /Dcell );
00344 
00345 
00346       int ixshift= ix-5;
00347       int iyshift= iy-5;
00348 
00349 //         cout<<"\n Ev: "<<Eventi_Fatti<< " =====>  ";
00350 //          cout<< setw(8)<<M_Hits[ipr].pnome<<" x "<< setw(8) <<x << " y " << setw(8)<<y <<" e "<< setw(8)<<e_in
00351 //          <<" cel_chs " << setw(8)<<ix << " " << setw(8)<<iy<< flush;
00352 
00353 
00354       for ( int i=0;i<11;i++ )
00355         {
00356           for ( int j=0;j<11;j++ )
00357             {
00358               ix=ixshift+i;
00359               iy=iyshift+j;
00360               CelSpace.Set_index ( mx,my,ix,iy );
00361 // deposito dell' energia rilasciata nelle celle dalla pertcella incidente.
00362               CelSpace.Rilascia_E ( sig,e_in );
00363               CelSpace.Cella2Pad();
00364             }
00365         }
00366     }
00367 
00368 
00369   PAD.Momenti();
00370 
00371 // memorizzo per root
00372   padhit=PAD.padhit;
00373   epad28=PAD.epad28;
00374   m28x  =PAD.m28x  ;
00375   m28qx =PAD.m28qx ;
00376   m28y  =PAD.m28y  ;
00377   m28qy =PAD.m28qy ;
00378   epad44=PAD.epad44;
00379   m44x  =PAD.m44x  ;
00380   m44qx =PAD.m44qx ;
00381   m44y  =PAD.m44y  ;
00382   m44qy =PAD.m44qy ;
00383   quad1= PAD.quad1;
00384   quad2= PAD.quad2;
00385   quad3= PAD.quad3;
00386   quad4= PAD.quad4;
00387 
00388 // ridefinizione dgli hit visti come peak
00389 
00390   PAD.Get_Peak();
00391   padhit=PAD.npeak;
00392   dist_max=PAD.dist_max;
00393 
00394 
00395 // DEBUG DEBUG.......................if(mhit==1000....) per non eseguire il debug
00396   if ( mhit==1000&&padhit==2 )
00397     {
00398 
00399 
00400       Gout<<"\n ev "<<Eventi_Fatti<< " hit "<<mhit<<" peak "<<PAD.npeak<<"  "<<PAD.padhit;
00401 
00402       for ( int k=0;k<mhit;k++ )
00403         {
00404           double e_in =M_Hits[k].e_rivela;
00405           double mx = M_Hits[k].Xdev.x;
00406           double my = M_Hits[k].Xdev.y;
00407 
00408           Gout<<"\n Lkrhit "<<k<<" "<<M_Hits[k].pnome<<"  x,y "<<mx<<" "<<my<< "  e "<<e_in<<" "<<M_Hits[k].Pdev.e;
00409 
00410 
00411 
00412         }
00413 
00414       for ( int k=0;k<padhit;k++ )
00415         {
00416 
00417           double mx = PAD.Peak[k].ix;
00418           double my = PAD.Peak[k].iy;
00419           Gout<<"\n Padhit "<<k<<"  x,y "<<mx<<" "<<my;
00420         }
00421 
00422       Gout<<"\n    ";
00423       for ( int jx=0;jx<32;jx++ )
00424         {
00425           Gout<<setw ( 4 ) <<jx*8-124;
00426         }
00427       for ( int jy=0;jy<32;jy++ )
00428         {
00429           Gout<<"\n "<<setw ( 4 ) <<jy*8-124;
00430           for ( int jx=0;jx<32;jx++ )
00431             {
00432 
00433               int epad=int ( PAD.padxy44[jx][jy]*10. );
00434 
00435               if ( epad>0 ) Gout<<" "<<setw ( 3 ) <<epad;
00436               else    Gout<<"  . ";
00437 
00438 
00439             }
00440         }
00441     }
00442 // end DEBUG....................
00443 
00444 }
00445 
00446 
00447 
00448 //=======================================
00449 int DevLkr::Traccia ( Particella *pr )
00450 {
00451 // controllo il tracing della particella
00452 // se è un pione
00453   if ( pr->Get_Nome() ==Pip||pr->Get_Nome() ==Pim )
00454     {
00455 // ed è interno al lkr ed ha un cammino potenziale maggiore di un cm..
00456       if ( nowpos==INTERNO&&pr->pathok>1. )
00457         {
00458 // calcolo in cammino prima di interagire 
00459           double pathfai = -liint* log ( EPSR + Pran() );
00460           if ( pathfai<pr->pathok )
00461             {
00462 // interagisce prima di fare il cammino potenziale
00463 // restante dichiaro la particella come distrutta: Ifato=idead=-3;
00464               pr->Set_Fato ( Distr,-3 ); 
00465               pr->pathok=pathfai;  // ridefinisco il cammino potenziale nel dev prima dellinterazione distruttiva...
00466             }
00467         }
00468     }
00469 // se non è un pione traccio seguendo la procedura standard...
00470 // se è un pione traccio la parte di cammino restante prima della distruzione.... 
00471   int ret=Device::Traccia ( pr );
00472   return ret;
00473 }
00474 
00475 //*********************************************
00476 //*********************************************
00477 DevLkr::~DevLkr()
00478 {}
00479 
00483 void DevLkr::Prgeom()
00484 {
00485   Gout<<"==================  R i v e l a t o r e =================";
00486   Gout<<"\n --> < "<<nome <<" >  [ "<<fun
00487   <<" ]  Calorim. ";
00488   Device::Prgeom();
00489 
00490 }
00491 //***********************************************
00492 void DevLkr::DataSmear()
00493 {
00499 // operate on the dev_variables of type (2) M_Hits
00500 //  double x,y,ep,se,sx;
00501 
00502 
00503   const char *partnom;
00504   i=0;
00505   while ( i<=nhit )
00506     {
00507       x=M_Hits[i].Xdev.x;
00508       y=M_Hits[i].Xdev.y;
00509       partnom=M_Hits[i].pnome;
00510       ep=M_Hits[i].e_rivela;     //energia rilasciate nel dev
00511 
00512 //
00513 
00514       if ( partnom==Gam|| partnom==Elec|| partnom==Elep )
00515         {
00516 
00517 
00518           //================================================================
00519           // new model from eta runs fit
00520           //  double rr, xfr=0.,slope=0.0;
00521           int Tail_todo=1;
00522           if ( Tail_todo==1 )
00523             {
00524 
00525 //        if ( Pran() <=0.085 )    // first small  correction..to be checked
00526               if ( Pran() <=0.090 )    // 19.07.09
00527 
00528                 {
00529                   if ( ep<=30.0 )
00530                     slope=32.5+1.25*ep;
00531                   else
00532                     slope=75.0;
00533                   rr =Pran();
00534                   if ( rr>1.e-9 )
00535 //          if ( rr>1.e-9 )      // 19.07.09
00536                     {
00537                       ep*= ( 1.0+log ( rr ) /slope );
00538                       SelRea->Tailsrt_done++;
00539                     }
00540                 }
00541 
00542 
00543               // add long tails from E/P nel 3 per mille
00544               if ( Pran() <=0.0021 )    // hadronproduction correction..
00545 //        if ( Pran() <=0.003 )    // 19.07.09
00546                 {
00547                   rr =Pran();
00548                   if ( rr>=0.000245 )
00549 //         if ( rr>=0.0001 )  // 19.07.09
00550                     xfr=0.92+log ( rr ) /10.14;
00551                   else
00552                     xfr=.1;
00553 
00554                   ep*=xfr;
00555                   SelRea->Tailong_done++;
00556                 }
00557 // tails done
00558             }
00559 
00560 
00561           //================================================================
00562 
00563 
00564           //  calcolo degli errori per il calorimetro
00565           //    x=Xdev[i][0]; y=Xdev[i][1];
00566           //    se= sqrt(0.01 + (0.001024+2.5e-5*ep)*ep);       // 1998
00567           se= sqrt ( 0.0081 + ( 0.001024+1.764e-5*ep ) *ep );      //1999
00568           ep=Pgauss ( se,ep );
00569 
00570           sx=sqrt ( 3.6e-3 + 0.1764/ep );   // correzione 2001
00571 //     sx=sqrt ( 2.5e-3 + 0.1806/ep );  // 19.07.09  ... vedere nella ricostruzione....
00572 //
00573 
00574           x=Pgauss ( sx,x );
00575           y=Pgauss ( sx,y );
00576         }
00578 
00579       else
00580         {
00581           // le altre particelle...pioni o "fuse" ..si usa un errore di 1 cm
00582           // per i mu si usa  2 mm.
00583 
00584           double sigma=1.; // for handron or "Fuse"
00585           if ( partnom==Mum||partnom==Mup )
00586             sigma=0.2;
00587           x=Pgauss ( sigma,x );
00588           y=Pgauss ( sigma,y );
00589 
00590           se= sqrt ( 0.0081 + ( 0.001024+1.764e-5*ep ) *ep );      //1999
00591           ep=Pgauss ( se,ep );
00592 
00593         }
00594       M_Hits[i].e_rivela=ep;
00595       M_Hits[i].Xdev.x=x;
00596       M_Hits[i].Xdev.y=y;
00597       M_Hits[i].Xlab=Devc2Lab ( M_Hits[i].Xdev );
00598 
00599 
00600       i++;
00601     }
00602 
00603 }
00604 //************************************
00605 //=====================Simula il rivelatore =======================
00611 int DevLkr::SimulaDev()
00612 {
00613   // this procedure performs a filter of the measures
00614   // to simulate the device response
00615   // attention for  no gamma particles...
00616 
00617 // opera sulla variabili di tipo (2) predifinite   M_Hits
00618 
00619 
00620   if ( mhit<1 ) return 0;
00621   emDev=0.;
00622   dead=0;
00623   // attenzione le dimensioni sono legate al massimo numere dellle particelle viste dal dev....
00624   int flag[30]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
00625   // hit number of gammas in the associated det. (remember:-1, 0,1,2,3,4,5)
00626 
00627 
00628   const char *pnome;
00629   // ----------
00630   // set flags and for  pions try to make life a little bit worse into lkr
00631   i=0;
00632   while ( i<=nhit )
00633     {
00634       flag[i]=1; // set all flags to 1
00635       pnome=M_Hits[i].pnome;
00636       if ( pnome==Pip||pnome==Pim )
00637         {
00638           M_Hits[i].e_rivela+=E_pio_Relesed( &M_Hits[i] );  //  released pion energy
00639         }
00640       i++;
00641     }
00642 
00643 
00644   // cuts
00645 
00647 
00648   double Ecutg=0.35;
00649 //    double Ecutg=.35;
00650 
00651   ht=nhit;
00652   while ( ht>-1 )
00653     {
00654       // qui tagli in energia sui gamma  o elettroni
00655       pnome=M_Hits[ht].pnome;
00656       if ( ! ( pnome==Gam||pnome==Elec||pnome==Elep ) )
00657         {
00658           ht--;
00659           continue;
00660         }
00661 
00662       if ( flag[ht]!=0&& ( M_Hits[ht].e_rivela<Ecutg ) )
00663         {
00664           flag[ht]=-2;
00665           dead++;
00666         } //  geometry
00667       else if ( ( xyd= M_Hits[ht].Xdev.XYNorma() ) < 10. ) //taglio sul tubo del calorimetro
00668         {
00669           flag[ht]=-1;
00670           dead++;
00671         } // geometrical  cut:
00672 
00673       else   //if still alive,  then  dead cels test....
00674         {
00675           x= M_Hits[ht].Xdev.x;
00676           y= M_Hits[ht].Xdev.y;
00677 
00678           int  killcel=Get_DeadCel ( x,y );
00679           if ( killcel==1 )
00680             {
00681               flag[ht]=-3;
00682               dead++;
00683             }
00684         }
00685       ht--;
00686     }
00687 
00688 
00689   //  cout<<"\n Lkr nhit dead "<< nhit<<" "<<dead<<" "<<killcel<<" "<<flag[0];
00690 
00691 
00693 //    for (int i=0;i<=nhit;i++)
00694 //    Gout<<"\n Lk: "<< evento_.Gen.Event<<setprecision(3)
00695 //    <<" xy "<< setw(8)<<M_Hits[i].Xdev.x<<" "<< setw(8)<<M_Hits[i].Xdev.y
00696 //    <<" e "<< setw(8)<< M_Hits[i].e_rivela<<" pr "<<M_Hits[i].idm<< " flg "<<flag[i];
00697 
00698 // Fusion procedure. Default to 1 ... zero for background test....
00699 
00700   if ( Fusione==1 )
00701     {
00702       evento_.Gen.Ifus=0;
00703       double ee1=0.0,ee2=0.0,eet=0.0;
00704       ht=nhit;
00705       while ( ht>-1 )
00706         {
00707           if ( flag[ht]<1 )
00708             {
00709               ht--;
00710               continue;
00711             }
00712           ee1=M_Hits[ht].e_rivela;
00713 
00714           gvet Daux=M_Hits[ht].Xdev;
00715 
00716 //      Daux.print("Daux");
00717 
00718           //
00719 
00720           hi=ht-1;
00721           while ( hi>-1 )
00722             {
00723               if ( flag[hi]<1 )
00724                 {
00725                   hi--;
00726                   continue;
00727                 } //skip...
00728 
00729               sepm = ( M_Hits[hi].Xdev-Daux ).XYNorma();   // distanza proiettata su xy
00730 
00731 //        if ( sepm<10. ) return 0;  // attenzione per Kl->pio0  ????
00732 
00733 
00734               if ( sepm<2. )           // allora  fusion sepm<2.
00735                 {
00736                   ee2=M_Hits[hi].e_rivela;
00737                   eet=ee1+ee2;
00738                   if ( eet<0.00001 )
00739                     {
00740                       M_Hits[hi].Xdev= ( M_Hits[ht].Xdev+ M_Hits[hi].Xdev ) *0.5;
00741                       M_Hits[hi].Xlab= ( M_Hits[ht].Xlab+ M_Hits[hi].Xlab ) *0.5;
00742                       M_Hits[hi].tempo= ( M_Hits[ht].tempo + M_Hits[hi].tempo ) *0.5;
00743                     }
00744                   else
00745                     {
00746                       M_Hits[hi].Xdev= ( M_Hits[ht].Xdev*ee1+ M_Hits[hi].Xdev*ee2 ) /eet;
00747                       M_Hits[hi].Xlab= ( M_Hits[ht].Xlab*ee1+ M_Hits[hi].Xlab*ee2 ) /eet;
00748                       M_Hits[hi].tempo= ( M_Hits[ht].tempo*ee1 + M_Hits[hi].tempo*ee2 ) /eet;
00749 
00750 
00751                     }
00752                   M_Hits[hi].Pdev+=M_Hits[ht].Pdev;
00753                   M_Hits[hi].Vers=M_Hits[hi].Pdev.Verso();
00754                   M_Hits[hi].e_rivela=eet;
00755 // to remeber that is an artefact define  idm =-1
00756                   M_Hits[hi].idm=-1;
00757 
00758                   if ( evento_.Gen.Event<1000 )
00759                     Gout<<" \n Fuse: "<<setw ( 8 ) <<evento_.Gen.Event<<setprecision ( 3 )
00760                     <<"  "<<setw ( 8 ) << M_Hits[hi].pnome<<" di "<<setw ( 8 ) <<ee2
00761                     <<" con " <<M_Hits[ht].pnome
00762                     <<" di "<<setw ( 8 ) <<ee1<<" sp "<<setw ( 8 ) <<sepm<<" " << M_Hits[hi].idm;
00763 
00764                   M_Hits[hi].pnome=Fuse;
00765 
00766                   flag[ht]=-4;
00767                   dead++;
00768                   evento_.Gen.Ifus++;
00769                   break;
00770                 }
00771               hi--;
00772             }
00773           ht--;
00774         }
00775     }
00776   // end fusione
00777 
00778   // soglia rivelazione nel kripton   400. MeV
00779 
00780   for ( int i=0;i<=nhit;i++ )
00781     {
00782 
00783 
00784       if ( flag[i]>=0 )
00785         {
00786           if ( M_Hits[i].e_rivela< 0.35 )
00787             {
00788               flag[i]=-5;
00789               dead++;
00790             }
00791           else
00792             {
00793               double xcl=M_Hits[i].Xdev.x;
00794               double ycl=M_Hits[i].Xdev.y;
00795               if ( ( xcl*xcl+ycl*ycl ) <144. )
00796                 {
00797                   flag[i]=-6;
00798                   dead++;
00799                 }
00800             }
00801         }
00802     }
00803 
00804 
00805   // compact the mesures....
00806   int htt=-1;
00807   for ( int i=0;i<=nhit;i++ )
00808     {
00809       if ( flag[i]>=0 )
00810         {
00811           htt++;
00812           emDev+=M_Hits[htt].e_rivela=   M_Hits[i].e_rivela;
00813           if ( htt==i )  continue;   //avoid to rewrite the same data into itsself...
00814           M_Hits[htt]=M_Hits[i];
00815         }
00816     }
00817 
00818   mhit=htt+1;  //attenzione ridefinizione da 1 a n anziche' da 0 a n-1;/*
00819   nhit=mhit-1;
00820 
00821 //cout<<"\n Lkr mhit "<< nhit<<" "<<mhit;
00822 
00823   // pad filling per trigger zero level
00824 
00825   Pad_Filling( );
00826 //=================================
00827   if ( Debugon==1 )
00828     Gout<<"\n CalSimul  "<<evento_.Gen.Event
00829     <<" mhit "<<setw ( 3 ) <<mhit<<" of "<<nhit+1
00830     <<"    dead "<<setw ( 3 ) << dead
00831     <<" fusi "<<setw ( 3 ) << evento_.Gen.Ifus
00832     <<" flag "<< flag[0]<<" "<<flag[1]<<" "<<flag[2]
00833     <<" " << flag[3]<<" "<<flag[4]<<" "<<flag[5]<<endl;
00834 
00835   return htt;
00836 }
00837 //******************************************
00838 double DevLkr::E_pio_Relesed( Bufdev *MH)
00839 {
00840   // nota MH sono i parametri misurati di un hit (vedi BufDev *)
00845   static double anor=0.0;
00846 
00847   // define the energy left in the hadronic interction if it has flagged idead=-3 
00848   if ( MH->idead!=-3 ) return 0.0;
00849   double brnd=Pran();
00850   if ( brnd<.3 ) return 0.;
00851 
00852 
00853   double rp=0.0, fp=0.0;
00854   //double alfa=10., beta=10.; originali
00855   double alfa=12., beta=10.;
00856   if ( anor==0.0 )  // prima volta calcolo l'integrale della fun. di distribuzione.
00857     {
00858       while ( rp<1. )
00859         {
00860           anor+= ( 1.-exp ( -alfa*rp ) ) *exp ( -beta*rp ) *rp*rp;
00861           rp+=0.01;
00862         }
00863     }
00864   // normal path(gvet_0)
00865 
00866   double rnd=Pran();
00867   rp=0.0;
00868   while ( rp<1. )
00869     {
00870       fp+= ( 1.-exp ( -alfa*rp ) ) *exp ( -beta*rp ) *rp*rp/anor;
00871       if ( fp>rnd ) break;
00872       rp+=0.01;
00873     }
00874   // correzione dell'energia rilasciata in funzione della profondita' di interazione
00875   double depth= ( 2.*Lout.z-MH->last_path ) /60.;
00876   double reduci =1.- exp ( -depth*depth );
00877   return rp* MH->Pdev.e*reduci;
00878 
00879 }
00880 //===============================================================
00881 
00882 void DevLkr::Reset_RootData()
00883 {
00884   hit_recorded=padhit=0;
00885   emDev=0.0;
00886   epad28=m28x=m28qx=m28y=m28qy=0.0;
00887   epad44=m44x=m44qx=m44y=m44qy=0.0;
00888   dist_max=0.;
00889 
00890 }
00891 
00892 
00893 //===============================================================
00895 
00896 
00897 const float DevLkr::Deadcl[90][2] =
00898 {
00899   {  -124.3518     ,   33.55526     },{  -104.6134     ,   21.71223     },
00900   {  -102.6396     ,  4.0000000E-07 },{  -96.71809     ,  -23.68606     },
00901   {  -88.82274     ,  -78.95355     },{  -82.90123     ,   61.18901     },
00902   {  -69.08435     ,   75.00587     },{  -67.11052     ,   45.39830     },
00903   {  -67.11052     ,   43.42446     },{  -67.11052     ,  -33.55526     },
00904   {  -67.11052     ,  -65.13667     },{  -65.13667     ,  -3.947674     },
00905   {  -59.21516     ,   114.4827     },{  -57.24132     ,   67.11052     },
00906   {  -53.29364     ,  -25.65990     },{  -51.31981     ,  -122.3780     },
00907   {  -49.34597     ,   112.5088     },{  -47.37213     ,  -1.973835     },
00908   {  -45.39829     ,   124.3519     },{  -45.39829     ,   122.3780     },
00909   {  -39.47677     ,  -3.947674     },{  -33.55526     ,   51.31981     },
00910   {  -25.65990     ,  -61.18900     },{  -23.68606     ,   23.68607     },
00911   {  -21.71222     ,  -100.6658     },{  -19.73838     ,   61.18901     },
00912   {  -17.76455     ,   106.5873     },{  -15.79071     ,   92.77043     },
00913   {  -5.921513     ,   65.13669     },{  -1.973835     ,   63.16285     },
00914   {   1.973843     ,   80.92740     },{   1.973843     ,  -33.55526     },
00915   {   3.947681     ,   19.73839     },{   9.869198     ,  -100.6658     },
00916   {   19.73839     ,  -96.71809     },{   21.71223     ,  -35.52909     },
00917   {   23.68607     ,   82.90123     },{   23.68607     ,  -33.55526     },
00918   {   25.65991     ,   122.3780     },{   25.65991     ,   5.921520     },
00919   {   27.63375     ,  -96.71809     },{   31.58142     ,   27.63375     },
00920   {   31.58142     ,   27.63375     },{   33.55526     ,   124.3519     },
00921   {   33.55526     ,   122.3780     },{   33.55526     ,  -7.895351     },
00922   {   33.55526     ,  -7.895351     },{   33.55526     ,  -23.68606     },
00923   {   35.52910     ,   102.6396     },{   35.52910     ,   96.71811     },
00924   {   35.52910     ,   59.21517     },{   35.52910     ,   53.29365     },
00925   {   35.52910     ,   47.37214     },{   35.52910     ,  -19.73838     },
00926   {   37.50294     ,   118.4303     },{   37.50294     ,   104.6135     },
00927   {   37.50294     ,   59.21517     },{   37.50294     ,  -65.13667     },
00928   {   39.47678     ,   53.29365     },{   41.45062     ,   39.47678     },
00929   {   41.45062     ,  -7.895351     },{   43.42446     ,   102.6396     },
00930   {   43.42446     ,   69.08437     },
00931   {   43.42446     ,   63.16285     },
00932   {   45.39830     ,   122.3780     },{   45.39830     ,   118.4303     },
00933   {   45.39830     ,   71.05820     },{   45.39830     ,   69.08437     },
00934   {   49.34597     ,   124.3519     },{   49.34597     ,   122.3780     },
00935   {   51.31981     ,   37.50294     },{   51.31981     ,   27.63375     },
00936   {   51.31981     ,  -55.26748     },{   55.26749     ,   73.03204     },
00937   {   55.26749     ,  -90.79659     },{   61.18901     ,   86.84891     },
00938   {   63.16285     ,  -19.73838     },{   65.13669     ,  -61.18900     },
00939   {   73.03204     ,  -90.79659     },{   76.97972     ,  -43.42445     },
00940   {   80.92740     ,  -35.52909     },{   90.79659     ,  -51.31981     },
00941   {   90.79659     ,  -51.31981     },
00942   {   92.77043     ,   80.92740     },
00943   {   92.77043     ,  -61.18900     },{   98.69194     ,   75.00587     },
00944   {   110.5350     ,  -1.973835     },{   116.4565     ,  -51.31981     },
00945   {   118.4303     ,  -17.76455     },{   118.4303     ,  -47.37213     }
00946 
00947 };
00948 
00949 int DevLkr::Get_DeadCel ( double x,double y )
00950 {
00951   // Lkr dead cell finding
00952   int  killcel=0;
00953   for ( int l=0;l<90;l++ )
00954     {
00955       if ( fabs ( x-Deadcl[l][0] ) <2. && fabs ( y-Deadcl[l][1] ) <2. )
00956         {
00957           killcel=1;
00958           break;
00959         }
00960     }
00961   // killcel =0 (x,y)not in a dead cell
00962   // killcel=1 (x,y)  is in a dead cell
00963   return killcel;
00964 };
00965 
 All Classes Namespaces Files Functions Variables