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