//----------------------------------------------------------------------------- // Oct 19, 2001 A.Dominguez: initialization of the STNTUPLE SiStrip block // //----------------------------------------------------------------------------- #include "AbsEnv/AbsEnv.hh" #include "Stntuple/obj/TStnSiStrip.hh" #include "Stntuple/obj/TSiStripBlock.hh" #include "Stntuple/mod/InitStntupleDataBlocks.hh" #include "TrackingObjects/Tracks/CdfTrack.hh" #include "TrackingObjects/Storable/CdfTrackColl.hh" #include "GeometryBase/CdfDetector.hh" #include "SiliconGeometry/AbsSiDetectorNode.hh" #include "TrackingObjects/Storable/StorableRun2SiStripSet.hh" #include "TrackingObjects/SiData/SiStripSet.hh" #include "TrackingObjects/SiData/SiDataShift.hh" #include "SvxDaqObjects/MostRecentSiCalibration.hh" #include "SvxDaqObjects/SiDBInfoSet.hh" #include "SvxDaqObjects/SiDBInfo.hh" #include "SvxDaqObjects/SiStripPedestal.hh" #include "TrackingObjects/SiData/SiRecoDataRep.hh" #include "SiliconGeometry/CdfHalfLadderSet.hh" #include "ErrorLogger_i/gERRLOG.hh" //_____________________________________________________________________________ Int_t StntupleInitSiStrip(TStnSiStrip& t, const SiStrip& s, const SiDigiCode& d, const SiStripPedestal& p, bool accessGeometry, CdfHalfLadderSet::ConstIterator w ) { static const SiDataRep & dataRep = SiRecoDataRep::instance()->dataRep(); t.fStrip = s.getStripNumber(); if (dataRep.isAdcUnderflowFlagScaled(s.getScaledAdc())) { t.fADC=0; } else { t.fADC = s.dataShift().scaledToFloat(s.getScaledAdc()); } t.fNoise = s.dataShift().scaledToFloat(s.getScaledNoise()); t.fStatus= s.goodStrip(); t.fPed = s.dataShift().scaledToFloat(p.scaledPedestal(0)); // t.fNoise = s.dataShift().scaledToFloat(p.scaledNoise(0)); t.fDNoise= s.dataShift().scaledToFloat(p.scaledDnoise(0)); for (int i=0; itoLocalCoord(t.fStrip,d.getPnSide()); t.fGlobal = TVector3(w->getGlobalPositionVector(t.fLocal,d.getPnSide()).x(), w->getGlobalPositionVector(t.fLocal,d.getPnSide()).y(), w->getGlobalPositionVector(t.fLocal,d.getPnSide()).z()); } return 0; } //_____________________________________________________________________________ Int_t StntupleInitSiStripBlock(TStnDataBlock* Block, AbsEvent* Event, int Mode) { // fill STNTUPLE silicon strip block from a previously filled // StorableRun2SiStripSet. This had been made by SiClusteringModule // in this job, or saved in the event from a previous run. // NOTE: DigiCodes with only ONE strip on them are not saved. This avoids // saving the digicodes where the last strip on the z-side is always readout. int ev_number, rn_number; // check if block has already been // initialized ev_number = AbsEnv::instance()->trigNumber(); rn_number = AbsEnv::instance()->runNumber(); if (Block->Initialized(ev_number,rn_number)) return 0; TSiStripBlock* data = (TSiStripBlock*) Block; data->Clear(); StorableObject::SelectByDescription sel_name(data->CollName()->Data()); StorableObject::SelectByClassName sel_class("StorableRun2SiStripSet"); EventRecord::ConstIterator i( Event, sel_name && sel_class ); if (! i.is_valid()) return 1; StorableRun2SiStripSet_ch ch( i ); // Set the size of the digicode arrays // Clear MUST have been called since it takes care of deletes data->fDigiCodes = new UShort_t[(*ch).size()]; data->fDigiCodeFirstHit = new Int_t[(*ch).size()]; data->fDigiCodeLastHit = new Int_t[(*ch).size()]; data->fDigiCodeBEState = new Char_t[(*ch).size()]; data->fDigiCodeDtL1A = new Short_t[(*ch).size()]; data->fNDigiCodes=0; // Get pedestals and dnoise from database singleton. // (This is our friend the SiStripInfoSet) const SiDBInfoSet *db=MostRecentSiCalibration::getDbInfoSet(); // Get the silicon detector for access to geometry const AbsSiDetectorNode *siDet=CdfDetector::instance()->getSiDetector(); const CdfHalfLadderSet *theLadderSet = siDet->getWaferSet(); CdfHalfLadderSet::ConstIterator wend = theLadderSet->end(); for (SiStripSet::const_digi_iterator di=(*ch).contents().begin(); di!=(*ch).contents().end(); di++) { SiDigiCode digi=(*di).first; SiHalfLadderCode higi(digi); CdfHalfLadderSet::ConstIterator w; w = (data->fStreamGeometryInfo) ? theLadderSet->find(higi) : wend; int first = data->fNSiStrips; // fNSiStrips is incremented by NewSiStrip() int last = -1; for (SiStripSet::const_iterator si=(*di).second.begin(); si!=(*di).second.end() && (*di).second.size()>1; si++) { TStnSiStrip* siStrip = data->NewSiStrip(); // new space for 1 TStnSiStrip in TClonesArray if (data->fStreamGeometryInfo) siStrip->fStreamGeometryInfo=true; // Stream out geometry SiStripPedestal ped; if (db) { SiDBInfoSet::const_digi_iterator pdi=db->contents().find(digi); SiDBInfoSet::const_iterator pi=db->find(pdi,(*si).getStripNumber()); ped=(*pi).pedestal(); } else { ped.set(0, 2, 2); // - new version } StntupleInitSiStrip( *siStrip, *si, digi, ped, w!=wend, w ); // Fill TStnSiStrip } // Loop over strips if (data->fNSiStrips > first) { //There were strips in this digicode last = (data->fNSiStrips)-1; data->fDigiCodes[data->fNDigiCodes] = digi.getKey(); data->fDigiCodeFirstHit[data->fNDigiCodes] = first; data->fDigiCodeLastHit[data->fNDigiCodes] = last; // Assume that the VrbInfoSet was filled by SiClusteringModule. // This is true if monitorMode is true (default) in SiClusteringModule. char be=0; short L1A=0; if ( (*ch).getSvxSiVrbInfoSet() && (*ch).getIslSiVrbInfoSet() ) { if (digi.getLayer() > 0 && digi.getLayer() < 6) { (*ch).getSvxSiVrbInfoSet()->setKey(digi); be=(*ch).getSvxSiVrbInfoSet()->beState(); L1A=(*ch).getSvxSiVrbInfoSet()->timeSinceL1A(); } else { (*ch).getIslSiVrbInfoSet()->setKey(digi); be=(*ch).getIslSiVrbInfoSet()->beState(); L1A=(*ch).getIslSiVrbInfoSet()->timeSinceL1A(); } } data->fDigiCodeBEState[data->fNDigiCodes] = be; data->fDigiCodeDtL1A[data->fNDigiCodes] = L1A; data->fNDigiCodes++; } } // Loop over digicodes data->f_EventNumber = ev_number; data->f_RunNumber = rn_number; return 0; }