FlyoDoc_2011 Pisa 2011 by GmP --- 011

flyopunta/src/src_uti/gvet.h

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
 All Classes Namespaces Files Functions Variables