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 00013 #include "illumina.h" 00014 #include "flyoh.h" 00015 00016 //using namespace std; 00017 00018 Illumina::Illumina() 00019 { 00020 npr=0; 00021 illumina_buffer_dim=100; //attention: ok with cuts... without cuts better to keep 300. 00022 Make_illumina_buffer ( illumina_buffer_dim ); 00023 Gout<<"\n Illumination required: DONE of "<<illumina_buffer_dim<<" dimension"; 00024 } 00025 00026 00027 Illumina::~Illumina() 00028 { 00029 } 00030 //==================R a d x ============================= 00031 void Illumina::Make_illumina_buffer ( int rdim ) 00032 { 00033 // make space 00034 idm = new int[rdim]; 00035 id = new int[rdim]; 00036 ifato = new int[rdim]; 00037 devstry= new unsigned long long[rdim]; 00038 xg = new float[rdim]; 00039 yg = new float[rdim]; 00040 zg = new float[rdim]; 00041 tg = new float[rdim]; 00042 xf = new float[rdim]; 00043 yf = new float[rdim]; 00044 zf = new float[rdim]; 00045 pxg = new float[rdim]; 00046 pyg = new float[rdim]; 00047 pzg = new float[rdim]; 00048 eg = new float[rdim]; 00049 pxf = new float[rdim]; 00050 pyf = new float[rdim]; 00051 pzf = new float[rdim]; 00052 ef = new float[rdim]; 00053 mass = new float[rdim]; 00054 theta = new float[rdim]; 00055 thetastar = new float[rdim]; 00056 pxsg = new float[rdim]; 00057 pysg = new float[rdim]; 00058 pzsg = new float[rdim]; 00059 esg = new float[rdim]; 00060 } 00061 //===================== I l l u m i n a ========================= 00062 void Illumina::Store_Illumina() 00063 { 00064 // generated data...info for debug activated by illumina 00065 // do not activate if pipeline is on 00066 Particella *pr; 00067 const char *ft; 00068 static qvet Stesso; 00069 00070 // calcoli per gas 00071 pr=SelRea->avo->next; 00072 qvet Ptot; 00073 while (pr!=0&&pr->Get_Id()==0) // calcolo del quadriimpulso delle particelle generate da Fluka 00074 { 00075 Ptot+=pr->Get_Gp(); 00076 pr=pr->next; 00077 00078 } 00079 Ptot.Invarq(); 00080 Ptot.putq(pxtgas,pytgas,pztgas,Etgas); 00081 mqgas=Ptot.mq; 00082 Ptot.x=-1.*Ptot.x; 00083 Ptot.y=-1.*Ptot.y; 00084 Ptot.z=-1.*Ptot.z; 00085 qvet Ppart=SelRea->avo->Get_Gp(); 00086 Ppart.Lburst(Ptot); 00087 00088 pr=SelRea->avo; 00089 npr=0; 00090 while ( pr!=0 ) 00091 { 00092 if (dectubo==0) { //luce per TUTTE le particelle generate 00093 if ( ( ft=pr->Get_Fato() ) == Undef //particelle non inizializzate 00094 || pr->Get_Ifato() == 0 // particelle non inizializzate (superfluo) 00095 ) { 00096 pr=pr->next; 00097 continue; 00098 } 00099 } 00100 else { //evento fluka: luce per le particelle VISIBILI 00101 // to be adjusted depending on the study 00102 if ( ( ft=pr->Get_Fato() ) == Undef //particelle non inizializzate 00103 || pr->Get_Ifato() == 0 // particelle non inizializzate (superfluo) 00104 || pr->Get_See() == 0 //particelle invisibili (es. nu,pi0..) 00105 || (pr->Get_DevStory()==0 && pr->Get_Ifato()==-2) //particelle che decadono prima di essere rivelabili 00106 || pr->Get_Gp().e == 0 // particelle di energia nulla! (circa 300 fotoni su 10e6 eventi gas) 00107 || (pr->X-pr->Get_Gx()).Norma() == 0 // particelle "virtuali" 00108 // particelle generate fuori dall'apparato sperimentale 00109 || pr->Get_Gx().z < 10200 || pr->Get_Gx().z > 25000 //taglio su z 00110 //taglio sul tubo 00111 || (pr->Get_Gx().XYNorma() > 55 && pr->Get_Gx().z > 10200 && pr->Get_Gx().z < 17000) 00112 //taglio sui detectors downstream 00113 || (pr->Get_Gx().XYNorma() > 80 && pr->Get_Gx().z > 17000 && pr->Get_Gx().z < 20000) 00114 || (pr->Get_Gx().XYNorma() > 115 && pr->Get_Gx().z > 20000 && pr->Get_Gx().z < 25000) 00115 ) 00116 { 00117 pr=pr->next; 00118 continue; 00119 } 00120 } 00121 idm[npr]= pr->Get_Idm(); 00122 id[npr]= pr->Get_Id(); 00123 ifato[npr]= pr->Get_Ifato(); 00124 devstry[npr] = pr->Get_DevStory(); 00125 // Gout<<"\n ift "<< ifato[npr]; 00126 tg[npr]=evento_.Gen.tempo; 00127 // 00128 pr->Get_Gx().putv( xg[npr],yg[npr],zg[npr] ); 00129 pr->X.putv( xf[npr],yf[npr],zf[npr] ); 00130 pr->Get_Gp().putq( pxg[npr],pyg[npr],pzg[npr],eg[npr] ); 00131 pr->P.putq( pxf[npr],pyf[npr],pzf[npr],ef[npr] ); 00132 00133 mass[npr]=float ( pr->Get_Massa() ); 00134 00135 //angolo per di uscita -> gas_eventi 00136 // if (pr->Get_Gpz()>0.) 00137 // theta[npr] = asin(pr->Get_Gp().XYNorma()/pr->Get_Gpn()); 00138 // 00139 // 00140 // else if (pr->Get_Gpz()<0.) 00141 // theta[npr] = GmpConst::PiGreco - asin(pr->Get_Gp().XYNorma()/pr->Get_Gpn()); 00142 // else 00143 // theta[npr] = asin(1.0); 00144 00145 theta[npr] =acos(pr->Get_Gpz()/pr->Get_Gpn()); 00146 //calcolo del cost* ( rispetto a z) qui per tutte le particelle generate 00147 Ppart=pr->Get_Gp(); 00148 Ppart.Lburst(Stesso); 00149 thetastar[npr]=acos(Ppart.z/Ppart.mom); 00150 Ppart.putq( pxsg[npr],pysg[npr],pzsg[npr],esg[npr] ); 00151 00152 00153 00154 if ( npr>illumina_buffer_dim-2 ) { 00155 Gout<<"\nToo many illumina particles ... cut to "<< illumina_buffer_dim ; 00156 break; 00157 } 00158 npr++; 00159 00160 00161 pr=pr->next; 00162 } 00163 00164 } 00165 00166 00167