FlyoDoc_2011 Pisa 2011 by GmP --- 011

flyopunta/src/src_uti/illumina.cpp

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