FlyoDoc_2011 Pisa 2011 by GmP --- 011
|
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