| 5 | #include <TrkLevel1.h> | #include <TrkLevel1.h> | 
| 6 | #include <iostream> | #include <iostream> | 
| 7 | using namespace std; | using namespace std; | 
| 8 |  | //...................................... | 
| 9 |  | // F77 routines | 
| 10 |  | //...................................... | 
| 11 |  | extern "C" { | 
| 12 |  |  | 
| 13 |  | //      int readetaparam_(); | 
| 14 |  | float cog_(int*,int*); | 
| 15 |  | float pfaeta_(int*,float*); | 
| 16 |  | float pfaeta2_(int*,float*); | 
| 17 |  | float pfaeta3_(int*,float*); | 
| 18 |  | float pfaeta4_(int*,float*); | 
| 19 |  |  | 
| 20 |  | } | 
| 21 | //-------------------------------------- | //-------------------------------------- | 
| 22 | // | // | 
| 23 | // | // | 
| 74 | // | // | 
| 75 | //-------------------------------------- | //-------------------------------------- | 
| 76 | /** | /** | 
| 77 | * Evaluate the cluster signal. | * Evaluate the cluster signal including a maximum number of adjacent | 
| 78 | * @param cut Inclusion cut. | * strips, around maxs, having a significant signal. | 
| 79 |  | * @param nstrip   Maximum number of strips. | 
| 80 |  | * @param cut      Inclusion cut ( s > cut*sigma ). | 
| 81 |  | * If nstrip<=0 only the inclusion cut is used to determine the cluster size. | 
| 82 | */ | */ | 
| 83 | Float_t TrkCluster::GetSignal(Float_t cut){ | Float_t TrkCluster::GetSignal(Int_t nstrip, Float_t cut){ | 
| 84 | Float_t s = 0; |  | 
| 85 | for(Int_t is = 0; is < CLlength; is++){ | Float_t s = 0; | 
| 86 | Float_t scut = cut*clsigma[is]; |  | 
| 87 | if(clsignal[is] > scut) s += clsignal[is]; | if( nstrip<=0 ){ | 
| 88 |  | //          for(Int_t is = 0; is < CLlength; is++){ | 
| 89 |  | //              Float_t scut = cut*clsigma[is]; | 
| 90 |  | //              if(clsignal[is] > scut) s += clsignal[is]; | 
| 91 |  | //          }; | 
| 92 |  | for(Int_t is = indmax+1; is < CLlength; is++){ | 
| 93 |  | Float_t scut = cut*clsigma[is]; | 
| 94 |  | if(clsignal[is] > scut) s += clsignal[is]; | 
| 95 |  | else break; | 
| 96 |  | }; | 
| 97 |  | for(Int_t is = indmax; is >=0; is--){ | 
| 98 |  | Float_t scut = cut*clsigma[is]; | 
| 99 |  | if(clsignal[is] > scut) s += clsignal[is]; | 
| 100 |  | else break; | 
| 101 | }; | }; | 
| 102 | return s; | return s; | 
| 103 |  | }; | 
| 104 |  |  | 
| 105 |  |  | 
| 106 |  | Int_t il = indmax; | 
| 107 |  | Int_t ir = indmax; | 
| 108 |  | Int_t inc = 0; | 
| 109 |  |  | 
| 110 |  | if( clsignal[indmax] < cut*clsigma[indmax] ) return 0; | 
| 111 |  |  | 
| 112 |  | while ( inc < nstrip ){ | 
| 113 |  | Float_t sl = -100000; | 
| 114 |  | Float_t sr = -100000; | 
| 115 |  | if( il >= 0       ) sl = clsignal[il]; | 
| 116 |  | if( ir < CLlength ) sr = clsignal[ir]; | 
| 117 |  | if( sl == sr && inc == 0 ){ | 
| 118 |  | s += clsignal[il]; //cout << inc<<" - "<< clsignal[il]<<" "<<s<<endl; | 
| 119 |  | il--; | 
| 120 |  | ir++; | 
| 121 |  | }else if ( sl >= sr && sl > cut*clsigma[il] && inc !=0 ){ | 
| 122 |  | s += sl;//cout << inc<<" - "<< clsignal[il]<<" "<<s<<endl; | 
| 123 |  | il--; | 
| 124 |  | }else if ( sl < sr && sr > cut*clsigma[ir] ){ | 
| 125 |  | s += sr;//cout << inc<<" - " << clsignal[ir]<<" "<<s<<endl; | 
| 126 |  | ir++; | 
| 127 |  | }else break; | 
| 128 |  |  | 
| 129 |  | inc++; | 
| 130 |  | } | 
| 131 |  | return s; | 
| 132 | }; | }; | 
| 133 |  |  | 
| 134 | /** | /** | 
| 135 | * Evaluate the cluster signal-to-noise, as defined by Turchetta. | including a ( maximum ) fixed number of adjacent strips (with s>0) around the maxs. | 
| 136 | * @param cut Inclusion cut. | * @param nstrip Number of strips. | 
| 137 | */ | */ | 
| 138 | Float_t TrkCluster::GetSignalToNoise(Float_t cut){ | /** | 
| 139 | Float_t sn = 0; | * Evaluate the cluster signal-to-noise, as defined by Turchetta, including a maximum number of adjacent strips, around maxs, having a significant signal. | 
| 140 | for(Int_t is = 0; is < CLlength; is++){ | * @param nstrip   Maximum number of strips. | 
| 141 | Float_t scut = cut*clsigma[is]; | * @param cut      Inclusion cut ( s > cut*sigma ). | 
| 142 | if(clsignal[is] > scut) sn += clsignal[is]/clsigma[is]; | * If nstrip<=0 only the inclusion cut is used to determine the cluster size. | 
| 143 |  | */ | 
| 144 |  | Float_t TrkCluster::GetSignalToNoise(Int_t nstrip, Float_t cut){ | 
| 145 |  |  | 
| 146 |  | Float_t sn = 0; | 
| 147 |  |  | 
| 148 |  | if( nstrip<=0 ){ | 
| 149 |  | for(Int_t is = indmax+1; is < CLlength; is++){ | 
| 150 |  | Float_t scut = cut*clsigma[is]; | 
| 151 |  | if(clsignal[is] > scut) sn += clsignal[is]/clsigma[is]; | 
| 152 |  | else break; | 
| 153 |  | }; | 
| 154 |  | for(Int_t is = indmax; is >=0; is--){ | 
| 155 |  | Float_t scut = cut*clsigma[is]; | 
| 156 |  | if(clsignal[is] > scut) sn += clsignal[is]/clsigma[is]; | 
| 157 |  | else break; | 
| 158 | }; | }; | 
| 159 | return sn; | return sn; | 
| 160 |  | }; | 
| 161 |  |  | 
| 162 |  |  | 
| 163 |  | Int_t il = indmax; | 
| 164 |  | Int_t ir = indmax; | 
| 165 |  | Int_t inc = 0; | 
| 166 |  |  | 
| 167 |  | if( clsignal[indmax] < cut*clsigma[indmax] ) return 0; | 
| 168 |  |  | 
| 169 |  | while ( inc < nstrip ){ | 
| 170 |  | Float_t sl = -100000; | 
| 171 |  | Float_t sr = -100000; | 
| 172 |  | if( il >= 0       ) sl = clsignal[il]; | 
| 173 |  | if( ir < CLlength ) sr = clsignal[ir]; | 
| 174 |  | if( sl == sr && inc == 0 ){ | 
| 175 |  | sn += clsignal[il]/clsigma[il]; | 
| 176 |  | il--; | 
| 177 |  | ir++; | 
| 178 |  | }else if ( sl >= sr && sl > cut*clsigma[il] && inc !=0 ){ | 
| 179 |  | sn += sl/clsigma[il]; | 
| 180 |  | il--; | 
| 181 |  | }else if ( sl < sr && sr > cut*clsigma[ir] ){ | 
| 182 |  | sn += sr/clsigma[ir]; | 
| 183 |  | ir++; | 
| 184 |  | }else break; | 
| 185 |  |  | 
| 186 |  | inc++; | 
| 187 |  | } | 
| 188 |  | return sn; | 
| 189 | }; | }; | 
| 190 | /** | /** | 
| 191 | * Evaluate the cluster multiplicity. | * Evaluate the cluster multiplicity. | 
| 265 | // | // | 
| 266 | // | // | 
| 267 | //-------------------------------------- | //-------------------------------------- | 
| 268 |  | /** | 
| 269 |  | * Method to fill a level1 struct with only one cluster (done to use F77 p.f.a. routines on a cluster basis). | 
| 270 |  | */ | 
| 271 |  | cTrkLevel1* TrkCluster::GetLevel1Struct(){ | 
| 272 |  |  | 
| 273 |  | cTrkLevel1* l1 = new cTrkLevel1; | 
| 274 |  |  | 
| 275 |  | l1->nclstr1 = 1; | 
| 276 |  | l1->view[0] = view; | 
| 277 |  | l1->ladder[0] = GetLadder(); | 
| 278 |  | l1->maxs[0] = maxs; | 
| 279 |  | l1->mult[0] = GetMultiplicity(); | 
| 280 |  | l1->dedx[0] = GetSignal(); | 
| 281 |  | l1->indstart[0] = 1; | 
| 282 |  | l1->indmax[0]   = indmax+1; | 
| 283 |  | l1->totCLlength = CLlength; | 
| 284 |  | for(Int_t i=0; i<CLlength; i++){ | 
| 285 |  | l1->clsignal[i] = clsignal[i]; | 
| 286 |  | l1->clsigma[i] = clsigma[i]; | 
| 287 |  | l1->cladc[i] = cladc[i]; | 
| 288 |  | l1->clbad[i] = clbad[i]; | 
| 289 |  | }; | 
| 290 |  |  | 
| 291 |  | return l1; | 
| 292 |  | }; | 
| 293 |  | //-------------------------------------- | 
| 294 |  | // | 
| 295 |  | // | 
| 296 |  | //-------------------------------------- | 
| 297 |  | /** | 
| 298 |  | * Evaluates the Center-Of-Gravity (COG) of the cluster, in strips, relative to the strip with the maximum signal (TrkCluster::maxs). | 
| 299 |  | *      @param ncog Number of strips to evaluate COG. | 
| 300 |  | * If ncog=0, the COG of the cluster is evaluated according to the cluster multiplicity (defined by the inclusion cut). | 
| 301 |  | * If ncog>0, the COG is evaluated using ncog strips, even if they have a negative signal (according to G.Landi) | 
| 302 |  | */ | 
| 303 |  | Float_t TrkCluster::GetCOG(Int_t ncog){ | 
| 304 |  |  | 
| 305 |  | int ic = 1; | 
| 306 |  | level1event_ = *GetLevel1Struct(); | 
| 307 |  | return cog_(&ncog,&ic); | 
| 308 |  |  | 
| 309 |  | }; | 
| 310 |  | //-------------------------------------- | 
| 311 |  | // | 
| 312 |  | // | 
| 313 |  | //-------------------------------------- | 
| 314 |  | /** | 
| 315 |  | * Evaluates the cluster position, in strips, relative to the strip with the maximum signal (TrkCluster::maxs), by applying the non-linear ETA-algorythm. | 
| 316 |  | *  @param neta  Number of strips to evaluate ETA. | 
| 317 |  | *  @param angle Projected angle between particle track and detector plane. | 
| 318 |  | * Implemented values of neta are 2,3,4. If neta=0, ETA2, ETA3 and ETA4 are applied according to the angle. | 
| 319 |  | */ | 
| 320 |  | Float_t TrkCluster::GetETA(Int_t neta, float angle){ | 
| 321 |  |  | 
| 322 |  | //      LoadPfaParam(); | 
| 323 |  | int ic = 1; | 
| 324 |  | level1event_ = *GetLevel1Struct(); | 
| 325 |  | if(neta == 0)      return pfaeta_(&ic,&angle); | 
| 326 |  | else if(neta == 2) return pfaeta2_(&ic,&angle); | 
| 327 |  | else if(neta == 3) return pfaeta3_(&ic,&angle); | 
| 328 |  | else if(neta == 4) return pfaeta4_(&ic,&angle); | 
| 329 |  | else cout << "ETA"<<neta<<" not implemented\n"; | 
| 330 |  | return 0; | 
| 331 |  |  | 
| 332 |  | }; | 
| 333 |  |  | 
| 334 |  | //-------------------------------------- | 
| 335 |  | // | 
| 336 |  | // | 
| 337 |  | //-------------------------------------- | 
| 338 | TrkLevel1::TrkLevel1(){ | TrkLevel1::TrkLevel1(){ | 
| 339 |  |  | 
| 340 | //      good1 = -1; | //      good1 = -1; | 
| 421 | * Fills a struct cTrkLevel1 with values from a TrkLevel1 object (to put data into a F77 common). | * Fills a struct cTrkLevel1 with values from a TrkLevel1 object (to put data into a F77 common). | 
| 422 | */ | */ | 
| 423 |  |  | 
| 424 | void TrkLevel1::GetLevel1Struct(cTrkLevel1 *l1) const { | cTrkLevel1* TrkLevel1::GetLevel1Struct() { | 
| 425 |  |  | 
| 426 | // ********* completare ********* // | cTrkLevel1 *l1=0; | 
| 427 | // ********* completare ********* // | // | 
|  | // ********* completare ********* // |  | 
|  | // ********* completare ********* // |  | 
|  | // ********* completare ********* // |  | 
|  | // ********* completare ********* // |  | 
|  | //  general variables |  | 
|  | //      l1->good1 = good1; |  | 
| 428 | for(Int_t i=0; i<12 ; i++){ | for(Int_t i=0; i<12 ; i++){ | 
| 429 | //              l1->crc[i] = crc[i]; | l1->good[i] = good[i]; | 
| 430 | for(Int_t j=0; j<24 ; j++){ | for(Int_t j=0; j<24 ; j++){ | 
| 431 | l1->cnev[j][i]     = cnev[j][i]; | l1->cnev[j][i]  = cnev[j][i]; | 
| 432 | l1->cnnev[j][i] = cnnev[j][i]; | l1->cnnev[j][i] = cnnev[j][i]; | 
| 433 | }; | }; | 
|  | //              l1->fshower[i] = fshower[i]; |  | 
| 434 | }; | }; | 
| 435 |  |  | 
| 436 | //  *** CLUSTERS *** | //  *** CLUSTERS *** | 
| 438 | for(Int_t i=0;i<l1->nclstr1;i++){ | for(Int_t i=0;i<l1->nclstr1;i++){ | 
| 439 |  |  | 
| 440 | l1->view[i]     = ((TrkCluster *)Cluster->At(i))->view; | l1->view[i]     = ((TrkCluster *)Cluster->At(i))->view; | 
|  | //              l1->ladder[i]   = ((TrkCluster *)Cluster->At(i))->ladder; |  | 
| 441 | l1->maxs[i]     = ((TrkCluster *)Cluster->At(i))->maxs; | l1->maxs[i]     = ((TrkCluster *)Cluster->At(i))->maxs; | 
| 442 | //              l1->mult[i]     = ((TrkCluster *)Cluster->At(i))->mult; | // COMPLETARE // | 
| 443 | //              l1->dedx[i]     = ((TrkCluster *)Cluster->At(i))->sgnl; | // COMPLETARE // | 
| 444 |  | // COMPLETARE // | 
| 445 |  | // COMPLETARE // | 
| 446 |  | // COMPLETARE // | 
| 447 |  | // COMPLETARE // | 
| 448 |  |  | 
| 449 | } | } | 
| 450 |  | // COMPLETARE // | 
| 451 | // ********* completare ********* // | // COMPLETARE // | 
| 452 |  | // COMPLETARE // | 
| 453 |  | // COMPLETARE // | 
| 454 |  | // COMPLETARE // | 
| 455 |  | // COMPLETARE // | 
| 456 |  | return l1; | 
| 457 | } | } | 
| 458 | //-------------------------------------- | //-------------------------------------- | 
| 459 | // | // | 
| 476 | // | // | 
| 477 | // | // | 
| 478 | //-------------------------------------- | //-------------------------------------- | 
| 479 |  | void TrkLevel1::Delete(){ | 
| 480 |  |  | 
| 481 |  | for(Int_t i=0; i<12 ; i++){ | 
| 482 |  | good[i] = -1; | 
| 483 |  | for(Int_t j=0; j<24 ; j++){ | 
| 484 |  | cnev[j][i]     = 0; | 
| 485 |  | cnnev[j][i] = 0; | 
| 486 |  | }; | 
| 487 |  | }; | 
| 488 |  | // | 
| 489 |  | Cluster->Delete(); | 
| 490 |  |  | 
| 491 |  | } | 
| 492 |  |  | 
| 493 |  | //-------------------------------------- | 
| 494 |  | // | 
| 495 |  | // | 
| 496 |  | //-------------------------------------- | 
| 497 | TrkCluster *TrkLevel1::GetCluster(int is){ | TrkCluster *TrkLevel1::GetCluster(int is){ | 
| 498 |  |  | 
| 499 | if(is >= this->nclstr()){ | if(is >= this->nclstr()){ | 
| 505 | TrkCluster *cluster = (TrkCluster*)t[is]; | TrkCluster *cluster = (TrkCluster*)t[is]; | 
| 506 | return cluster; | return cluster; | 
| 507 | } | } | 
| 508 |  | //-------------------------------------- | 
| 509 |  | // | 
| 510 |  | // | 
| 511 |  | //-------------------------------------- | 
| 512 |  | /** | 
| 513 |  | * Load Position-Finding-Algorythm parameters (call the F77 routine). | 
| 514 |  | * | 
| 515 |  | */ | 
| 516 |  | int TrkLevel1::LoadPfaParam(TString path){ | 
| 517 |  |  | 
| 518 |  | if( strcmp(path_.path,path.Data()) ){ | 
| 519 |  | cout <<"Loading p.f.a. parameters\n"; | 
| 520 |  | strcpy(path_.path,path.Data()); | 
| 521 |  | path_.pathlen = path.Length(); | 
| 522 |  | path_.error   = 0; | 
| 523 |  | return readetaparam_(); | 
| 524 |  | } | 
| 525 |  | return 0; | 
| 526 |  | } | 
| 527 |  |  | 
| 528 |  |  | 
| 529 | ClassImp(TrkLevel1); | ClassImp(TrkLevel1); |