FlyoDoc_2011 Pisa 2011 by GmP --- 011

flyopunta/src/src_dev/devsveto.cpp

00001 /***************************************************************************
00002  *   Copyright (C) 2009 by giuseppe Pierazzini                                      *
00003  *   giuseppe@pierazzini.it                                                               *
00004  *                                                                         *
00005  *                                                                         *
00006  *   This program is distributed in the hope that it will be useful,       *
00007  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00008  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.                  *
00009  *                                                                         *
00010  *  Dipartimento di Fisica  E.Fermi / INFN Pisa Italy                      *
00011  ***************************************************************************/
00012 #include "parm.h"
00013 #include "evento.h"
00014 #include "devsveto.h"
00015 using namespace GmpConst;
00016 using namespace std;
00017 
00018 
00034 DevSveto::DevSveto()
00035         : DevCrn()
00036 {
00037 
00038 //     double latox,latoy,latoz, rmedia;
00039 //   gvet *Ubl,*Use; //Versori degli assi dei blocchi e dei settori.
00040 //   gvet *C_bl,*C_sec; // centri dei blocchi e dei settori
00041 //   int Blocchi, iblocco,isector;
00042 //   double Fasebase;
00043 
00044     devtype=TypDevSveto;
00045     devclass="Sveto_Crn";
00046     rin =Lin.y=Lin.x;
00047     Lin.Norma();
00048     rinq=rin*rin;
00049 
00050     if (nickname[0]=='A' && nickname[1]=='n') { //serve per controllo, ma è superfluo
00051         if (nickname[2]!='9' && nickname[3]=='\0') { //anti 1-8 ('\0' è il null character!)
00052             Strati=5; //numero di strati per veto
00053             if (nickname[2]=='6'||nickname[2]=='7'||nickname[2]=='8') //anti 6-8
00054                 Blocchi=48;   // numero di blocchi per strato
00055             else //anti 1-5
00056                 Blocchi=32;
00057         }
00058         else { //anti 9-12
00059             Strati=4; //numero di strati per veto
00060             if (nickname[3]=='2') // anti 12
00061                 Blocchi=64;   // numero di blocchi per strato
00062             else // blocchi 9-11
00063                 Blocchi=60;   // numero di blocchi per strato
00064         }
00065     }
00066                 
00067     iblocco=-1;
00068     isector=-1;
00069     istrato=-1;
00070 
00071     //  Lout.z;  // = semispessore della corona in z
00072     latoy=latoz= Lout.z/Strati; // semispessori del leadglass ... (attenzione a Spectrometer09.app!)
00073     latox= rout-rin;   // lunghezza del leadglass=spessore della corona= rout-rin
00074 
00075 //calcolo i versori degli assi  e i centri  dei blocchi
00076 //il primo blocco ha l'asse orientato secondo la FaseBase.
00077 //il primo settore è spostato di Dfi5 in senso antiorario se guardato da downstream
00078 
00079     int TBlocchi=Strati*Blocchi;
00080 
00081     Dfi = 2.* PiGreco/Blocchi;
00082     U_bl=new gvet[TBlocchi];
00083     U_sc=new gvet[TBlocchi];
00084     C_bl=new gvet[TBlocchi];
00085     C_sc=new gvet[TBlocchi];
00086     double rmed=(rout+rin)*.5;
00087     double Dfi5=Dfi*0.5;
00088     for (int i=0;i<TBlocchi;i++)
00089     {
00090         istrato=(i/Blocchi);
00091         FaseBase[istrato]=istrato*(Dfi/Strati);
00092         double fi = FaseBase[istrato]+i*Dfi;
00093         // se Fasebase=0. il primo blocco è lungo l'asse x
00094         double Centro_z_strato=2.*latoz*istrato+latoz -Lout.z;
00095 
00096 //      Gout<<"\n C: "<< Centro_z_strato<<" " << i<< " "<<strato;
00097         U_bl[i].setvn(cos(fi),sin(fi),0);
00098         C_bl[i]= U_bl[i]*rmed;
00099         C_bl[i].z=Centro_z_strato;
00100         fi+=Dfi5;
00101         U_sc[i].setvn(cos(fi),sin(fi),0);
00102         C_sc[i]= U_sc[i]*rmed;
00103         C_sc[i].z=Centro_z_strato;
00104     }
00105     
00106     
00107     
00108     
00109 }
00110 
00111 DevSveto::~DevSveto()
00112 {
00113 }
00114 //======================================================
00115 //----------------- --------
00116 void DevSveto::Prgeom()
00117 {
00118     Gout<<"==================  R i v e l a t o r e =================";
00119     Gout<<"\n --> < "<<nome <<" >  [ "<<fun
00120     <<" ]  Contenitore a forma di corona cilindrica . ";
00121     Device::Prgeom();
00122 
00123 }
00124 int DevSveto::Get_Structinfo()
00125 {
00126     int code=-1;
00127     if ( istrato ==-1) return -1;
00128     if ( iblocco>-1) code=iblocco;
00129     if ( isector>-1) code=isector+1000;
00130     return code;
00131 }
00132 
00133 //----------------- -----P o s i z i o n e ---
00134 int DevSveto::Posizione()
00135 {
00136     int pos=0;
00137     iblocco=-1;
00138     isector=-1;
00139     istrato=-1;
00140     if ( ( pos=DevCrn::Posizione())!=0 ) return pos; // esce se esterno o nel "buco" della corona.
00141 //
00142 // qui ... la particella  è interno alla corona
00143 // in quale strato siamo
00144     istrato = int(0.5* (X_dev.z+Lout.z)/latoz); // 0<=istrato<5
00145 
00146 // verifico se il punto particella  è interno anche ad un blocco leadglass
00147 // Ricordo:
00148 // L'asse centrale di ogni blocco, pensato come un  parallelepipedo,  punta al centro della corona.
00149 // Il suo versore è individuato da Ubl[i] (calcolato prima) tipo Ubl[i]=(vx,vy,0).
00150 // Se il punto è nella corona la sua posizione in zeta e in alto-basso ( secondo il versore Ubl) è ok.
00151 // Dobbiamo calcolare la sua distanza dall'asse centrale sul piano  x,y
00152 //  e verificare che è minore della senilarghezza, laty,  dal blocco.
00153     double fdf,fi;
00154     gvet Xpunto=X_dev;
00155     Xpunto.z=0;
00156     fi=fdf =atan2 ( Xpunto.y,Xpunto.x )-FaseBase[istrato];  // attenzione deve essere sempre >0!!
00157     if (fi<0.)fi+=2.*PiGreco;
00158     iblocco=int(fi/Dfi+0.5) %Blocchi;// è il blocco più vicino al punto... aggiungo lo strato
00159     iblocco+=istrato*Blocchi;
00160 
00161 //  if(Eventi_Fatti<100) Gout<<"\n Pos1 "<<setw(8)<<pr_dev->Get_Ido()<<" "<<setw(8)<<X_dev.z<<" "
00162 //       <<setw(8)<<fi<<" " <<setw(3)<<iblocco<<" "<<setw(3) <<isector<< " " <<setw(3)<<istrato ;
00163 
00164     double dist= (Xpunto-U_bl[iblocco]*(U_bl[iblocco]%Xpunto)).Norma();
00165     if ( dist< latoy) return 0;  // è dentro il blocco "iblocco" con isector=-1;
00166 
00167 
00168 // non è nel blocco,ma è nel settore esterno al blocco
00169     iblocco=-1;
00170     fi=fdf-Dfi*0.5;
00171     if (fi<0.)fi+=2.*PiGreco;
00172 
00173     isector= int(fi/Dfi+0.5) %Blocchi + istrato*Blocchi;
00174 
00175 //    if(Eventi_Fatti<100) Gout<<"\n Pos2 "<<setw(8)<<pr_dev->Get_Ido()<<" "<<setw(8)<<X_dev.z<<" "
00176 //       <<setw(8)<<fi<<" " <<setw(3)<<iblocco<<" "<<setw(3) <<isector<< " " <<setw(3)<<istrato ;
00177 
00178     return -1;  // La particella è nel "buco", o meglio, nel settore  isector con iblocco=-1!
00179 
00180 }
00181 //===========================================================
00182 //----------------------C a m I n t e r --------------------
00183 
00184 double DevSveto::CamInter()
00185 {
00186     /*
00187      siamo in un blocco leadglass  iblocco.
00188     Procedura:
00189     1)Calcolo il cammino che dovrebbe fare la particella per uscire dallla corona e lo memorizzo in camm..
00190     2) Verifico il cammino per uscire lateralmente dal blocco.. se minore di camm ridefinisco camm.
00191       Per questo
00192      Calcolo un sistema interno (destrorso)  al blocco con:
00193     - l'asse z parallelo allo Z generale del dev
00194     - l'asse x nella direzione  del'asse del blocco
00195     - l'asse y perpendicolare ai due di prima.
00196     */
00197 
00198     DevCrn::CamInter();  // definisco il cammino "camm" nella corona
00199 
00200 //    Controllo nel blocco
00201     gvet Bx = U_bl[iblocco];
00202     gvet Bz(0.,0.,1.);
00203     gvet By = Bz&Bx;
00204     By=By.NVerso();
00205 
00206     gvet X_p = X_dev-C_bl[iblocco];  // vettore distanza del punto dal centro blocco
00207 
00208 
00209 // piani laterali paralleli in y  e lati in zeta
00210     double t=0.;
00211     double  bv=By%V_dev;
00212     if (fabs(bv)>0.)
00213     {
00214         if ( (t=(latoy-By%X_p)/bv) >0.  && t<camm) camm=t;
00215         else  if ( (t=-(latoy+By%X_p)/bv) >0. && t<camm) camm=t;
00216     }
00217     // e lati zeta
00218     bv=Bz%V_dev;
00219     if (fabs(bv)>0.)
00220     {
00221         if ( (t=(latoz-Bz%X_p)/bv) >0.  && t<camm) camm=t;
00222         else  if ( (t=-(latoz+Bz%X_p)/bv) >0. && t<camm) camm=t;
00223     }
00224     return camm;
00225 }
00226 
00227 
00228 double DevSveto::CamBuco()
00229 {
00230 
00231     if (isector==-1) // è nel buco della corona
00232         return DevCrn::CamBuco();
00233 
00234 // siamo dentro un settore tra due blocchi e all'interno della corona.
00235 
00236     DevCrn::CamInter(); // calcolo camm all'interno della corona
00237 
00238 // verifico se colpisco le superfici del settore adiacenti ai leadglass.
00239 // assi di riferimento e centro del settore
00240     gvet Sx = U_sc[isector];
00241     gvet Sz(0.,0.,1.);
00242     gvet Sy = Sz&Sx;
00243     Sy=Sy.NVerso();
00244 
00245 // calcolo il cammino verso il piano di destra e confronto
00246     gvet X_p = X_dev-C_sc[isector];
00247     int ib=isector;
00248     gvet Bx = U_bl[ib];
00249     gvet By = Sz&Bx;
00250     By=By.NVerso();     // normale al piano di destra
00251     gvet Xpd= C_bl[ib]+ By*latoy-C_sc[isector];  // un punto sul piano di destra riferito al centro settore.
00252 
00253     double t=0.;
00254     double sv=Sy%V_dev;
00255     if (fabs(sv)>0. && (t=(Sy%Xpd-Sy%X_p)/sv) >0. && t<camm) camm=t;
00256 
00257 // calcolo il cammino verso il piano di sinistra e confronto
00258     ib=(isector+1)%Blocchi;
00259     Bx = U_bl[ib];
00260     By = Sz&Bx;
00261     By=By.NVerso();     // normale al piano di destra
00262     Xpd= C_bl[ib]- By*latoy-C_sc[isector];  // un punto sul piano di destra riferito al centro settore.
00263 
00264     sv=Sy%V_dev;
00265     if (fabs(sv)>0. && (t=(Sy%Xpd-Sy%X_p)/sv) >0. && t<camm) camm=t;
00266 
00267 // e lati z dello strato
00268     sv=Sz%V_dev;
00269     if (fabs(sv)>0.)
00270     {
00271         if ( (t=(latoz-Sz%X_p)/sv) >0.  && t<camm) camm=t;
00272         else  if ( (t=-(latoz+Sz%X_p)/sv) >0. && t<camm) camm=t;
00273     }
00274 
00275     return camm;
00276 
00277 
00278 }
00279 
00280 
00281 
00282 
00283 
00284 
00285 
 All Classes Namespaces Files Functions Variables