FlyoDoc_2011 Pisa 2011 by GmP --- 011
|
00001 /*************************************************************************** 00002 GVET.H 00003 ------------------- 00004 revised : Febbraio settembre 2010 00005 copyright : (C) 2000 by Giuseppe M Pierazzini 00006 email : pierazzini@unipi.it 00007 ***************************************************************************/ 00015 #ifndef GVET_H 00016 #define GVET_H 00017 #include <cmath> 00018 00019 //**************************************************** 00020 // 00021 //------------------- Vettori tridimensionali -------------- 00022 //---------------------------------------------------- 00023 // algebra: 00024 // Operator/Method Description 00025 //---- COSTRUCTOR--- 00026 // gvet() : empty vector 00027 // gvet(double a,double b,double c) : vector= (a,b,c) 00028 00029 //---OPERATOR ------ ----------- 00030 // operator ! : to calculate inversion of matrix. 00031 // operator += : combined subtraction and assignment operator 00032 // operator -= : combined subctraction and assignment operator 00033 // operator - : Unary change of sign 00034 // gvet & operator=(gvet *a) : permette V= *vec 00035 // void operator=(double *a) : permette V=a; con a[] = {x,y,z} 00036 // gvet & operator+(gvet &) : V= V1 + V2 00037 // gvet & operator+(gvet* a) : V= V1 + *V2 00038 // gvet & operator-(gvet &) : V= V1 - V2 00039 // gvet & operator-(gvet* a) : V= V1 - *V2 00040 // gvet & operator&(gvet &) : Prodotto vettoriale 00041 // gvet & operator&(gvet *b) : Prodotto vettoriale 00042 // gmat & operator&(gmat &) : Prodotto vettoriale generalizzato ad una matrice M=VxM1 00043 // gvet & operator %( gmat &): Prodotto vettore x matrice in vettore V= V1.M 00044 // double operator%(gvet & A): Prodotto scalare 00045 // double operator%(gvet * A): Prodotto scalare 00046 // gvet & operator*=(double c) : operatore *= per una costante 00047 // gvet & operator/=(double c) : operatore /= per una costante 00048 00049 //----- FUNCTIONS --- 00050 // gvet & Verso() : calcola il versore... 00051 // gvet & NVerso() : calcola prima la norma.. just in the case!! + 00052 // double Norma() : calcola la Norma 00053 // double XYNorma() : calcola la norma solo sul piano xy 00054 // double YZNorma() : calcola la norma solo sul piano yz 00055 // double ZXNorma() : calcola la norma solo sul piano zx 00056 // gvet & NxzVerso() : Versore sul piano xz 00057 // gvet & NyzVerso() : Versore sul piano yz 00058 // gvet & setvn(double a,double b,double c) : define V e normalizza 00059 // gvet & setvn(double *a) : define V e normalizza 00060 // gvet & setv(double a,double b,double c) : define V e NON normalizza 00061 // gvet & setv(double *a) : define V e NON normalizzarriva solo con if(Nome== 00062 00063 // virtual void Reset() : azzera 00064 // void putv(double &x,double &y,double &z) : define x,y,z 00065 // void putv(float &x,float &y,float &z) : define x,y,z 00066 // void putvn(double &a,double &b,double &c,double &d) 00067 // void putvn(float &a,float &b,float &c,float &d) 00068 // virtual void print(char *) : stampa info 00069 //------------------------------------------------------- 00070 class gmatrix; 00071 class gvet 00072 { 00073 00074 protected: 00075 union 00076 { 00077 struct { 00078 double x, y, z,t; 00079 }; // t è per combalità con i quadrivettori 00080 struct { 00081 double px, py, pz,e; 00082 }; 00083 double v[4];// componenti del vettore 00084 }; 00085 public: 00086 union 00087 { 00088 struct { 00089 double norma,normaq; 00090 }; 00091 struct { 00092 double mom,momq; 00093 }; 00094 }; 00095 // norma ... attenzione va aggiornato se cambia v. 00096 00097 gvet() { 00098 x=y=z=0.0; 00099 normaq=norma=0.0; 00100 }; 00101 gvet ( double a,double b, double c ) 00102 { 00103 x= a; 00104 y= b; 00105 z= c; 00106 normaq=x*x+y*y+z*z; 00107 norma=sqrt ( normaq ); 00108 }; 00109 // operatori delicati possono generare grane...meglio usare setvn,setv 00110 // gvet(double * p){x=p[0];y=p[1];z=p[2];normaq=x*x+y*y+z*z;norma=sqrt(normaq);}; 00111 // gvet(double p){x=y=z=p; normaq=3.*p*p; norma=sqrt(normaq);}; 00112 //------------------- 00113 virtual ~gvet() {}; 00114 00115 double& operator[] ( int i ) { 00116 return v[i]; 00117 }; 00118 double& operator() ( int i ) { 00119 return v[i]; 00120 }; 00121 // operatore unario di cambio segno 00122 gvet operator-(); 00123 00124 double Norma() 00125 { 00126 normaq=x*x+y*y+z*z; 00127 norma=sqrt ( normaq ); 00128 return norma; 00129 }; 00130 double XYNorma() { 00131 return sqrt ( x*x+y*y ); 00132 }; 00133 double YZNorma() { 00134 return sqrt ( y*y+z*z ); 00135 }; 00136 double ZXNorma() { 00137 return sqrt ( z*z+x*x ); 00138 }; 00139 gvet Verso() { 00140 return *this/norma; 00141 }; // calcola il versore... 00142 gvet NVerso() { 00143 Norma(); // calcola la norma.. just in the case!! 00144 return *this/norma; 00145 } 00146 00147 gvet NxzVerso(); // Versore sul piano xz 00148 gvet NyzVerso(); // Versore sul piano yz 00149 00151 00152 // gvet & operator = ( gvet *a ) 00153 // { 00154 // *this=*a; 00155 // return *this; 00156 // } 00157 00158 gvet & operator = ( gmatrix &m ); 00159 00160 00161 00162 00163 gvet operator+ ( const gvet & ); 00164 gvet operator+ ( gvet* a ) { 00165 return *this+*a; 00166 } 00167 gvet operator- ( const gvet& a ); 00168 gvet operator- ( gvet* a ) { 00169 return *this-*a; 00170 } 00171 00172 00173 // this+=V; this-=V; 00174 gvet & operator+= ( const gvet& a ) // attenzione non calcola norma.. 00175 { 00176 x+=a.x; 00177 y+=a.y; 00178 z+=a.z; 00179 return *this; 00180 } 00181 gvet & operator+= ( gvet * a ) // attenzione non calcola norma.. 00182 { 00183 *this+=*a; 00184 return *this; 00185 } 00186 00187 gvet & operator-= ( const gvet& a ) // attenzione non calcola norma.. 00188 { 00189 x-=a.x; 00190 y-=a.y; 00191 z-=a.z; 00192 return *this; 00193 } 00194 gvet & operator-= ( gvet * a ) // attenzione non calcola norma.. 00195 { 00196 *this-=*a; 00197 return *this; 00198 } 00199 00200 00201 00202 00203 //Prodotto vettoriale P=this.x.A 00204 gvet operator & ( const gvet & ); 00205 gvet operator & ( gvet *b ) { 00206 return *this & *b; 00207 } 00208 // prodotto esterno per una matrice 00209 00210 00211 00212 // prodotto scalare 00213 double operator% ( const gvet & A ) 00214 { 00215 return ( x*A.x+y*A.y+z*A.z ); 00216 }; // prodotto scalare 00217 double operator% ( gvet * A ) { 00218 return *this%*A; 00219 }; 00220 friend double operator% ( gvet * A,gvet & B ) { 00221 return *A%B; 00222 } ; 00223 00224 // prodotto per un parametro this*a 00225 gvet operator* ( const double ); 00226 // friend gvet operator*(double c, gvet & A){ return (A*c);} // friend function 00227 friend gvet operator* ( double c, gvet A ) { 00228 return ( A*c ); 00229 } 00230 // divide per un parametro 00231 gvet operator/ ( const double a ) { 00232 double b=1./a; 00233 return *this*b; 00234 } 00235 00236 // operatore *= per una costante 00237 gvet & operator*= ( double c ) 00238 { 00239 x*=c; 00240 y*=c; 00241 z*=c; 00242 norma*=fabs ( c ); 00243 normaq=norma*norma; 00244 return *this; 00245 } 00246 00247 // operatore /= per una costante 00248 gvet & operator/= ( double c ) 00249 { 00250 x/=c; 00251 y/=c; 00252 z/=c; 00253 norma/=fabs ( c ); 00254 normaq=norma*norma; 00255 return *this; 00256 } 00257 00258 00259 00260 gmatrix& operator >> (gmatrix &); 00261 00262 00263 // vettore per una matrice 00264 // gvet & operator %( gmat &); 00265 //setting or putting 00266 virtual void Reset() { 00267 x=y=z=t=norma=normaq=0.; 00268 }; 00269 gvet & setvn ( const double a,const double b,const double c ) { 00270 x=a; 00271 y=b; 00272 z=c; 00273 Norma(); 00274 return *this; 00275 } 00276 gvet & setvn ( const float a,const float b,const float c ) { 00277 x=a; 00278 y=b; 00279 z=c; 00280 Norma(); 00281 return *this; 00282 } 00283 00284 00285 gvet & setvn ( double *a ) { 00286 x=a[0]; 00287 y=a[1]; 00288 z=a[2]; 00289 Norma(); 00290 return *this; 00291 } 00292 gvet & setv ( double a,double b,double c ) { 00293 x=a; 00294 y=b; 00295 z=c; 00296 return *this; 00297 } 00298 00299 gvet & setvt ( double a,double b,double c,double g) { 00300 x=a; 00301 y=b; 00302 z=c; 00303 t=g; //il tempo !!! 00304 return *this; 00305 } 00306 00307 00308 gvet & setv ( double *a ) { 00309 x=a[0]; 00310 y=a[1]; 00311 z=a[2]; 00312 return *this; 00313 } 00314 00320 void putv( double &a,double &b,double &c ) { 00321 a=x; 00322 b=y; 00323 c=z; 00324 } 00325 void putv( float &a,float &b,float &c ) { 00326 a=x; 00327 b=y; 00328 c=z; 00329 } 00330 void putv( double *a ) { 00331 a[0]=x; 00332 a[1]=y; 00333 a[2]=z; 00334 } 00335 00336 void putvn(double &a,double &b,double &c,double &d ) { 00337 a=x; 00338 b=y; 00339 c=z; 00340 d=norma; 00341 } 00342 void putvn( float &a,float &b,float &c,float &d ) { 00343 a=x; 00344 b=y; 00345 c=z; 00346 d=norma; 00347 } 00348 void putvn( double *a) { 00349 a[0]=x; 00350 a[1]=y; 00351 a[2]=z; 00352 a[3]=norma; 00353 } 00354 00355 virtual void print ( const char * ); 00356 virtual void print ( long ev,const char *pnome,int pid,const char *devnome ); 00357 }; 00358 00359 00360 //**************************************************** 00361 //**************************************************** 00362 //===================================================== 00363 // The 4 dimensions vector @author Giuseppe Pierazzini 00364 //----------------------------------------------------- 00365 //---------------------------------------------------- 00366 // algebra: 00367 // Operator/Method Description 00368 // constructor 00369 // qvet(double ); 00370 // qvet(double*); 00371 // qvet(gvet &,double); 00372 // qvet(double,double,double,double); 00373 00374 // operatori 00375 // qvet & operator=(qvet *a) ; 00376 // void operator=(double *a) ;attenzione come (px,py,pz,m) 00377 // qvet & operator+=(qvet& a) ; 00378 // qvet & operator+=(qvet * a) ; 00379 // qvet & operator-=(qvet& a) ; 00380 // qvet & operator-=(qvet * a) ; 00381 // qvet & operator-() ;operatore unario: solo space 00382 // qvet & operator+(qvet &) ; 00383 // qvet & operator+(qvet* a) ; 00384 // qvet & operator-(qvet &) ; 00385 // qvet & operator-(qvet* a) ; 00386 // double operator*(qvet & A) ;prodotto scalare tra quadrivettori 00387 // double operator*(qvet * A) ; 00388 // friend double operator*(qvet * A,qvet & B) 00389 // qvet & operator*(double ) ;prodotto per un parametro 00390 // friend qvet & operator*(double a,qvet & B) 00391 // qvet & operator/(double a) ;divisione per un parametro 00392 00393 // double Invar(); 00394 // double Invarq(); 00395 // double Energia(); //Calcola l'energia a partire dalla massa e impulso 00396 // double Impulso(); //Calcola l'impulso a partire dalla massa e energia 00397 00398 // qvet & setvn(double a,double b,double c, double d) 00399 // qvet & setvn(double *a) 00400 // qvet & setvn(gvet &Vg,double a) 00401 // qvet & setv(double a,double b,double c,double mass) 00402 // qvet & setv(double *a) 00403 // qvet & setv(gvet &Vg,double a) 00404 00405 // set del quadrivettore ; il quarto valore e' l'energia; 00406 // qvet & setqn(double a,double b,double c, double d) 00407 // qvet & setqn(double *a) 00408 // qvet & setqn(gvet &Vg,double a) 00409 00410 // void Reset() 00411 // void putq(double &a,double &b,double &c,double &d) 00412 00413 // void putq(double *a) 00414 00415 // qvet & Lburst(qvet &); //lorentz buster....in direzione di Burst... 00416 // void print(char *); 00417 //------------------------------------------------------------------------------- 00418 00424 class qvet:public gvet 00425 { 00426 friend class gvet; 00427 protected: 00428 // double e = componente [3] del vettore V 00429 public: // norma ... attenzione va aggiornato se cambia v. 00430 double m,mq; // invariante relativistico... 00431 qvet() { 00432 x=y=z=e=m=mq=normaq=norma=0.0; 00433 }; 00434 qvet ( double ); 00435 qvet ( double* ); 00436 qvet ( gvet ,double ); 00437 qvet ( double,double,double,double ); 00438 ~qvet() {}; 00439 double Invar(); 00440 double Invarq(); 00441 double Energia(); //Calcola l'energia a partire dalla massa e impulso 00442 double Impulso(); //Calcola l'impulso a partire dalla massa e energia 00443 00445 qvet & operator= ( qvet *a ) { 00446 *this=*a; 00447 return *a; 00448 } 00449 void operator= ( double *a ); // attenzione come (px,py,pz,m) 00450 qvet & operator+= ( const qvet& a ); // attenzione non calcola norma.. 00451 qvet & operator+= ( qvet * a ) { 00452 *this+=*a; 00453 return *this; 00454 } 00455 qvet & operator-= ( const qvet& a ); // attenzione non calcola norma.. 00456 qvet & operator-= ( qvet * a ) { 00457 *this-=*a; 00458 return *this; 00459 } 00460 qvet operator-(); // operatore unario: solo space 00461 00462 qvet operator+ ( const qvet & ); 00463 qvet operator+ ( qvet* a ) { 00464 return *this+*a; 00465 }; 00466 qvet operator- ( const qvet & ); 00467 qvet operator- ( qvet* a ) { 00468 return *this-*a; 00469 } 00470 00471 // prodotto vettoriale... eredita! 00472 // prodotto scalare quadrivettoriale 00473 00474 double operator* ( const qvet & A ) { 00475 return ( e*A.e- ( x*A.x+y*A.y+z*A.z ) ); 00476 } 00477 double operator* ( qvet * A ) { 00478 return *this**A; // idem 00479 } 00480 friend double operator* ( qvet * A,qvet & B ) { 00481 return *A*B; 00482 } 00483 00484 00485 qvet operator* ( double ); // prodotto per un parametro 00486 // friend qvet operator*(double a,qvet & B){return B*a;}; 00487 friend qvet operator* ( double a,qvet B ) { 00488 return B*a; 00489 }; 00490 00491 qvet operator/ ( double a ) { 00492 a=1./a; 00493 return *this*a; 00494 } 00495 00496 00497 // set del vettore parte spaziale; il quarto valore e' la massa 00498 // calcola la norma e l'energia 00499 00500 qvet & setvn ( const double a,const double b,const double c, const double massa ) 00501 { 00502 x=a; 00503 y=b; 00504 z=c; 00505 m=massa; 00506 mq=m*m; 00507 normaq=x*x+y*y+z*z; 00508 norma=sqrt(normaq); 00509 e=sqrt(normaq+mq); 00510 return *this; 00511 } 00512 qvet & setvn ( double *a ) 00513 { 00514 x=a[0]; 00515 y=a[1]; 00516 z=a[2]; 00517 m=a[3]; 00518 mq=m*m; 00519 normaq=x*x+y*y+z*z; 00520 norma=sqrt(normaq); 00521 e=sqrt(normaq+mq); 00522 return *this; 00523 } 00524 qvet & setvn ( gvet Vg,const double massa ) 00525 { 00526 x=Vg[0]; 00527 y=Vg[1]; 00528 z=Vg[2]; 00529 m=massa; 00530 mq=m*m; 00531 normaq=x*x+y*y+z*z; 00532 norma=sqrt(normaq); 00533 e=sqrt(normaq+mq); 00534 return *this; 00535 } 00536 00537 // set del vettore parte spaziale; il quarto valore e' la massa; non normalizza 00538 00539 qvet & setv ( double a,double b,double c,double massa ) 00540 { 00541 x=a; 00542 y=b; 00543 z=c; 00544 m=massa; 00545 return *this; 00546 } 00547 qvet & setv ( double *a ) 00548 { 00549 x=a[0]; 00550 y=a[1]; 00551 z=a[2]; 00552 m=a[3]; 00553 return *this; 00554 } 00555 qvet & setv ( gvet &Vg,double massa ) 00556 { 00557 x=Vg[0]; 00558 y=Vg[1]; 00559 z=Vg[2]; 00560 m=massa; 00561 return *this; 00562 } 00563 00564 // set del quadrivettore ; il quarto valore e' l'energia; 00565 // calcolo della norma e dell'invariante 00566 qvet & setqn ( double a,double b,double c, double eg ) 00567 { 00568 x=a; 00569 y=b; 00570 z=c; 00571 e=eg; 00572 Invar(); 00573 return *this; 00574 } 00575 qvet & setqn ( double *a ) 00576 { 00577 x=a[0]; 00578 y=a[1]; 00579 z=a[2]; 00580 e=a[3]; 00581 Invar(); 00582 return *this; 00583 } 00584 qvet & setqn ( gvet Vg,double eg ) 00585 { 00586 x=Vg[0]; 00587 y=Vg[1]; 00588 z=Vg[2]; 00589 e=eg; 00590 Invar(); 00591 return *this; 00592 } 00593 00594 void Reset() { 00595 x=y=z=e=norma=normaq=m=mq=0.; 00596 }; 00597 00598 00605 void putq( double &a,double &b,double &c,double &d ) { 00606 a=x; 00607 b=y; 00608 c=z; 00609 d=e; 00610 } 00611 void putq( float &a,float &b,float &c,float &d ) { 00612 a=x; 00613 b=y; 00614 c=z; 00615 d=e; 00616 } 00617 00618 void putq( double *a ) { 00619 a[0]=x; 00620 a[1]=y; 00621 a[2]=z; 00622 a[3]=e; 00623 } 00624 00625 00626 00627 00628 void Riposo() { // con massa già definita 00629 x=y=z=norma=normaq=0.; 00630 e=m; 00631 mq=m*m; 00632 }; 00633 void Riposo(double massa) {// con massa in input 00634 x=y=z=norma=normaq=0.; 00635 e=m=massa; 00636 mq=m*m; 00637 }; 00638 qvet & Lburst ( qvet & Burst ); //lorentz buster....in direzione del Burst... 00639 void print ( const char * ); 00640 void print ( long ev,const char *pnome,int pid,const char *devnome ); 00641 }; 00642 00643 #endif