#include <L1Trigger/GlobalTrigger/interface/L1GtCorrelationCondition.h>
Public Member Functions | |
const bool | evaluateCondition () const |
the core function to check if the condition matches | |
const L1GtCorrelationTemplate * | gtCorrelationTemplate () const |
get / set the pointer to a L1GtCondition | |
const L1GlobalTriggerGTL * | gtGTL () const |
get / set the pointer to GTL | |
const L1GlobalTriggerPSB * | gtPSB () const |
get / set the pointer to PSB | |
L1GtCorrelationCondition (const L1GtCorrelationCondition &) | |
L1GtCorrelationCondition (const L1GtCondition *, const L1GtCondition *, const L1GtCondition *, const int, const int, const int, const int, const L1GlobalTriggerGTL *, const L1GlobalTriggerPSB *, const L1GtEtaPhiConversions *) | |
from base template condition (from event setup usually) | |
L1GtCorrelationCondition () | |
constructors default | |
L1GtCorrelationCondition & | operator= (const L1GtCorrelationCondition &) |
void | print (std::ostream &myCout) const |
print condition | |
void | setGtCorrelationTemplate (const L1GtCorrelationTemplate *) |
void | setGtGTL (const L1GlobalTriggerGTL *) |
set the pointer to GTL | |
void | setGtPSB (const L1GlobalTriggerPSB *) |
set the pointer to PSB | |
virtual | ~L1GtCorrelationCondition () |
Private Member Functions | |
void | copy (const L1GtCorrelationCondition &cp) |
copy function for copy constructor and operator= | |
Private Attributes | |
int | m_cond0EtaBits |
int | m_cond0NrL1Objects |
int | m_cond1EtaBits |
int | m_cond1NrL1Objects |
const L1GtCondition * | m_gtCond0 |
pointer to first sub-condition | |
const L1GtCondition * | m_gtCond1 |
pointer to second sub-condition | |
const L1GtCorrelationTemplate * | m_gtCorrelationTemplate |
pointer to a L1GtCorrelationTemplate | |
const L1GtEtaPhiConversions * | m_gtEtaPhiConversions |
pointer to eta and phi conversion class | |
const L1GlobalTriggerGTL * | m_gtGTL |
pointer to GTL, to be able to get the trigger objects | |
const L1GlobalTriggerPSB * | m_gtPSB |
pointer to PSB, to be able to get the trigger objects |
Implementation: <TODO: enter implementation details>
$Date$ $Revision$
Definition at line 36 of file L1GtCorrelationCondition.h.
L1GtCorrelationCondition::L1GtCorrelationCondition | ( | ) |
constructors default
Definition at line 60 of file L1GtCorrelationCondition.cc.
00060 : 00061 L1GtConditionEvaluation() { 00062 00063 // empty 00064 00065 }
L1GtCorrelationCondition::L1GtCorrelationCondition | ( | const L1GtCondition * | corrTemplate, | |
const L1GtCondition * | cond0Condition, | |||
const L1GtCondition * | cond1Condition, | |||
const | int, | |||
const | int, | |||
const | int, | |||
const | int, | |||
const L1GlobalTriggerGTL * | ptrGTL, | |||
const L1GlobalTriggerPSB * | ptrPSB, | |||
const L1GtEtaPhiConversions * | etaPhiConversions | |||
) |
from base template condition (from event setup usually)
Definition at line 68 of file L1GtCorrelationCondition.cc.
References L1GtConditionEvaluation::m_condMaxNumberObjects.
00074 : 00075 L1GtConditionEvaluation(), 00076 m_gtCorrelationTemplate(static_cast<const L1GtCorrelationTemplate*>(corrTemplate)), 00077 m_gtCond0(cond0Condition), m_gtCond1(cond1Condition), 00078 m_cond0NrL1Objects(cond0NrL1Objects), 00079 m_cond1NrL1Objects(cond1NrL1Objects), m_cond0EtaBits(cond0EtaBits), 00080 m_cond1EtaBits(cond1EtaBits), m_gtGTL(ptrGTL), m_gtPSB(ptrPSB), 00081 m_gtEtaPhiConversions(etaPhiConversions) { 00082 00083 m_condMaxNumberObjects = 2; // irrelevant for correlation conditions 00084 00085 }
L1GtCorrelationCondition::L1GtCorrelationCondition | ( | const L1GtCorrelationCondition & | cp | ) |
Definition at line 112 of file L1GtCorrelationCondition.cc.
References copy().
00113 : 00114 L1GtConditionEvaluation() { 00115 copy(cp); 00116 }
L1GtCorrelationCondition::~L1GtCorrelationCondition | ( | ) | [virtual] |
void L1GtCorrelationCondition::copy | ( | const L1GtCorrelationCondition & | cp | ) | [private] |
copy function for copy constructor and operator=
Definition at line 88 of file L1GtCorrelationCondition.cc.
References L1GtConditionEvaluation::m_combinationsInCond, m_cond0EtaBits, m_cond0NrL1Objects, m_cond1EtaBits, m_cond1NrL1Objects, L1GtConditionEvaluation::m_condLastResult, L1GtConditionEvaluation::m_condMaxNumberObjects, m_gtCond0, m_gtCond1, m_gtCorrelationTemplate, m_gtEtaPhiConversions, m_gtGTL, and m_gtPSB.
Referenced by L1GtCorrelationCondition(), and operator=().
00088 { 00089 00090 m_gtCorrelationTemplate = cp.m_gtCorrelationTemplate; 00091 00092 m_gtCond0 = cp.m_gtCond0; 00093 m_gtCond1 = cp.m_gtCond1; 00094 00095 m_cond0NrL1Objects = cp.m_cond0NrL1Objects; 00096 m_cond1NrL1Objects = cp.m_cond1NrL1Objects; 00097 m_cond0EtaBits = cp.m_cond0EtaBits; 00098 m_cond1EtaBits = cp.m_cond1EtaBits; 00099 00100 m_gtCorrelationTemplate = cp.m_gtCorrelationTemplate; 00101 m_gtGTL = cp.m_gtGTL; 00102 m_gtPSB = cp.m_gtPSB; 00103 00104 m_gtEtaPhiConversions = cp.m_gtEtaPhiConversions; 00105 00106 m_condMaxNumberObjects = cp.m_condMaxNumberObjects; 00107 m_condLastResult = cp.m_condLastResult; 00108 m_combinationsInCond = cp.m_combinationsInCond; 00109 00110 }
const bool L1GtCorrelationCondition::evaluateCondition | ( | ) | const [virtual] |
the core function to check if the condition matches
Implements L1GtConditionEvaluation.
Definition at line 156 of file L1GtCorrelationCondition.cc.
References CenJet, L1GtCorrelationTemplate::cond0Category(), L1GtCorrelationTemplate::cond1Category(), CondCalo, CondEnergySum, L1GtConditionEvaluation::condLastResult(), CondMuon, lat::endl(), L1GtConditionEvaluation::evaluateConditionStoreResult(), ForJet, L1GlobalTriggerPSB::getCandL1CenJet(), L1GlobalTriggerPSB::getCandL1ETM(), L1GlobalTriggerPSB::getCandL1ForJet(), L1GlobalTriggerPSB::getCandL1IsoEG(), L1GlobalTriggerGTL::getCandL1Mu(), L1GlobalTriggerPSB::getCandL1NoIsoEG(), L1GlobalTriggerPSB::getCandL1TauJet(), L1GtConditionEvaluation::getCombinationsInCond(), edm::isDebugEnabled(), IsoEG, LogTrace, m_cond0EtaBits, m_cond0NrL1Objects, m_cond1EtaBits, m_cond1NrL1Objects, m_gtCond0, m_gtCond1, m_gtCorrelationTemplate, m_gtGTL, m_gtPSB, NoIsoEG, L1GtCondition::objectType(), L1GctEtMiss::phi(), L1GtCaloCondition::print(), L1GtMuonCondition::print(), L1GtEnergySumCondition::print(), and TauJet.
00156 { 00157 00158 bool condResult = false; 00159 00160 // number of objects in condition (it is 2, no need to retrieve from 00161 // condition template) and their type 00162 int nObjInCond = 2; 00163 std::vector<L1GtObject> cndObjTypeVec(nObjInCond); 00164 00165 // evaluate first the two sub-conditions (Type1s) 00166 00167 const L1GtConditionCategory cond0Categ = m_gtCorrelationTemplate->cond0Category(); 00168 const L1GtConditionCategory cond1Categ = m_gtCorrelationTemplate->cond1Category(); 00169 00170 const L1GtMuonTemplate* corrMuon = 0; 00171 const L1GtCaloTemplate* corrCalo = 0; 00172 const L1GtEnergySumTemplate* corrEnergySum = 0; 00173 00174 CombinationsInCond cond0Comb; 00175 CombinationsInCond cond1Comb; 00176 00177 switch (cond0Categ) { 00178 case CondMuon: { 00179 corrMuon = static_cast<const L1GtMuonTemplate*>(m_gtCond0); 00180 L1GtMuonCondition muCondition(corrMuon, m_gtGTL, 00181 m_cond0NrL1Objects, m_cond0EtaBits); 00182 00183 muCondition.evaluateConditionStoreResult(); 00184 condResult = muCondition.condLastResult(); 00185 00186 cond0Comb = *(muCondition.getCombinationsInCond()); 00187 cndObjTypeVec[0] = (corrMuon->objectType())[0]; 00188 00189 if (edm::isDebugEnabled() ) { 00190 std::ostringstream myCout; 00191 muCondition.print(myCout); 00192 00193 LogTrace("L1GtCorrelationCondition") << myCout.str() << std::endl; 00194 } 00195 } 00196 break; 00197 case CondCalo: { 00198 corrCalo = static_cast<const L1GtCaloTemplate*>(m_gtCond0); 00199 L1GtCaloCondition caloCondition(corrCalo, m_gtPSB, 00200 m_cond0NrL1Objects, m_cond0NrL1Objects, m_cond0NrL1Objects, 00201 m_cond0NrL1Objects, m_cond0NrL1Objects, m_cond0EtaBits); 00202 00203 caloCondition.evaluateConditionStoreResult(); 00204 condResult = caloCondition.condLastResult(); 00205 00206 cond0Comb = *(caloCondition.getCombinationsInCond()); 00207 cndObjTypeVec[0] = (corrCalo->objectType())[0]; 00208 00209 if (edm::isDebugEnabled() ) { 00210 std::ostringstream myCout; 00211 caloCondition.print(myCout); 00212 00213 LogTrace("L1GtCorrelationCondition") << myCout.str() << std::endl; 00214 } 00215 } 00216 break; 00217 case CondEnergySum: { 00218 corrEnergySum = static_cast<const L1GtEnergySumTemplate*>(m_gtCond0); 00219 L1GtEnergySumCondition eSumCondition(corrEnergySum, m_gtPSB); 00220 00221 eSumCondition.evaluateConditionStoreResult(); 00222 condResult = eSumCondition.condLastResult(); 00223 00224 cond0Comb = *(eSumCondition.getCombinationsInCond()); 00225 cndObjTypeVec[0] = (corrEnergySum->objectType())[0]; 00226 00227 if (edm::isDebugEnabled() ) { 00228 std::ostringstream myCout; 00229 eSumCondition.print(myCout); 00230 00231 LogTrace("L1GtCorrelationCondition") << myCout.str() << std::endl; 00232 } 00233 } 00234 break; 00235 default: { 00236 // should not arrive here 00237 condResult = false; 00238 } 00239 break; 00240 } 00241 00242 // return if first subcondition is false 00243 if (!condResult) { 00244 return false; 00245 } 00246 00247 00248 switch (cond1Categ) { 00249 case CondMuon: { 00250 corrMuon = static_cast<const L1GtMuonTemplate*>(m_gtCond1); 00251 L1GtMuonCondition muCondition(corrMuon, m_gtGTL, 00252 m_cond1NrL1Objects, m_cond1EtaBits); 00253 00254 muCondition.evaluateConditionStoreResult(); 00255 condResult = muCondition.condLastResult(); 00256 00257 cond1Comb = *(muCondition.getCombinationsInCond()); 00258 cndObjTypeVec[1] = (corrMuon->objectType())[0]; 00259 00260 if (edm::isDebugEnabled() ) { 00261 std::ostringstream myCout; 00262 muCondition.print(myCout); 00263 00264 LogTrace("L1GtCorrelationCondition") << myCout.str() << std::endl; 00265 } 00266 } 00267 break; 00268 case CondCalo: { 00269 corrCalo = static_cast<const L1GtCaloTemplate*>(m_gtCond1); 00270 L1GtCaloCondition caloCondition(corrCalo, m_gtPSB, 00271 m_cond1NrL1Objects, m_cond1NrL1Objects, m_cond1NrL1Objects, 00272 m_cond1NrL1Objects, m_cond1NrL1Objects, m_cond1EtaBits); 00273 00274 caloCondition.evaluateConditionStoreResult(); 00275 condResult = caloCondition.condLastResult(); 00276 00277 cond1Comb = *(caloCondition.getCombinationsInCond()); 00278 cndObjTypeVec[1] = (corrCalo->objectType())[0]; 00279 00280 if (edm::isDebugEnabled() ) { 00281 std::ostringstream myCout; 00282 caloCondition.print(myCout); 00283 00284 LogTrace("L1GtCorrelationCondition") << myCout.str() << std::endl; 00285 } 00286 } 00287 break; 00288 case CondEnergySum: { 00289 corrEnergySum = static_cast<const L1GtEnergySumTemplate*>(m_gtCond1); 00290 L1GtEnergySumCondition eSumCondition(corrEnergySum, m_gtPSB); 00291 eSumCondition.evaluateConditionStoreResult(); 00292 condResult = eSumCondition.condLastResult(); 00293 00294 cond1Comb = *(eSumCondition.getCombinationsInCond()); 00295 cndObjTypeVec[1] = (corrEnergySum->objectType())[0]; 00296 00297 if (edm::isDebugEnabled() ) { 00298 std::ostringstream myCout; 00299 eSumCondition.print(myCout); 00300 00301 LogTrace("L1GtCorrelationCondition") << myCout.str() << std::endl; 00302 } 00303 } 00304 break; 00305 default: { 00306 // should not arrive here 00307 condResult = false; 00308 } 00309 break; 00310 } 00311 00312 // return if second subcondition is false 00313 // if here, the first subcondition was true 00314 if (!condResult) { 00315 return false; 00316 } 00317 00318 // 00319 // evaluate the delta_eta and delta_phi correlations 00320 // 00321 00322 // store the indices of the calorimeter objects 00323 // from the combination evaluated in the condition 00324 SingleCombInCond objectsInComb; 00325 objectsInComb.reserve(nObjInCond); 00326 00327 // clear the m_combinationsInCond vector 00328 (*m_combinationsInCond).clear(); 00329 00330 // pointers to objects 00331 const std::vector<const L1MuGMTCand*>* candMuVec = 0; 00332 const std::vector<const L1GctCand*>* candCaloVec = 0; 00333 const L1GctEtMiss* candETM = 0; // no other energy sum appears in correlation conditions 00334 00335 unsigned int phiIndex0; 00336 unsigned int phiIndex1; 00337 unsigned int etaIndex0; 00338 unsigned int etaIndex1; 00339 00340 // loop over all combinations which produced individually "true" as Type1s 00341 for (std::vector<SingleCombInCond>::const_iterator 00342 it0Comb = cond0Comb.begin(); it0Comb != cond0Comb.end(); it0Comb++) { 00343 00344 // Type1s: there is 1 object only, no need for a loop (*it0Comb)[0] 00345 int obj0Index = (*it0Comb)[0]; 00346 switch (cond0Categ) { 00347 case CondMuon: { 00348 candMuVec = m_gtGTL->getCandL1Mu(); 00349 phiIndex0 = (*candMuVec)[obj0Index]->phiIndex(); 00350 etaIndex0 = (*candMuVec)[obj0Index]->etaIndex(); 00351 00352 } 00353 break; 00354 case CondCalo: { 00355 switch (cndObjTypeVec[0]) { 00356 case NoIsoEG: 00357 candCaloVec = m_gtPSB->getCandL1NoIsoEG(); 00358 break; 00359 case IsoEG: 00360 candCaloVec = m_gtPSB->getCandL1IsoEG(); 00361 break; 00362 case CenJet: 00363 candCaloVec = m_gtPSB->getCandL1CenJet(); 00364 break; 00365 case ForJet: 00366 candCaloVec = m_gtPSB->getCandL1ForJet(); 00367 break; 00368 case TauJet: 00369 candCaloVec = m_gtPSB->getCandL1TauJet(); 00370 break; 00371 default: 00372 // do nothing 00373 break; 00374 } 00375 00376 phiIndex0 = (*candCaloVec)[obj0Index]->phiIndex(); 00377 etaIndex0 = (*candCaloVec)[obj0Index]->etaIndex(); 00378 } 00379 break; 00380 case CondEnergySum: { 00381 candETM = m_gtPSB->getCandL1ETM(); 00382 phiIndex0 = candETM->phi(); 00383 } 00384 break; 00385 default: { 00386 // should not arrive here 00387 condResult = false; 00388 } 00389 break; 00390 } 00391 00392 for (std::vector<SingleCombInCond>::const_iterator 00393 it1Comb = cond1Comb.begin(); it1Comb != cond1Comb.end(); it1Comb++) { 00394 00395 // Type1s: there is 1 object only, no need for a loop (*it1Comb)[0] 00396 int obj1Index = (*it1Comb)[0]; 00397 switch (cond1Categ) { 00398 case CondMuon: { 00399 candMuVec = m_gtGTL->getCandL1Mu(); 00400 phiIndex1 = (*candMuVec)[obj1Index]->phiIndex(); 00401 etaIndex1 = (*candMuVec)[obj1Index]->etaIndex(); 00402 00403 } 00404 break; 00405 case CondCalo: { 00406 switch (cndObjTypeVec[1]) { 00407 case NoIsoEG: 00408 candCaloVec = m_gtPSB->getCandL1NoIsoEG(); 00409 break; 00410 case IsoEG: 00411 candCaloVec = m_gtPSB->getCandL1IsoEG(); 00412 break; 00413 case CenJet: 00414 candCaloVec = m_gtPSB->getCandL1CenJet(); 00415 break; 00416 case ForJet: 00417 candCaloVec = m_gtPSB->getCandL1ForJet(); 00418 break; 00419 case TauJet: 00420 candCaloVec = m_gtPSB->getCandL1TauJet(); 00421 break; 00422 default: 00423 // do nothing 00424 break; 00425 } 00426 00427 phiIndex1 = (*candCaloVec)[obj1Index]->phiIndex(); 00428 etaIndex1 = (*candCaloVec)[obj1Index]->etaIndex(); 00429 } 00430 break; 00431 case CondEnergySum: { 00432 candETM = m_gtPSB->getCandL1ETM(); 00433 phiIndex1 = candETM->phi(); 00434 } 00435 break; 00436 default: { 00437 // should not arrive here 00438 condResult = false; 00439 } 00440 break; 00441 } 00442 00443 if (edm::isDebugEnabled() ) { 00444 LogTrace("L1GtCorrelationCondition") 00445 << "\n First correlation object of type " << cndObjTypeVec[0] 00446 << " with collection index " << obj0Index 00447 << ": phiIndex = " << phiIndex0 << " etaIndex = " << etaIndex0 00448 << "\n Second correlation object of type " << cndObjTypeVec[1] 00449 << " with collection index " << obj1Index 00450 << " phiIndex = " << phiIndex1 << " etaIndex = " << etaIndex1 00451 << std::endl; 00452 } 00453 00454 // clear the indices in the combination 00455 objectsInComb.clear(); 00456 //... 00457 00458 objectsInComb.push_back(obj0Index); 00459 objectsInComb.push_back(obj1Index); //... 00460 00461 // evaluate delta_eta 00462 00463 // evaluate delta_phi 00464 00465 // if we get here all checks were successfull for this combination 00466 // set the general result for evaluateCondition to "true" 00467 00468 condResult = true; 00469 (*m_combinationsInCond).push_back(objectsInComb); 00470 00471 } 00472 00473 } 00474 00475 return condResult; 00476 00477 }
const L1GtCorrelationTemplate* L1GtCorrelationCondition::gtCorrelationTemplate | ( | ) | const [inline] |
get / set the pointer to a L1GtCondition
Definition at line 71 of file L1GtCorrelationCondition.h.
References m_gtCorrelationTemplate.
00071 { 00072 return m_gtCorrelationTemplate; 00073 }
const L1GlobalTriggerGTL* L1GtCorrelationCondition::gtGTL | ( | ) | const [inline] |
get / set the pointer to GTL
Definition at line 78 of file L1GtCorrelationCondition.h.
References m_gtGTL.
00078 { 00079 return m_gtGTL; 00080 }
const L1GlobalTriggerPSB* L1GtCorrelationCondition::gtPSB | ( | ) | const [inline] |
get / set the pointer to PSB
Definition at line 85 of file L1GtCorrelationCondition.h.
References m_gtPSB.
00085 { 00086 return m_gtPSB; 00087 }
L1GtCorrelationCondition & L1GtCorrelationCondition::operator= | ( | const L1GtCorrelationCondition & | cp | ) |
Definition at line 126 of file L1GtCorrelationCondition.cc.
References copy().
00128 { 00129 copy(cp); 00130 return *this; 00131 }
void L1GtCorrelationCondition::print | ( | std::ostream & | myCout | ) | const [virtual] |
print condition
Reimplemented from L1GtConditionEvaluation.
Definition at line 480 of file L1GtCorrelationCondition.cc.
References m_gtCorrelationTemplate, L1GtConditionEvaluation::print(), and L1GtCorrelationTemplate::print().
Referenced by L1GlobalTriggerGTL::run().
00480 { 00481 00482 m_gtCorrelationTemplate->print(myCout); 00483 L1GtConditionEvaluation::print(myCout); 00484 00485 }
void L1GtCorrelationCondition::setGtCorrelationTemplate | ( | const L1GtCorrelationTemplate * | corrTempl | ) |
Definition at line 134 of file L1GtCorrelationCondition.cc.
References m_gtCorrelationTemplate.
00135 { 00136 00137 m_gtCorrelationTemplate = corrTempl; 00138 00139 }
void L1GtCorrelationCondition::setGtGTL | ( | const L1GlobalTriggerGTL * | ptrGTL | ) |
set the pointer to GTL
Definition at line 142 of file L1GtCorrelationCondition.cc.
References m_gtGTL.
00142 { 00143 00144 m_gtGTL = ptrGTL; 00145 00146 }
void L1GtCorrelationCondition::setGtPSB | ( | const L1GlobalTriggerPSB * | ptrPSB | ) |
set the pointer to PSB
Definition at line 149 of file L1GtCorrelationCondition.cc.
References m_gtPSB.
00149 { 00150 00151 m_gtPSB = ptrPSB; 00152 00153 }
int L1GtCorrelationCondition::m_cond0EtaBits [private] |
Definition at line 110 of file L1GtCorrelationCondition.h.
Referenced by copy(), and evaluateCondition().
Definition at line 108 of file L1GtCorrelationCondition.h.
Referenced by copy(), and evaluateCondition().
int L1GtCorrelationCondition::m_cond1EtaBits [private] |
Definition at line 111 of file L1GtCorrelationCondition.h.
Referenced by copy(), and evaluateCondition().
Definition at line 109 of file L1GtCorrelationCondition.h.
Referenced by copy(), and evaluateCondition().
const L1GtCondition* L1GtCorrelationCondition::m_gtCond0 [private] |
pointer to first sub-condition
Definition at line 102 of file L1GtCorrelationCondition.h.
Referenced by copy(), and evaluateCondition().
const L1GtCondition* L1GtCorrelationCondition::m_gtCond1 [private] |
pointer to second sub-condition
Definition at line 105 of file L1GtCorrelationCondition.h.
Referenced by copy(), and evaluateCondition().
const L1GtCorrelationTemplate* L1GtCorrelationCondition::m_gtCorrelationTemplate [private] |
pointer to a L1GtCorrelationTemplate
Definition at line 99 of file L1GtCorrelationCondition.h.
Referenced by copy(), evaluateCondition(), gtCorrelationTemplate(), print(), and setGtCorrelationTemplate().
const L1GtEtaPhiConversions* L1GtCorrelationCondition::m_gtEtaPhiConversions [private] |
pointer to eta and phi conversion class
Definition at line 120 of file L1GtCorrelationCondition.h.
Referenced by copy().
const L1GlobalTriggerGTL* L1GtCorrelationCondition::m_gtGTL [private] |
pointer to GTL, to be able to get the trigger objects
Definition at line 114 of file L1GtCorrelationCondition.h.
Referenced by copy(), evaluateCondition(), gtGTL(), and setGtGTL().
const L1GlobalTriggerPSB* L1GtCorrelationCondition::m_gtPSB [private] |
pointer to PSB, to be able to get the trigger objects
Definition at line 117 of file L1GtCorrelationCondition.h.
Referenced by copy(), evaluateCondition(), gtPSB(), and setGtPSB().