FlyoDoc_2011 Pisa 2011 by GmP --- 011

flyopunta/src/src_dev48/crossmat.cpp

00001 /***************************************************************************
00002  *   Copyright (C) 2005 by Giuseppe Pierazzini          Pisa 20.02.05      *
00003  *   pierazzini@unipi.it                                                   *
00004  *                                     F l y o                             *
00005  *   Epsi/NA48                                                             *
00006  ***************************************************************************/
00007 #include "crossmat.h"
00008 #include "parm.h"
00009 #include "evento.h"
00010 
00011 using namespace std;
00012 
00013 const float ss_xmin=0.0703443,ss_xmax=0.1333443;
00014 const float stepss= ( ss_xmax-ss_xmin ) /84.;
00015 const float stepvss= 0.0315/42.;
00016 
00017 
00018 
00019 
00020 
00021 
00022 CrossMat::CrossMat()
00023 {
00024   dati=0;
00025 
00026   Gout<<"\n CrossMat: Creo 3528 Elenti..."<<endl;
00027   for ( int i=0;i<3528;i++ ) Elem[i]=0;
00028 
00029 }
00030 
00031 
00032 CrossMat::~CrossMat()
00033 {
00034   delete Elem;
00035 }
00036 
00037 //====================
00038 
00039 double CrossMat::CrossAdd ( float gss_sort,float gvss_sort,float ss_sort,float vss_sort )
00040 {
00041 
00045 
00048 
00049 
00050   int gss,gvss,iss,ivss;
00051   gss= ( gss_sort-ss_xmin ) /stepss;
00052   gvss= gvss_sort/stepvss;
00053   iss= ( ss_sort-ss_xmin ) /stepss;
00054   ivss= vss_sort/stepvss;
00055 
00056 // get out if out of range
00057 
00058 
00059   if ( gss<0  ||gss>83 ) return 1000.;
00060   if ( gvss<0 ||gvss>41 ) return 1000.;
00061   if ( iss<0  ||iss>83 ) return 1000.;
00062   if ( ivss<0 ||ivss>41 ) return 1000.;
00063 
00064  
00065 // ok
00066   dati++;
00067 // memorizza  i dati di generazione
00068 
00069   int gi = gss+gvss*84;
00070 
00071   Cross *pg=Elem[gi];  // indice pg del Cross di generazione.....
00072   if ( pg==0 )         // se non esiste si crea....
00073   {
00074     Elem[gi]=pg=new Cross();
00075     pg->i=gss;pg->j=gvss;
00076     pg->n=1;
00077     pg->next=0;
00078     pg->dist=0.0;
00079 //    Gout<<"\n elem "<<dati<<"  "<<gi<<"  "<<pg->i<<" " <<pg->j<<"  "<<iss<< "  "
00080 //    <<ivss<< "  " <<endl;
00081   }
00082   else pg->n++;  // se esiste si incrementa solo
00083 
00084 
00085 // memorizza gli indici di ricostruzione
00086   // per distanza dei canali Generato-ricostruito
00087   double dss = gss-iss; double dvs=gvss-ivss;
00088 
00089   Cross *plast;
00090   Cross *px=pg->next;  // punto al secondo Cross ...dati ricostruito...
00091 
00092   if ( px==0 )  // non esiste  ne creo uno nuovo....
00093   {
00094     pg->next=px=new Cross();
00095     px->i=iss;px->j=ivss;
00096     px->n=1;
00097     px->next=0;
00098     px->dist=sqrt ( dss*dss+dvs*dvs );
00099   }
00100 
00101   else if ( px!=0 )
00102   {
00103     while ( px ) //test su tutti i Cross collegati a pg....
00104     {
00105       if ( px->i==iss&&px->j==ivss )
00106       {
00107         px->n++;
00108         break;
00109       }
00110 // se non sono uscito continuo...
00111       plast=px;
00112       px=px->next;
00113 
00114     }
00115 // se non ho trovato....px รจ ancora  nullo...
00116     if ( px==0 )  // non esiste  ancora ne creo uno nuovo....
00117     {
00118       plast->next=px=new Cross();
00119       px->i=iss;px->j=ivss;
00120       px->n=1;
00121       px->next=0;
00122       px->dist=sqrt ( dss*dss+dvs*dvs );
00123 
00124     }
00125   }
00126 
00127   return px->dist;
00128 
00129 }
00130 
00131 // printing
00132 void CrossMat::CrossPrint ( )
00133 {
00134   Cross *px,*pg;
00135 
00136   Gout <<"\n Crossmat summary  "<< setw ( 9 ) << dati;
00137   for ( int gi=0;gi<3528;gi++ )
00138   {
00139     pg=Elem[gi];
00140     if ( pg==0 ) continue;
00141 //  {Gout <<"\n Crossmat "<< gi << "  " << gss<< " " <<gvss<< "  elemento vuoto"; return;}
00142     Gout <<"\n El: "<< setw ( 5 ) <<gi<<" == "<< setw ( 3 ) << pg->i
00143     << " "<< setw ( 3 ) <<pg->j
00144     << " con "<< setw ( 8 ) << pg->n;
00145     px= pg->next;
00146     while ( px!=0 )
00147     {
00148       double dss = ( px->i-pg->i ), dvs= ( px->j-pg->j );
00149       double dif = sqrt ( dss*dss+dvs*dvs );
00150       Gout<<"\n    in --> " << setw ( 3 ) << px->i
00151       << " "<< setw ( 3 ) <<px->j
00152       << " con "<< setw ( 8 ) << px->n << "  d= "<<dif;
00153       px=px->next;
00154 
00155     }
00156   }
00157 
00158 
00159 }
00160 
00162 // listing
00163 void CrossMat::CrossList (const char* Res )
00164 {
00165   char *LisDat=new char[256];
00166   char ListaOut[256];
00167   std::ofstream Lout;
00168  
00169   sprintf ( LisDat,"%s_%d.dat",Res,evento_.Gen.Run );
00170   
00171   string AuxLis;AuxLis=LisDat;
00172   check_file_name ( OutDir,AuxLis );
00173   sprintf ( ListaOut,"%s/%s",OutDir,AuxLis.c_str() );  // Flyo running
00174 
00175   Lout.open ( ListaOut,ios::out );
00176   Cross *px,*pg;
00177 
00178   int gi=0;
00179   Gout <<"\n Crossmat  listing summary  Run "
00180   <<"  totali eventi "<< setw ( 9 ) << dati<<endl;
00181   Lout <<"\n Crossmat  listing summary  Run "
00182       <<"  totali eventi "<< setw ( 9 ) << dati<<endl;
00183   for ( int kss=0;kss<84;kss++ )
00184   {
00185     for ( int kvss=0;kvss<42;kvss++ )
00186     {
00187 
00188       gi =kss+kvss*84;
00189       pg=Elem[gi];
00190       if ( pg==0 ) continue;
00191 
00192       px= pg->next;
00193       while ( px!=0 )
00194       {
00195 
00196         Lout <<"\n "<< setw ( 3 ) << pg->i+1
00197         << " "<< setw ( 3 ) <<pg->j+1
00198         << setw ( 3 ) << px->i+1
00199         << " "<< setw ( 3 ) <<px->j+1
00200         << "  "<< setw ( 6 ) << px->n <<setprecision ( 2 )
00201         << "  "<< setw ( 5 ) << px->dist;
00202         px=px->next;
00203 
00204       }
00205 
00206 
00207 
00208     }
00209 
00210 
00211   }
00212 
00213 
00214 
00215 
00216 }
00217 
 All Classes Namespaces Files Functions Variables