| 1 | #include <CaloHough.h> | 
| 2 | //////////////////////////////////////////////////////////// | 
| 3 | /// INITIALIZATIONS & GLOBAL PARAMETERS | 
| 4 | //////////////////////////////////////////////////////////// | 
| 5 |  | 
| 6 | CaloHough_parameters * CaloHough_parameters::_parameters = 0; | 
| 7 |  | 
| 8 | /** | 
| 9 | * Set external parameters to default values | 
| 10 | */ | 
| 11 | void CaloHough_parameters::SetDefault(){ | 
| 12 |  | 
| 13 | cout << "CaloHough --> SET DEFAULT PARAMETERS" << endl; | 
| 14 |  | 
| 15 | isimu = 0; | 
| 16 |  | 
| 17 | //     Q_UP = 4.;// mip | 
| 18 | //     Q_DN = 0.; | 
| 19 | //     M_UP = 3; | 
| 20 | //     M_DN = 0; | 
| 21 | Q_UP = 10000.; | 
| 22 | Q_DN = 100.; | 
| 23 | M_UP = 3000; | 
| 24 | M_DN = 0; | 
| 25 |  | 
| 26 | h_qtot[0] = new TH2F("houghqtot_0","Hit pattern",96,-0.5,95.5,22,-0.5,21.5); | 
| 27 | h_qtot[1] = new TH2F("houghqtot_1","Hit pattern",96,-0.5,95.5,22,-0.5,21.5); | 
| 28 |  | 
| 29 | int n1 = 150; | 
| 30 | int n2 = 150; | 
| 31 |  | 
| 32 | h_par[0]  = new TH2F("houghpar_0","par1 vs par2",n1,-40.,40.,n2,-10.,10.); | 
| 33 | h_par[1]  = new TH2F("houghpar_1","par1 vs par2",n1,-40.,40.,n2,-10.,10.); | 
| 34 |  | 
| 35 | h_par_fine[0]  = new TH2F("houghparfine_0","par1 vs par2",10*n1,-40.,40.,10*n2,-10.,10.); | 
| 36 | h_par_fine[1]  = new TH2F("houghparfine_1","par1 vs par2",10*n1,-40.,40.,10*n2,-10.,10.); | 
| 37 |  | 
| 38 | h_par1[0]  = new TH1F("houghpar1_0","par1",n1,-10.,10.); | 
| 39 | h_par1[1]  = new TH1F("houghpar1_1","par1",n1,-10.,10.); | 
| 40 |  | 
| 41 | h_par2[0]  = new TH1F("houghpar2_0","par2",n2,-40.,40.); | 
| 42 | h_par2[1]  = new TH1F("houghpar2_1","par2",n2,-40.,40.); | 
| 43 | }; | 
| 44 | //////////////////////////////////////////////////////////// | 
| 45 | /// CLASS IMPLEMENTATION | 
| 46 | //////////////////////////////////////////////////////////// | 
| 47 | /** | 
| 48 | * Reset event | 
| 49 | * it has to be called for each event | 
| 50 | */ | 
| 51 | void CaloHough::Reset(){ | 
| 52 | return; | 
| 53 | } | 
| 54 |  | 
| 55 | /** | 
| 56 | * \brief Set event | 
| 57 | */ | 
| 58 | bool CaloHough::Set(CaloLevel1 *cl1){ | 
| 59 |  | 
| 60 | //    bool debug   = CaloHough_parameters::Get()->debug; | 
| 61 | float Q_UP    = CaloHough_parameters::Get()->Q_UP; | 
| 62 | int   M_UP    = CaloHough_parameters::Get()->M_UP; | 
| 63 | float Q_DN    = CaloHough_parameters::Get()->Q_DN; | 
| 64 | int   M_DN    = CaloHough_parameters::Get()->M_DN; | 
| 65 |  | 
| 66 | cout << "bool CaloHough::Set(CaloLevel1*)"<<endl; | 
| 67 |  | 
| 68 | if(!cl1)return false; | 
| 69 |  | 
| 70 | TH2F* h_qtot[2]; | 
| 71 | TH2F* h_par[2]; | 
| 72 | TH2F* h_par_fine[2]; | 
| 73 | TH1F* h_par1[2]; | 
| 74 | TH1F* h_par2[2]; | 
| 75 | for(int iv=0; iv<2; iv++){ | 
| 76 | h_qtot[iv] = CaloHough_parameters::Get()->h_qtot[iv]; | 
| 77 | h_par[iv]  = CaloHough_parameters::Get()->h_par[iv]; | 
| 78 | h_par_fine[iv]  = CaloHough_parameters::Get()->h_par_fine[iv]; | 
| 79 | h_par1[iv] = CaloHough_parameters::Get()->h_par1[iv]; | 
| 80 | h_par2[iv] = CaloHough_parameters::Get()->h_par2[iv]; | 
| 81 | if(!h_qtot[iv] || !h_par[iv] || !h_par1[iv]  || !h_par2[iv] || !h_par_fine[iv])return false; | 
| 82 | h_qtot[iv]->Reset(); | 
| 83 | h_par[iv]->Reset(); | 
| 84 | h_par_fine[iv]->Reset(); | 
| 85 | h_par1[iv]->Reset(); | 
| 86 | h_par2[iv]->Reset(); | 
| 87 | } | 
| 88 |  | 
| 89 | // ----------------------------------- | 
| 90 | // set charge collected in each plane | 
| 91 | // ----------------------------------- | 
| 92 | // | 
| 93 | CaloStrip cstrip; | 
| 94 | int isimu = CaloHough_parameters::Get()->isimu; | 
| 95 | if(isimu==0)cstrip = CaloStrip(cl1,false); | 
| 96 | if(isimu==1)cstrip = CaloStrip(cl1,true); | 
| 97 | // | 
| 98 | vector<int>   ids[22][2];  //id strip 0-95 | 
| 99 | vector<float>  xy[22][2];  //cluster coordinate | 
| 100 | int islast   = -1; | 
| 101 | int iplast   = -1; | 
| 102 | int mult     = 0; | 
| 103 | float qsum   = 0.; | 
| 104 | float xyqsum = 0.; | 
| 105 | float issum  = 0.; | 
| 106 | int ncluster[] = {0,0}; | 
| 107 | for(int ih=0;ih<cl1->istrip;ih++){ | 
| 108 | // | 
| 109 | int iv=-1; | 
| 110 | int ip=-1; | 
| 111 | int is=-1; | 
| 112 | cl1->DecodeEstrip(ih,iv,ip,is); | 
| 113 | float xyz[3]; | 
| 114 | cstrip.Set(iv,ip,is); | 
| 115 | //      cout << " * "<<setw(3)<<iv<<setw(3)<<ip<<setw(3)<<is<<endl; | 
| 116 | xyz[0] = cstrip.GetX(); | 
| 117 | xyz[1] = cstrip.GetY(); | 
| 118 | xyz[2] = cstrip.GetZ(); | 
| 119 | // | 
| 120 | //      ...................................... metodo 2 | 
| 121 | if( is != islast+1 || ip != iplast ){ // new cluster | 
| 122 | if( | 
| 123 | qsum <  Q_UP && | 
| 124 | qsum >  Q_DN && | 
| 125 | mult <  M_UP && | 
| 126 | mult >  M_DN && | 
| 127 | true){         // store the previous cluster | 
| 128 | xy[ip][iv].push_back( xyqsum/qsum ); | 
| 129 | ids[ip][iv].push_back( (int)(0.5+issum/qsum) ); | 
| 130 | h_qtot[iv]->Fill( issum/qsum, (float)(21-ip), qsum); | 
| 131 | ncluster[iv]++; | 
| 132 | cout << " >> "<<qsum<<endl; | 
| 133 | }// ... and reset counters | 
| 134 | mult = 0; | 
| 135 | qsum = 0.; | 
| 136 | xyqsum = 0.; | 
| 137 | issum  = 0.; | 
| 138 | } | 
| 139 |  | 
| 140 | mult++; | 
| 141 | qsum   +=             cstrip.GetE(); | 
| 142 | xyqsum += xyz[iv]   * cstrip.GetE(); | 
| 143 | issum  += (float)is * cstrip.GetE(); | 
| 144 | islast  = is; | 
| 145 | iplast  = ip; | 
| 146 |  | 
| 147 | //      ...................................... metodo 1 | 
| 148 | //      if( cstrip.GetE() < Q_UP ){ | 
| 149 | //          h_qtot[iv]->Fill( (float)is, (float)(21-ip), cstrip.GetE()); | 
| 150 | //          ids[ip][iv].push_back(is); | 
| 151 | //      } | 
| 152 |  | 
| 153 | } | 
| 154 | cout << "n.clusters X "<<ncluster[0]<<endl; | 
| 155 | cout << "n.clusters Y "<<ncluster[0]<<endl; | 
| 156 | // | 
| 157 | //    cstrip.Set(0,0,0); | 
| 158 | //    cstrip.Set(0,21,0); | 
| 159 | cstrip.Set(0,11,0); | 
| 160 | float zref = cstrip.GetZ();//reference plane | 
| 161 | // | 
| 162 | for(int iv=0; iv<2; iv++){ | 
| 163 | for(int ip1=0; ip1<22-1; ip1++){ | 
| 164 | //          for(int ip2=ip1+1; ip2<22; ip2++){ | 
| 165 | for(int ip2=ip1+1; ip2<min(22,ip1+3); ip2++){ | 
| 166 | //              cout << "ip1 "<<ip1<<" "<<ids[ip1][iv].size()<<endl; | 
| 167 | //              cout << "ip2 "<<ip2<<" "<<ids[ip2][iv].size()<<endl; | 
| 168 | for(int is1=0; is1<(int)ids[ip1][iv].size(); is1++){ | 
| 169 | for(int is2=0; is2<(int)ids[ip2][iv].size(); is2++){ | 
| 170 |  | 
| 171 | //      ...................................... metodo 1 | 
| 172 | //                      int ids1 = ids[ip1][iv][is1]; | 
| 173 | //                      int ids2 = ids[ip2][iv][is2]; | 
| 174 | //                      float xyz1[3]; | 
| 175 | //                      float xyz2[3]; | 
| 176 | //                      cstrip.Set(iv,ip1,ids1); | 
| 177 | //                      xyz1[0] = cstrip.GetX(); | 
| 178 | //                      xyz1[1] = cstrip.GetY(); | 
| 179 | //                      xyz1[2] = cstrip.GetZ(); | 
| 180 | //                      cstrip.Set(iv,ip2,ids2); | 
| 181 | //                      xyz2[0] = cstrip.GetX(); | 
| 182 | //                      xyz2[1] = cstrip.GetY(); | 
| 183 | //                      xyz2[2] = cstrip.GetZ(); | 
| 184 |  | 
| 185 | //      ...................................... metodo 2 | 
| 186 | //                      int ids1 = ids[ip1][iv][is1]; | 
| 187 | int ids2 = ids[ip2][iv][is2]; | 
| 188 | float xyz1[3]; | 
| 189 | float xyz2[3]; | 
| 190 | cstrip.Set(iv,ip1,is1); | 
| 191 | xyz1[iv] = xy[ip1][iv][is1]; | 
| 192 | xyz1[2]  = cstrip.GetZ(); | 
| 193 | cstrip.Set(iv,ip2,ids2); | 
| 194 | xyz2[iv] = xy[ip2][iv][is2]; | 
| 195 | xyz2[2]  = cstrip.GetZ(); | 
| 196 | // | 
| 197 | float par1 = 0.; | 
| 198 | if(fabs(xyz1[2]-xyz2[2])>0.)par1 = (xyz1[iv]-xyz2[iv])/(xyz1[2]-xyz2[2]); | 
| 199 | float par2 = xyz1[iv] - par1*xyz1[2]; | 
| 200 | par2 = par1*zref + par2; | 
| 201 | h_par[iv]->Fill(par2,par1); // parameter space | 
| 202 | h_par_fine[iv]->Fill(par2,par1); // parameter space | 
| 203 | h_par1[iv]->Fill(par1); | 
| 204 | h_par2[iv]->Fill(par2); | 
| 205 | //                      cout << setw(15)<<par1<< setw(15)<<par2<<endl; | 
| 206 | } | 
| 207 | } | 
| 208 | } | 
| 209 | } | 
| 210 | // | 
| 211 | for( int ibx=1; ibx <= h_par[iv]->GetXaxis()->GetNbins(); ibx++){ | 
| 212 | for( int iby=1; iby <= h_par[iv]->GetYaxis()->GetNbins(); iby++){ | 
| 213 | // get bin content | 
| 214 | float content = h_par[iv]->GetBinContent(ibx,iby); | 
| 215 | if( content > 6){ | 
| 216 | double xmi = h_par[iv]->GetXaxis()->GetBinLowEdge(ibx); | 
| 217 | double xma = h_par[iv]->GetXaxis()->GetBinUpEdge(ibx); | 
| 218 | double ymi = h_par[iv]->GetYaxis()->GetBinLowEdge(iby); | 
| 219 | double yma = h_par[iv]->GetYaxis()->GetBinUpEdge(iby); | 
| 220 | h_par_fine[iv]->GetXaxis()->SetRangeUser(xmi,xma); | 
| 221 | h_par_fine[iv]->GetYaxis()->SetRangeUser(ymi,yma); | 
| 222 | double par1 = h_par_fine[iv]->GetMean(1); | 
| 223 | double par2 = h_par_fine[iv]->GetMean(2); | 
| 224 | cout << iv << " <><><><><><><>< "<<setw(15)<<par1<<setw(15)<<par2<<endl; | 
| 225 | } | 
| 226 | } | 
| 227 | } | 
| 228 |  | 
| 229 | // | 
| 230 | for(int ip=0; ip<22; ip++){ | 
| 231 | ids[ip][iv].clear(); | 
| 232 | xy[ip][iv].clear(); | 
| 233 | } | 
| 234 | }//end loop on views | 
| 235 |  | 
| 236 | return true; | 
| 237 | } | 
| 238 | ClassImp(CaloHough); | 
| 239 | ClassImp(CaloHough_parameters); | 
| 240 |  |