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