FlyoDoc_2011 Pisa 2011 by GmP --- 011
|
Public Member Functions | |
DevStraw () | |
========================================= | |
int | SimulaDev () |
int | Set_tubo (int nb, double DX, double hit_time, int *tubo, double *T0, double *Ts, double *Tmp, int *Tcc) |
void | Set_tubi_errors (int itb, double *Ts, double *T0) |
int | Mscatter (Particella *, double) |
void | Prgeom () |
void | Get_wire () |
********************************************************************* | |
Public Attributes | |
DevStraw * | upstraw |
DevStraw * | nextstraw |
Tubiparm | TbParm |
int | tubiseen |
int | flag_pileup |
int | ntub1 |
int | tubo1 [16] |
int | use_tubo1 [16] |
int | toc_tubo1 [16] |
int | ntub2 |
int | tubo2 [16] |
int | use_tubo2 [16] |
int | toc_tubo2 [16] |
int | ntub3 |
int | tubo3 [16] |
int | use_tubo3 [16] |
int | toc_tubo3 [16] |
int | ntub4 |
int | tubo4 [16] |
int | use_tubo4 [16] |
int | toc_tubo4 [16] |
double | ts_tubo1 [16] |
double | t0_tubo1 [16] |
double | tmp_tubo1 [16] |
double | ts_tubo2 [16] |
double | t0_tubo2 [16] |
double | tmp_tubo2 [16] |
double | ts_tubo3 [16] |
double | t0_tubo3 [16] |
double | tmp_tubo3 [16] |
double | ts_tubo4 [16] |
double | t0_tubo4 [16] |
double | tmp_tubo4 [16] |
int | nwire |
float | Wirecoor [16] |
float | Wiredtim [16] |
float | Wiret0tim [16] |
float | Wiret0stim [16] |
float | Wiredtempo [16] |
Definition at line 55 of file devstraw.h.
DevStraw::DevStraw | ( | ) |
=========================================
Definition at line 27 of file devstraw.cpp.
: DevRtRt() { devtype=TypDevStraw; devclass="Straw Chamber"; Gout<<"\n\n < "<<nome <<" > Dev Id "<<idev<<" Device type <"<<devclass<<"> typ "<<devtype; static DevStraw *laststraw = 0; if ( laststraw== 0 ) FirstStraw=this; else laststraw->nextstraw = this; // linking upstraw=laststraw; laststraw = this; this->nextstraw = 0; // end linking for (int i=0;i<16;i++) { Wirecoor[i]=Wiredtim[i]=Wiret0tim[i]=Wiredtempo[i]=Wiret0stim[i]=0.; }; // attenzione questa istruzione va corretta a seconda del path...da aggiustare // char *Direttor={"../../mslibrary"}; string Direttor= "../../mslibrary"; Gout<<"\n Multiple Scattering data for dev "<< nome; if ( StrTetPip!=0 ) Gout<<" allready done."; else { Strawlib ( Direttor,string("pionplus"),StrTetPip, StrProbPip ); Strawlib ( Direttor,string("muon" ), StrTetMup, StrProbMup ); Strawlib ( Direttor,string("positron"),StrTetElep,StrProbElep ); /* for ( int i=0;i<1200;i++ ) { Gout<<"\n "<<i<<" " <<StrProbPip[10][i]<<" " <<StrProbPip[40][i]<<" " <<StrProbPip[70][i]; } */ } tubiseen=0; // test of this particular measured buffer dimension int dim= working_buffer; if (dim<MemoryBuffer) { dim=MemoryBuffer; Gout<<"\n In device ** "<<nome <<" ** measur_buffer adjusted to ==> "<<dim; } }
void DevStraw::Get_wire | ( | ) |
*********************************************************************
int FiloValida(int *flags, double *Tubo,double *T0, double *Ts);
int FiloValida(int,int *flags, int *Tubo,double *T0, double *Ts);
Definition at line 500 of file devstraw.cpp.
{ int ix=0; double Xwire[16],Xwiredtim[16],Xwiredtrailing[16],Xwiretrailsom[16],Xwiredtempo[16]; int piano[16]; for (int i=0;i<16;i++) use_tubo1[i]=use_tubo2[i]=use_tubo3[i]=use_tubo4[i]=-1; for (int i=0;i<16;i++) { Xwire[i]=Xwiredtim[i]=Xwiredtrailing[i]=Xwiretrailsom[i]=.0; Xwiredtempo[i]=-300.; } double trailing0=0.; int ntb,b3,b4; tempo_trigger=0.0; long Tnano= evento_.Gen.tempo; tempo_trigger=double((Tnano/trigger_res)*trigger_res) + trigger_res/2.; // cout<<"\n\n Start Ev "<<evento_.Gen.Event<<" "<<nome<<" mhit "<<mhit; // cout<<"\n Primo piano "<<ntub1; // primo piano for (int i=0;i<ntub1;i++) { TbParm.Reset(); trailing0=t0_tubo1[i]-tempo_trigger; if (fabs(trailing0)>tubo_res) continue; // qui si butta se siamo fuori tempo massimo.... TbParm.ntbc=TbParm.ntb=ntb =tubo1[i]; TbParm.tlead0=ts_tubo1[i]-tempo_trigger; // tempo di arrivo del segnale al filo centrale del tubo if (TbParm.tlead0<0.0||TbParm.tlead0>155.) continue; //test on plane 4 b4=TbParm.FiloValida(ntub4,use_tubo4,tubo4,t0_tubo4,ts_tubo4); //test on plane 3 b3=TbParm.FiloValida(ntub3,use_tubo3,tubo3,t0_tubo3,ts_tubo3); // test segno if defined.. if (TbParm.segno==0.0) continue; use_tubo1[i]=ntb; Xwire[ix]=TbParm.ntb*passo+XTref1+TbParm.segno*TbParm.tlead0/conv2time; Xwiredtim[ix]=TbParm.totdriftsav; Xwiredtrailing[ix]=TbParm.trailingsav-trailing0; Xwiretrailsom[ix]=TbParm.trailingsav+trailing0; Xwiredtempo[ix]=evento_.Gen.tempo-tmp_tubo1[i]; piano[ix]=ntb+1000*b3+1000000*b4; ix++; } // secondo piano //cout<<"\n Secondo piano "<<ntub2; for (int i=0;i<ntub2;i++) { TbParm.Reset(); trailing0=t0_tubo2[i]-tempo_trigger; if (fabs(trailing0)>tubo_res) continue; // qui si butta se siamo fuori tempo massimo.... TbParm.ntb=ntb =tubo2[i]; TbParm.tlead0=ts_tubo2[i]-tempo_trigger; // tempo di arrivo del segnale al filo centrale del tubo if (TbParm.tlead0<0.0||TbParm.tlead0>155.) continue; //test on plane 3 TbParm.ntbc=ntb; b3=TbParm.FiloValida(ntub3,use_tubo3,tubo3,t0_tubo3,ts_tubo3); //test on plane 4 TbParm.ntbc=ntb+1; b4=TbParm.FiloValida(ntub4,use_tubo4,tubo4,t0_tubo4,ts_tubo4); // test segno if defined.. if (TbParm.segno==0.0) continue; use_tubo2[i]=ntb; Xwire[ix]=TbParm.ntb*passo+XTref2+TbParm.segno*TbParm.tlead0/conv2time; Xwiredtim[ix]=TbParm.totdriftsav; Xwiredtrailing[ix]=TbParm.trailingsav-trailing0; Xwiretrailsom[ix]=TbParm.trailingsav+trailing0; Xwiredtempo[ix]=evento_.Gen.tempo-tmp_tubo2[i]; piano[ix]=-(ntb+1000*b3+1000000*b4); ix++; } nwire=ix; for (int i=0;i<nwire;i++) { Wirecoor[i]=Xwire[i]; Wiredtim[i]=Xwiredtim[i]; Wiret0tim[i]=Xwiredtrailing[i]; Wiret0stim[i]=Xwiretrailsom[i]; Wiredtempo[i]=Xwiredtempo[i]; } // verifico se l'evento nella camera è stato costruito con pileup flag_pileup=0; for (int i=0;i<nwire;i++) { if (Wiredtempo[i]!=0) flag_pileup++; } //if (nwire!=mhit) if (nwire< -10) { cout<<"\n ****** Ev "<<evento_.Gen.Event<<" "<<nome<<" mhit "<<mhit<< " nwire "<<nwire<<"\n"; for ( int k=0;k<mhit;k++ ) { double X1= M_Hits[k].Xdev.x ; cout<<" "<<M_Hits[k].pnome<<" "<<X1; } cout<<"\n "<< ntub1<<" "<<ntub2<<" " <<ntub3<< " "<<ntub4; for (int tb=0;tb<ntub1;tb++) cout<<"\n hit1 "<< tubo1[tb]<<" dt "<< ts_tubo1[tb]-evento_.Gen.tempo; for (int tb=0;tb<ntub2;tb++) cout<<"\n hit2 "<< tubo2[tb]<<" dt "<< ts_tubo2[tb]-evento_.Gen.tempo; for (int tb=0;tb<ntub3;tb++) cout<<"\n hit3 "<< tubo3[tb]<<" dt "<< ts_tubo3[tb]-evento_.Gen.tempo; for (int tb=0;tb<ntub4;tb++) cout<<"\n hit4 "<< tubo4[tb]<<" dt "<< ts_tubo4[tb]-evento_.Gen.tempo; cout<<"\n Dev "<<nome<<" nwire "<<nwire<< " x: "; for (int ix=0;ix<nwire;ix++) { cout<<" [ "<<piano[ix]<<" "<<Xwire[ix]<<" tt "<<Xwiredtim[ix]<<" ] "; } cout<<"\n coordinate M_Hit "; for (int i=0;i<mhit;i++) cout<< " "<<M_Hits[i].Xdev.x; cout<<endl; } }
int DevStraw::Mscatter | ( | Particella * | pr, |
double | tratok | ||
) | [virtual] |
qui pioni elettroni e muoni positivi tra 6 e 65 GeV/c
Reimplemented from Device.
Definition at line 92 of file devstraw.cpp.
{ //------------------------------------------------- // M S C A T T E R //------------------------------------------------- // ======= Multiple Scattering Routine ===== // at t e n z i o n e ... aggiustare per magnete e sfera!!! if (Scatter==0) return 0; // no multiple scattering required lrad=nowpos?lradb:lradi; if (lrad <= 0.0 || // no multiscat. pr->charg == 0.0 || // no charge tratok < 0.001 ) // no crossed space return 0; //=============================== qvet Pprev; double randx,randy; int libMom,jbin,passx,passy; double libProb,dthx,dthy; int pplus,positron,muon; if ( pr->P.norma<=6. || pr->P.norma>65. ) { return Device::Mscatter ( pr,tratok ); } if ( pr->Get_Nome() !=Pip && pr->Get_Nome() !=Elep && pr->Get_Nome() !=Mup ) { return Device::Mscatter ( pr,tratok ); } // Multiple Scattering library implementation // No gaussian multiple scattering for Pip,Elep,and Mup // Define type of particle pplus = positron = muon = 0; if ( !strcmp ( pr->Get_Nome(),"pip" ) ) pplus = 1; if ( !strcmp ( pr->Get_Nome(),"elep" ) ) positron = 1; if ( !strcmp ( pr->Get_Nome(),"mup" ) ) muon = 1; // Smear the coordinate according to the MSlib libProb = 0; passx = passy = 0; dthx = dthy = 0; randx = Pran(); randy = Pran(); libMom = ( int ) pr->P.norma; for ( jbin=0;jbin<1200;jbin++ ) { if ( pplus ) libProb = StrProbPip[libMom][jbin]; if ( positron ) libProb = StrProbElep[libMom][jbin]; if ( muon ) libProb = StrProbMup[libMom][jbin]; // libProb = libMSProb[libMom][jbin]; if ( !passx && libProb>randx ) { if ( pplus ) dthx = StrTetPip[jbin]; if ( positron ) dthx = StrTetElep[jbin]; if ( muon ) dthx = StrTetMup[jbin]; // dthx = msTheta[jbin]; passx = 1; } if ( !passy && libProb>randy ) { if ( pplus ) dthy = StrTetPip[jbin]; if ( positron ) dthy = StrTetElep[jbin]; if ( muon ) dthy = StrTetMup[jbin]; // dthy = msTheta[jbin]; passy = 1; } } // cout << dthx << " " << dthy << endl; pr->P.x += pr->P.norma*dthx; pr->P.y += pr->P.norma*dthy; pr->Vers=pr->P.Verso(); //------------------------------------------------- // D e g r a d o // ======= Multiple Scattering energy loss ===== // do nothing if .... if ( Perdita ==0 ) return 0; // no loss if ( nowpos==0 ) { Ro=Roint; Dedx=Dedxint; } else if ( nowpos==-1 ) { Ro=Robuc; Dedx=Dedxbuc; } else return 0; if ( Ro == 0.0 ) return 0; // no densita' if ( Dedx == 0.0 ) return 0; // no Dedx // p=Puls.norma; double p=0.; double persa=0.0; persa= Dedx*tratok; //in GeV double ee=pr->P.e; if ( persa>= ( ee-pr->massa ) ) { persa=ee-pr->massa; p=0.0; ee=pr->massa; } else { ee-=persa; p = sqrt ( ee*ee - pr->massa*pr->massa ); } gvet Pscat=pr->Vers*p; pr->P.x=Pscat.x; pr->P.y=Pscat.y; pr->P.z=Pscat.z; pr->P.z = ee; pr->P.Norma(); if ( Debugon==1 ) Gout<<" de="<<setw ( 6 ) <<persa<<" P "<<setw ( 6 ) <<pr->P.norma; // Gout<<"\n Msc "<<pr->nome<<" gnhit "<< gnhit<<" ghcir "<<ghcir; if ( rivela==0 ) Hits[nhit].e_rivela+=persa; // attenzione nello hit generato... return 0; }
int DevStraw::SimulaDev | ( | ) | [virtual] |
simulaziome fili toccati
Reimplemented from Device.
Definition at line 335 of file devstraw.cpp.
{ tubiseen=ntub1=ntub2=ntub3=ntub4=0; for (int i=0;i<16;i++) toc_tubo1[i]=toc_tubo2[i]=toc_tubo3[i]=toc_tubo4[i]=0; // calcolo dei delle straw attraversate // // Ricordo alcuni parametri geometrici // passo = 1.76 cm uguale alla distanza tra i centri delle straw su di uno stesso piano // Distanza in zeta del piano 2 dal piano 1 d12= sqrt(3/4)*passo=1.524 cm // Distanza del piano 3 dal piano 1: d13= sqrt(3/4)*(2*passo+pass4) =3.429 cm // Distanza del piano 4 dal piano 1: d14= sqrt(3/4)*(3*passo+pass4) =4.953 cm // centro in x dello straw tube più a destra del piano 1: Xt= -basecm // centro in x dello straw tube più a destra del piano 2: Xt= -104.56+passo/2 = -103.68 cm // centro in x dello straw tube più a destra del piano 3: Xt= -104.56+passo/4 = -104.12 cm // centro in x dello straw tube più a destra del piano 4: Xt= -104.56-passo/4 = -105.00 cm nwire=0; double X1=0.,X2=0.,X3=0.,X4=0., tgxz=0.; // cout<<"\n Device "<<nome<<" mhit "<<mhit<<"\n"; for ( int k=0;k<mhit;k++ ) { // attenzione si lavora nel sistema del dev... gvet verso=Lab2Dev(M_Hits[k].Vers); tgxz=verso.x/verso.z; X1= M_Hits[k].Xdev.x ; double tempo_hit=M_Hits[k].tempo; // cout<<"\n\nhit Ev "<<evento_.Gen.Event<<" "<<M_Hits[k].pnome<<" x "<<X1<<" tgz "<<tgxz; ntub1=Set_tubo(ntub1,X1-XTref1,tempo_hit,tubo1,t0_tubo1,ts_tubo1,tmp_tubo1,toc_tubo1); X2= X1 + tgxz*d12; ntub2=Set_tubo(ntub2,X2-XTref2,tempo_hit,tubo2,t0_tubo2,ts_tubo2,tmp_tubo2,toc_tubo2); X3= X1 + tgxz*d13; ntub3=Set_tubo(ntub3,X3-XTref3,tempo_hit,tubo3,t0_tubo3,ts_tubo3,tmp_tubo3,toc_tubo3); X4= X1 + tgxz*d14; ntub4=Set_tubo(ntub4,X4-XTref4,tempo_hit,tubo4,t0_tubo4,ts_tubo4,tmp_tubo4,toc_tubo4); } // set the errors.... // prima di definire gli errori occorre conoscere come viene esattamente generato // il segnale di trailing e tleading. Set_tubi_errors(ntub1, ts_tubo1, t0_tubo1); Set_tubi_errors(ntub2, ts_tubo2, t0_tubo2); Set_tubi_errors(ntub3, ts_tubo3, t0_tubo3); Set_tubi_errors(ntub4, ts_tubo4, t0_tubo4); tubiseen=ntub1+ntub2+ntub3+ntub4; Get_wire(); return 1; }