Combine multiple OBX segments in ORU_R01 message hl7 using python hl7apy - python

I am trying to create an HL7 RU_R01 message with multiple OBX segments. However, I cannot find a way to merge these segments together into the message.
Here's my code:
message = Message("ORU_R01", validation_level=VALIDATION_LEVEL.STRICT)
has_xxx_formatted = '2'
text_formatted = DEFAULT_HL7_TEXT["EN"]["XXXX"]
## MSH Segment
message.MSH.msh_3 = 'XXXXX'
message.msh.msh_4 = 'XXXXX'
message.msh.msh_9 = "ORU^R01^ORU_R01"
message.msh.msh_10 = ""
message.msh.msh_11 = ""
# patient details
message.ORU_R01_PATIENT_RESULT.ORU_R01_PATIENT.PID.pid_2 = "patient_id"
message.ORU_R01_PATIENT_RESULT.ORU_R01_PATIENT.PID.pid_3 = ""
message.ORU_R01_PATIENT_RESULT.ORU_R01_PATIENT.PID.pid_5 = ""
## OBR Segment -- frature details
message.ORU_R01_PATIENT_RESULT.ORU_R01_ORDER_OBSERVATION.OBR.obr_4 = "Observations"
message.ORU_R01_PATIENT_RESULT.ORU_R01_ORDER_OBSERVATION.OBR.obr_7 = f"{datetime.now().strftime('%Y%m%d%H%M%S.%f')[:-2]}"
# obx0
obx0 = Segment('OBX', version='2.5')
obx0.obx_1 = "1"
obx0.obx_2 = "HD"
obx0.obx_3 = "REFInstanceUID"
obx0.obx_5 = "ref_uid"
obx0.obx_11 = "F"
# obx1
obx1 = Segment('OBX', version='2.5')
obx1.obx_1 = "2"
obx1.obx_2 = "TX"
obx1.obx_3 = "Presence"
obx1.obx_5 = "XXXX"
obx1.obx_11 = "F"
# obx2
obx2 = Segment('OBX', version='2.5')
obx2.obx_1 = "3"
obx2.obx_2 = "TX"
obx2.obx_3 = "Result"
obx2.obx_5 = "XXXXX"
obx2.obx_11 = "F"
Now if I add these obx segments using:
message.ORU_R01_PATIENT_RESULT.ORU_R01_ORDER_OBSERVATION.ORU_R01_OBSERVATION.OBX.obx_1 = 1
# adds individual values of obx0
....
message.ORU_R01_PATIENT_RESULT.ORU_R01_ORDER_OBSERVATION.ORU_R01_OBSERVATION.OBX.obx_1 = 2
# adds individual values of obx1
....
message.ORU_R01_PATIENT_RESULT.ORU_R01_ORDER_OBSERVATION.ORU_R01_OBSERVATION.OBX.obx_1 = 3
# adds individual values of obx2
....
It only adds the last OBX segment into the message.
If I try to add the convert the OBX segments into a group as suggested here:
name = 'MDM_T02_OBXNTE_SUPPGRP'
mdm_group = Group(name, version='2.5')
mdm_group.obx = obx0
mdm_group.add(obx1)
mdm_group.add(obx2)
message.ORU_R01_PATIENT_RESULT.ORU_R01_ORDER_OBSERVATION.ORU_R01_ORDER_OBSERVATION = mdm_group
I get the following error:
InvalidName: Invalid name for Group: MDM_T02_OBXNTE_SUPPGRP
I'd like to know how to add these multiple segments into a single message after the OBR. Thank you in advance

I don't know the python libraries, so I won't be able to give you the exact syntax, but ORU_R01_OBSERVATION is a repeatable field that allows for a single OBX and multiple NTE segments. If I were to guess the code should be something like.
message.ORU_R01_PATIENT_RESULT.ORU_R01_ORDER_OBSERVATION.ORU_R01_OBSERVATION[0].OBX.obx_1 = 1
# adds individual values of obx0
....
message.ORU_R01_PATIENT_RESULT.ORU_R01_ORDER_OBSERVATION.ORU_R01_OBSERVATION[1].OBX.obx_1 = 2
# adds individual values of obx1
....
message.ORU_R01_PATIENT_RESULT.ORU_R01_ORDER_OBSERVATION.ORU_R01_OBSERVATION[2].OBX.obx_1 = 3
# adds individual values of obx2
....

It seems that the correct way to add multiple segments is to add each hl7apy.core.Segment to it's individual hl7apy.core.Group. This is explained here, and the documentation from the java version of hl7apy is useful.
message = Message("ORU_R01", validation_level=VALIDATION_LEVEL.TOLERATED)
has_xxx_formatted = '2'
text_formatted = DEFAULT_HL7_TEXT["EN"]["XXXX"]
## MSH Segment
message.MSH.msh_3 = 'XXXXX'
message.msh.msh_4 = 'XXXXX'
message.msh.msh_9 = "ORU^R01^ORU_R01"
message.msh.msh_10 = ""
message.msh.msh_11 = ""
# patient details
message.ORU_R01_PATIENT_RESULT.ORU_R01_PATIENT.PID.pid_2 = "patient_id"
message.ORU_R01_PATIENT_RESULT.ORU_R01_PATIENT.PID.pid_3 = ""
message.ORU_R01_PATIENT_RESULT.ORU_R01_PATIENT.PID.pid_5 = ""
## OBR Segment -- frature details
message.ORU_R01_PATIENT_RESULT.ORU_R01_ORDER_OBSERVATION.OBR.obr_4 = "Observations"
message.ORU_R01_PATIENT_RESULT.ORU_R01_ORDER_OBSERVATION.OBR.obr_7 = f"{datetime.now().strftime('%Y%m%d%H%M%S.%f')[:-2]}"
obs_name = 'ORU_R01_OBSERVATION'
# obx0
obx0_group = Group(obs_name, version='2.5')
obx0 = Segment('OBX', version='2.5')
obx0.obx_1 = "1"
obx0.obx_2 = "HD"
obx0.obx_3 = "REFInstanceUID"
obx0.obx_5 = "ref_uid"
obx0.obx_11 = "F"
obx0_group.add(obx0)
message.ORU_R01_PATIENT_RESULT.ORU_R01_ORDER_OBSERVATION.add(obx0_group)
# obx1
name = 'ORU_R01_OBSERVATION'
obx1_group = Group(obs_name, version='2.5')
obx1 = Segment('OBX', version='2.5')
obx1.obx_1 = "2"
obx1.obx_2 = "TX"
obx1.obx_3 = "Presence"
obx1.obx_5 = "XXXX"
obx1.obx_11 = "F"
obx1_group.add(obx1)
message.ORU_R01_PATIENT_RESULT.ORU_R01_ORDER_OBSERVATION.add(obx1_group)
# obx2
name = 'ORU_R01_OBSERVATION'
obx2_group = Group(obs_name, version='2.5')
obx2 = Segment('OBX', version='2.5')
obx2.obx_1 = "3"
obx2.obx_2 = "TX"
obx2.obx_3 = "Result"
obx2.obx_5 = "XXXXX"
obx2.obx_11 = "F"
obx2_group.add(obx2)
message.ORU_R01_PATIENT_RESULT.ORU_R01_ORDER_OBSERVATION.add(obx2_group)
Also note that the validation level is set to tolerated TOLERATED. STRICT mode only works with a single OBX segment.
Now the validation works.
assert hl7.validate() is True

Related

Python FedEx Image Stream to Image

I am trying to automate my shipping process using the Python fedex module. I am using developer test credentials. The code to create my shipment can be seen here:
import fedex
from fedex.services.ship_service import FedexProcessShipmentRequest, FedexDeleteShipmentRequest
from fedex.config import FedexConfig
CONFIG_OBJ = FedexConfig(key='******',
password= '*****',
account_number='***',
meter_number='***',
use_test_server=True)
shipment = FedexProcessShipmentRequest(CONFIG_OBJ)
shipment = FedexProcessShipmentRequest(CONFIG_OBJ)
shipment.RequestedShipment.DropoffType = 'REGULAR_PICKUP'
shipment.RequestedShipment.ServiceType = 'FEDEX_GROUND'
shipment.RequestedShipment.PackagingType = 'YOUR_PACKAGING'
shipment.RequestedShipment.Shipper.Contact.PersonName = 'Sender Name'
shipment.RequestedShipment.Shipper.Contact.PhoneNumber = '9012638716'
shipment.RequestedShipment.Shipper.Address.StreetLines = ['Address Line 1']
shipment.RequestedShipment.Shipper.Address.City = 'Detroit'
shipment.RequestedShipment.Shipper.Address.StateOrProvinceCode = 'Mi'
shipment.RequestedShipment.Shipper.Address.PostalCode = '48127'
shipment.RequestedShipment.Shipper.Address.CountryCode = 'US'
shipment.RequestedShipment.Recipient.Contact.PersonName = 'Recipient Name'
shipment.RequestedShipment.Recipient.Contact.PhoneNumber = '9012637906'
shipment.RequestedShipment.Recipient.Address.StreetLines = ['Address Line 1']
shipment.RequestedShipment.Recipient.Address.City = 'Detroit'
shipment.RequestedShipment.Recipient.Address.StateOrProvinceCode = 'Mi'
shipment.RequestedShipment.Recipient.Address.PostalCode = '48127'
shipment.RequestedShipment.Recipient.Address.CountryCode = 'US'
shipment.RequestedShipment.EdtRequestType = 'NONE'
shipment.RequestedShipment.ShippingChargesPayment.Payor.ResponsibleParty.AccountNumber \
= CONFIG_OBJ.account_number
shipment.RequestedShipment.ShippingChargesPayment.PaymentType = 'SENDER'
shipment.RequestedShipment.LabelSpecification.LabelFormatType = 'COMMON2D'
shipment.RequestedShipment.LabelSpecification.ImageType = 'PNG'
shipment.RequestedShipment.LabelSpecification.LabelStockType = 'PAPER_7X4.75'
shipment.RequestedShipment.LabelSpecification.LabelPrintingOrientation = 'BOTTOM_EDGE_OF_TEXT_FIRST'
The code executes without problem and outputs the following JSON:
(reply){
HighestSeverity = "SUCCESS"
Notifications[] =
(Notification){
Severity = "SUCCESS"
Source = "ship"
Code = "0000"
Message = "Success"
LocalizedMessage = "Success"
},
Version =
(VersionId){
ServiceId = "ship"
Major = 23
Intermediate = 0
Minor = 0
}
JobId = "aac513eb0455f072033104594"
CompletedShipmentDetail =
(CompletedShipmentDetail){
UsDomestic = True
CarrierCode = "FDXG"
MasterTrackingId =
(TrackingId){
TrackingIdType = "FEDEX"
TrackingNumber = "794608334864"
}
ServiceTypeDescription = "FXG"
ServiceDescription =
(ServiceDescription){
ServiceType = "FEDEX_GROUND"
Code = "92"
Names[] =
....
I would like to show the physical shipping label that the following subsection of the output points to:
Label =
(ShippingDocument){
Type = "OUTBOUND_LABEL"
ShippingDocumentDisposition = "RETURNED"
ImageType = "PNG"
Resolution = 200
CopiesToPrint = 1
Parts[] =
(ShippingDocumentPart){
DocumentPartSequenceNumber = 1
Image = "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"
},
}
However, I am unsure how to do this. Can anybody offer me any guidance?
Thank you!

Bitcoin verify a single block in python

Currently i try to verify the Bitcoin Block 77504 by my own. But from the satoshi whitepaper it seems i have more questions than answer to do so.
First information from the previous block:
### What we know from last block ###
# height = 77503
# id = 00000000000447829abff59b3208a08ff28b3eb184b1298929abe6dd65c3578a
# version = 1
# timestamp = 1283325019
# bits = 459874456
# nonce = 1839166754
# difficulty = 623.3869598689275
# merkle_root = f18107935e8853011e477244241b5d786966495f8c59be46c92ac323c9cc8cde
# tx_count = 6
# size = 1438
# weight = 5752
Then the information from the block i want to verify
### What we now want to mine ###
# height = 77504
# id = 00000000004582246e63ff7e0760c6f009e5ef5ce1eb5397be6f3eb9d698bda5
# version = 1
# timestamp = 1283326637
# bits = 459874456
# nonce = 191169021
# difficulty = 623.3869598689275
# merkle_root = 59c77dabd9f005c771b23b846c79c7741dc0e70d912f9470eace886b42a0d601
# tx_count = 44
# size = 11052
# weight = 44208
# txids = ["b899c55adb5a9604b72643c0f6cd5bf6c2447bb0fc035c50e13d2e471cbf5aa5","05180e3252c48a54d4d0abe9359621f54f3031fd318a812be96da0f13bfa8bf3","29d641bd4a5d4b01ceee1126af920513d52e088bad500fad1358c96962e25e28","40d52b5aa4be889739410f82f36c71fdda554b999fb14fc12aeab5bb2e6498cb","62d5e84500cc674a5172bea5755a223da974f90f614deb45c160478a8974419c","78de7a104617f58620ae9e7cf58bcd875d8043ee5046d93c9d69224c2ae39a1e","8831ad38deb23e1fbea6d376f1805aec194760b0f334a3c4b623aa0751445c9b","8a6bd0c2d74ea785d886bd6d87b6a4eb4cd35af5fb7ae3a364eb1f76b114c375","90d6da6a4b48e7330ae926cd00623fa8d94fd0a2b9a001475da22cbc49435ff9","d002da9953844c767cf7d42092b81e8c5bb03baf520d79028013fd3400bc8651","d1f8573148126e8d17641276f22ece33b8276311d93794ed2975ebb802b98fc8","d22ed765adba9c7f5fef19ff15cb89559b4148d571fcb40ee2889231ac1b8dea","f32b000adf9ab6d7a66593cb20cba4d3a3e0cbb3453608ce11a780fab532add5","32d2ff811677a8dbed4f317c9fcae4796b491bde944cca4a993734be787b4e79","4b806d44d9aff762601f21ad541c0e99a77d0a14b730774a2d7721dd094d9030","8c5258a8e3f60c9edfa55b86780a9832c8cd5f407dbe25948cd2fd87910ca4c4","bc4fcea23cd93bac13ab75bad8d23576be88a89e72f2c455932f096d6dd2a2da","ca5c53ef34ff5a2f816daf648c8dafb01680502c2c0c98b82b9527392f707e70","f9db6e9a62502dfe8057e7b1c0f3b8f145d354ee4e341233bfe8861fff143822","fc3730bbfa443558c677da6898f106ee7d5516b14e21bf369def7cb6a5bf6b8b","1cfa85d94ebfb9206ad49f421319a6ee99b339e4e8d292b866459bb742731d83","80fa7f38cc02b05b765675adba589d426e6122b1e8158726df0c55cf44c937eb","8c72683585901ff96edd14bde9c87ee91a9d54c187a15aa333e3d6b916399fd2","905e015afa4df7d9dc4a1a80a029e469258045fe9288071b16af49a2f458c2cb","bd8fab0ca0072cd230a4bb0a6efff5964756a023ca53d1f06c3fa22800fe044c","464280d62b8965255c286f1c4c5c457f594db64bdef1c8aaa7ddf776fc4d320e","625b8ec5af9ad2c1506aca8ad61670ce3acf7070fe5aabc2dec06dcda119503a","a2e06f6b0ea68cc2c9bf44d09e54832c830971961ed8ea5ec553918ab7eb48d2","a4de41f56f0970d9b1948f1e386a124860891d790f506c2e3bbe71dd289031d4","11475d2fbbc5e3aee2eff54aa9bf2f83d5f33fffce528cc9804f820e0f6a76e7","5dc019a6397c25d0e7db56f3ed2ccdc1db5642701224d56fb9ad1d1017279e7b","e5d1e0e5a2309cb07ec522a1eb56da5aa5e58ecaea6d49e278a52c1c24230dae","21d192ea46007dbeef7c9673ac158c0f9dbf80e0785380ae562a1fbb10430ae7","8fafe7a8168563c4c186d792b49fc0fa4368c6b2e5a1217f2f98b127ff1cdf87","d2410a45bcc0e4f5b7a8d84e730ffd9744e0dd0d9fb2d7e93fb71e590bf0f1fb","6103334a35171bc5a153b51dd7c94977c62822b1cec2fcac20ea9d0a959129d7","6551831774420989df2d9deeab196e14025f2e5fd502feb86dfc7ccedb917ce0","7c1a188e0c94c7d61aea1ebddb359f508c99fdd0e028887bbf3a3036a1b5bf8a","8b9c989cee69c107697b13aebd677879db48275c089ae206c85eb8db45acf50f","4195c5abf97adb2108de8aeee99cb751e2b4f9698607f60e326b9a67b9127a31","800b308f49fe86ff3323dd6240190212626d052a017dd1cad01540790604c00f","1d2fb37bab59d6f3f83f7596fde128a0b7b0f7ccd8fabc8d2a929923a268a847","8a8149d58791ace6cefd803021b4e870acca5b2c40e2e1415f423e6ec4333e32","7a1eb6b8ee1ff52648cd9a099c7658be53627732b226aa93f56d430c85a52991"]
I have prepared a small script that should calculate it for me but no matter what i am not able to get to the target hash 00000000004582246e63ff7e0760c6f009e5ef5ce1eb5397be6f3eb9d698bda5 to verify the block mined. What is also unclear to me where would one have to add his own Bitcoin wallet to get the reward of the transaction.
from hashlib import sha256
def SHA256(text):
return sha256(text.encode("ascii")).hexdigest()
def mine(block_number, transactions, previous_hash, prefix_zeros):
prefix_str = '0'*prefix_zeros
text = str(block_number) + str(transactions) + str(previous_hash) + str(nonce_to_verify)
new_hash = SHA256(text)
if new_hash.startswith(prefix_str):
print(f"Jipiiii! Successfully mined bitcoins with nonce value:{nonce_to_verify}")
return new_hash
else:
new_hash = None
return new_hash
### normally this is unknown, would be somethinge like range(0,100000000000), i just want to verify a block ###
nonce_to_verify = 191169021
### In what format are transactions presented ? ###
transactions = ["b899c55adb5a9604b72643c0f6cd5bf6c2447bb0fc035c50e13d2e471cbf5aa5","05180e3252c48a54d4d0abe9359621f54f3031fd318a812be96da0f13bfa8bf3","29d641bd4a5d4b01ceee1126af920513d52e088bad500fad1358c96962e25e28","40d52b5aa4be889739410f82f36c71fdda554b999fb14fc12aeab5bb2e6498cb","62d5e84500cc674a5172bea5755a223da974f90f614deb45c160478a8974419c","78de7a104617f58620ae9e7cf58bcd875d8043ee5046d93c9d69224c2ae39a1e","8831ad38deb23e1fbea6d376f1805aec194760b0f334a3c4b623aa0751445c9b","8a6bd0c2d74ea785d886bd6d87b6a4eb4cd35af5fb7ae3a364eb1f76b114c375","90d6da6a4b48e7330ae926cd00623fa8d94fd0a2b9a001475da22cbc49435ff9","d002da9953844c767cf7d42092b81e8c5bb03baf520d79028013fd3400bc8651","d1f8573148126e8d17641276f22ece33b8276311d93794ed2975ebb802b98fc8","d22ed765adba9c7f5fef19ff15cb89559b4148d571fcb40ee2889231ac1b8dea","f32b000adf9ab6d7a66593cb20cba4d3a3e0cbb3453608ce11a780fab532add5","32d2ff811677a8dbed4f317c9fcae4796b491bde944cca4a993734be787b4e79","4b806d44d9aff762601f21ad541c0e99a77d0a14b730774a2d7721dd094d9030","8c5258a8e3f60c9edfa55b86780a9832c8cd5f407dbe25948cd2fd87910ca4c4","bc4fcea23cd93bac13ab75bad8d23576be88a89e72f2c455932f096d6dd2a2da","ca5c53ef34ff5a2f816daf648c8dafb01680502c2c0c98b82b9527392f707e70","f9db6e9a62502dfe8057e7b1c0f3b8f145d354ee4e341233bfe8861fff143822","fc3730bbfa443558c677da6898f106ee7d5516b14e21bf369def7cb6a5bf6b8b","1cfa85d94ebfb9206ad49f421319a6ee99b339e4e8d292b866459bb742731d83","80fa7f38cc02b05b765675adba589d426e6122b1e8158726df0c55cf44c937eb","8c72683585901ff96edd14bde9c87ee91a9d54c187a15aa333e3d6b916399fd2","905e015afa4df7d9dc4a1a80a029e469258045fe9288071b16af49a2f458c2cb","bd8fab0ca0072cd230a4bb0a6efff5964756a023ca53d1f06c3fa22800fe044c","464280d62b8965255c286f1c4c5c457f594db64bdef1c8aaa7ddf776fc4d320e","625b8ec5af9ad2c1506aca8ad61670ce3acf7070fe5aabc2dec06dcda119503a","a2e06f6b0ea68cc2c9bf44d09e54832c830971961ed8ea5ec553918ab7eb48d2","a4de41f56f0970d9b1948f1e386a124860891d790f506c2e3bbe71dd289031d4","11475d2fbbc5e3aee2eff54aa9bf2f83d5f33fffce528cc9804f820e0f6a76e7","5dc019a6397c25d0e7db56f3ed2ccdc1db5642701224d56fb9ad1d1017279e7b","e5d1e0e5a2309cb07ec522a1eb56da5aa5e58ecaea6d49e278a52c1c24230dae","21d192ea46007dbeef7c9673ac158c0f9dbf80e0785380ae562a1fbb10430ae7","8fafe7a8168563c4c186d792b49fc0fa4368c6b2e5a1217f2f98b127ff1cdf87","d2410a45bcc0e4f5b7a8d84e730ffd9744e0dd0d9fb2d7e93fb71e590bf0f1fb","6103334a35171bc5a153b51dd7c94977c62822b1cec2fcac20ea9d0a959129d7","6551831774420989df2d9deeab196e14025f2e5fd502feb86dfc7ccedb917ce0","7c1a188e0c94c7d61aea1ebddb359f508c99fdd0e028887bbf3a3036a1b5bf8a","8b9c989cee69c107697b13aebd677879db48275c089ae206c85eb8db45acf50f","4195c5abf97adb2108de8aeee99cb751e2b4f9698607f60e326b9a67b9127a31","800b308f49fe86ff3323dd6240190212626d052a017dd1cad01540790604c00f","1d2fb37bab59d6f3f83f7596fde128a0b7b0f7ccd8fabc8d2a929923a268a847","8a8149d58791ace6cefd803021b4e870acca5b2c40e2e1415f423e6ec4333e32","7a1eb6b8ee1ff52648cd9a099c7658be53627732b226aa93f56d430c85a52991"]
### Just a check of 5 leading zeros... but why the difficulty 623.3869598689275 how to get to the 11 zeros? ###
difficulty=11
### Last Block (77503) found ###
lastfoundblock = "00000000000447829abff59b3208a08ff28b3eb184b1298929abe6dd65c3578a"
print("start mining")
new_hash = mine(77504,transactions,lastfoundblock, difficulty)
print("finnished mining.")
print(f"Found block is: {new_hash} should be the same as 00000000004582246e63ff7e0760c6f009e5ef5ce1eb5397be6f3eb9d698bda5")
Help would be appreciated so that i can verify a single block. Already pointing in the right directions would be appreciated so that i can solve my problem.
As no one was able to answer it... here is the code to verify a block's nonce:
import hashlib, struct, binascii
from time import time
def get_target_str(bits):
# https://en.bitcoin.it/wiki/Difficulty
exp = bits >> 24
mant = bits & 0xffffff
target_hexstr = '%064x' % (mant * (1<<(8*(exp - 3))))
print(f'T: {target_hexstr}')
target_str = bytes.fromhex(target_hexstr)
return target_str
def verify_nonce(version, prev_block, mrkl_root,
timestamp, bits_difficulty,nonce):
target_str = get_target_str(bits_difficulty)
header = ( struct.pack("<L", version) +
bytes.fromhex(prev_block)[::-1] +
bytes.fromhex(mrkl_root)[::-1] +
struct.pack("<LLL", timestamp, bits_difficulty, nonce))
hash_result = hashlib.sha256(hashlib.sha256(header).digest()).digest()
return bytes.hex(hash_result[::-1])
#nonce += 1
test1_version = 0x3fff0000
test1_prev_block = "0000000000000000000140ac4688aea45aacbe7caf6aaca46f16acd93e1064c3"
test1_merkle_root = "422458fced12693312058f6ee4ada19f6df8b29d8cac425c12f4722e0dc4aafd"
test1_timestamp = 0x5E664C76
test1_bits_diff = 0x17110119
test1_nonce1 = 538463288 #(0x20184C38)
test1_block_hash = "0000000000000000000d493c3c1b91c8059c6b0838e7e68fbcf8f8382606b82c"
test1_calc_block_hash = verify_nonce(test1_version,
test1_prev_block,
test1_merkle_root,
test1_timestamp,
test1_bits_diff,
test1_nonce1)
print(f'S: {test1_block_hash}')
print(f'R: {test1_calc_block_hash}')
if test1_block_hash == test1_calc_block_hash:
print("hashing is correct")
Thanks to https://github.com/razvancazacu/bitcoin-mining-crypto

How do you turn off (or hide) the seconds y axis scale on a combination chart in openpyxl?

How do you turn off (or hide) the seconds y axis scale on a combination chart in openpyxl?
I can find the xml difference by comparing the before and after changes to hide the scale (I just change the excel file extension to '.zip' to access the xml):
-<c:valAx>
<c:axId val="156672520"/>
-<c:scaling>
<c:orientation val="minMax"/>
</c:scaling>
<c:delete val="0"/>
<c:axPos val="r"/>
<c:majorGridlines/>
<c:numFmt sourceLinked="1" formatCode="0.0"/>
<c:majorTickMark val="out"/>
<c:minorTickMark val="none"/>
<c:tickLblPos val="none"/> # this changes from 'nextTo'
<c:crossAx val="207247000"/>
<c:crosses val="max"/>
<c:crossBetween val="between"/>
</c:valAx>
I've tried this (last few lines are the 'tickLblPos' ):
mainchart = LineChart()
mainchart.style = 12
v2 = Reference(WorkSheetOne, min_col=1, min_row=2+CombBarLineDataOffsetFromTop, max_row=3+CombBarLineDataOffsetFromTop, max_col=13)
mainchart.add_data(v2, titles_from_data=True, from_rows=True)
mainchart.layout = Layout(
ManualLayout(
x=0.12, y=0.25, # position from the top
h=0.9, w=0.75, # this is scaling the chart into the container
xMode="edge",
yMode="edge",
)
)
mainchart.title = "Chart Title"
# Style the lines
s1 = mainchart.series[0]
#Marker type
s1.marker.symbol = "diamond" # triangle
s1.marker.size = 9
s1.marker.graphicalProperties.solidFill = "C00000" # Marker filling
s1.marker.graphicalProperties.line.solidFill = "000000" # Marker outline
s1.graphicalProperties.line.noFill = False
# Line color
s1.graphicalProperties.line.solidFill = "000000" # line color
s2 = mainchart.series[1]
s2.graphicalProperties.line.solidFill = "000000"
s2.graphicalProperties.line.dashStyle = "dash"
mainchart.dataLabels = DataLabelList()
mainchart.dataLabels.showVal = False
mainchart.dataLabels.dLblPos = 't'
mainchart.height = 15
mainchart.width = 39
#Create the Chart
chart2 = BarChart()
chart2.type = "col"
chart2.style = 10 # simple bar
chart2.y_axis.axId = 0
dataone = Reference(WorkSheetOne, min_col=2, min_row=CombBarLineDataOffsetFromTop+1, max_row=CombBarLineDataOffsetFromTop+1, max_col=13 )
doneseries = Series(dataone, title="Series Title")
chart2.append(doneseries)
cats = Reference(WorkSheetOne, min_col=2, min_row=CombBarLineDataOffsetFromTop, max_row=CombBarLineDataOffsetFromTop, max_col=13)
chart2.set_categories(cats)
# Set the series for the chart data
series3Total = chart2.series[0]
fill3Total = PatternFillProperties(prst="pct5")
fill3Total.foreground = ColorChoice(srgbClr='996633') # brown
fill3Total.background = ColorChoice(srgbClr='996633')
series3Total.graphicalProperties.pattFill = fill3Total
chart2.dataLabels = DataLabelList()
chart2.dataLabels.showVal = False
chart2.shape = 2
mainchart.y_axis.crosses = "max"
mainchart.y_axis.tickLblPos = "none" # nextTo -- this doesn't work
mainchart += chart2
WorkSheetOne.add_chart(mainchart, 'A1')
How can I translate the difference in the XML to an attribute with openpyxl?
The problem here is with some of default values for some attributes which use 3-valued logic at times so that None != "none", ie. <c:tickLblPos /> != <c:tickLblPos val="none"/> because the default is "nextTo". This plays havoc with the Python semantics (3-valued logic is always wrong) where the default is not to set an attribute if the value is None in Python. This really only affects ChartML and I've added some logic to the descriptors for the relevant objects so that "none" will be written where required.
But this code isn't publicly available yet. Get in touch with my by e-mail if you'd like a preview.

Compression of Inverted index using blocked compression

I have built an inverted index dictionary of text collection and need to compress dictionary using blocked compression k=8 and in posting file,gaps between docids using gamma encoding
def createCompressedIndex(dictionary_uncomp_v1):
for term in dictionary_uncomp_v1.keys():
entry = dictionary_uncomp_v1.get(term)
postingList = []
prevId = 0
pEntry = PostingEntry(0,0,0,0)
for pEntry in entry.postingList:
docId = getGammaCode(pEntry.docId - prevId)
frequency = getGammaCode(pEntry.termFreq)
newPEntry = PostingEntry(docId,frequency,0,0)
postingList.extend(newPEntry)
prevId = pEntry.docId
ptemp = docId+frequency
docFrequency = getGammaCode(entry.docFreq)
entrytemp = ptemp+docFrequency
totalTermFreq = getGammaCode(entry.totTermFreq)
compressedEntry = DictEntry(term,docFrequency,totalTermFreq,postingList)
dictionary_comp_v1[term] = bytearray(entrytemp)

ArcGIS Python Map Book PDF not working blank PDF

The purpose of the code is to make a PDF map book that displays all of the large lakes in North America. I'm trying to run this code to make a map book but it gives me a blank PDF. How can I fix this?
## Import arcpy module
import arcpy
import math
import os
from arcpy import env
arcpy.env.overwriteOutput = True
# Define inputs and outputs - Script arguments
arcpy.env.workspace = r"F:\Geog173\Lab7\Lab7_Data"
Lakes = "NA_Big_Lakes.shp"
Cities = "NA_Cities.shp"
NA = "North_America.shp"
##Python arguments
## Arguments = NA_Big_Lakes.shp NA_Cities.shp New_Lakes.shp Center_Lakes.shp
Lakes= 'NA_Big_Lakes.shp'
NA = 'North_America.shp'
Cities = 'NA_Cities.shp'
##New_Lakes = 'New_Lakes.shp'
##Center_Lakes = 'Center_Lakes.shp'
# Identify the geometry field
desc = arcpy.Describe(Lakes)
shapeName = desc.ShapeFieldName
# Identify the geometry field in Cities shapefile
##desc = arcpy.Describe(Cities)
##shapefieldnameCity = desc.ShapeFieldName
#Get lake cursor
inrows = arcpy.SearchCursor(Lakes)
# Set up variables for output path and PDF file name
outDir = r"F:\Geog173\Lab7\Lab7_Data"
finalMapPDF_filename = outDir + r"\NA_Big_Lake_Mapbook.pdf"
# Check whether the mapbook PDF exists. If it does, delete it.
if os.path.exists(finalMapPDF_filename):
os.remove(finalMapPDF_filename)
# Create map book PDF
finalMapPDF = arcpy.mapping.PDFDocumentCreate(finalMapPDF_filename)
# Create MapDocument object pointing to specified mxd
mxd = arcpy.mapping.MapDocument(outDir + r"\OriginalMap.mxd")
# Get dataframe
df = arcpy.mapping.ListDataFrames(mxd)[0]
# ----------------------------------------------------------------------------#
# Start appending pages. Title page first.
# ----------------------------------------------------------------------------#
# Find text element with value "test", and replace it with other value
mapText = "A Map Book for North American Large Lakes " + '\n\r' + "Kishore, A., Geog173, Geography, UCLA" + '\n\r' + " Lake number: 18" + '\n\r' + " Total area: 362117 km2" + '\n\r' + " Mean area: 20118 km2"
print mapText
for elm in arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT"):
if elm.text == "test":
elm.text = mapText
arcpy.RefreshTOC()
arcpy.RefreshActiveView()
#df.extent = feature.extent
arcpy.mapping.ExportToPDF(mxd, outDir + r"\TempMapPages.pdf")
# Append multi-page PDF to finalMapPDF
finalMapPDF.appendPages(outDir + r"\TempMapPages.pdf")
#initialize text value, so it can be reused in next iteration
for elm in arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT"):
if elm.text == mapText:
elm.text = "test"
# ----------------------------------------------------------------------------#
# Loop through each lake
# ----------------------------------------------------------------------------#
# Loop through each row/feature
lakecount = 0
for row in inrows:
lakecount = lakecount + 1
CITY_NAME = ""
CNTRY_NAME = ""
ADMIN_NAME = ""
POP_CLASS = ""
DISTANCE = 0
XY = ""
#print "shapeName" , shapeName
# Create the geometry object
feature = row.getValue(shapeName)
mapText = "Lake FID: " + str(row.FID) + ", Area (km2): " + str(row.Area_km2)
print mapText
# Find text element with value "test", and replace it with other value
for elm in arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT"):
if elm.text == "test":
elm.text = mapText
arcpy.RefreshTOC()
arcpy.RefreshActiveView()
df.extent = feature.extent
arcpy.mapping.ExportToPDF(mxd, outDir + r"\TempMapPages.pdf")
# Append multi-page PDF to finalMapPDF
finalMapPDF.appendPages(outDir + r"\TempMapPages.pdf")
# Set up properties for Adobe Reader and save PDF.
finalMapPDF.updateDocProperties(pdf_open_view = "USE_THUMBS",
pdf_layout = "SINGLE_PAGE")
finalMapPDF.saveAndClose()
# Done. Clean up and let user know the process has finished.
del row, inrows
del mxd, finalMapPDF
print "Map book for lakes in North America is complete!"
First off you should remove the last lines of your code where you delete the mxd. Run the code again and inspect the MXD. Are the data layers drawing properly? I recommend having code that completely works before performing file cleanup so you can identify potential errors.

Categories

Resources