/////////////////////////////////////////////////////////////////////////////// // Dec 07 2001 P.Murat: start putting in some comments // --------------------------------------------------- // TCalDataBlock: ROOT-parseable description of TCalData to be stored in // STNTUPLE /////////////////////////////////////////////////////////////////////////////// #include "TVector2.h" #include #include #include "CalorGeometry/CalParameters.hh" ClassImp(TCalDataBlock) //_____________________________________________________________________________ void TCalDataBlock::ReadV1(TBuffer &R__b) { R__b >> fNTowers; R__b >> fHadEnergy; R__b >> fEmEnergy; R__b >> fSumEt; if (fNTowers > 0) { fTowerList->Streamer(R__b); } // initialize V2 variables to 0 fNTowersOot = 0; fEmEnergyOot = 0; fHadEnergyOot = 0; } //_____________________________________________________________________________ void TCalDataBlock::ReadV2(TBuffer &R__b) { struct CalDataBlock_v2 { Int_t fNTowers; // number of hit towers Int_t fNTowersOot; Float_t fHadEnergy; // total had energy Float_t fEmEnergy; // total em energy Float_t fSumEt; // sum(Et) Float_t fEmEnergyOot; // Float_t fHadEnergyOot; // TClonesArray* fTowerList; // list of towers } v2; int nwi = ((Int_t* ) &v2.fHadEnergy ) - &v2.fNTowers; int nwf = ((Float_t*) &v2.fTowerList ) - &v2.fHadEnergy; R__b.ReadFastArray(&v2.fNTowers,nwi); R__b.ReadFastArray(&v2.fHadEnergy,nwf); fNTowers = v2.fNTowers; fHadEnergy = v2.fHadEnergy; fEmEnergy = v2.fEmEnergy; fSumEt = v2.fSumEt; fNTowersOot = v2.fNTowersOot; fEmEnergyOot = v2.fEmEnergyOot; fHadEnergyOot = v2.fHadEnergyOot; if (fNTowers > 0) { fTowerList->Streamer(R__b); } // initialize V3 variables to 0 fSumEtMP[0] = 0.; fSumEtMP[1] = 0.; fMEtXMP = 0.; fMEtYMP = 0.; fXiP = 0.; fXiPbar = 0.; fNMPHits[0] = 0; fNMPHits[1] = 0; } //______________________________________________________________________________ void TCalDataBlock::Streamer(TBuffer &R__b) { // Stream an object of class TCalDataBlock. // V2 adds out of time energies // V3 adds miniplug variables (code by Angela Wyatt) int nwi = ((Int_t* ) &fHadEnergy ) - &fNTowers; int nwf = ((Float_t*) &fTowerList ) - &fHadEnergy; if (R__b.IsReading()) { Version_t R__v = R__b.ReadVersion(); if (R__v == 1) ReadV1(R__b); if (R__v == 2) ReadV2(R__b); else { //----------------------------------------------------------------------------- // read version(current is V3). //----------------------------------------------------------------------------- R__b.ReadFastArray(&fNTowers,nwi); R__b.ReadFastArray(&fHadEnergy,nwf); if (fNTowers > 0) { fTowerList->Streamer(R__b); } } } else { R__b.WriteVersion(TCalDataBlock::IsA()); R__b.WriteFastArray(&fNTowers,nwi); R__b.WriteFastArray(&fHadEnergy,nwf); if (fNTowers > 0) { fTowerList->Streamer(R__b); } } } //_____________________________________________________________________________ TCalDataBlock::TCalDataBlock() { // commented out pieces are available starting // from version 2.24/05 fTowerList = new TClonesArray("TCalTower",100); fTowerList->BypassStreamer(kFALSE); fAdcThreshold = 0; Clear(); } //_____________________________________________________________________________ TCalDataBlock::~TCalDataBlock() { fTowerList->Delete(); delete fTowerList; } //_____________________________________________________________________________ TCalTower* TCalDataBlock::Tower(Int_t IEta, Int_t IPhi) { TCalTower* tow; Int_t eta_phi = ((IEta & 0xff) << 8) + (IPhi & 0xff); int nt = fTowerList->GetEntriesFast(); for (int i=0; iEtaPhi() == eta_phi) goto END; } tow = 0; END: return tow; } //_____________________________________________________________________________ Int_t TCalDataBlock::GetListOfTowers(Float_t Eta, Float_t Phi, Float_t Cone, TObjArray* List) { TCalTower* tower; Float_t deta, dphi, dr; Int_t n_in_cone = 0; List->Clear(); int nt = fTowerList->GetEntriesFast(); for (int i=0; iEta()-Eta; dphi = TVector2::Phi_mpi_pi(tower->Phi()-Phi); dr = sqrt(deta*deta+dphi*dphi); if (dr < Cone) { List->Add((TObject*) tower); n_in_cone++; } } return n_in_cone; } //_____________________________________________________________________________ Int_t TCalDataBlock::GetMPMultiplicity(Int_t iside, Float_t thresh, Int_t thresh_type) { //default thresh type = 0 (energy) , option 1 = et TCalTower* tower; Int_t n_hits = 0; int nt = fTowerList->GetEntriesFast(); for (int i=0; iIEta() <=3) || (iside == 1 && tower->IEta() >=48)) { // Is this a seed tower bool mptow_seed = true; for (int iadj=0; (mptow_seed == true && iadj<6); ++iadj) { int it = tower->MPITow(); if (MPA_Surrounding[it][iadj] != 99) { int itow_neigh = MPA_Surrounding[it][iadj]; int ieta,iphi; GetMPIetaIphi(iside,itow_neigh,ieta,iphi); TCalTower* neigh = Tower(ieta,iphi); if (neigh && tower->Et() < neigh->Et()) mptow_seed = false; } } // Is this a hit float DEP2PART_CORR = 2.50; // (error : +/-0.63) float towe = tower->Energy()*DEP2PART_CORR; float towet = tower->Et()*DEP2PART_CORR; if (mptow_seed && ((thresh_type == 0 && towe > thresh) || (thresh_type == 1 && towet > thresh))) ++n_hits; } } return n_hits; } //_____________________________________________________________________________ void TCalDataBlock::GetMPIetaIphi(int is, int it, int & ieta, int & iphi) { if (it%14<2) {ieta = 0; iphi = it%14 + (it/14)*2 - 0;} else if (it%14>=2 && it%14< 5) {ieta = 1; iphi = it%14 + (it/14)*3 - 2;} else if (it%14>=5 && it%14< 9) {ieta = 2; iphi = it%14 + (it/14)*4 - 5;} else if (it%14>=9 && it%14<14) {ieta = 3; iphi = it%14 + (it/14)*5 - 9;} if (is==1) ieta = 51 - ieta; } //_____________________________________________________________________________ void TCalDataBlock::Clear(Option_t* opt) { fTowerList->Clear(); fNTowers = 0; fHadEnergy = 0.; fEmEnergy = 0.; fSumEt = 0.; fNTowersOot = 0; fEmEnergyOot = 0; fHadEnergyOot = 0; fSumEtMP[0] = 0.; fSumEtMP[1] = 0.; fMEtXMP = 0.; fMEtYMP = 0.; fXiP = 0.; fXiPbar = 0.; fNMPHits[0] = 0; fNMPHits[1] = 0; } //_____________________________________________________________________________ void TCalDataBlock::Print(Option_t* opt) const { // print all the towers in the list int nt = fTowerList->GetEntriesFast(); if (nt) { fTowerList->At(0)->Print("banner"); for (int i=0; iAt(i)->Print(); } } }