//----------------------- EXPORT TO PROCESS -------------------------- SharedMemory::Export SharedMemory::exportToProcess(RemoteProcess &target, bool readOnly) const { HANDLE targetProcessHandle = target.getHandle(); HANDLE exportHandle; BOOL success = DuplicateHandle( GetCurrentProcess(), // source process handle this->mappingObjectHandle, // source handle targetProcessHandle, // target process handle &exportHandle, // out: target handle NULL, // access false, // inherit readOnly ? PAGE_READONLY : DUPLICATE_SAME_ACCESS); if(!success) { throw GeneralException(__FUNCTION__ ": failed export SharedMemory"); } Export exportObject; exportObject.bufferSize = this->bufferSize; exportObject.targetProcessMappingObjectHandle = exportHandle; exportObject.readOnly = readOnly; return exportObject; }
AnyType TPTScriptInterface::tptS_set(std::deque<std::string> * words) { //Arguments from stack StringType property = eval(words); AnyType selector = eval(words); AnyType value = eval(words); Simulation * sim = m->GetSimulation(); unsigned char * partsBlock = (unsigned char*)&sim->parts[0]; int returnValue = 0; FormatType propertyFormat; int propertyOffset = GetPropertyOffset(property.Value(), propertyFormat); if(propertyOffset==-1) throw GeneralException("Invalid property"); //Selector int newValue; float newValuef; if (value.GetType() == TypeNumber) { newValue = newValuef = ((NumberType)value).Value(); } else if (value.GetType() == TypeFloat) { newValue = newValuef = ((FloatType)value).Value(); } else if(value.GetType() == TypeString) { if (property.Value() == "temp") { std::string newString = ((StringType)value).Value(); if (newString.at(newString.length()-1) == 'C') newValuef = atof(newString.substr(0, newString.length()-1).c_str())+273.15; else if (newString.at(newString.length()-1) == 'F') newValuef = (atof(newString.substr(0, newString.length()-1).c_str())-32.0f)*5/9+273.15f; else throw GeneralException("Invalid value for assignment"); } else { newValue = GetParticleType(((StringType)value).Value()); if (newValue < 0 || newValue >= PT_NUM) { // TODO: add element CAKE to invalidate this if (!strcasecmp(((StringType)value).Value().c_str(),"cake")) throw GeneralException("Cake is a lie, not an element"); throw GeneralException("Invalid element"); } } } else throw GeneralException("Invalid value for assignment"); if (property.Value() == "type" && (newValue < 0 || newValue >= PT_NUM || !sim->elements[newValue].Enabled)) throw GeneralException("Invalid element"); if(selector.GetType() == TypePoint || selector.GetType() == TypeNumber) { int partIndex = -1; if(selector.GetType() == TypePoint) { ui::Point tempPoint = ((PointType)selector).Value(); if(tempPoint.X<0 || tempPoint.Y<0 || tempPoint.Y >= YRES || tempPoint.X >= XRES) throw GeneralException("Invalid position"); } else partIndex = ((NumberType)selector).Value(); if(partIndex<0 || partIndex>NPART || sim->parts[partIndex].type==0) throw GeneralException("Invalid particle"); switch(propertyFormat) { case FormatInt: *((int*)(partsBlock+(partIndex*sizeof(Particle))+propertyOffset)) = newValue; break; case FormatFloat: *((float*)(partsBlock+(partIndex*sizeof(Particle))+propertyOffset)) = newValuef; break; } returnValue = 1; } else if(selector.GetType() == TypeString && ((StringType)selector).Value() == "all") { switch(propertyFormat) { case FormatInt: { for(int j = 0; j < NPART; j++) if(sim->parts[j].type) { returnValue++; *((int*)(partsBlock+(j*sizeof(Particle))+propertyOffset)) = newValue; } } break; case FormatFloat: { for(int j = 0; j < NPART; j++) if(sim->parts[j].type) { returnValue++; *((float*)(partsBlock+(j*sizeof(Particle))+propertyOffset)) = newValuef; } } break; } } else if(selector.GetType() == TypeString || selector.GetType() == TypeNumber) { int type; if(selector.GetType() == TypeNumber) type = ((NumberType)selector).Value(); else if(selector.GetType() == TypeString) type = GetParticleType(((StringType)selector).Value()); if(type<0 || type>=PT_NUM) throw GeneralException("Invalid particle type"); if(type==0) throw GeneralException("Cannot set properties of particles that do not exist"); std::cout << propertyOffset << std::endl; switch(propertyFormat) { case FormatInt: { for(int j = 0; j < NPART; j++) if(sim->parts[j].type == type) { returnValue++; *((int*)(partsBlock+(j*sizeof(Particle))+propertyOffset)) = newValue; } } break; case FormatFloat: { for(int j = 0; j < NPART; j++) if(sim->parts[j].type == type) { returnValue++; *((float*)(partsBlock+(j*sizeof(Particle))+propertyOffset)) = newValuef; } } break; } } else throw GeneralException("Invalid selector"); return NumberType(returnValue); }
AnyType TPTScriptInterface::tptS_set(std::deque<std::string> * words) { //Arguments from stack StringType property = eval(words); AnyType selector = eval(words); AnyType value = eval(words); Simulation * sim = m->GetSimulation(); unsigned char * partsBlock = (unsigned char*)&sim->parts[0]; int returnValue = 0; FormatType propertyFormat; int propertyOffset = GetPropertyOffset(property.Value(), propertyFormat); if(propertyOffset==-1) throw GeneralException("Invalid property"); //Selector int newValue; if(value.GetType() == TypeNumber) newValue = ((NumberType)value).Value(); else if(value.GetType() == TypeString) { newValue = GetParticleType(((StringType)value).Value()); if (newValue < 0 || newValue >= PT_NUM) throw GeneralException("Invalid element"); } else throw GeneralException("Invalid value for assignment"); if (property.Value() == "type" && (newValue < 0 || newValue >= PT_NUM)) throw GeneralException("Invalid element"); if(selector.GetType() == TypePoint || selector.GetType() == TypeNumber) { int partIndex = -1; if(selector.GetType() == TypePoint) { ui::Point tempPoint = ((PointType)selector).Value(); if(tempPoint.X<0 || tempPoint.Y<0 || tempPoint.Y >= YRES || tempPoint.X >= XRES) throw GeneralException("Invalid position"); } else partIndex = ((NumberType)selector).Value(); if(partIndex<0 || partIndex>NPART || sim->parts[partIndex].type==0) throw GeneralException("Invalid particle"); switch(propertyFormat) { case FormatInt: *((int*)(partsBlock+(partIndex*sizeof(Particle))+propertyOffset)) = newValue; break; case FormatFloat: *((float*)(partsBlock+(partIndex*sizeof(Particle))+propertyOffset)) = newValue; break; } returnValue = 1; } else if(selector.GetType() == TypeString && ((StringType)selector).Value() == "all") { switch(propertyFormat) { case FormatInt: { for(int j = 0; j < NPART; j++) if(sim->parts[j].type) { returnValue++; *((int*)(partsBlock+(j*sizeof(Particle))+propertyOffset)) = newValue; } } break; case FormatFloat: { for(int j = 0; j < NPART; j++) if(sim->parts[j].type) { returnValue++; *((float*)(partsBlock+(j*sizeof(Particle))+propertyOffset)) = newValue; } } break; } } else if(selector.GetType() == TypeString || selector.GetType() == TypeNumber) { int type; if(selector.GetType() == TypeNumber) type = ((NumberType)selector).Value(); else if(selector.GetType() == TypeString) type = GetParticleType(((StringType)selector).Value()); if(type<0 || type>=PT_NUM) throw GeneralException("Invalid particle type"); std::cout << propertyOffset << std::endl; switch(propertyFormat) { case FormatInt: { for(int j = 0; j < NPART; j++) if(sim->parts[j].type == type) { returnValue++; *((int*)(partsBlock+(j*sizeof(Particle))+propertyOffset)) = newValue; } } break; case FormatFloat: { for(int j = 0; j < NPART; j++) if(sim->parts[j].type == type) { returnValue++; *((float*)(partsBlock+(j*sizeof(Particle))+propertyOffset)) = newValue; } } break; } } else throw GeneralException("Invalid selector"); return NumberType(returnValue); }
Globals::Globals() { clockInSeconds_ = -1; adcClockInSeconds_ = -1; filterClockInSeconds_ = -1; eventInSeconds_ = -1; energyContraction_ = 1.0; hasReject_ = false; revision_ = "None"; numTraces_ = 16; try { pugi::xml_document doc; pugi::xml_parse_result result = doc.load_file("Config.xml"); std::stringstream ss; if (!result) { ss << "Globals : error parsing file " << "Config.xml"; ss << " : " << result.description(); throw GeneralException(ss.str()); } Messenger m; pugi::xml_node description = doc.child("Configuration").child("Description"); std::string desc_text = description.text().get(); m.detail("Experiment: " + desc_text); m.start("Loading global parameters"); pugi::xml_node global = doc.child("Configuration").child("Global"); for (pugi::xml_node_iterator it = global.begin(); it != global.end(); ++it) { if (std::string(it->name()).compare("Revision") == 0) { revision_ = it->attribute("version").as_string(); ss << "Revision: " << revision_; m.detail(ss.str()); ss.str(""); if (revision_ == "A") { clockInSeconds_ = 10e-9; adcClockInSeconds_ = 10e-9; filterClockInSeconds_ = 10e-9; maxWords_ = IO_BUFFER_LENGTH; } else if (revision_ == "D") { clockInSeconds_ = 10e-9; adcClockInSeconds_ = 10e-9; filterClockInSeconds_ = 10e-9; maxWords_ = EXTERNAL_FIFO_LENGTH; } else if (revision_ == "F" || revision_ == "DF") { clockInSeconds_ = 8e-9; adcClockInSeconds_ = 4e-9; filterClockInSeconds_ = 8e-9; maxWords_ = EXTERNAL_FIFO_LENGTH; } else { throw GeneralException("Globals: unknown revision version " + revision_); } } else if (std::string(it->name()).compare("EventWidth") == 0) { std::string units = it->attribute("unit").as_string("None"); double value = it->attribute("value").as_double(-1); if (units == "ns") value *= 1e-9; else if (units == "us") value *= 1e-6; else if (units == "ms") value *= 1e-3; else if (units == "s") value *= 1.0; else throw GeneralException("Globals: unknown units " + units); eventInSeconds_ = value; eventWidth_ = (int)(eventInSeconds_ / clockInSeconds_); ss << "Event width: " << eventInSeconds_ * 1e6 << " us" << ", i.e. " << eventWidth_ << " pixie16 clock tics."; m.detail(ss.str()); ss.str(""); } else if (std::string(it->name()).compare("EnergyContraction") == 0) { energyContraction_ = it->attribute("value").as_double(1); } else if (std::string(it->name()).compare("Path") == 0) { configPath_ = it->text().get(); m.detail("Path to other configuration files: " + configPath_); } else if (std::string(it->name()).compare("NumOfTraces") == 0) { numTraces_ = it->attribute("value").as_uint(); } else WarnOfUnknownParameter(m, it); } unsigned int power2 = 1; unsigned int maxDammSize = 16384; while (power2 < numTraces_ && power2 < maxDammSize) { power2 *= 2; } ss << "Number of traces set to " << power2 << " (" << numTraces_ << ")"; m.detail(ss.str()); ss.str(""); numTraces_ = power2; m.detail("Loading rejection regions"); pugi::xml_node reject = doc.child("Configuration").child("Reject"); for (pugi::xml_node time = reject.child("Time"); time; time = time.next_sibling("Time")) { int start = time.attribute("start").as_int(-1); int end = time.attribute("end").as_int(-1); std::stringstream ss; if (start < 0 || end < 0 || start > end) { ss << "Globals: incomplete or wrong rejection region " << "declaration: " << start << ", " << end; throw GeneralException(ss.str()); } ss << "Rejection region: " << start << " to " << end << " s"; m.detail(ss.str(), 1); std::pair<int, int> region(start, end); reject_.push_back(region); } if (reject_.size() > 0) { hasReject_ = true; } pugi::xml_node timing = doc.child("Configuration").child("Timing"); for(pugi::xml_node_iterator it = timing.child("Physical").begin(); it != timing.child("Physical").end(); ++it) { if(std::string(it->name()).compare("NeutronMass") == 0) neutronMass_ = it->attribute("value").as_double(); else if(std::string(it->name()).compare("SpeedOfLight") == 0) speedOfLight_ = it->attribute("value").as_double(); else if(std::string(it->name()).compare("SpeedOfLightSmall") == 0) speedOfLightSmall_ = it->attribute("value").as_double(); else if(std::string(it->name()).compare("SpeedOfLightBig") == 0) speedOfLightBig_ = it->attribute("value").as_double(); else if(std::string(it->name()).compare("SpeedOfLightMedium") == 0) speedOfLightMedium_ = it->attribute("value").as_double(); else if(std::string(it->name()).compare("SmallLength") == 0) smallLength_ = it->attribute("value").as_double(); else if(std::string(it->name()).compare("MediumLength") == 0) mediumLength_ = it->attribute("value").as_double(); else if(std::string(it->name()).compare("BigLength") == 0) bigLength_ = it->attribute("value").as_double(); else WarnOfUnknownParameter(m, it); } for(pugi::xml_node_iterator it = timing.child("Trace").begin(); it != timing.child("Trace").end(); ++it) { if(std::string(it->name()).compare("WaveformRange") == 0) { waveformRange_.first = it->child("Low").attribute("value").as_int(5); waveformRange_.second = it->child("High").attribute("value").as_int(10); } else if(std::string(it->name()).compare("SiPmtWaveformRange") == 0) { siPmtWaveformRange_.first = it->child("Low").attribute("value").as_int(5); siPmtWaveformRange_.second = it->child("High").attribute("value").as_int(5); } else if(std::string(it->name()).compare("LaBr3WaveformRange") == 0) { labr3WaveformRange_.first = it->child("Low").attribute("value").as_int(10); labr3WaveformRange_.second = it->child("High").attribute("value").as_int(15); } else if(std::string(it->name()).compare("DiscriminationStart") == 0) discriminationStart_ = it->attribute("value").as_double(); else if(std::string(it->name()).compare("TrapezoidalWalk") == 0) trapezoidalWalk_ = it->attribute("value").as_double(); else if(std::string(it->name()).compare("TraceDelay") == 0) traceDelay_ = it->attribute("value").as_double(); else if(std::string(it->name()).compare("TraceLength") == 0) traceLength_ = it->attribute("value").as_double(); else if(std::string(it->name()).compare("QdcCompression") == 0) qdcCompression_ = it->attribute("value").as_double(); else WarnOfUnknownParameter(m, it); } for(pugi::xml_node_iterator it = timing.child("Fitting").begin(); it != timing.child("Fitting").end(); ++it) { if(std::string(it->name()).compare("SigmaBaselineThresh") == 0) sigmaBaselineThresh_ = it->attribute("value").as_double(); else if(std::string(it->name()).compare("SiPmtSigmaBaselineThresh") == 0) siPmtSigmaBaselineThresh_ = it->attribute("value").as_double(); else if (std::string(it->name()).compare("Vandle") == 0) { smallVandlePars_.first = it->child("Small").child("Beta").attribute("value").as_double(); smallVandlePars_.second = it->child("Small").child("Gamma").attribute("value").as_double(); mediumVandlePars_.first = it->child("Medium").child("Beta").attribute("value").as_double(); mediumVandlePars_.second = it->child("Medium").child("Gamma").attribute("value").as_double(); bigVandlePars_.first = it->child("Big").child("Beta").attribute("value").as_double(); bigVandlePars_.second = it->child("Big").child("Gamma").attribute("value").as_double(); tvandlePars_.first = it->child("TeenyVandle").child("Beta").attribute("value").as_double(); tvandlePars_.second = it->child("TeenyVandle").child("Gamma").attribute("value").as_double(); }else if (std::string(it->name()).compare("SingleBeta") == 0) { singleBetaPars_.first = it->child("Beta").attribute("value").as_double(); singleBetaPars_.second = it->child("Gamma").attribute("value").as_double(); }else if(std::string(it->name()).compare("DoubleBeta") == 0) { doubleBetaPars_.first = 0.0; doubleBetaPars_.second = it->child("Gamma").attribute("value").as_double(); }else if (std::string(it->name()).compare("Pulser") == 0) { pulserPars_.first = it->child("Beta").attribute("value").as_double(); pulserPars_.second = it->child("Gamma").attribute("value").as_double(); }else if (std::string(it->name()).compare("Liquid") == 0) { liquidScintPars_.first = it->child("Beta").attribute("value").as_double(); liquidScintPars_.second = it->child("Gamma").attribute("value").as_double(); }else if (std::string(it->name()).compare("LaBr3") == 0) { labr3_r6231_100Pars_.first = it->child("r6231_100").child("Beta").attribute("value").as_double(0); labr3_r6231_100Pars_.second = it->child("r6231_100").child("Gamma").attribute("value").as_double(0); labr3_r7724_100Pars_.first = it->child("r7724_100").child("Beta").attribute("value").as_double(0); labr3_r7724_100Pars_.second = it->child("r7724_100").child("Gamma").attribute("value").as_double(0); }else WarnOfUnknownParameter(m, it); } SanityCheck(); } catch (std::exception &e) { std::cout << "Exception caught at Globals" << std::endl; std::cout << "\t" << e.what() << std::endl; exit(EXIT_FAILURE); } }