#include //-------------------------------------- /** * Default constructor */ CaloNuclei::CaloNuclei(){ Clear(); }; CaloNuclei::CaloNuclei(PamLevel2 *l2p){ // Clear(); // L2 = l2p; // if ( !L2->IsORB() ) printf(" WARNING: OrbitalInfo Tree is needed, the plugin could not work properly without it \n"); // OBT = 0; PKT = 0; atime = 0; N = 5; R = 3; // debug = false; // }; void CaloNuclei::Clear(){ // tr = 0; interplane = 0; preq = 0.; postq = 0.; dedx1 = 0.; dedx3 = 0.; qpremean = 0.; qpremeanN = 0.; // multhit = false; gap = false; // }; void CaloNuclei::Print(){ // Process(); // printf("========================================================================\n"); printf(" OBT: %u PKT: %u ATIME: %u Track %i \n",OBT,PKT,atime,tr); printf(" interplane [number of available dE/dx before interaction]: %i\n",interplane); printf(" ethr [threshold used to determine interplane]:............ %f \n",ethr); printf(" dedx1 [dE/dx from the first calorimeter plane]:........... %f \n",dedx1); printf(" dedx3 [dE/dx (average) if the first 3 Si planes]:......... %f \n",dedx3); printf(" multhit [true if interplane determined by multiple hits]:. %i \n",multhit); printf(" gap [true if interplane determined by a gap]:............. %i \n",gap); printf(" preq [total energy in MIP before the interaction plane]:.. %f \n",preq); printf(" postq [total energy in MIP after the interaction plane]:.. %f \n",postq); printf(" qpremean [truncated mean using 3 planes and 3 strips]:.... %f \n",qpremean); printf(" N [no of used plane]:..................................... %i \n",N); printf(" R [no strip used per plane ]:............................. %i \n",R); printf(" qpremeanN [truncated mean using N planes and R strips]:... %f \n",qpremeanN); printf("========================================================================\n"); // }; void CaloNuclei::Delete(){ Clear(); //delete this; }; void CaloNuclei::Process(){ Process(0); }; void CaloNuclei::Process(Int_t ntr){ // if ( !L2 ){ printf(" ERROR: cannot find PamLevel2 object, use the correct constructor or check your program!\n"); printf(" ERROR: CaloNuclei variables not filled \n"); return; }; // Bool_t newentry = false; // if ( L2->IsORB() ){ if ( L2->GetOrbitalInfo()->pkt_num != PKT || L2->GetOrbitalInfo()->OBT != OBT || L2->GetOrbitalInfo()->absTime != atime ){ newentry = true; OBT = L2->GetOrbitalInfo()->OBT; PKT = L2->GetOrbitalInfo()->pkt_num; atime = L2->GetOrbitalInfo()->absTime; }; } else { newentry = true; }; // if ( !newentry ) return; // tr = ntr; // if ( debug ) printf(" Processing event at OBT %u PKT %u time %u \n",OBT,PKT,atime); // Clear(); // PamTrack *track = 0; track = L2->GetTrack(ntr); // Int_t view = 0; Int_t plane = 0; Int_t strip = 0; Float_t mip = 0.; // Float_t defethr = 6. * 0.90; Float_t defethr = 6.25; // = (sqrt(9) - 0.5) ** 2.; // // Calculate dedx1 and dedx3 // for ( Int_t i=0; iGetCaloLevel1()->istrip; i++ ){ // mip = L2->GetCaloLevel1()->DecodeEstrip(i,view,plane,strip); // if ( strip != -1 && view == 1 && plane == 0 && ( strip == (track->GetCaloTrack()->tibar[0][1]-1) || strip == (track->GetCaloTrack()->tibar[0][1]-2) || strip == (track->GetCaloTrack()->tibar[0][1]) ) && true ){ dedx1 += mip; }; if ( strip != -1 && (( view == 1 && ( plane == 0 || plane == 1 ) ) || ( view == 0 && plane == 0 )) && (( view == 0 && ( strip == track->GetCaloTrack()->tibar[0][0] || strip == (track->GetCaloTrack()->tibar[0][0]-1) || strip == (track->GetCaloTrack()->tibar[0][0]-2) )) || ( view == 1 && ( strip == track->GetCaloTrack()->tibar[0][1] || strip == (track->GetCaloTrack()->tibar[0][1]-1) || strip == (track->GetCaloTrack()->tibar[0][1]-2) )) || ( view == 1 && ( strip == track->GetCaloTrack()->tibar[1][1] || strip == (track->GetCaloTrack()->tibar[1][1]-1) || strip == (track->GetCaloTrack()->tibar[1][1]-2) ))) && true ){ dedx3 += mip; }; // }; // dedx3 /= 3.; // Float_t mesethr = dedx1 * 0.90; Float_t mesethr = 0.; if ( dedx1 > 0. ) mesethr = (sqrt(dedx1) - 0.50)*(sqrt(dedx1) - 0.50); Bool_t aldone = false; // retry: // if ( debug ) printf("retry\n"); // interplane = 0; // ethr = TMath::Max(defethr,mesethr); // // Find the interaction plane "interplane" // Int_t gapth = 3; Int_t nhit[2] = {0,0}; Int_t splane[2] = {-1,-1}; Int_t sview[2] = {-1,-1}; Int_t interpl[2] = {-1,-1}; Int_t interv[2] = {-1,-1}; Bool_t wmulthit[2] = {false,false}; Bool_t wgap[2] = {false,false}; Int_t ii = 0; while ( iiGetCaloLevel1()->istrip ){ // mip = L2->GetCaloLevel1()->DecodeEstrip(ii,view,plane,strip); // if ( strip != -1 && mip > ethr && !wmulthit[view] && !wgap[view] && ( strip == (track->GetCaloTrack()->tibar[plane][view]-1) || strip == (track->GetCaloTrack()->tibar[plane][view]-2) || strip == (track->GetCaloTrack()->tibar[plane][view]) ) && true ){ if ( debug ) printf(" inside loop: ii %i mip %f view %i plane %i strip %i tibar %i nhit %i splane %i sview %i \n",ii,mip,view,plane,strip,track->GetCaloTrack()->tibar[plane][view]-1,nhit[view],splane[view],sview[view]); interpl[view] = plane; interv[view] = view; if ( splane[view] != plane || sview[view] != view ){ if ( nhit[view] > 1 ){ wmulthit[view] = true; // if ( splane[view] == -1 ) splane[view] = 0; // // if ( sview[view] == -1 ) sview[view] = view; // interpl[view] = splane[view]; interv[view] = sview[view]; }; if ( plane > splane[view]+gapth ){ wgap[view] = true; // if ( splane[view] == -1 ) splane[view] = 0;// // if ( sview[view] == -1 ) sview[view] = view; // interpl[view] = splane[view]; interv[view] = sview[view]; }; splane[view] = plane; sview[view] = view; nhit[view] = 1; } else { nhit[view]++; }; }; // ii++; // }; // if (debug ) printf("conversion interpl %i interv %i multhit %i interplane %i \n",interpl[0],interv[0],multhit,interplane); Int_t winterplane[2] = {-1,-1}; // for ( Int_t view = 0; view < 2; view++){ // if ( nhit[view] > 1 && !wmulthit[view] && !wgap[view] ){ wmulthit[view] = true; interpl[view] = splane[view]; interv[view] = sview[view]; }; // if ( wmulthit[view] ) multhit = true; if ( wgap[view] ) gap = true; // // convert view and plane number of interaction plane into number of available dE/dx measurements before the interaction plane // if ( interpl[view] >= 0 ) { if ( interv[view] == 0 ){ winterplane[view] = (1 + interpl[view]) * 2; } else { winterplane[view] = (1 + interpl[view]) + (1 + interpl[view] - 1); }; if ( wmulthit[view] ) winterplane[view]--; }; }; if ( winterplane[0] > 0 && winterplane[1] > 0 ){ if ( multhit ){ interplane = TMath::Min(winterplane[0],winterplane[1]); } else { interplane = TMath::Max(winterplane[0],winterplane[1]); }; } else { if ( !winterplane[0] || !winterplane[1] ){ interplane = 0; } else { interplane = TMath::Max(winterplane[0],winterplane[1]); }; }; // if ( debug ) printf("2conversion interpl %i interv %i multhit %i interplane %i \n",interpl[1],interv[1],multhit,interplane); if ( debug ) printf("3conversion winterpl0 %i winterpl1 %i \n",winterplane[0],winterplane[1]); // Int_t ipl = 0; if ( interplane > 0 ){ // // Calculate preq, postq, qpremean // ii = 0; Int_t ind = -1; Int_t qsplane = -1; Int_t qsview = -1; Int_t ind2 = -1; Int_t qsplane2 = -1; Int_t qsview2 = -1; Float_t qme[200]; memset(qme,0,200*sizeof(Float_t)); Float_t qme2[2112]; memset(qme2,0,2112*sizeof(Float_t)); // while ( iiGetCaloLevel1()->istrip ){ // mip = L2->GetCaloLevel1()->DecodeEstrip(ii,view,plane,strip); // if ( strip != -1 ){ if ( view == 0 ){ ipl = (1 + plane) * 2; } else { ipl = (1 + plane) + (1 + plane - 1 ); }; if ( ipl > interplane ){ postq += mip; } else { preq += mip; if ( strip == (track->GetCaloTrack()->tibar[plane][view]-1) || strip == (track->GetCaloTrack()->tibar[plane][view]-2) || strip == (track->GetCaloTrack()->tibar[plane][view]) ){ if ( qsplane != plane || qsview != view ){ qsplane = plane; qsview = view; ind++; if ( debug && ind > 199 ) printf(" AAAGH!! \n"); qme[ind] = 0.; }; qme[ind] += mip; }; for ( Int_t ns = 0; ns < R ; ns++){ Int_t ms = track->GetCaloTrack()->tibar[plane][view] - 1 - ns + (R - 1)/2; if ( strip == ms ){ if ( qsplane2 != plane || qsview2 != view ){ qsplane2 = plane; qsview2 = view; ind2++; if ( debug && ind2 > 2112 ) printf(" AAAGH!! \n"); qme2[ind2] = 0.; }; qme2[ind2] += mip; }; }; }; // }; // ii++; // }; // // here we must calculate qpremean, order vector qme, select 3 lowest measurements and caculate the mean... // if ( debug ){ for (Int_t l=0; l < interplane; l++){ printf(" qme[%i] = %f \n",l,qme[l]); }; }; // Long64_t work[200]; ind = 0; Int_t l = 0; Float_t qm = 0.; Float_t qm2 = 0.; // Float_t qmt = ethr*0.8; // *0.9 // Int_t uplim = TMath::Max(3,N); // while ( l < uplim && ind < interplane ){ qm = TMath::KOrdStat(interplane,qme,ind,work); if ( qm >= qmt ){ if ( l < 3 ) qpremean += qm; l++; if ( debug ) printf(" value no %i qm %f qmt %f \n",l,qm,qmt); }; ind++; }; // qpremean /= l; // ind = 0; l = 0; while ( l < uplim && ind < interplane ){ qm2 = TMath::KOrdStat(interplane,qme2,ind,work); if ( qm2 >= qmt ){ if ( l < N ) qpremeanN += qm2; l++; if ( debug ) printf(" qm2 value no %i qm %f qmt %f \n",l,qm2,qmt); }; ind++; }; // qpremeanN /= l; // if ( debug ) printf(" charge is %f \n",sqrt(qpremean)); // if ( mesethr != ethr && interplane >= 3 && !aldone ){ Float_t mesethr2 = (sqrt(qpremean) - 0.50)*(sqrt(qpremean) - 0.50); if ( mesethr2 < mesethr*0.90 ){ mesethr = (sqrt(dedx1) - 0.25)*(sqrt(dedx1) - 0.25); } else { mesethr = mesethr2; }; aldone = true; if ( mesethr > defethr ) goto retry; }; }; // if ( debug ) printf(" esci \n"); // };